vendor: 8,338 bytes, lines 1-17
1function Hs(e,a){for(var s=0;s<a.length;s++){const r=a[s];if(typeof r!="string"&&!Array.isArray(r)){for(const n in r)if(n!=="default"&&!(n in e)){const o=Object.getOwnPropertyDescriptor(r,n);o&&Object.defineProperty(e,n,o.get?o:{enumerable:!0,get:()=>r[n]})}}}return Object.freeze(Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}))}(function(){const a=document.createElement("link").relList;if(a&&a.supports&&a.supports("modulepreload"))return;for(const n of document.querySelectorAll('link[rel="modulepreload"]'))r(n);new MutationObserver(n=>{for(const o of n)if(o.type==="childList")for(const i of o.addedNodes)i.tagName==="LINK"&&i.rel==="modulepreload"&&r(i)}).observe(document,{childList:!0,subtree:!0});function s(n){const o={};return n.integrity&&(o.integrity=n.integrity),n.referrerPolicy&&(o.referrerPolicy=n.referrerPolicy),n.crossOrigin==="use-credentials"?o.credentials="include":n.crossOrigin==="anonymous"?o.credentials="omit":o.credentials="same-origin",o}function r(n){if(n.ep)return;n.ep=!0;const o=s(n);fetch(n.href,o)}})();function Pt(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,"default")?e.default:e}var Ra={exports:{}},Ot={};/** 2 * @license React 3 * react-jsx-runtime.production.js 4 * 5 * Copyright (c) Meta Platforms, Inc. and affiliates. 6 * 7 * This source code is licensed under the MIT license found in the 8 * LICENSE file in the root directory of this source tree. 9 */var Fr;function ho(){if(Fr)return Ot;Fr=1;var e=Symbol.for("react.transitional.element"),a=Symbol.for("react.fragment");function s(r,n,o){var i=null;if(o!==void 0&&(i=""+o),n.key!==void 0&&(i=""+n.key),"key"in n){o={};for(var c in n)c!=="key"&&(o[c]=n[c])}else o=n;return n=o.ref,{$$typeof:e,type:r,key:i,ref:n!==void 0?n:null,props:o}}return Ot.Fragment=a,Ot.jsx=s,Ot.jsxs=s,Ot}var $r;function po(){return $r||($r=1,Ra.exports=ho()),Ra.exports}var t=po(),Ua={exports:{}},V={};/** 10 * @license React 11 * react.production.js 12 * 13 * Copyright (c) Meta Platforms, Inc. and affiliates. 14 * 15 * This source code is licensed under the MIT license found in the 16 * LICENSE file in the root directory of this source tree. 17 */var Wr;function mo(){if(Wr)return V;Wr=1;var e=Symbol.for("react.transitional.element"),a=Symbol.for("react.portal"),s=Symbol.for("react.fragment"),r=Symbol.for("react.strict_mode"),n=Symbol.for("react.profiler"),o=Symbol.for("react.consumer"),i=Symbol.for("react.context"),c=Symbol.for("react.forward_ref"),l=Symbol.for("react.suspense"),d=Symbol.for("react.memo"),p=Symbol.for("react.lazy"),u=Symbol.for("react.activity"),f=Symbol.iterator;function v(m){return m===null||typeof m!="object"?null:(m=f&&m[f]||m["@@iterator"],typeof m=="function"?m:null)}var k={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},w=Object.assign,T={};function R(m,S,B){this.props=m,this.context=S,this.refs=T,this.updater=B||k}R.prototype.isReactComponent={},R.prototype.setState=function(m,S){if(typeof m!="object"&&typeof m!="function"&&m!=null)throw Error("takes an object of state variables to update or a function which returns an object of state variables.");this.updater.enqueueSetState(this,m,S,"setState")},R.prototype.forceUpdate=function(m){this.updater.enqueueForceUpdate(this,m,"forceUpdate")};function N(){}N.prototype=R.prototype;function O(m,S,B){this.props=m,this.context=S,this.refs=T,this.updater=B||k}var M=O.prototype=new N;M.constructor=O,w(M,R.prototype),M.isPureReactComponent=!0;var K=Array.isArray;function be(){}var y={H:null,A:null,T:null,S:null},D=Object.prototype.hasOwnProperty;function ee(m,S,B){var F=B.ref;return{$$typeof:e,type:m,key:S,ref:F!==void 0?F:null,props:B}}function H(m,S){return ee(m.type,S,m.props)}function ie(m){return typeof m=="object"&&m!==null&&m.$$typeof===e}function le(m){var S={"=":"=0",":":"=2"};return"$"+m.replace(/[=:]/g,function(B){return S[B]})}var ke=/\/+/g;function ge(m,S){return typeof m=="object"&&m!==null&&m.key!=null?le(""+m.key):S.toString(36)}function Oe(m){switch(m.status){case"fulfilled":return m.value;case"rejected":throw m.reason;default:switch(typeof m.status=="string"?m.then(be,be):(m.status="pending",m.then(function(S){m.status==="pending"&&(m.status="fulfilled",m.value=S)},function(S){m.status==="pending"&&(m.status="rejected",m.reason=S)})),m.status){case"fulfilled":return m.value;case"rejected":throw m.reason}}throw m}function Re(m,S,B,F,G){var J=typeof m;(J==="undefined"||J==="boolean")&&(m=null);var te=!1;if(m===null)te=!0;else switch(J){case"bigint":case"string":case"number":te=!0;break;case"object":switch(m.$$typeof){case e:case a:te=!0;break;case p:return te=m._init,Re(te(m._payload),S,B,F,G)}}if(te)return G=G(m),te=F===""?"."+ge(m,0):F,K(G)?(B="",te!=null&&(B=te.replace(ke,"$&/")+"/"),Re(G,S,B,"",function(La){return La})):G!=null&&(ie(G)&&(G=H(G,B+(G.key==null||m&&m.key===G.key?"":(""+G.key).replace(ke,"$&/")+"/")+te)),S.push(G)),1;te=0;var Le=F===""?".":F+":";if(K(m))for(var Te=0;Te<m.length;Te++)F=m[Te],J=Le+ge(F,Te),te+=Re(F,S,B,J,G);else if(Te=v(m),typeof Te=="function")for(m=Te.call(m),Te=0;!(F=m.next()).done;)F=F.value,J=Le+ge(F,Te++),te+=Re(F,S,B,J,G);else if(J==="object"){if(typeof m.then=="function")return Re(Oe(m),S,B,F,G);throw S=String(m),Error("Objects are not valid as a React child (found: "+(S==="[object Object]"?"object with keys {"+Object.keys(m).join(", ")+"}":S)+"). If you meant to render a collection of children, use an array instead.")}return te}function L(m,S,B){if(m==null)return m;var F=[],G=0;return Re(m,F,"","",function(J){return S.call(B,J,G++)}),F}function q(m){if(m._status===-1){var S=m._result;S=S(),S.then(function(B){(m._status===0||m._status===-1)&&(m._status=1,m._result=B)},function(B){(m._status===0||m._status===-1)&&(m._status=2,m._result=B)}),m._status===-1&&(m._status=0,m._result=S)}if(m._status===1)return m._result.default;throw m._result}var de=typeof reportError=="function"?reportError:function(m){if(typeof window=="object"&&typeof window.ErrorEvent=="function"){var S=new window.ErrorEvent("error",{bubbles:!0,cancelable:!0,message:typeof m=="object"&&m!==null&&typeof m.message=="string"?String(m.message):String(m),error:m});if(!window.dispatchEvent(S))return}else if(typeof process=="object"&&typeof process.emit=="function"){process.emit("uncaughtException",m);return}console.error(m)},ye={map:L,forEach:function(m,S,B){L(m,function(){S.apply(this,arguments)},B)},count:function(m){var S=0;return L(m,function(){S++}),S},toArray:function(m){return L(m,function(S){return S})||[]},only:function(m){if(!ie(m))throw Error("React.Children.only expected to receive a single React element child.");return m}};return V.Activity=u,V.Children=ye,V.Component=R,V.Fragment=s,V.Profiler=n,V.PureComponent=O,V.StrictMode=r,V.Suspense=l,V.__CLIENT_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE=y,V.__COMPILER_RUNTIME={__proto__:null,c:function(m){return y.H.useMemoCache(m)}},V.cache=function(m){return function(){return m.apply(null,arguments)}},V.cacheSignal=function(){return null},V.cloneElement=function(m,S,B){if(m==null)throw Error("The argument must be a React element, but you passed "+m+".");var F=w({},m.props),G=m.key;if(S!=null)for(J in S.key!==void 0&&(G=""+S.key),S)!D.call(S,J)||J==="key"||J==="__self"||J==="__source"||J==="ref"&&S.ref===void 0||(F[J]=S[J]);var J=arguments.length-2;if(J===1)F.children=B;else if(1<J){for(var te=Array(J),Le=0;Le<J;Le++)te[Le]=arguments[Le+2];F.children=te}return ee(m.type,G,F)},V.createContext=function(m){return m={$$typeof:i,_currentValue:m,_currentValue2:m,_threadCount:0,Provider:null,Consumer:null},m.Provider=m,m.Consumer={$$typeof:o,_context:m},m},V.createElement=function(m,S,B){var F,G={},J=null;if(S!=null)for(F in S.key!==void 0&&(J=""+S.key),S)D.call(S,F)&&F!=="key"&&F!=="__self"&&F!=="__source"&&(G[F]=S[F]);var te=arguments.length-2;if(te===1)G.children=B;else if(1<te){for(var Le=Array(te),Te=0;Te<te;Te++)Le[Te]=arguments[Te+2];G.children=Le}if(m&&m.defaultProps)for(F in te=m.defaultProps,te)G[F]===void 0&&(G[F]=te[F]);return ee(m,J,G)},V.createRef=function(){return{current:null}},V.forwardRef=function(m){return{$$typeof:c,render:m}},V.isValidElement=ie,V.lazy=function(m){return{$$typeof:p,_payload:{_status:-1,_result:m},_init:q}},V.memo=function(m,S){return{$$typeof:d,type:m,compare:S===void 0?null:S}
17},V.startTransition=function(m){var S=y.T,B={};y.T=B;try{var F=m(),G=y.S;G!==null&&G(B,F),typeof F=="object"&&F!==null&&typeof F.then=="function"&&F.then(be,de)}catch(J){de(J)}finally{S!==null&&B.types!==null&&(S.types=B.types),y.T=S}},V.unstable_useCacheRefresh=function(){return y.H.useCacheRefresh()},V.use=function(m){return y.H.use(m)},V.useActionState=function(m,S,B){return y.H.useActionState(m,S,B)},V.useCallback=function(m,S){return y.H.useCallback(m,S)},V.useContext=function(m){return y.H.useContext(m)},V.useDebugValue=function(){},V.useDeferredValue=function(m,S){return y.H.useDeferredValue(m,S)},V.useEffect=function(m,S){return y.H.useEffect(m,S)},V.useEffectEvent=function(m){return y.H.useEffectEvent(m)},V.useId=function(){return y.H.useId()},V.useImperativeHandle=function(m,S,B){return y.H.useImperativeHandle(m,S,B)},V.useInsertionEffect=function(m,S){return y.H.useInsertionEffect(m,S)},V.useLayoutEffect=function(m,S){return y.H.useLayoutEffect(m,S)},V.useMemo=function(m,S){return y.H.useMemo(m,S)},V.useOptimistic=function(m,S){return y.H.useOptimistic(m,S)},V.useReducer=function(m,S,B){return y.H.useReducer(m,S,B)},V.useRef=function(m){return y.H.useRef(m)},V.useState=function(m){return y.H.useState(m)},V.useSyncExternalStore=function(m,S,B){return y.H.useSyncExternalStore(m,S,B)},V.useTransition=function(){return y.H.useTransition()},V.version="19.2.7",V}var Hr;function Vs(){return Hr||(Hr=1,Ua.exports=mo()),Ua.exports}var b=Vs();const Ie=Pt(b),fo=Hs({__proto__:null,default:Ie},[b]);var Ia={exports:{}},_a,Vr;function go(){if(Vr)return _a;Vr=1;var e="SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED";return _a=e,_a}var Da,Gr;function yo(){if(Gr)return Da;Gr=1;var e=go();function a(){}function s(){}return s.resetWarningCache=a,Da=function(){function r(i,c,l,d,p,u){if(u!==e){var f=new Error("Calling PropTypes validators directly is not supported by the `prop-types` package. Use PropTypes.checkPropTypes() to call them. Read more at http://fb.me/use-check-prop-types");throw f.name="Invariant Violation",f}}r.isRequired=r;function n(){return r}var o={array:r,bigint:r,bool:r,func:r,number:r,object:r,string:r,symbol:r,any:r,arrayOf:n,element:r,elementType:r,instanceOf:n,node:r,objectOf:n,oneOf:n,oneOfType:n,shape:n,exact:n,checkPropTypes:s,resetWarningCache:a};return o.PropTypes=o,o},Da}var Yr;function xo(){return Yr||(Yr=1,Ia.exports=yo()()),Ia.exports}var bo=xo();const Z=Pt(bo);var Ma,Kr;function vo(){if(Kr)return Ma;Kr=1;var e=typeof Element<"u",a=typeof Map=="function",s=typeof Set=="function",r=typeof ArrayBuffer=="function"&&!!ArrayBuffer.isView;function n(o,i){if(o===i)return!0;if(o&&i&&typeof o=="object"&&typeof i=="object"){if(o.constructor!==i.constructor)return!1;var c,l,d;if(Array.isArray(o)){if(c=o.length,c!=i.length)return!1;for(l=c;l--!==0;)if(!n(o[l],i[l]))return!1;return!0}var p;if(a&&o instanceof Map&&i instanceof Map){if(o.size!==i.size)return!1;for(p=o.entries();!(l=p.next()).done;)if(!i.has(l.value[0]))return!1;for(p=o.entries();!(l=p.next()).done;)if(!n(l.value[1],i.get(l.value[0])))return!1;return!0}if(s&&o instanceof Set&&i instanceof Set){if(o.size!==i.size)return!1;for(p=o.entries();!(l=p.next()).done;)if(!i.has(l.value[0]))return!1;return!0}if(r&&ArrayBuffer.isView(o)&&ArrayBuffer.isView(i)){if(c=o.length,c!=i.length)return!1;for(l=c;l--!==0;)if(o[l]!==i[l])return!1;return!0}if(o.constructor===RegExp)return o.source===i.source&&o.flags===i.flags;if(o.valueOf!==Object.prototype.valueOf&&typeof o.valueOf=="function"&&typeof i.valueOf=="function")return o.valueOf()===i.valueOf();if(o.toString!==Object.prototype.toString&&typeof o.toString=="function"&&typeof i.toString=="function")return o.toString()===i.toString();if(d=Object.keys(o),c=d.length,c!==Object.keys(i).length)return!1;for(l=c;l--!==0;)if(!Object.prototype.hasOwnProperty.call(i,d[l]))return!1;if(e&&o instanceof Element)return!1;for(l=c;l--!==0;)if(!((d[l]==="_owner"||d[l]==="__v"||d[l]==="__o")&&o.$$typeof)&&!n(o[d[l]],i[d[l]]))return!1;return!0}return o!==o&&i!==i}return Ma=function(i,c){try{return n(i,c)}catch(l){if((l.message||"").match(/stack|recursion/i))return console.warn("react-fast-compare cannot handle circular refs"),!1;throw l}},Ma}var wo=vo();const ko=Pt(wo);var za,Qr;function jo(){if(Qr)return za;Qr=1;var e=function(a,s,r,n,o,i,c,l){if(!a){var d;if(s===void 0)d=new Error("Minified exception occurred; use the non-minified dev environment for the full error message and additional helpful warnings.");else{var p=[r,n,o,i,c,l],u=0;d=new Error(s.replace(/%s/g,function(){return p[u++]})),d.name="Invariant Violation"}throw d.framesToPop=1,d}};return za=e,za}var So=jo();const Jr=Pt(So);var Ba,Zr;function No(){return Zr||(Zr=1,Ba=function(a,s,r,n){var o=r?r.call(n,a,s):void 0;if(o!==void 0)return!!o;if(a===s)return!0;
17if(typeof a!="object"||!a||typeof s!="object"||!s)return!1;var i=Object.keys(a),c=Object.keys(s);if(i.length!==c.length)return!1;for(var l=Object.prototype.hasOwnProperty.bind(s),d=0;d<i.length;d++){var p=i[d];if(!l(p))return!1;var u=a[p],f=s[p];if(o=r?r.call(n,u,f,p):void 0,o===!1||o===void 0&&u!==f)return!1}return!0}),Ba}var To=No();const Po=Pt(To);function xe(){return xe=Object.assign||function(e){for(var a=1;a<arguments.length;a++){var s=arguments[a];for(var r in s)Object.prototype.hasOwnProperty.call(s,r)&&(e[r]=s[r])}return e},xe.apply(this,arguments)}function hr(e,a){e.prototype=Object.create(a.prototype),e.prototype.constructor=e,Xa(e,a)}function Xa(e,a){return Xa=Object.setPrototypeOf||function(s,r){return s.__proto__=r,s},Xa(e,a)}function Xr(e,a){if(e==null)return{};var s,r,n={},o=Object.keys(e);for(r=0;r<o.length;r++)a.indexOf(s=o[r])>=0||(n[s]=e[s]);return n}var z={BASE:"base",BODY:"body",HEAD:"head",HTML:"html",LINK:"link",META:"meta",NOSCRIPT:"noscript",SCRIPT:"script",STYLE:"style",TITLE:"title",FRAGMENT:"Symbol(react.fragment)"},Ao={rel:["amphtml","canonical","alternate"]},Lo={type:["application/ld+json"]},Co={charset:"",name:["robots","description"],property:["og:type","og:title","og:url","og:image","og:image:alt","og:description","twitter:url","twitter:title","twitter:description","twitter:image","twitter:image:alt","twitter:card","twitter:site"]},es=Object.keys(z).map(function(e){return z[e]}),fa={accesskey:"accessKey",charset:"charSet",class:"className",contenteditable:"contentEditable",contextmenu:"contextMenu","http-equiv":"httpEquiv",itemprop:"itemProp",tabindex:"tabIndex"},qo=Object.keys(fa).reduce(function(e,a){return e[fa[a]]=a,e},{}),St=function(e,a){for(var s=e.length-1;s>=0;s-=1){var r=e[s];if(Object.prototype.hasOwnProperty.call(r,a))return r[a]}return null},Eo=function(e){var a=St(e,z.TITLE),s=St(e,"titleTemplate");if(Array.isArray(a)&&(a=a.join("")),s&&a)return s.replace(/%s/g,function(){return a});var r=St(e,"defaultTitle");return a||r||void 0},Oo=function(e){return St(e,"onChangeClientState")||function(){}},Fa=function(e,a){return a.filter(function(s){return s[e]!==void 0}).map(function(s){return s[e]}).reduce(function(s,r){return xe({},s,r)},{})},Ro=function(e,a){return a.filter(function(s){return s[z.BASE]!==void 0}).map(function(s){return s[z.BASE]}).reverse().reduce(function(s,r){if(!s.length)for(var n=Object.keys(r),o=0;o<n.length;o+=1){var i=n[o].toLowerCase();if(e.indexOf(i)!==-1&&r[i])return s.concat(r)}return s},[])},Rt=function(e,a,s){var r={};return s.filter(function(n){return!!Array.isArray(n[e])||(n[e]!==void 0&&console&&typeof console.warn=="function"&&console.warn("Helmet: "+e+' should be of type "Array". Instead found type "'+typeof n[e]+'"'),!1)}).map(function(n){return n[e]}).reverse().reduce(function(n,o){var i={};o.filter(function(u){for(var f,v=Object.keys(u),k=0;k<v.length;k+=1){var w=v[k],T=w.toLowerCase();a.indexOf(T)===-1||f==="rel"&&u[f].toLowerCase()==="canonical"||T==="rel"&&u[T].toLowerCase()==="stylesheet"||(f=T),a.indexOf(w)===-1||w!=="innerHTML"&&w!=="cssText"&&w!=="itemprop"||(f=w)}if(!f||!u[f])return!1;var R=u[f].toLowerCase();return r[f]||(r[f]={}),i[f]||(i[f]={}),!r[f][R]&&(i[f][R]=!0,!0)}).reverse().forEach(function(u){return n.push(u)});for(var c=Object.keys(i),l=0;l<c.length;l+=1){var d=c[l],p=xe({},r[d],i[d]);r[d]=p}return n},[]).reverse()},Uo=function(e,a){if(Array.isArray(e)&&e.length){for(var s=0;s<e.length;s+=1)if(e[s][a])return!0}return!1},Gs=function(e){return Array.isArray(e)?e.join(""):e},$a=function(e,a){return Array.isArray(e)?e.reduce(function(s,r){return(function(n,o){for(var i=Object.keys(n),c=0;c<i.length;c+=1)if(o[i[c]]&&o[i[c]].includes(n[i[c]]))return!0;return!1})(r,a)?s.priority.push(r):s.default.push(r),s},{priority:[],default:[]}):{default:e}},ts=function(e,a){var s;return xe({},e,((s={})[a]=void 0,s))},Io=[z.NOSCRIPT,z.SCRIPT,z.STYLE],Wa=function(e,a){return a===void 0&&(a=!0),a===!1?String(e):String(e).replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,""").replace(/'/g,"'")},as=function(e){return Object.keys(e).reduce(function(a,s){var r=e[s]!==void 0?s+'="'+e[s]+'"':""+s;return a?a+" "+r:r},"")},rs=function(e,a){return a===void 0&&(a={}),Object.keys(e).reduce(function(s,r){return s[fa[r]||r]=e[r],s},a)},ca=function(e,a){return a.map(function(s,r){var n,o=((n={key:r})["data-rh"]=!0,n);
17return Object.keys(s).forEach(function(i){var c=fa[i]||i;c==="innerHTML"||c==="cssText"?o.dangerouslySetInnerHTML={__html:s.innerHTML||s.cssText}:o[c]=s[i]}),Ie.createElement(e,o)})},_e=function(e,a,s){switch(e){case z.TITLE:return{toComponent:function(){return n=a.titleAttributes,(o={key:r=a.title})["data-rh"]=!0,i=rs(n,o),[Ie.createElement(z.TITLE,i,r)];var r,n,o,i},toString:function(){return(function(r,n,o,i){var c=as(o),l=Gs(n);return c?"<"+r+' data-rh="true" '+c+">"+Wa(l,i)+"</"+r+">":"<"+r+' data-rh="true">'+Wa(l,i)+"</"+r+">"})(e,a.title,a.titleAttributes,s)}};case"bodyAttributes":case"htmlAttributes":return{toComponent:function(){return rs(a)},toString:function(){return as(a)}};default:return{toComponent:function(){return ca(e,a)},toString:function(){return(function(r,n,o){return n.reduce(function(i,c){var l=Object.keys(c).filter(function(u){return!(u==="innerHTML"||u==="cssText")}).reduce(function(u,f){var v=c[f]===void 0?f:f+'="'+Wa(c[f],o)+'"';return u?u+" "+v:v},""),d=c.innerHTML||c.cssText||"",p=Io.indexOf(r)===-1;return i+"<"+r+' data-rh="true" '+l+(p?"/>":">"+d+"</"+r+">")},"")})(e,a,s)}}}},er=function(e){var a=e.baseTag,s=e.bodyAttributes,r=e.encode,n=e.htmlAttributes,o=e.noscriptTags,i=e.styleTags,c=e.title,l=c===void 0?"":c,d=e.titleAttributes,p=e.linkTags,u=e.metaTags,f=e.scriptTags,v={toComponent:function(){},toString:function(){return""}};if(e.prioritizeSeoTags){var k=(function(w){var T=w.linkTags,R=w.scriptTags,N=w.encode,O=$a(w.metaTags,Co),M=$a(T,Ao),K=$a(R,Lo);return{priorityMethods:{toComponent:function(){return[].concat(ca(z.META,O.priority),ca(z.LINK,M.priority),ca(z.SCRIPT,K.priority))},toString:function(){return _e(z.META,O.priority,N)+" "+_e(z.LINK,M.priority,N)+" "+_e(z.SCRIPT,K.priority,N)}},metaTags:O.default,linkTags:M.default,scriptTags:K.default}})(e);v=k.priorityMethods,p=k.linkTags,u=k.metaTags,f=k.scriptTags}return{priority:v,base:_e(z.BASE,a,r),bodyAttributes:_e("bodyAttributes",s,r),htmlAttributes:_e("htmlAttributes",n,r),link:_e(z.LINK,p,r),meta:_e(z.META,u,r),noscript:_e(z.NOSCRIPT,o,r),script:_e(z.SCRIPT,f,r),style:_e(z.STYLE,i,r),title:_e(z.TITLE,{title:l,titleAttributes:d},r)}},ra=[],tr=function(e,a){var s=this;a===void 0&&(a=typeof document<"u"),this.instances=[],this.value={setHelmet:function(r){s.context.helmet=r},helmetInstances:{get:function(){return s.canUseDOM?ra:s.instances},add:function(r){(s.canUseDOM?ra:s.instances).push(r)},remove:function(r){var n=(s.canUseDOM?ra:s.instances).indexOf(r);(s.canUseDOM?ra:s.instances).splice(n,1)}}},this.context=e,this.canUseDOM=a,a||(e.helmet=er({baseTag:[],bodyAttributes:{},htmlAttributes:{},linkTags:[],metaTags:[],noscriptTags:[],scriptTags:[],styleTags:[],title:"",titleAttributes:{}}))},Ys=Ie.createContext({}),_o=Z.shape({setHelmet:Z.func,helmetInstances:Z.shape({get:Z.func,add:Z.func,remove:Z.func})}),Do=typeof document<"u",jt=(function(e){function a(s){var r;return(r=e.call(this,s)||this).helmetData=new tr(r.props.context,a.canUseDOM),r}return hr(a,e),a.prototype.render=function(){return Ie.createElement(Ys.Provider,{value:this.helmetData.value},this.props.children)},a})(b.Component);jt.canUseDOM=Do,jt.propTypes={context:Z.shape({helmet:Z.shape()}),children:Z.node.isRequired},jt.defaultProps={context:{}},jt.displayName="HelmetProvider";var vt=function(e,a){var s,r=document.head||document.querySelector(z.HEAD),n=r.querySelectorAll(e+"[data-rh]"),o=[].slice.call(n),i=[];return a&&a.length&&a.forEach(function(c){var l=document.createElement(e);for(var d in c)Object.prototype.hasOwnProperty.call(c,d)&&(d==="innerHTML"?l.innerHTML=c.innerHTML:d==="cssText"?l.styleSheet?l.styleSheet.cssText=c.cssText:l.appendChild(document.createTextNode(c.cssText)):l.setAttribute(d,c[d]===void 0?"":c[d]));l.setAttribute("data-rh","true"),o.some(function(p,u){return s=u,l.isEqualNode(p)})?o.splice(s,1):i.push(l)}),o.forEach(function(c){return c.parentNode.removeChild(c)}
17),i.forEach(function(c){return r.appendChild(c)}),{oldTags:o,newTags:i}},Ha=function(e,a){var s=document.getElementsByTagName(e)[0];if(s){for(var r=s.getAttribute("data-rh"),n=r?r.split(","):[],o=[].concat(n),i=Object.keys(a),c=0;c<i.length;c+=1){var l=i[c],d=a[l]||"";s.getAttribute(l)!==d&&s.setAttribute(l,d),n.indexOf(l)===-1&&n.push(l);var p=o.indexOf(l);p!==-1&&o.splice(p,1)}for(var u=o.length-1;u>=0;u-=1)s.removeAttribute(o[u]);n.length===o.length?s.removeAttribute("data-rh"):s.getAttribute("data-rh")!==i.join(",")&&s.setAttribute("data-rh",i.join(","))}},ss=function(e,a){var s=e.baseTag,r=e.htmlAttributes,n=e.linkTags,o=e.metaTags,i=e.noscriptTags,c=e.onChangeClientState,l=e.scriptTags,d=e.styleTags,p=e.title,u=e.titleAttributes;Ha(z.BODY,e.bodyAttributes),Ha(z.HTML,r),(function(w,T){w!==void 0&&document.title!==w&&(document.title=Gs(w)),Ha(z.TITLE,T)})(p,u);var f={baseTag:vt(z.BASE,s),linkTags:vt(z.LINK,n),metaTags:vt(z.META,o),noscriptTags:vt(z.NOSCRIPT,i),scriptTags:vt(z.SCRIPT,l),styleTags:vt(z.STYLE,d)},v={},k={};Object.keys(f).forEach(function(w){var T=f[w],R=T.newTags,N=T.oldTags;R.length&&(v[w]=R),N.length&&(k[w]=f[w].oldTags)}),a&&a(),c(e,v,k)},Ut=null,ga=(function(e){function a(){for(var r,n=arguments.length,o=new Array(n),i=0;i<n;i++)o[i]=arguments[i];return(r=e.call.apply(e,[this].concat(o))||this).rendered=!1,r}hr(a,e);var s=a.prototype;return s.shouldComponentUpdate=function(r){return!Po(r,this.props)},s.componentDidUpdate=function(){this.emitChange()},s.componentWillUnmount=function(){this.props.context.helmetInstances.remove(this),this.emitChange()},s.emitChange=function(){var r,n,o=this.props.context,i=o.setHelmet,c=null,l=(r=o.helmetInstances.get().map(function(d){var p=xe({},d.props);return delete p.context,p}),{baseTag:Ro(["href"],r),bodyAttributes:Fa("bodyAttributes",r),defer:St(r,"defer"),encode:St(r,"encodeSpecialCharacters"),htmlAttributes:Fa("htmlAttributes",r),linkTags:Rt(z.LINK,["rel","href"],r),metaTags:Rt(z.META,["name","charset","http-equiv","property","itemprop"],r),noscriptTags:Rt(z.NOSCRIPT,["innerHTML"],r),onChangeClientState:Oo(r),scriptTags:Rt(z.SCRIPT,["src","innerHTML"],r),styleTags:Rt(z.STYLE,["cssText"],r),title:Eo(r),titleAttributes:Fa("titleAttributes",r),prioritizeSeoTags:Uo(r,"prioritizeSeoTags")});jt.canUseDOM?(n=l,Ut&&cancelAnimationFrame(Ut),n.defer?Ut=requestAnimationFrame(function(){ss(n,function(){Ut=null})}):(ss(n),Ut=null)):er&&(c=er(l)),i(c)},s.init=function(){this.rendered||(this.rendered=!0,this.props.context.helmetInstances.add(this),this.emitChange())},s.render=function(){return this.init(),null},a})(b.Component);ga.propTypes={context:_o.isRequired},ga.displayName="HelmetDispatcher";var Mo=["children"],zo=["children"],ua=(function(e){function a(){return e.apply(this,arguments)||this}hr(a,e);var s=a.prototype;return s.shouldComponentUpdate=function(r){return!ko(ts(this.props,"helmetData"),ts(r,"helmetData"))},s.mapNestedChildrenToProps=function(r,n){if(!n)return null;switch(r.type){case z.SCRIPT:case z.NOSCRIPT:return{innerHTML:n};case z.STYLE:return{cssText:n};default:throw new Error("<"+r.type+" /> elements are self-closing and can not contain children. Refer to our API for more information.")}},s.flattenArrayTypeChildren=function(r){var n,o=r.child,i=r.arrayTypeChildren;return xe({},i,((n={})[o.type]=[].concat(i[o.type]||[],[xe({},r.newChildProps,this.mapNestedChildrenToProps(o,r.nestedChildren))]),n))},s.mapObjectTypeChildren=function(r){var n,o,i=r.child,c=r.newProps,l=r.newChildProps,d=r.nestedChildren;switch(i.type){case z.TITLE:return xe({},c,((n={})[i.type]=d,n.titleAttributes=xe({},l),n));case z.BODY:return xe({},c,{bodyAttributes:xe({},l)});case z.HTML:return xe({},c,{htmlAttributes:xe({},l)});default:return xe({},c,((o={})[i.type]=xe({},l),o))}},s.mapArrayTypeChildrenToProps=function(r,n){var o=xe({},n);return Object.keys(r).forEach(function(i){var c;o=xe({},o,((c={})[i]=r[i],c))}),o}
17,s.warnOnInvalidChildren=function(r,n){return Jr(es.some(function(o){return r.type===o}),typeof r.type=="function"?"You may be attempting to nest <Helmet> components within each other, which is not allowed. Refer to our API for more information.":"Only elements types "+es.join(", ")+" are allowed. Helmet does not support rendering <"+r.type+"> elements. Refer to our API for more information."),Jr(!n||typeof n=="string"||Array.isArray(n)&&!n.some(function(o){return typeof o!="string"}),"Helmet expects a string as a child of <"+r.type+">. Did you forget to wrap your children in braces? ( <"+r.type+">{``}</"+r.type+"> ) Refer to our API for more information."),!0},s.mapChildrenToProps=function(r,n){var o=this,i={};return Ie.Children.forEach(r,function(c){if(c&&c.props){var l=c.props,d=l.children,p=Xr(l,Mo),u=Object.keys(p).reduce(function(v,k){return v[qo[k]||k]=p[k],v},{}),f=c.type;switch(typeof f=="symbol"?f=f.toString():o.warnOnInvalidChildren(c,d),f){case z.FRAGMENT:n=o.mapChildrenToProps(d,n);break;case z.LINK:case z.META:case z.NOSCRIPT:case z.SCRIPT:case z.STYLE:i=o.flattenArrayTypeChildren({child:c,arrayTypeChildren:i,newChildProps:u,nestedChildren:d});break;default:n=o.mapObjectTypeChildren({child:c,newProps:n,newChildProps:u,nestedChildren:d})}}}),this.mapArrayTypeChildrenToProps(i,n)},s.render=function(){var r=this.props,n=r.children,o=Xr(r,zo),i=xe({},o),c=o.helmetData;return n&&(i=this.mapChildrenToProps(n,i)),!c||c instanceof tr||(c=new tr(c.context,c.instances)),c?Ie.createElement(ga,xe({},i,{context:c.value,helmetData:void 0})):Ie.createElement(Ys.Consumer,null,function(l){return Ie.createElement(ga,xe({},i,{context:l}))})},a})(b.Component);ua.propTypes={base:Z.object,bodyAttributes:Z.object,children:Z.oneOfType([Z.arrayOf(Z.node),Z.node]),defaultTitle:Z.string,defer:Z.bool,encodeSpecialCharacters:Z.bool,htmlAttributes:Z.object,link:Z.arrayOf(Z.object),meta:Z.arrayOf(Z.object),noscript:Z.arrayOf(Z.object),onChangeClientState:Z.func,script:Z.arrayOf(Z.object),style:Z.arrayOf(Z.object),title:Z.string,titleAttributes:Z.object,titleTemplate:Z.string,prioritizeSeoTags:Z.bool,helmetData:Z.object},ua.defaultProps={defer:!0,encodeSpecialCharacters:!0,prioritizeSeoTags:!1},ua.displayName="Helmet";var Va={exports:{}},Pe={};/** 18 * @license React 19 * react-dom.production.js 20 * 21 * Copyright (c) Meta Platforms, Inc. and affiliates. 22 * 23 * This source code is licensed under the MIT license found in the 24 * LICENSE file in the root directory of this source tree. 25 */var ns;function Bo(){if(ns)return Pe;ns=1;var e=Vs();function a(l){var d="https://react.dev/errors/"+l;if(1<arguments.length){d+="?args[]="+encodeURIComponent(arguments[1]);for(var p=2;p<arguments.length;p++)d+="&args[]="+encodeURIComponent(arguments[p])}return"Minified React error #"+l+"; visit "+d+" for the full message or use the non-minified dev environment for full errors and additional helpful warnings."}function s(){}var r={d:{f:s,r:function(){throw Error(a(522))},D:s,C:s,L:s,m:s,X:s,S:s,M:s},p:0,findDOMNode:null},n=Symbol.for("react.portal");function o(l,d,p){var u=3<arguments.length&&arguments[3]!==void 0?arguments[3]:null;return{$$typeof:n,key:u==null?null:""+u,children:l,containerInfo:d,implementation:p}}var i=e.__CLIENT_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE;function c(l,d){if(l==="font")return"";if(typeof d=="string")return d==="use-credentials"?d:""}return Pe.__DOM_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE=r,Pe.createPortal=function(l,d){var p=2<arguments.length&&arguments[2]!==void 0?arguments[2]:null;if(!d||d.nodeType!==1&&d.nodeType!==9&&d.nodeType!==11)throw Error(a(299));return o(l,d,null,p)},Pe.flushSync=function(l){var d=i.T,p=r.p;try{if(i.T=null,r.p=2,l)return l()}finally{i.T=d,r.p=p,r.d.f()}},Pe.preconnect=function(l,d){typeof l=="string"&&(d?(d=d.crossOrigin,d=typeof d=="string"?d==="use-credentials"?d:"":void 0):d=null,r.d.C(l,d))},Pe.prefetchDNS=function(l){typeof l=="string"&&r.d.D(l)},Pe.preinit=function(l,d){if(typeof l=="string"&&d&&typeof d.as=="string"){var p=d.as,u=c(p,d.crossOrigin),f=typeof d.integrity=="string"?d.integrity:void 0,v=typeof d.fetchPriority=="string"?d.fetchPriority:void 0;p==="style"?r.d.S(l,typeof d.precedence=="string"?d.precedence:void 0,{crossOrigin:u,integrity:f,fetchPriority:v}):p==="script"&&r.d.X(l,{crossOrigin:u,integrity:f,fetchPriority:v,nonce:typeof d.nonce=="string"?d.nonce:void 0})}},Pe.preinitModule=function(l,d){if(typeof l=="string")if(typeof d=="object"&&d!==null){if(d.as==null||d.as==="script"){var p=c(d.as,d.crossOrigin);r.d.M(l,{crossOrigin:p,integrity:typeof d.integrity=="string"?d.integrity:void 0,nonce:typeof d.nonce=="string"?d.nonce:void 0})}}else d==null&&r.d.M(l)},Pe.preload=function(l,d){if(typeof l=="string"&&typeof d=="object"&&d!==null&&typeof d.as=="string"){var p=d.as,u=c(p,d.crossOrigin);r.d.L(l,p,{crossOrigin:u,integrity:typeof d.integrity=="string"?d.integrity:void 0,nonce:typeof d.nonce=="string"?d.nonce:void 0,type:typeof d.type=="string"?d.type:void 0,fetchPriority:typeof d.fetchPriority=="string"?d.fetchPriority:void 0,referrerPolicy:typeof d.referrerPolicy=="string"?d.referrerPolicy:void 0,imageSrcSet:typeof d.imageSrcSet=="string"?d.imageSrcSet:void 0,imageSizes:typeof d.imageSizes=="string"?d.imageSizes:void 0,media:typeof d.media=="string"?d.media:void 0})}},Pe.preloadModule=function(l,d){if(typeof l=="string")if(d){var p=c(d.as,d.crossOrigin);r.d.m(l,{as:typeof d.as=="string"&&d.as!=="script"?d.as:void 0,crossOrigin:p,integrity:typeof d.integrity=="string"?d.integrity:void 0})}else r.d.m(l)},Pe.requestFormReset=function(l){r.d.r(l)},Pe.unstable_batchedUpdates=function(l,d){return l(d)},Pe.useFormState=function(l,d,p){return i.H.useFormState(l,d,p)},Pe.useFormStatus=function(){return i.H.useHostTransitionStatus()},Pe.version="19.2.7",Pe}var os;function Fo(){if(os)return Va.exports;os=1;function e(){if(!(typeof __REACT_DEVTOOLS_GLOBAL_HOOK__>"u"||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!="function"))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(e)}catch(a){console.error(a)}}return e(),Va.exports=Bo(),Va.exports}var pr=Fo();const $o=Pt(pr),Ks=Hs({__proto__:null,default:$o},[pr]);/** 26 * @remix-run/router v1.23.3 27 * 28 * Copyright (c) Remix Software Inc. 29 * 30 * This source code is licensed under the MIT license found in the 31 * LICENSE.md file in the root directory of this source tree. 32 * 33 * @license MIT 34 */function ue(){return ue=Object.assign?Object.assign.bind():function(e){for(var a=1;a<arguments.length;a++){var s=arguments[a];for(var r in s)({}).hasOwnProperty.call(s,r)&&(e[r]=s[r])}return e},ue.apply(null,arguments)}var we;(function(e){e.Pop="POP",e.Push="PUSH",e.Replace="REPLACE"})(we||(we={}));const is="popstate";function Wo(e){e===void 0&&(e={});function a(r,n){let{pathname:o,search:i,hash:c}=r.location;return Ft("",{pathname:o,search:i,hash:c},n.state&&n.state.usr||null,n.state&&n.state.key||"default")}function s(r,n){return typeof n=="string"?n:pt(n)}return Vo(a,s,null,e)}function Q(e,a){if(e===!1||e===null||typeof e>"u")throw new Error(a)}function ht(e,a){if(!e){typeof console<"u"&&console.warn(a);try{throw new Error(a)}catch{}}}function Ho(){return Math.random().toString(36).substr(2,8)}function ls(e,a){return{usr:e.state,key:e.key,idx:a}}function Ft(e,a,s,r){return s===void 0&&(s=null),ue({pathname:typeof e=="string"?e:e.pathname,search:"",hash:""}
vendor: 2,249 bytes, line 34
34,typeof a=="string"?at(a):a,{state:s,key:a&&a.key||r||Ho()})}function pt(e){let{pathname:a="/",search:s="",hash:r=""}=e;return s&&s!=="?"&&(a+=s.charAt(0)==="?"?s:"?"+s),r&&r!=="#"&&(a+=r.charAt(0)==="#"?r:"#"+r),a}function at(e){let a={};if(e){let s=e.indexOf("#");s>=0&&(a.hash=e.substr(s),e=e.substr(0,s));let r=e.indexOf("?");r>=0&&(a.search=e.substr(r),e=e.substr(0,r)),e&&(a.pathname=e)}return a}function Vo(e,a,s,r){r===void 0&&(r={});let{window:n=document.defaultView,v5Compat:o=!1}=r,i=n.history,c=we.Pop,l=null,d=p();d==null&&(d=0,i.replaceState(ue({},i.state,{idx:d}),""));function p(){return(i.state||{idx:null}).idx}function u(){c=we.Pop;let T=p(),R=T==null?null:T-d;d=T,l&&l({action:c,location:w.location,delta:R})}function f(T,R){c=we.Push;let N=Ft(w.location,T,R);d=p()+1;let O=ls(N,d),M=w.createHref(N);try{i.pushState(O,"",M)}catch(K){if(K instanceof DOMException&&K.name==="DataCloneError")throw K;n.location.assign(M)}o&&l&&l({action:c,location:w.location,delta:1})}function v(T,R){c=we.Replace;let N=Ft(w.location,T,R);d=p();let O=ls(N,d),M=w.createHref(N);i.replaceState(O,"",M),o&&l&&l({action:c,location:w.location,delta:0})}function k(T){let R=n.location.origin!=="null"?n.location.origin:n.location.href,N=typeof T=="string"?T:pt(T);return N=N.replace(/ $/,"%20"),Q(R,"No window.location.(origin|href) available to create URL for href: "+N),new URL(N,R)}let w={get action(){return c},get location(){return e(n,i)},listen(T){if(l)throw new Error("A history only accepts one active listener");return n.addEventListener(is,u),l=T,()=>{n.removeEventListener(is,u),l=null}},createHref(T){return a(n,T)},createURL:k,encodeLocation(T){let R=k(T);return{pathname:R.pathname,search:R.search,hash:R.hash}},push:f,replace:v,go(T){return i.go(T)}};return w}var ne;(function(e){e.data="data",e.deferred="deferred",e.redirect="redirect",e.error="error"})(ne||(ne={}));const Go=new Set(["lazy","caseSensitive","path","id","index","children"]);function Yo(e){return e.index===!0}function ya(e,a,s,r){return s===void 0&&(s=[]),r===void 0&&(r={}),e.map((n,o)=>{let i=[...s,String(o)],c=typeof n.id=="string"?n.id:i.join("-");if(Q(n.index!==!0||!n.children,"Cannot specify children on an index route"),Q(!r[c],'Found a route id collision on i
34d "'+c+`". Route id's must be globally unique within Data Router usages`),Yo(n)){let l=ue({},n,a(n),{id:c});return r[c]=l,l}else{let l=ue({},n,a(n),{id:c,children:void 0});return r[c]=l,n.children&&(l.children=ya(n.children,a,i,r)),l}})}function et(e,a,s){return s===void 0&&(s="/"),ha(e,a,s,!1)}function ha(e,a,s,r){let n=typeof a=="string"?at(a):a,o=Ke(n.pathname||"/",s);if(o==null)return null;let i=Qs(e);Qo(i);let c=null,l=ii(o);for(let d=0;c==null&&d<i.length;++d)c=ni(i[d],l,r);return c}function Ko(e,a){let{route:s,pathname:r,params:n}=e;return{id:s.id,pathname:r,params:n,data:a[s.id],handle:s.handle}}function Qs(e,a,s,r){a===void 0&&(a=[]),s===void 0&&(s=[]),r===void 0&&(r="");let n=(o,i,c)=>{let l={relativePath:c===void 0?o.path||"":c,caseSensitive:o.caseSensitive===!0,childrenIndex:i,route:o};l.relativePath.startsWith("/")&&(Q(l.relativePath.startsWith(r),'Absolute route path "'+l.relativePath+'" nested under path '+('"'+r+'" is not valid. An absolute child route path ')+"must start with the combined path of all its parent routes."),l.relativePath=l.relativePath.slice(r.length));let d=Ye([r,l.relativePath]),p=s.concat(l);o.children&&o.children.length>0&&(Q(o.index!==!0,"Index routes must not have child routes. Please remove "+('all child routes from route path "'+d+'".')),Qs(o.children,a,p,d)),!(o.path==null&&!o.index)&&a.push({path:d,score:ri(d,o.index),routesMeta:p})};return e.forEach((o,i)=>{var c;if(o.path===""||!((c=o.path)!=null&&c.includes("?")))n(o,i);else for(let l of Js(o.path))n(o,i,l)}),a}function Js(e){let a=e.split("/");if(a.length===0)return[];let[s,...r]=a,n=s.endsWith("?"),o=s.replace(/\?$/,"");if(r.length===0)return n?[o,""]:[o];let i=Js(r.join("/")),c=[];return c.push(...i.map(l=>l===""?o:[o,l].join("/"))),n&&c.push(...i),c.map(l=>e.startsWith("/")&&l===""?"/":l)}function Qo(e){e.sort((a,s)=>a.score!==s.score?s.score-a.score:si(a.routesMeta.map(r=>r.childrenIndex),s.routesMeta.map(r=>r.childrenIndex)))}const Jo=/^:[\w-]+$/,Zo=3,Xo=2,ei=1,ti=10,ai=-2,ds=e=>e==="*";function ri(e,a){let s=e.split("/"),r=s.length;return s.some(ds)&&(r+=ai),a&&(r+=Xo),s.filter(n=>!ds(n)).reduce((n,o)=>n+(Jo.test(o)?Zo:o===""?ei:ti),r)}function si(e,a){return e.length===a.length&&e.slice(0,-1).every((r,n)=>r===a[n])?e[e.length-1]-a[a.length-1]:0}function ni(e,a,s){s===void 0&&(s=!1);let{routesMeta:r}=e,n={},o="/",i=[];for(let c=0;c<r.length;++c){let l=r[c],d=c===r.length-1,p=o==="/"?a:a.slice(o.length)||"/",u=xa({path:l.relativePath,caseSensitive:l.caseSensitive,end:d},p),f=l.route;if(!u&&d&&s&&!r[r.length-1].route.index&&(u=xa({path:l.relativePath,caseSensitive:l.caseSensitive,end:!1},p)),!u)return null;
vendor: 1,641 bytes, line 34
34Object.assign(n,u.params),i.push({params:n,pathname:Ye([o,u.pathname]),pathnameBase:ui(Ye([o,u.pathnameBase])),route:f}),u.pathnameBase!=="/"&&(o=Ye([o,u.pathnameBase]))}return i}function xa(e,a){typeof e=="string"&&(e={path:e,caseSensitive:!1,end:!0});let[s,r]=oi(e.path,e.caseSensitive,e.end),n=a.match(s);if(!n)return null;let o=n[0],i=o.replace(/(.)\/+$/,"$1"),c=n.slice(1);return{params:r.reduce((d,p,u)=>{let{paramName:f,isOptional:v}=p;if(f==="*"){let w=c[u]||"";i=o.slice(0,o.length-w.length).replace(/(.)\/+$/,"$1")}const k=c[u];return v&&!k?d[f]=void 0:d[f]=(k||"").replace(/%2F/g,"/"),d},{}),pathname:o,pathnameBase:i,pattern:e}}function oi(e,a,s){a===void 0&&(a=!1),s===void 0&&(s=!0),ht(e==="*"||!e.endsWith("*")||e.endsWith("/*"),'Route path "'+e+'" will be treated as if it were '+('"'+e.replace(/\*$/,"/*")+'" because the `*` character must ')+"always follow a `/` in the pattern. To get rid of this warning, "+('please change the route path to "'+e.replace(/\*$/,"/*")+'".'));let r=[],n="^"+e.replace(/\/*\*?$/,"").replace(/^\/*/,"/").replace(/[\\.*+^${}|()[\]]/g,"\\$&").replace(/\/:([\w-]+)(\?)?/g,(i,c,l)=>(r.push({paramName:c,isOptional:l!=null}),l?"/?([^\\/]+)?":"/([^\\/]+)"));return e.endsWith("*")?(r.push({paramName:"*"}),n+=e==="*"||e==="/*"?"(.*)$":"(?:\\/(.+)|\\/*)$"):s?n+="\\/*$":e!==""&&e!=="/"&&(n+="(?:(?=\\/|$))"),[new RegExp(n,a?void 0:"i"),r]}function ii(e){try{return e.split("/").map(a=>decodeURIComponent(a).replace(/\//g,"%2F")).join("/")}catch(a){return ht(!1,'The URL path "'+e+'" could not be decoded because it is is a malformed URL segment. This is probably due to a bad percent '+("encoding ("+
vendor: 51,400 bytes, lines 34-53
34a+").")),e}}function Ke(e,a){if(a==="/")return e;if(!e.toLowerCase().startsWith(a.toLowerCase()))return null;let s=a.endsWith("/")?a.length-1:a.length,r=e.charAt(s);return r&&r!=="/"?null:e.slice(s)||"/"}const li=/^(?:[a-z][a-z0-9+.-]*:|\/\/)/i,di=e=>li.test(e);function ci(e,a){a===void 0&&(a="/");let{pathname:s,search:r="",hash:n=""}=typeof e=="string"?at(e):e,o;if(s)if(di(s))o=s;else{if(s.includes("//")){let i=s;s=gr(s),ht(!1,"Pathnames cannot have embedded double slashes - normalizing "+(i+" -> "+s))}s.startsWith("/")?o=cs(s.substring(1),"/"):o=cs(s,a)}else o=a;return{pathname:o,search:hi(r),hash:pi(n)}}function cs(e,a){let s=a.replace(/\/+$/,"").split("/");return e.split("/").forEach(n=>{n===".."?s.length>1&&s.pop():n!=="."&&s.push(n)}),s.length>1?s.join("/"):"/"}function Ga(e,a,s,r){return"Cannot include a '"+e+"' character in a manually specified "+("`to."+a+"` field ["+JSON.stringify(r)+"]. Please separate it out to the ")+("`to."+s+"` field. Alternatively you may provide the full path as ")+'a string in <Link to="..."> and the router will parse it for you.'}function Zs(e){return e.filter((a,s)=>s===0||a.route.path&&a.route.path.length>0)}function mr(e,a){let s=Zs(e);return a?s.map((r,n)=>n===s.length-1?r.pathname:r.pathnameBase):s.map(r=>r.pathnameBase)}function fr(e,a,s,r){r===void 0&&(r=!1);let n;typeof e=="string"?n=at(e):(n=ue({},e),Q(!n.pathname||!n.pathname.includes("?"),Ga("?","pathname","search",n)),Q(!n.pathname||!n.pathname.includes("#"),Ga("#","pathname","hash",n)),Q(!n.search||!n.search.includes("#"),Ga("#","search","hash",n)));let o=e===""||n.pathname==="",i=o?"/":n.pathname,c;if(i==null)c=s;else{let u=a.length-1;if(!r&&i.startsWith("..")){let f=i.split("/");for(;f[0]==="..";)f.shift(),u-=1;n.pathname=f.join("/")}c=u>=0?a[u]:"/"}let l=ci(n,c),d=i&&i!=="/"&&i.endsWith("/"),p=(o||i===".")&&s.endsWith("/");return!l.pathname.endsWith("/")&&(d||p)&&(l.pathname+="/"),l}const gr=e=>e.replace(/\/\/+/g,"/"),Ye=e=>gr(e.join("/")),ui=e=>e.replace(/\/+$/,"").replace(/^\/*/,"/"),hi=e=>!e||e==="?"?"":e.startsWith("?")?e:"?"+e,pi=e=>!e||e==="#"?"":e.startsWith("#")?e:"#"+e;class ba{constructor(a,s,r,n){n===void 0&&(n=!1),this.status=a,this.statusText=s||"",this.internal=n,r instanceof Error?(this.data=r.toString(),this.error=r):this.data=r}}function $t(e){return e!=null&&typeof e.status=="number"&&typeof e.statusText=="string"&&typeof e.internal=="boolean"&&"data"in e}const Xs=["post","put","patch","delete"],mi=new Set(Xs),fi=["get",...Xs],gi=new Set(fi),yi=new Set([301,302,303,307,308]),xi=new Set([307,308]),Ya={state:"idle",location:void 0,formMethod:void 0,formAction:void 0,formEncType:void 0,formData:void 0,json:void 0,text:void 0},bi={state:"idle",data:void 0,formMethod:void 0,formAction:void 0,formEncType:void 0,formData:void 0,json:void 0,text:void 0},It={state:"unblocked",proceed:void 0,reset:void 0,location:void 0},yr=/^(?:[a-z][a-z0-9+.-]*:|\/\/)/i,vi=e=>({hasErrorBoundary:!!e.hasErrorBoundary}),en="remix-router-transitions";function wi(e){const a=e.window?e.window:typeof window<"u"?window:void 0,s=typeof a<"u"&&typeof a.document<"u"&&typeof a.document.createElement<"u",r=!s;Q(e.routes.length>0,"You must provide a non-empty routes array to createRouter");let n;if(e.mapRouteProperties)n=e.mapRouteProperties;else if(e.detectErrorBoundary){let h=e.detectErrorBoundary;n=g=>({hasErrorBoundary:h(g)})}else n=vi;let o={},i=ya(e.routes,n,void 0,o),c,l=e.basename||"/",d=e.dataStrategy||Ni,p=e.patchRoutesOnNavigation,u=ue({v7_fetcherPersist:!1,v7_normalizeFormMethod:!1,v7_partialHydration:!1,v7_prependBasename:!1,v7_relativeSplatPath:!1,v7_skipActionErrorRevalidation:!1},e.future),f=null,v=new Set,k=null,w=null,T=null,R=e.hydrationData!=null,N=et(i,e.history.location,l),O=!1,M=null;if(N==null&&!p){let h=qe(404,{pathname:e.history.location.pathname}),{matches:g,route:x}=ws(i);N=g,M={[x.id]:h}}N&&!e.hydrationData&&Xt(N,i,e.history.location.pathname).active&&(N=null);let K;if(N)if(N.some(h=>h.route.lazy))K=!1;else if(!N.some(h=>h.route.loader))K=!0;else if(u.v7_partialHydration){let h=e.hydrationData?e.hydrationData.loaderData:null,g=e.hydrationData?e.hydrationData.errors:null;if(g){let x=N.findIndex(j=>g[j.route.id]!==void 0);K=N.slice(0,x+1).every(j=>!rr(j.route,h,g))}else K=N.every(x=>!rr(x.route,h,g))}else K=e.hydrationData!=null;else if(K=!1,N=[],u.v7_partialHydration){let h=Xt(null,i,e.history.location.pathname);h.active&&h.matches&&(O=!0,N=h.matches)}let be,y={historyAction:e.history.action,location:e.history.location,matches:N,initialized:K,navigation:Ya,restoreScrollPosition:e.hydrationData!=null?!1:null,preventScrollReset:!1,revalidation:"idle",loaderData:e.hydrationData&&e.hydrationData.loaderData||{},actionData:e.hydrationData&&e.hydrationData.actionData||null,errors:e.hydrationData&&e.hydrationData.errors||M,fetchers:new Map,blockers:new Map},D=we.Pop,ee=!1,H,ie=!1,le=new Map,ke=null,ge=!1,Oe=!1,Re=[],L=new Set,q=new Map,de=0,ye=-1,m=new Map,S=new Set,B=new Map,F=new Map,G=new Set,J=new Map,te=new Map,Le;function Te(){if(f=e.history.listen(h=>{let{action:g,location:x,delta:j}=h;if(Le){Le(),Le=void 0;return}ht(te.size===0||j!=null,"You are trying to use a blocker on a POP navigation to a location that was not created by @remix-run/router. This will fail silently in production. This can happen if you are navigating outside the router via `window.history.pushState`/`window.location.hash` instead of using router navigation APIs. This can also happen if you are using createHashRouter and the user manually changes the URL.");let P=Dr({currentLocation:y.location,nextLocation:x,historyAction:g});if(P&&j!=null){let _=new Promise($=>{Le=$});e.history.go(j*-1),Zt(P,{state:"blocked",location:x,proceed(){Zt(P,{state:"proceeding",proceed:void 0,reset:void 0,location:x}),_.then(()=>e.history.go(j))},reset(){let $=new Map(y.blockers);$.set(P,It),Ce({blockers:$})}});return}return ot(g,x)}),s){Mi(a,le);let h=()=>zi(a,le);a.addEventListener("pagehide",h),ke=()=>a.removeEventListener("pagehide",h)}return y.initialized||ot(we.Pop,y.location,{initialHydration:!0}),be}function La(){f&&f(),ke&&ke(),v.clear(),H&&H.abort(),y.fetchers.forEach((h,g)=>Jt(g)),y.blockers.forEach((h,g)=>_r(g))}function Qn(h){return v.add(h),()=>v.delete(h)}function Ce(h,g){g===void 0&&(g={}),y=ue({},y,h);let x=[],j=[];u.v7_fetcherPersist&&y.fetchers.forEach((P,_)=>{P.state==="idle"&&(G.has(_)?j.push(_):x.push(_))}),G.forEach(P=>{!y.fetchers.has(P)&&!q.has(P)&&j.push(P)}),[...v].forEach(P=>P(y,{deletedFetchers:j,viewTransitionOpts:g.viewTransitionOpts,flushSync:g.flushSync===!0})),u.v7_fetcherPersist?(x.forEach(P=>y.fetchers.delete(P)),j.forEach(P=>Jt(P))):j.forEach(P=>G.delete(P))}function gt(h,g,x){var j,P;let{flushSync:_}=x===void 0?{}:x,$=y.actionData!=null&&y.navigation.formMethod!=null&&Be(y.navigation.formMethod)&&y.navigation.state==="loading"&&((j=h.state)==null?void 0:j._isRedirect)!==!0,C;g.actionData?Object.keys(g.actionData).length>0?C=g.actionData:C=null:$?C=y.actionData:C=null;let E=g.loaderData?bs(y.loaderData,g.loaderData,g.matches||[],g.errors):y.loaderData,A=y.blockers;A.size>0&&(A=new Map(A),A.forEach((X,Ne)=>A.set(Ne,It)));let U=ee===!0||y.navigation.formMethod!=null&&Be(y.navigation.formMethod)&&((P=h.state)==null?void 0:P._isRedirect)!==!0;c&&(i=c,c=void 0),ge||D===we.Pop||(D===we.Push?e.history.push(h,h.state):D===we.Replace&&e.history.replace(h,h.state));let Y;if(D===we.Pop){let X=le.get(y.location.pathname);X&&X.has(h.pathname)?Y={currentLocation:y.location,nextLocation:h}:le.has(h.pathname)&&(Y={currentLocation:h,nextLocation:y.location})}else if(ie){let X=le.get(y.location.pathname);X?X.add(h.pathname):(X=new Set([h.pathname]),le.set(y.location.pathname,X)),Y={currentLocation:y.location,nextLocation:h}}Ce(ue({},g,{actionData:C,loaderData:E,historyAction:D,location:h,initialized:!0,navigation:Ya,revalidation:"idle",restoreScrollPosition:zr(h,g.matches||y.matches),preventScrollReset:U,blockers:A}),{viewTransitionOpts:Y,flushSync:_===!0}),D=we.Pop,ee=!1,ie=!1,ge=!1,Oe=!1,Re=[]}async function Cr(h,g){if(typeof h=="number"){e.history.go(h);return}let x=ar(y.location,y.matches,l,u.v7_prependBasename,h,u.v7_relativeSplatPath,g==null?void 0:g.fromRouteId,g==null?void 0:g.relative),{path:j,submission:P,error:_}=us(u.v7_normalizeFormMethod,!1,x,g),$=y.location,C=Ft(y.location,j,g&&g.state);C=ue({},C,e.history.encodeLocation(C));let E=g&&g.replace!=null?g.replace:void 0,A=we.Push;E===!0?A=we.Replace:E===!1||P!=null&&Be(P.formMethod)&&P.formAction===y.location.pathname+y.location.search&&(A=we.Replace);let U=g&&"preventScrollReset"in g?g.preventScrollReset===!0:void 0,Y=(g&&g.flushSync)===!0,X=Dr({currentLocation:$,nextLocation:C,historyAction:A});if(X){Zt(X,{state:"blocked",location:C,proceed(){Zt(X,{state:"proceeding",proceed:void 0,reset:void 0,location:C}),Cr(h,g)},reset(){let Ne=new Map(y.blockers);Ne.set(X,It),Ce({blockers:Ne})}});return}return await ot(A,C,{submission:P,pendingError:_,preventScrollReset:U,replace:g&&g.replace,enableViewTransition:g&&g.viewTransition,flushSync:Y})}function Jn(){if(Ca(),Ce({revalidation:"loading"}),y.navigation.state!=="submitting"){if(y.navigation.state==="idle"){ot(y.historyAction,y.location,{startUninterruptedRevalidation:!0});return}ot(D||y.historyAction,y.navigation.location,{overrideNavigation:y.navigation,enableViewTransition:ie===!0})}}async function ot(h,g,x){H&&H.abort(),H=null,D=h,ge=(x&&x.startUninterruptedRevalidation)===!0,io(y.location,y.matches),ee=(x&&x.preventScrollReset)===!0,ie=(x&&x.enableViewTransition)===!0;let j=c||i,P=x&&x.overrideNavigation,_=x!=null&&x.initialHydration&&y.matches&&y.matches.length>0&&!O?y.matches:et(j,g,l),$=(x&&x.flushSync)===!0;if(_&&y.initialized&&!Oe&&qi(y.location,g)&&!(x&&x.submission&&Be(x.submission.formMethod))){gt(g,{matches:_},{flushSync:$});return}let C=Xt(_,j,g.pathname);if(C.active&&C.matches&&(_=C.matches),!_){let{error:ce,notFoundMatches:se,route:pe}=qa(g.pathname);gt(g,{matches:se,loaderData:{},errors:{[pe.id]:ce}},{flushSync:$});return}H=new AbortController;let E=wt(e.history,g,H.signal,x&&x.submission),A;if(x&&x.pendingError)A=[dt(_).route.id,{type:ne.error,error:x.pendingError}];else if(x&&x.submission&&Be(x.submission.formMethod)){let ce=await Zn(E,g,x.submission,_,C.active,{replace:x.replace,flushSync:$});if(ce.shortCircuited)return;if(ce.pendingActionResult){let[se,pe]=ce.pendingActionResult;if(Ue(pe)&&$t(pe.error)&&pe.error.status===404){H=null,gt(g,{matches:ce.matches,loaderData:{},errors:{[se]:pe.error}});return}}_=ce.matches||_,A=ce.pendingActionResult,P=Ka(g,x.submission),$=!1,C.active=!1,E=wt(e.history,E.url,E.signal)}let{shortCircuited:U,matches:Y,loaderData:X,errors:Ne}=await Xn(E,g,_,C.active,P,x&&x.submission,x&&x.fetcherSubmission,x&&x.replace,x&&x.initialHydration===!0,$,A);U||(H=null,gt(g,ue({matches:Y||_},vs(A),{loaderData:X,errors:Ne})))}async function Zn(h,g,x,j,P,_){_===void 0&&(_={}),Ca();let $=_i(g,x);if(Ce({navigation:$},{flushSync:_.flushSync===!0}),P){let A=await ea(j,g.pathname,h.signal);if(A.type==="aborted")return{shortCircuited:!0};if(A.type==="error"){let U=dt(A.partialMatches).route.id;return{matches:A.partialMatches,pendingActionResult:[U,{type:ne.error,error:A.error}]}}else if(A.matches)j=A.matches;else{let{notFoundMatches:U,error:Y,route:X}=qa(g.pathname);return{matches:U,pendingActionResult:[X.id,{type:ne.error,error:Y}]}}}let C,E=Mt(j,g);if(!E.route.action&&!E.route.lazy)C={type:ne.error,error:qe(405,{method:h.method,pathname:g.pathname,routeId:E.route.id})};else if(C=(await Lt("action",y,h,[E],j,null))[E.route.id],h.signal.aborted)return{shortCircuited:!0};if(ct(C)){let A;return _&&_.replace!=null?A=_.replace:A=gs(C.response.headers.get("Location"),new URL(h.url),l,e.history)===y.location.pathname+y.location.search,await it(h,C,!0,{submission:x,replace:A}),{shortCircuited:!0}}if(tt(C))throw qe(400,{type:"defer-action"});if(Ue(C)){let A=dt(j,E.route.id);return(_&&_.replace)!==!0&&(D=we.Push),{matches:j,pendingActionResult:[A.route.id,C]}}return{matches:j,pendingActionResult:[E.route.id,C]}}async function Xn(h,g,x,j,P,_,$,C,E,A,U){let Y=P||Ka(g,_),X=_||$||js(Y),Ne=!ge&&(!u.v7_partialHydration||!E);if(j){if(Ne){let me=qr(U);Ce(ue({navigation:Y},me!==void 0?{actionData:me}:{}),{flushSync:A})}let re=await ea(x,g.pathname,h.signal);if(re.type==="aborted")return{shortCircuited:!0};if(re.type==="error"){let me=dt(re.partialMatches).route.id;return{matches:re.partialMatches,loaderData:{},errors:{[me]:re.error}}}else if(re.matches)x=re.matches;else{let{error:me,notFoundMatches:xt,route:Et}=qa(g.pathname);return{matches:xt,loaderData:{},errors:{[Et.id]:me}}}}let ce=c||i,[se,pe]=ps(e.history,y,x,X,g,u.v7_partialHydration&&E===!0,u.v7_skipActionErrorRevalidation,Oe,Re,L,G,B,S,ce,l,U);if(Ea(re=>!(x&&x.some(me=>me.route.id===re))||se&&se.some(me=>me.route.id===re)),ye=++de,se.length===0&&pe.length===0){let re=Ur();return gt(g,ue({matches:x,loaderData:{},errors:U&&Ue(U[1])?{[U[0]]:U[1].error}:null},vs(U),re?{fetchers:new Map(y.fetchers)}:{}),{flushSync:A}),{shortCircuited:!0}}if(Ne){let re={};if(!j){re.navigation=Y;let me=qr(U);me!==void 0&&(re.actionData=me)}pe.length>0&&(re.fetchers=eo(pe)),Ce(re,{flushSync:A})}pe.forEach(re=>{Ze(re.key),re.controller&&q.set(re.key,re.controller)});let yt=()=>pe.forEach(re=>Ze(re.key));H&&H.signal.addEventListener("abort",yt);let{loaderResults:Ct,fetcherResults:Ve}=await Er(y,x,se,pe,h);if(h.signal.aborted)return{shortCircuited:!0};H&&H.signal.removeEventListener("abort",yt),pe.forEach(re=>q.delete(re.key));let Fe=sa(Ct);if(Fe)return await it(h,Fe.result,!0,{replace:C}),{shortCircuited:!0};if(Fe=sa(Ve),Fe)return S.add(Fe.key),await it(h,Fe.result,!0,{replace:C}),{shortCircuited:!0};let{loaderData:Oa,errors:qt}=xs(y,x,Ct,U,pe,Ve,J);J.forEach((re,me)=>{re.subscribe(xt=>{(xt||re.done)&&J.delete(me)})}),u.v7_partialHydration&&E&&y.errors&&(qt=ue({},y.errors,qt));let lt=Ur(),ta=Ir(ye),aa=lt||ta||pe.length>0;return ue({matches:x,loaderData:Oa,errors:qt},aa?{fetchers:new Map(y.fetchers)}:{})}function qr(h){if(h&&!Ue(h[1]))return{[h[0]]:h[1].data};if(y.actionData)return Object.keys(y.actionData).length===0?null:y.actionData}function eo(h){return h.forEach(g=>{let x=y.fetchers.get(g.key),j=_t(void 0,x?x.data:void 0);y.fetchers.set(g.key,j)}),new Map(y.fetchers)}function to(h,g,x,j){if(r)throw new Error("router.fetch() was called during the server render, but it shouldn't be. You are likely calling a useFetcher() method in the body of your component. Try moving it to a useEffect or a callback.");Ze(h);let P=(j&&j.flushSync)===!0,_=c||i,$=ar(y.location,y.matches,l,u.v7_prependBasename,x,u.v7_relativeSplatPath,g,j==null?void 0:j.relative),C=et(_,$,l),E=Xt(C,_,$);if(E.active&&E.matches&&(C=E.matches),!C){He(h,g,qe(404,{pathname:$}),{flushSync:P});return}let{path:A,submission:U,error:Y}=us(u.v7_normalizeFormMethod,!0,$,j);if(Y){He(h,g,Y,{flushSync:P});return}let X=Mt(C,A),Ne=(j&&j.preventScrollReset)===!0;if(U&&Be(U.formMethod)){ao(h,g,A,X,C,E.active,P,Ne,U);return}B.set(h,{routeId:g,path:A}),ro(h,g,A,X,C,E.active,P,Ne,U)}async function ao(h,g,x,j,P,_,$,C,E){Ca(),B.delete(h);function A(ve){if(!ve.route.action&&!ve.route.lazy){let bt=qe(405,{method:E.formMethod,pathname:x,routeId:g});return He(h,g,bt,{flushSync:$}),!0}return!1}if(!_&&A(j))return;let U=y.fetchers.get(h);Je(h,Di(E,U),{flushSync:$});let Y=new AbortController,X=wt(e.history,x,Y.signal,E);if(_){let ve=await ea(P,new URL(X.url).pathname,X.signal,h);if(ve.type==="aborted")return;if(ve.type==="error"){He(h,g,ve.error,{flushSync:$});return}else if(ve.matches){if(P=ve.matches,j=Mt(P,x),A(j))return}else{He(h,g,qe(404,{pathname:x}),{flushSync:$});return}}q.set(h,Y);let Ne=de,se=(await Lt("action",y,X,[j],P,h))[j.route.id];if(X.signal.aborted){q.get(h)===Y&&q.delete(h);return}if(u.v7_fetcherPersist&&G.has(h)){if(ct(se)||Ue(se)){Je(h,Xe(void 0));return}}else{if(ct(se))if(q.delete(h),ye>Ne){Je(h,Xe(void 0));return}else return S.add(h),Je(h,_t(E)),it(X,se,!1,{fetcherSubmission:E,preventScrollReset:C});if(Ue(se)){He(h,g,se.error);return}}if(tt(se))throw qe(400,{type:"defer-action"});let pe=y.navigation.location||y.location,yt=wt(e.history,pe,Y.signal),Ct=c||i,Ve=y.navigation.state!=="idle"?et(Ct,y.navigation.location,l):y.matches;Q(Ve,"Didn't find any matches after fetcher action");let Fe=++de;m.set(h,Fe);let Oa=_t(E,se.data);y.fetchers.set(h,Oa);let[qt,lt]=ps(e.history,y,Ve,E,pe,!1,u.v7_skipActionErrorRevalidation,Oe,Re,L,G,B,S,Ct,l,[j.route.id,se]);lt.filter(ve=>ve.key!==h).forEach(ve=>{let bt=ve.key,Br=y.fetchers.get(bt),uo=_t(void 0,Br?Br.data:void 0);y.fetchers.set(bt,uo),Ze(bt),ve.controller&&q.set(bt,ve.controller)}),Ce({fetchers:new Map(y.fetchers)});let ta=()=>lt.forEach(ve=>Ze(ve.key));Y.signal.addEventListener("abort",ta);let{loaderResults:aa,fetcherResults:re}=await Er(y,Ve,qt,lt,yt);if(Y.signal.aborted)return;Y.signal.removeEventListener("abort",ta),m.delete(h),q.delete(h),lt.forEach(ve=>q.delete(ve.key));let me=sa(aa);if(me)return it(yt,me.result,!1,{preventScrollReset:C});if(me=sa(re),me)return S.add(me.key),it(yt,me.result,!1,{preventScrollReset:C});let{loaderData:xt,errors:Et}=xs(y,Ve,aa,void 0,lt,re,J);if(y.fetchers.has(h)){let ve=Xe(se.data);y.fetchers.set(h,ve)}Ir(Fe),y.navigation.state==="loading"&&Fe>ye?(Q(D,"Expected pending action"),H&&H.abort(),gt(y.navigation.location,{matches:Ve,loaderData:xt,errors:Et,fetchers:new Map(y.fetchers)})):(Ce({errors:Et,loaderData:bs(y.loaderData,xt,Ve,Et),fetchers:new Map(y.fetchers)}),Oe=!1)}async function ro(h,g,x,j,P,_,$,C,E){let A=y.fetchers.get(h);Je(h,_t(E,A?A.data:void 0),{flushSync:$});let U=new AbortController,Y=wt(e.history,x,U.signal);if(_){let se=await ea(P,new URL(Y.url).pathname,Y.signal,h);if(se.type==="aborted")return;if(se.type==="error"){He(h,g,se.error,{flushSync:$});return}else if(se.matches)P=se.matches,j=Mt(P,x);else{He(h,g,qe(404,{pathname:x}),{flushSync:$});return}}q.set(h,U);let X=de,ce=(await Lt("loader",y,Y,[j],P,h))[j.route.id];if(tt(ce)&&(ce=await xr(ce,Y.signal,!0)||ce),q.get(h)===U&&q.delete(h),!Y.signal.aborted){if(G.has(h)){Je(h,Xe(void 0));return}if(ct(ce))if(ye>X){Je(h,Xe(void 0));return}else{S.add(h),await it(Y,ce,!1,{preventScrollReset:C});return}if(Ue(ce)){He(h,g,ce.error);return}Q(!tt(ce),"Unhandled fetcher deferred data"),Je(h,Xe(ce.data))}}async function it(h,g,x,j){let{submission:P,fetcherSubmission:_,preventScrollReset:$,replace:C}=j===void 0?{}:j;g.response.headers.has("X-Remix-Revalidate")&&(Oe=!0);let E=g.response.headers.get("Location");Q(E,"Expected a Location header on the redirect Response"),E=gs(E,new URL(h.url),l,e.history);let A=Ft(y.location,E,{_isRedirect:!0});if(s){let se=!1;if(g.response.headers.has("X-Remix-Reload-Document"))se=!0;else if(yr.test(E)){const pe=e.history.createURL(E);se=pe.origin!==a.location.origin||Ke(pe.pathname,l)==null}if(se){C?a.location.replace(E):a.location.assign(E);return}}H=null;let U=C===!0||g.response.headers.has("X-Remix-Replace")?we.Replace:we.Push,{formMethod:Y,formAction:X,formEncType:Ne}=y.navigation;!P&&!_&&Y&&X&&Ne&&(P=js(y.navigation));let ce=P||_;if(xi.has(g.response.status)&&ce&&Be(ce.formMethod))await ot(U,A,{submission:ue({},ce,{formAction:E}),preventScrollReset:$||ee,enableViewTransition:x?ie:void 0});else{let se=Ka(A,P);await ot(U,A,{overrideNavigation:se,fetcherSubmission:_,preventScrollReset:$||ee,enableViewTransition:x?ie:void 0})}}async function Lt(h,g,x,j,P,_){let $,C={};try{$=await Ti(d,h,g,x,j,P,_,o,n)}catch(E){return j.forEach(A=>{C[A.route.id]={type:ne.error,error:E}}),C}for(let[E,A]of Object.entries($))if(Ei(A)){let U=A.result;C[E]={type:ne.redirect,response:Li(U,x,E,P,l,u.v7_relativeSplatPath)}}else C[E]=await Ai(A);return C}async function Er(h,g,x,j,P){let _=h.matches,$=Lt("loader",h,P,x,g,null),C=Promise.all(j.map(async U=>{if(U.matches&&U.match&&U.controller){let X=(await Lt("loader",h,wt(e.history,U.path,U.controller.signal),[U.match],U.matches,U.key))[U.match.route.id];return{[U.key]:X}}else return Promise.resolve({[U.key]:{type:ne.error,error:qe(404,{pathname:U.path})}})})),E=await $,A=(await C).reduce((U,Y)=>Object.assign(U,Y),{});return await Promise.all([Ui(g,E,P.signal,_,h.loaderData),Ii(g,A,j)]),{loaderResults:E,fetcherResults:A}}function Ca(){Oe=!0,Re.push(...Ea()),B.forEach((h,g)=>{q.has(g)&&L.add(g),Ze(g)})}function Je(h,g,x){x===void 0&&(x={}),y.fetchers.set(h,g),Ce({fetchers:new Map(y.fetchers)},{flushSync:(x&&x.flushSync)===!0})}function He(h,g,x,j){j===void 0&&(j={});let P=dt(y.matches,g);Jt(h),Ce({errors:{[P.route.id]:x},fetchers:new Map(y.fetchers)},{flushSync:(j&&j.flushSync)===!0})}function Or(h){return F.set(h,(F.get(h)||0)+1),G.has(h)&&G.delete(h),y.fetchers.get(h)||bi}function Jt(h){let g=y.fetchers.get(h);q.has(h)&&!(g&&g.state==="loading"&&m.has(h))&&Ze(h),B.delete(h),m.delete(h),S.delete(h),u.v7_fetcherPersist&&G.delete(h),L.delete(h),y.fetchers.delete(h)}function so(h){let g=(F.get(h)||0)-1;g<=0?(F.delete(h),G.add(h),u.v7_fetcherPersist||Jt(h)):F.set(h,g),Ce({fetchers:new Map(y.fetchers)})}function Ze(h){let g=q.get(h);g&&(g.abort(),q.delete(h))}function Rr(h){for(let g of h){let x=Or(g),j=Xe(x.data);y.fetchers.set(g,j)}}function Ur(){let h=[],g=!1;for(let x of S){let j=y.fetchers.get(x);Q(j,"Expected fetcher: "+x),j.state==="loading"&&(S.delete(x),h.push(x),g=!0)}return Rr(h),g}function Ir(h){let g=[];for(let[x,j]of m)if(j<h){let P=y.fetchers.get(x);Q(P,"Expected fetcher: "+x),P.state==="loading"&&(Ze(x),m.delete(x),g.push(x))}return Rr(g),g.length>0}function no(h,g){let x=y.blockers.get(h)||It;return te.get(h)!==g&&te.set(h,g),x}function _r(h){y.blockers.delete(h),te.delete(h)}function Zt(h,g){let x=y.blockers.get(h)||It;Q(x.state==="unblocked"&&g.state==="blocked"||x.state==="blocked"&&g.state==="blocked"||x.state==="blocked"&&g.state==="proceeding"||x.state==="blocked"&&g.state==="unblocked"||x.state==="proceeding"&&g.state==="unblocked","Invalid blocker state transition: "+x.state+" -> "+g.state);let j=new Map(y.blockers);j.set(h,g),Ce({blockers:j})}function Dr(h){let{currentLocation:g,nextLocation:x,historyAction:j}=h;if(te.size===0)return;te.size>1&&ht(!1,"A router only supports one blocker at a time");let P=Array.from(te.entries()),[_,$]=P[P.length-1],C=y.blockers.get(_);if(!(C&&C.state==="proceeding")&&$({currentLocation:g,nextLocation:x,historyAction:j}))return _}function qa(h){let g=qe(404,{pathname:h}),x=c||i,{matches:j,route:P}=ws(x);return Ea(),{notFoundMatches:j,route:P,error:g}}function Ea(h){let g=[];return J.forEach((x,j)=>{(!h||h(j))&&(x.cancel(),g.push(j),J.delete(j))}),g}function oo(h,g,x){if(k=h,T=g,w=x||null,!R&&y.navigation===Ya){R=!0;let j=zr(y.location,y.matches);j!=null&&Ce({restoreScrollPosition:j})}return()=>{k=null,T=null,w=null}}function Mr(h,g){return w&&w(h,g.map(j=>Ko(j,y.loaderData)))||h.key}function io(h,g){if(k&&T){let x=Mr(h,g);k[x]=T()}}function zr(h,g){if(k){let x=Mr(h,g),j=k[x];if(typeof j=="number")return j}return null}function Xt(h,g,x){if(p)if(h){if(Object.keys(h[0].params).length>0)return{active:!0,matches:ha(g,x,l,!0)}}else return{active:!0,matches:ha(g,x,l,!0)||[]};return{active:!1,matches:null}}async function ea(h,g,x,j){if(!p)return{type:"success",matches:h};let P=h;for(;;){let _=c==null,$=c||i,C=o;try{await p({signal:x,path:g,matches:P,fetcherKey:j,patch:(U,Y)=>{x.aborted||fs(U,Y,$,C,n)}})}catch(U){return{type:"error",error:U,partialMatches:P}}finally{_&&!x.aborted&&(i=[...i])}if(x.aborted)return{type:"aborted"};let E=et($,g,l);if(E)return{type:"success",matches:E};let A=ha($,g,l,!0);if(!A||P.length===A.length&&P.every((U,Y)=>U.route.id===A[Y].route.id))return{type:"success",matches:null};P=A}}function lo(h){o={},c=ya(h,n,void 0,o)}function co(h,g){let x=c==null;fs(h,g,c||i,o,n),x&&(i=[...i],Ce({}))}return be={get basename(){return l},get future(){return u},get state(){return y},get routes(){return i},get window(){return a},initialize:Te,subscribe:Qn,enableScrollRestoration:oo,navigate:Cr,fetch:to,revalidate:Jn,createHref:h=>e.history.createHref(h),encodeLocation:h=>e.history.encodeLocation(h),getFetcher:Or,deleteFetcher:so,dispose:La,getBlocker:no,deleteBlocker:_r,patchRoutes:co,_internalFetchControllers:q,_internalActiveDeferreds:J,_internalSetRoutes:lo},be}function ki(e){return e!=null&&("formData"in e&&e.formData!=null||"body"in e&&e.body!==void 0)}function ar(e,a,s,r,n,o,i,c){let l,d;if(i){l=[];for(let u of a)if(l.push(u),u.route.id===i){d=u;break}}else l=a,d=a[a.length-1];let p=fr(n||".",mr(l,o),Ke(e.pathname,s)||e.pathname,c==="path");if(n==null&&(p.search=e.search,p.hash=e.hash),(n==null||n===""||n===".")&&d){let u=br(p.search);if(d.route.index&&!u)p.search=p.search?p.search.replace(/^\?/,"?index&"):"?index";else if(!d.route.index&&u){let f=new URLSearchParams(p.search),v=f.getAll("index");f.delete("index"),v.filter(w=>w).forEach(w=>f.append("index",w));let k=f.toString();p.search=k?"?"+k:""}}return r&&s!=="/"&&(p.pathname=p.pathname==="/"?s:Ye([s,p.pathname])),pt(p)}function us(e,a,s,r){if(!r||!ki(r))return{path:s};if(r.formMethod&&!Ri(r.formMethod))return{path:s,error:qe(405,{method:r.formMethod})};let n=()=>({path:s,error:qe(400,{type:"invalid-body"})}),o=r.formMethod||"get",i=e?o.toUpperCase():o.toLowerCase(),c=rn(s);if(r.body!==void 0){if(r.formEncType==="text/plain"){if(!Be(i))return n();let f=typeof r.body=="string"?r.body:r.body instanceof FormData||r.body instanceof URLSearchParams?Array.from(r.body.entries()).reduce((v,k)=>{let[w,T]=k;return""+v+w+"="+T+` 35`},""):String(r.body);return{path:s,submission:{formMethod:i,formAction:c,formEncType:r.formEncType,formData:void 0,json:void 0,text:f}}}else if(r.formEncType==="application/json"){if(!Be(i))return n();try{let f=typeof r.body=="string"?JSON.parse(r.body):r.body;return{path:s,submission:{formMethod:i,formAction:c,formEncType:r.formEncType,formData:void 0,json:f,text:void 0}}}catch{return n()}}}Q(typeof FormData=="function","FormData is not available in this environment");let l,d;if(r.formData)l=sr(r.formData),d=r.formData;else if(r.body instanceof FormData)l=sr(r.body),d=r.body;else if(r.body instanceof URLSearchParams)l=r.body,d=ys(l);else if(r.body==null)l=new URLSearchParams,d=new FormData;else try{l=new URLSearchParams(r.body),d=ys(l)}catch{return n()}let p={formMethod:i,formAction:c,formEncType:r&&r.formEncType||"application/x-www-form-urlencoded",formData:d,json:void 0,text:void 0};if(Be(p.formMethod))return{path:s,submission:p};let u=at(s);return a&&u.search&&br(u.search)&&l.append("index",""),u.search="?"+l,{path:pt(u),submission:p}}function hs(e,a,s){s===void 0&&(s=!1);let r=e.findIndex(n=>n.route.id===a);return r>=0?e.slice(0,s?r+1:r):e}function ps(e,a,s,r,n,o,i,c,l,d,p,u,f,v,k,w){let T=w?Ue(w[1])?w[1].error:w[1].data:void 0,R=e.createURL(a.location),N=e.createURL(n),O=s;o&&a.errors?O=hs(s,Object.keys(a.errors)[0],!0):w&&Ue(w[1])&&(O=hs(s,w[0]));let M=w?w[1].statusCode:void 0,K=i&&M&&M>=400,be=O.filter((D,ee)=>{let{route:H}=D;if(H.lazy)return!0;if(H.loader==null)return!1;if(o)return rr(H,a.loaderData,a.errors);if(ji(a.loaderData,a.matches[ee],D)||l.some(ke=>ke===D.route.id))return!0;let ie=a.matches[ee],le=D;return ms(D,ue({currentUrl:R,currentParams:ie.params,nextUrl:N,nextParams:le.params},r,{actionResult:T,actionStatus:M,defaultShouldRevalidate:K?!1:c||R.pathname+R.search===N.pathname+N.search||R.search!==N.search||tn(ie,le)}))}),y=[];return u.forEach((D,ee)=>{if(o||!s.some(ge=>ge.route.id===D.routeId)||p.has(ee))return;let H=et(v,D.path,k);if(!H){y.push({key:ee,routeId:D.routeId,path:D.path,matches:null,match:null,controller:null});return}let ie=a.fetchers.get(ee),le=Mt(H,D.path),ke=!1;f.has(ee)?ke=!1:d.has(ee)?(d.delete(ee),ke=!0):ie&&ie.state!=="idle"&&ie.data===void 0?ke=c:ke=ms(le,ue({currentUrl:R,currentParams:a.matches[a.matches.length-1].params,nextUrl:N,nextParams:s[s.length-1].params},r,{actionResult:T,actionStatus:M,defaultShouldRevalidate:K?!1:c})),ke&&y.push({key:ee,routeId:D.routeId,path:D.path,matches:H,match:le,controller:new AbortController})}),[be,y]}function rr(e,a,s){if(e.lazy)return!0;if(!e.loader)return!1;let r=a!=null&&a[e.id]!==void 0,n=s!=null&&s[e.id]!==void 0;return!r&&n?!1:typeof e.loader=="function"&&e.loader.hydrate===!0?!0:!r&&!n}function ji(e,a,s){let r=!a||s.route.id!==a.route.id,n=e[s.route.id]===void 0;return r||n}function tn(e,a){let s=e.route.path;return e.pathname!==a.pathname||s!=null&&s.endsWith("*")&&e.params["*"]!==a.params["*"]}function ms(e,a){if(e.route.shouldRevalidate){let s=e.route.shouldRevalidate(a);if(typeof s=="boolean")return s}return a.defaultShouldRevalidate}function fs(e,a,s,r,n){var o;let i;if(e){let d=r[e];Q(d,"No route found to patch children into: routeId = "+e),d.children||(d.children=[]),i=d.children}else i=s;let c=a.filter(d=>!i.some(p=>an(d,p))),l=ya(c,n,[e||"_","patch",String(((o=i)==null?void 0:o.length)||"0")],r);i.push(...l)}function an(e,a){return"id"in e&&"id"in a&&e.id===a.id?!0:e.index===a.index&&e.path===a.path&&e.caseSensitive===a.caseSensitive?(!e.children||e.children.length===0)&&(!a.children||a.children.length===0)?!0:e.children.every((s,r)=>{var n;return(n=a.children)==null?void 0:n.some(o=>an(s,o))}):!1}async function Si(e,a,s){if(!e.lazy)return;let r=await e.lazy();if(!e.lazy)return;let n=s[e.id];Q(n,"No route found in manifest");let o={};for(let i in r){let l=n[i]!==void 0&&i!=="hasErrorBoundary";ht(!l,'Route "'+n.id+'" has a static property "'+i+'" defined but its lazy function is also returning a value for this property. '+('The lazy route property "'+i+'" will be ignored.')),!l&&!Go.has(i)&&(o[i]=r[i])}Object.assign(n,o),Object.assign(n,ue({},a(n),{lazy:void 0}))}async function Ni(e){let{matches:a}=e,s=a.filter(n=>n.shouldLoad);return(await Promise.all(s.map(n=>n.resolve()))).reduce((n,o,i)=>Object.assign(n,{[s[i].route.id]:o}),{})}async function Ti(e,a,s,r,n,o,i,c,l,d){let p=o.map(v=>v.route.lazy?Si(v.route,l,c):void 0),u=o.map((v,k)=>{let w=p[k],T=n.some(N=>N.route.id===v.route.id);return ue({},v,{shouldLoad:T,resolve:async N=>(N&&r.method==="GET"&&(v.route.lazy||v.route.loader)&&(T=!0),T?Pi(a,r,v,w,N,d):Promise.resolve({type:ne.data,result:void 0}))})}),f=await e({matches:u,request:r,params:o[0].params,fetcherKey:i,context:d});try{await Promise.all(p)}catch{}return f}async function Pi(e,a,s,r,n,o){let i,c,l=d=>{let p,u=new Promise((k,w)=>p=w);c=()=>p(),a.signal.addEventListener("abort",c);let f=k=>typeof d!="function"?Promise.reject(new Error("You cannot call the handler for a route which defines a boolean "+('"'+e+'" [routeId: '+s.route.id+"]"))):d({request:a,params:s.params,context:o},...k!==void 0?[k]:[]),v=(async()=>{try{return{type:"data",result:await(n?n(w=>f(w)):f())}}catch(k){return{type:"error",result:k}}})();return Promise.race([v,u])};try{let d=s.route[e];if(r)if(d){let p,[u]=await Promise.all([l(d).catch(f=>{p=f}),r]);if(p!==void 0)throw p;i=u}else if(await r,d=s.route[e],d)i=await l(d);else if(e==="action"){let p=new URL(a.url),u=p.pathname+p.search;throw qe(405,{method:a.method,pathname:u,routeId:s.route.id})}else return{type:ne.data,result:void 0};else if(d)i=await l(d);else{let p=new URL(a.url),u=p.pathname+p.search;throw qe(404,{pathname:u})}Q(i.result!==void 0,"You defined "+(e==="action"?"an action":"a loader")+" for route "+('"'+s.route.id+"\" but didn't return anything from your `"+e+"` ")+"function. Please return a value or `null`.")}catch(d){return{type:ne.error,result:d}}finally{c&&a.signal.removeEventListener("abort",c)}return i}async function Ai(e){let{result:a,type:s}=e;if(sn(a)){let u;try{let f=a.headers.get("Content-Type");f&&/\bapplication\/json\b/.test(f)?a.body==null?u=null:u=await a.json():u=await a.text()}catch(f){return{type:ne.error,error:f}}return s===ne.error?{type:ne.error,error:new ba(a.status,a.statusText,u),statusCode:a.status,headers:a.headers}:{type:ne.data,data:u,statusCode:a.status,headers:a.headers}}if(s===ne.error){if(ks(a)){var r,n;if(a.data instanceof Error){var o,i;return{type:ne.error,error:a.data,statusCode:(o=a.init)==null?void 0:o.status,headers:(i=a.init)!=null&&i.headers?new Headers(a.init.headers):void 0}}return{type:ne.error,error:new ba(((r=a.init)==null?void 0:r.status)||500,void 0,a.data),statusCode:$t(a)?a.status:void 0,headers:(n=a.init)!=null&&n.headers?new Headers(a.init.headers):void 0}}return{type:ne.error,error:a,statusCode:$t(a)?a.status:void 0}}if(Oi(a)){var c,l;return{type:ne.deferred,deferredData:a,statusCode:(c=a.init)==null?void 0:c.status,headers:((l=a.init)==null?void 0:l.headers)&&new Headers(a.init.headers)}}if(ks(a)){var d,p;return{type:ne.data,data:a.data,statusCode:(d=a.init)==null?void 0:d.status,headers:(p=a.init)!=null&&p.headers?new Headers(a.init.headers):void 0}}return{type:ne.data,data:a}}function Li(e,a,s,r,n,o){let i=e.headers.get("Location");if(Q(i,"Redirects returned/thrown from loaders/actions must have a Location header"),!yr.test(i)){let c=r.slice(0,r.findIndex(l=>l.route.id===s)+1);i=ar(new URL(a.url),c,n,!0,i,o),e.headers.set("Location",i)}return e}function gs(e,a,s,r){let n=["about:","blob:","chrome:","chrome-untrusted:","content:","data:","devtools:","file:","filesystem:","javascript:"];if(yr.test(e)){let o=e,i=o.startsWith("//")?new URL(a.protocol+o):new URL(o);if(n.includes(i.protocol))throw new Error("Invalid redirect location");let c=Ke(i.pathname,s)!=null;if(i.origin===a.origin&&c)return gr(i.pathname)+i.search+i.hash}try{let o=r.createURL(e);if(n.includes(o.protocol))throw new Error("Invalid redirect location")}catch{}return e}function wt(e,a,s,r){let n=e.createURL(rn(a)).toString(),o={signal:s};if(r&&Be(r.formMethod)){let{formMethod:i,formEncType:c}=r;o.method=i.toUpperCase(),c==="application/json"?(o.headers=new Headers({"Content-Type":c}),o.body=JSON.stringify(r.json)):c==="text/plain"?o.body=r.text:c==="application/x-www-form-urlencoded"&&r.formData?o.body=sr(r.formData):o.body=r.formData}return new Request(n,o)}function sr(e){let a=new URLSearchParams;for(let[s,r]of e.entries())a.append(s,typeof r=="string"?r:r.name);return a}function ys(e){let a=new FormData;for(let[s,r]of e.entries())a.append(s,r);return a}function Ci(e,a,s,r,n){let o={},i=null,c,l=!1,d={},p=s&&Ue(s[1])?s[1].error:void 0;return e.forEach(u=>{if(!(u.route.id in a))return;let f=u.route.id,v=a[f];if(Q(!ct(v),"Cannot handle redirect results in processLoaderData"),Ue(v)){let k=v.error;p!==void 0&&(k=p,p=void 0),i=i||{};{let w=dt(e,f);i[w.route.id]==null&&(i[w.route.id]=k)}o[f]=void 0,l||(l=!0,c=$t(v.error)?v.error.status:500),v.headers&&(d[f]=v.headers)}else tt(v)?(r.set(f,v.deferredData),o[f]=v.deferredData.data,v.statusCode!=null&&v.statusCode!==200&&!l&&(c=v.statusCode),v.headers&&(d[f]=v.headers)):(o[f]=v.data,v.statusCode&&v.statusCode!==200&&!l&&(c=v.statusCode),v.headers&&(d[f]=v.headers))}),p!==void 0&&s&&(i={[s[0]]:p},o[s[0]]=void 0),{loaderData:o,errors:i,statusCode:c||200,loaderHeaders:d}}function xs(e,a,s,r,n,o,i){let{loaderData:c,errors:l}=Ci(a,s,r,i);return n.forEach(d=>{let{key:p,match:u,controller:f}=d,v=o[p];if(Q(v,"Did not find corresponding fetcher result"),!(f&&f.signal.aborted))if(Ue(v)){let k=dt(e.matches,u==null?void 0:u.route.id);l&&l[k.route.id]||(l=ue({},l,{[k.route.id]:v.error})),e.fetchers.delete(p)}else if(ct(v))Q(!1,"Unhandled fetcher revalidation redirect");else if(tt(v))Q(!1,"Unhandled fetcher deferred data");else{let k=Xe(v.data);e.fetchers.set(p,k)}}),{loaderData:c,errors:l}}function bs(e,a,s,r){let n=ue({},a);for(let o of s){let i=o.route.id;if(a.hasOwnProperty(i)?a[i]!==void 0&&(n[i]=a[i]):e[i]!==void 0&&o.route.loader&&(n[i]=e[i]),r&&r.hasOwnProperty(i))break}return n}function vs(e){return e?Ue(e[1])?{actionData:{}}:{actionData:{[e[0]]:e[1].data}}:{}}function dt(e,a){return(a?e.slice(0,e.findIndex(r=>r.route.id===a)+1):[...e]).reverse().find(r=>r.route.hasErrorBoundary===!0)||e[0]}function ws(e){let a=e.length===1?e[0]:e.find(s=>s.index||!s.path||s.path==="/")||{id:"__shim-error-route__"};return{matches:[{params:{},pathname:"",pathnameBase:"",route:a}],route:a}}function qe(e,a){let{pathname:s,routeId:r,method:n,type:o,message:i}=a===void 0?{}:a,c="Unknown Server Error",l="Unknown @remix-run/router error";return e===400?(c="Bad Request",n&&s&&r?l="You made a "+n+' request to "'+s+'" but '+('did not provide a `loader` for route "'+r+'", ')+"so there is no way to handle the request.":o==="defer-action"?l="defer() is not supported in actions":o==="invalid-body"&&(l="Unable to encode submission body")):e===403?(c="Forbidden",l='Route "'+r+'" does not match URL "'+s+'"'):e===404?(c="Not Found",l='No route matches URL "'+s+'"'):e===405&&(c="Method Not Allowed",n&&s&&r?l="You made a "+n.toUpperCase()+' request to "'+s+'" but '+('did not provide an `action` for route "'+r+'", ')+"so there is no way to handle the request.":n&&(l='Invalid request method "'+n.toUpperCase()+'"')),new ba(e||500,c,new Error(l),!0)}function sa(e){let a=Object.entries(e);for(let s=a.length-1;s>=0;s--){let[r,n]=a[s];if(ct(n))return{key:r,result:n}}}function rn(e){let a=typeof e=="string"?at(e):e;return pt(ue({},a,{hash:""}))}function qi(e,a){return e.pathname!==a.pathname||e.search!==a.search?!1:e.hash===""?a.hash!=="":e.hash===a.hash?!0:a.hash!==""}function Ei(e){return sn(e.result)&&yi.has(e.result.status)}function tt(e){return e.type===ne.deferred}function Ue(e){return e.type===ne.error}function ct(e){return(e&&e.type)===ne.redirect}function ks(e){return typeof e=="object"&&e!=null&&"type"in e&&"data"in e&&"init"in e&&e.type==="DataWithResponseInit"}function Oi(e){let a=e;return a&&typeof a=="object"&&typeof a.data=="object"&&typeof a.subscribe=="function"&&typeof a.cancel=="function"&&typeof a.resolveData=="function"}function sn(e){return e!=null&&typeof e.status=="number"&&typeof e.statusText=="string"&&typeof e.headers=="object"&&typeof e.body<"u"}function Ri(e){return gi.has(e.toLowerCase())}function Be(e){return mi.has(e.toLowerCase())}async function Ui(e,a,s,r,n){let o=Object.entries(a);for(let i=0;i<o.length;i++){let[c,l]=o[i],d=e.find(f=>(f==null?void 0:f.route.id)===c);if(!d)continue;let p=r.find(f=>f.route.id===d.route.id),u=p!=null&&!tn(p,d)&&(n&&n[d.route.id])!==void 0;tt(l)&&u&&await xr(l,s,!1).then(f=>{f&&(a[c]=f)})}}async function Ii(e,a,s){for(let r=0;r<s.length;r++){let{key:n,routeId:o,controller:i}=s[r],c=a[n];e.find(d=>(d==null?void 0:d.route.id)===o)&&tt(c)&&(Q(i,"Expected an AbortController for revalidating fetcher deferred result"),await xr(c,i.signal,!0).then(d=>{d&&(a[n]=d)}))}}async function xr(e,a,s){if(s===void 0&&(s=!1),!await e.deferredData.resolveData(a)){if(s)try{return{type:ne.data,data:e.deferredData.unwrappedData}}catch(n){return{type:ne.error,error:n}}return{type:ne.data,data:e.deferredData.data}}}function br(e){return new URLSearchParams(e).getAll("index").some(a=>a==="")}function Mt(e,a){let s=typeof a=="string"?at(a).search:a.search;if(e[e.length-1].route.index&&br(s||""))return e[e.length-1];let r=Zs(e);return r[r.length-1]}function js(e){let{formMethod:a,formAction:s,formEncType:r,text:n,formData:o,json:i}=e;if(!(!a||!s||!r)){if(n!=null)return{formMethod:a,formAction:s,formEncType:r,formData:void 0,json:void 0,text:n};if(o!=null)return{formMethod:a,formAction:s,formEncType:r,formData:o,json:void 0,text:void 0};if(i!==void 0)return{formMethod:a,formAction:s,formEncType:r,formData:void 0,json:i,text:void 0}}}function Ka(e,a){return a?{state:"loading",location:e,formMethod:a.formMethod,formAction:a.formAction,formEncType:a.formEncType,formData:a.formData,json:a.json,text:a.text}:{state:"loading",location:e,formMethod:void 0,formAction:void 0,formEncType:void 0,formData:void 0,json:void 0,text:void 0}}function _i(e,a){return{state:"submitting",location:e,formMethod:a.formMethod,formAction:a.formAction,formEncType:a.formEncType,formData:a.formData,json:a.json,text:a.text}}function _t(e,a){return e?{state:"loading",formMethod:e.formMethod,formAction:e.formAction,formEncType:e.formEncType,formData:e.formData,json:e.json,text:e.text,data:a}:{state:"loading",formMethod:void 0,formAction:void 0,formEncType:void 0,formData:void 0,json:void 0,text:void 0,data:a}}function Di(e,a){return{state:"submitting",formMethod:e.formMethod,formAction:e.formAction,formEncType:e.formEncType,formData:e.formData,json:e.json,text:e.text,data:a?a.data:void 0}}function Xe(e){return{state:"idle",formMethod:void 0,formAction:void 0,formEncType:void 0,formData:void 0,json:void 0,text:void 0,data:e}}function Mi(e,a){try{let s=e.sessionStorage.getItem(en);if(s){let r=JSON.parse(s);for(let[n,o]of Object.entries(r||{}))o&&Array.isArray(o)&&a.set(n,new Set(o||[]))}}catch{}}function zi(e,a){if(a.size>0){let s={};for(let[r,n]of a)s[r]=[...n];try{e.sessionStorage.setItem(en,JSON.stringify(s))}catch(r){ht(!1,"Failed to save applied view transitions in sessionStorage ("+r+").")}}}/** 36 * React Router v6.30.4 37 * 38 * Copyright (c) Remix Software Inc. 39 * 40 * This source code is licensed under the MIT license found in the 41 * LICENSE.md file in the root directory of this source tree. 42 * 43 * @license MIT 44 */function va(){return va=Object.assign?Object.assign.bind():function(e){for(var a=1;a<arguments.length;a++){var s=arguments[a];for(var r in s)({}).hasOwnProperty.call(s,r)&&(e[r]=s[r])}return e},va.apply(null,arguments)}const Ht=b.createContext(null),vr=b.createContext(null),rt=b.createContext(null),wr=b.createContext(null),st=b.createContext({outlet:null,matches:[],isDataRoute:!1}),nn=b.createContext(null);function Bi(e,a){let{relative:s}=a===void 0?{}:a;Vt()||Q(!1);let{basename:r,navigator:n}=b.useContext(rt),{hash:o,pathname:i,search:c}=Ta(e,{relative:s}),l=i;return r!=="/"&&(l=i==="/"?r:Ye([r,i])),n.createHref({pathname:l,search:c,hash:o})}function Vt(){return b.useContext(wr)!=null}function mt(){return Vt()||Q(!1),b.useContext(wr).location}function on(e){b.useContext(rt).static||b.useLayoutEffect(e)}function ln(){let{isDataRoute:e}=b.useContext(st);return e?tl():Fi()}function Fi(){Vt()||Q(!1);let e=b.useContext(Ht),{basename:a,future:s,navigator:r}=b.useContext(rt),{matches:n}=b.useContext(st),{pathname:o}=mt(),i=JSON.stringify(mr(n,s.v7_relativeSplatPath)),c=b.useRef(!1);return on(()=>{c.current=!0}),b.useCallback(function(d,p){if(p===void 0&&(p={}),!c.current)return;if(typeof d=="number"){r.go(d);return}let u=fr(d,JSON.parse(i),o,p.relative==="path");e==null&&a!=="/"&&(u.pathname=u.pathname==="/"?a:Ye([a,u.pathname])),(p.replace?r.replace:r.push)(u,p.state,p)},[a,r,i,o,e])}const $i=b.createContext(null);function Wi(e){let a=b.useContext(st).outlet;return a&&b.createElement($i.Provider,{value:e},a)}function Ta(e,a){let{relative:s}=a===void 0?{}:a,{future:r}=b.useContext(rt),{matches:n}=b.useContext(st),{pathname:o}=mt(),i=JSON.stringify(mr(n,r.v7_relativeSplatPath));return b.useMemo(()=>fr(e,JSON.parse(i),o,s==="path"),[e,i,o,s])}function Hi(e,a,s,r){Vt()||Q(!1);let{navigator:n}=b.useContext(rt),{matches:o}=b.useContext(st),i=o[o.length-1],c=i?i.params:{};i&&i.pathname;let l=i?i.pathnameBase:"/";i&&i.route;let d=mt(),p;p=d;let u=p.pathname||"/",f=u;if(l!=="/"){let w=l.replace(/^\//,"").split("/");f="/"+u.replace(/^\//,"").split("/").slice(w.length).join("/")}let v=et(e,{pathname:f});return Qi(v&&v.map(w=>Object.assign({},w,{params:Object.assign({},c,w.params),pathname:Ye([l,n.encodeLocation?n.encodeLocation(w.pathname).pathname:w.pathname]),pathnameBase:w.pathnameBase==="/"?l:Ye([l,n.encodeLocation?n.encodeLocation(w.pathnameBase).pathname:w.pathnameBase])})),o,s,r)}function Vi(){let e=el(),a=$t(e)?e.status+" "+e.statusText:e instanceof Error?e.message:JSON.stringify(e),s=e instanceof Error?e.stack:null,n={padding:"0.5rem",backgroundColor:"rgba(200,200,200, 0.5)"};return b.createElement(b.Fragment,null,b.createElement("h2",null,"Unexpected Application Error!"),b.createElement("h3",{style:{fontStyle:"italic"}},a),s?b.createElement("pre",{style:n},s):null,null)}const Gi=b.createElement(Vi,null);class Yi extends b.Component{constructor(a){super(a),this.state={location:a.location,revalidation:a.revalidation,error:a.error}}static getDerivedStateFromError(a){return{error:a}}static getDerivedStateFromProps(a,s){return s.location!==a.location||s.revalidation!=="idle"&&a.revalidation==="idle"?{error:a.error,location:a.location,revalidation:a.revalidation}:{error:a.error!==void 0?a.error:s.error,location:s.location,revalidation:a.revalidation||s.revalidation}}componentDidCatch(a,s){console.error("React Router caught the following error during render",a,s)}render(){return this.state.error!==void 0?b.createElement(st.Provider,{value:this.props.routeContext},b.createElement(nn.Provider,{value:this.state.error,children:this.props.component})):this.props.children}}function Ki(e){let{routeContext:a,match:s,children:r}=e,n=b.useContext(Ht);return n&&n.static&&n.staticContext&&(s.route.errorElement||s.route.ErrorBoundary)&&(n.staticContext._deepestRenderedBoundaryId=s.route.id),b.createElement(st.Provider,{value:a},r)}function Qi(e,a,s,r){var n;if(a===void 0&&(a=[]),s===void 0&&(s=null),r===void 0&&(r=null),e==null){var o;if(!s)return null;if(s.errors)e=s.matches;else if((o=r)!=null&&o.v7_partialHydration&&a.length===0&&!s.initialized&&s.matches.length>0)e=s.matches;else return null}let i=e,c=(n=s)==null?void 0:n.errors;if(c!=null){let p=i.findIndex(u=>u.route.id&&(c==null?void 0:c[u.route.id])!==void 0);p>=0||Q(!1),i=i.slice(0,Math.min(i.length,p+1))}let l=!1,d=-1;if(s&&r&&r.v7_partialHydration)for(let p=0;p<i.length;p++){let u=i[p];if((u.route.HydrateFallback||u.route.hydrateFallbackElement)&&(d=p),u.route.id){let{loaderData:f,errors:v}=s,k=u.route.loader&&f[u.route.id]===void 0&&(!v||v[u.route.id]===void 0);if(u.route.lazy||k){l=!0,d>=0?i=i.slice(0,d+1):i=[i[0]];break}}}return i.reduceRight((p,u,f)=>{let v,k=!1,w=null,T=null;s&&(v=c&&u.route.id?c[u.route.id]:void 0,w=u.route.errorElement||Gi,l&&(d<0&&f===0?(al("route-fallback"),k=!0,T=null):d===f&&(k=!0,T=u.route.hydrateFallbackElement||null)));let R=a.concat(i.slice(0,f+1)),N=()=>{let O;return v?O=w:k?O=T:u.route.Component?O=b.createElement(u.route.Component,null):u.route.element?O=u.route.element:O=p,b.createElement(Ki,{match:u,routeContext:{outlet:p,matches:R,isDataRoute:s!=null},children:O})};return s&&(u.route.ErrorBoundary||u.route.errorElement||f===0)?b.createElement(Yi,{location:s.location,revalidation:s.revalidation,component:w,error:v,children:N(),routeContext:{outlet:null,matches:R,isDataRoute:!0}}):N()},null)}var dn=(function(e){return e.UseBlocker="useBlocker",e.UseRevalidator="useRevalidator",e.UseNavigateStable="useNavigate",e})(dn||{}),cn=(function(e){return e.UseBlocker="useBlocker",e.UseLoaderData="useLoaderData",e.UseActionData="useActionData",e.UseRouteError="useRouteError",e.UseNavigation="useNavigation",e.UseRouteLoaderData="useRouteLoaderData",e.UseMatches="useMatches",e.UseRevalidator="useRevalidator",e.UseNavigateStable="useNavigate",e.UseRouteId="useRouteId",e})(cn||{});function Ji(e){let a=b.useContext(Ht);return a||Q(!1),a}function Zi(e){let a=b.useContext(vr);return a||Q(!1),a}function Xi(e){let a=b.useContext(st);return a||Q(!1),a}function un(e){let a=Xi(),s=a.matches[a.matches.length-1];return s.route.id||Q(!1),s.route.id}function el(){var e;let a=b.useContext(nn),s=Zi(),r=un();return a!==void 0?a:(e=s.errors)==null?void 0:e[r]}function tl(){let{router:e}=Ji(dn.UseNavigateStable),a=un(cn.UseNavigateStable),s=b.useRef(!1);return on(()=>{s.current=!0}),b.useCallback(function(n,o){o===void 0&&(o={}),s.current&&(typeof n=="number"?e.navigate(n):e.navigate(n,va({fromRouteId:a},o)))},[e,a])}const Ss={};function al(e,a,s){Ss[e]||(Ss[e]=!0)}function rl(e,a){e==null||e.v7_startTransition,(e==null?void 0:e.v7_relativeSplatPath)===void 0&&(!a||a.v7_relativeSplatPath),a&&(a.v7_fetcherPersist,a.v7_normalizeFormMethod,a.v7_partialHydration,a.v7_skipActionErrorRevalidation)}function sl(e){return Wi(e.context)}function nl(e){let{basename:a="/",children:s=null,location:r,navigationType:n=we.Pop,navigator:o,static:i=!1,future:c}=e;Vt()&&Q(!1);let l=a.replace(/^\/*/,"/"),d=b.useMemo(()=>({basename:l,navigator:o,static:i,future:va({v7_relativeSplatPath:!1},c)}),[l,c,o,i]);typeof r=="string"&&(r=at(r));let{pathname:p="/",search:u="",hash:f="",state:v=null,key:k="default"}=r,w=b.useMemo(()=>{let T=Ke(p,l);return T==null?null:{location:{pathname:T,search:u,hash:f,state:v,key:k},navigationType:n}},[l,p,u,f,v,k,n]);return w==null?null:b.createElement(rt.Provider,{value:d},b.createElement(wr.Provider,{children:s,value:w}))}new Promise(()=>{});function ol(e){let a={hasErrorBoundary:e.ErrorBoundary!=null||e.errorElement!=null};return e.Component&&Object.assign(a,{element:b.createElement(e.Component),Component:void 0}),e.HydrateFallback&&Object.assign(a,{hydrateFallbackElement:b.createElement(e.HydrateFallback),HydrateFallback:void 0}),e.ErrorBoundary&&Object.assign(a,{errorElement:b.createElement(e.ErrorBoundary),ErrorBoundary:void 0}),a}/** 45 * React Router DOM v6.30.4 46 * 47 * Copyright (c) Remix Software Inc. 48 * 49 * This source code is licensed under the MIT license found in the 50 * LICENSE.md file in the root directory of this source tree. 51 * 52 * @license MIT 53 */function Nt(){return Nt=Object.assign?Object.assign.bind():function(e){for(var a=1;a<arguments.length;a++){var s=arguments[a];for(var r in s)({}).hasOwnProperty.call(s,r)&&(e[r]=s[r])}return e},Nt.apply(null,arguments)}function hn(e,a){if(e==null)return{};var s={};for(var r in e)if({}.hasOwnProperty.call(e,r)){if(a.indexOf(r)!==-1)continue;s[r]=e[r]}return s}function il(e){return!!(e.metaKey||e.altKey||e.ctrlKey||e.shiftKey)}function ll(e,a){return e.button===0&&(!a||a==="_self")&&!il(e)}const dl=["onClick","relative","reloadDocument","replace","state","target","to","preventScrollReset","viewTransition"],cl=["aria-current","caseSensitive","className","end","style","to","viewTransition","children"],ul="6";try{window.__reactRouterVersion=ul}catch{}function hl(e,a){return wi({basename:a==null?void 0:a.basename,future:Nt({},a==null?void 0:a.future,{v7_prependBasename:!0}),history:Wo({window:a==null?void 0:a.window}),hydrationData:(a==null?void 0:a.hydrationData)||pl(),routes:e,mapRouteProperties:ol,dataStrategy:a==null?void 0:a.dataStrategy,patchRoutesOnNavigation:a==null?void 0:a.patchRoutesOnNavigation,window:a==null?void 0:a.window}).initialize()}function pl(){var e;let a=(e=window)==null?void 0:e.__staticRouterHydrationData;return a&&a.errors&&(a=Nt({},a,{errors:ml(a.errors)})),a}function ml(e){if(!e)return null;let a=Object.entries(e),s={};for(let[r,n]of a)if(n&&n.__type==="RouteErrorResponse")s[r]=new ba(n.status,n.statusText,n.data,n.internal===!0);else if(n&&n.__type==="Error"){if(n.__subType){let o=window[n.__subType];if(typeof o=="function")try{let i=new o(n.message);i.stack="",s[r]=i}catch{}}if(s[r]==null){let o=new Error(n.message);o.stack="",s[r]=o}}else s[r]=n;return s}const pn=b.createContext({isTransitioning:!1}),fl=b.createContext(new Map),gl="startTransition",Ns=fo[gl],yl="flushSync",Ts=Ks[yl];function xl(e){Ns?Ns(e):e()}function Dt(e){Ts?Ts(e):e()}class bl{constructor(){this.status="pending",this.promise=new Promise((a,s)=>{this.resolve=r=>{this.status==="pending"&&(this.status="resolved",a(r))},this.reject=r=>{this.status==="pending"&&(this.status="rejected",s(r))}})}}function vl(e){let{fallbackElement:a,router:s,future:r}=e,[n,o]=b.useState(s.state),[i,c]=b.useState(),[l,d]=b.useState({isTransitioning:!1}),[p,u]=b.useState(),[f,v]=b.useState(),[k,w]=b.useState(),T=b.useRef(new Map),{v7_startTransition:R}=r||{},N=b.useCallback(D=>{R?xl(D):D()},[R]),O=b.useCallback((D,ee)=>{let{deletedFetchers:H,flushSync:ie,viewTransitionOpts:le}=ee;
53D.fetchers.forEach((ge,Oe)=>{ge.data!==void 0&&T.current.set(Oe,ge.data)}),H.forEach(ge=>T.current.delete(ge));let ke=s.window==null||s.window.document==null||typeof s.window.document.startViewTransition!="function";if(!le||ke){ie?Dt(()=>o(D)):N(()=>o(D));return}if(ie){Dt(()=>{f&&(p&&p.resolve(),f.skipTransition()),d({isTransitioning:!0,flushSync:!0,currentLocation:le.currentLocation,nextLocation:le.nextLocation})});let ge=s.window.document.startViewTransition(()=>{Dt(()=>o(D))});ge.finished.finally(()=>{Dt(()=>{u(void 0),v(void 0),c(void 0),d({isTransitioning:!1})})}),Dt(()=>v(ge));return}f?(p&&p.resolve(),f.skipTransition(),w({state:D,currentLocation:le.currentLocation,nextLocation:le.nextLocation})):(c(D),d({isTransitioning:!0,flushSync:!1,currentLocation:le.currentLocation,nextLocation:le.nextLocation}))},[s.window,f,p,T,N]);b.useLayoutEffect(()=>s.subscribe(O),[s,O]),b.useEffect(()=>{l.isTransitioning&&!l.flushSync&&u(new bl)},[l]),b.useEffect(()=>{if(p&&i&&s.window){let D=i,ee=p.promise,H=s.window.document.startViewTransition(async()=>{N(()=>o(D)),await ee});H.finished.finally(()=>{u(void 0),v(void 0),c(void 0),d({isTransitioning:!1})}),v(H)}},[N,i,p,s.window]),b.useEffect(()=>{p&&i&&n.location.key===i.location.key&&p.resolve()},[p,f,n.location,i]),b.useEffect(()=>{!l.isTransitioning&&k&&(c(k.state),d({isTransitioning:!0,flushSync:!1,currentLocation:k.currentLocation,nextLocation:k.nextLocation}),w(void 0))},[l.isTransitioning,k]),b.useEffect(()=>{},[]);let M=b.useMemo(()=>({createHref:s.createHref,encodeLocation:s.encodeLocation,go:D=>s.navigate(D),push:(D,ee,H)=>s.navigate(D,{state:ee,preventScrollReset:H==null?void 0:H.preventScrollReset}),replace:(D,ee,H)=>s.navigate(D,{replace:!0,state:ee,preventScrollReset:H==null?void 0:H.preventScrollReset})}),[s]),K=s.basename||"/",be=b.useMemo(()=>({router:s,navigator:M,static:!1,basename:K}),[s,M,K]),y=b.useMemo(()=>({v7_relativeSplatPath:s.future.v7_relativeSplatPath}),[s.future.v7_relativeSplatPath]);return b.useEffect(()=>rl(r,s.future),[r,s.future]),b.createElement(b.Fragment,null,b.createElement(Ht.Provider,{value:be},b.createElement(vr.Provider,{value:n},b.createElement(fl.Provider,{value:T.current},b.createElement(pn.Provider,{value:l},b.createElement(nl,{basename:K,location:n.location,navigationType:n.historyAction,navigator:M,future:y},n.initialized||s.future.v7_partialHydration?b.createElement(wl,{routes:s.routes,future:s.future,state:n}):a))))),null)}const wl=b.memo(kl);function kl(e){let{routes:a,future:s,state:r}=e;return Hi(a,void 0,r,s)}const jl=typeof window<"u"&&typeof window.document<"u"&&typeof window.document.createElement<"u",Sl=/^(?:[a-z][a-z0-9+.-]*:|\/\/)/i,oe=b.forwardRef(function(a,s){let{onClick:r,relative:n,reloadDocument:o,replace:i,state:c,target:l,to:d,preventScrollReset:p,viewTransition:u}=a,f=hn(a,dl),{basename:v}=b.useContext(rt),k,w=!1;if(typeof d=="string"&&Sl.test(d)&&(k=d,jl))try{let O=new URL(window.location.href),M=d.startsWith("//")?new URL(O.protocol+d):new URL(d),K=Ke(M.pathname,v);M.origin===O.origin&&K!=null?d=K+M.search+M.hash:w=!0}catch{}let T=Bi(d,{relative:n}),R=kr(d,{replace:i,state:c,target:l,preventScrollReset:p,relative:n,viewTransition:u});function N(O){r&&r(O),O.defaultPrevented||R(O)}return b.createElement("a",Nt({},f,{href:k||T,onClick:w||o?r:N,ref:s,target:l}))}),mn=b.forwardRef(function(a,s){let{"aria-current":r="page",caseSensitive:n=!1,className:o="",end:i=!1,style:c,to:l,viewTransition:d,children:p}=a,u=hn(a,cl),f=Ta(l,{relative:u.relative}),v=mt(),k=b.useContext(vr),{navigator:w,basename:T}=b.useContext(rt),R=k!=null&&Tl(f)&&d===!0,N=w.encodeLocation?w.encodeLocation(f).pathname:f.pathname,O=v.pathname,M=k&&k.navigation&&k.navigation.location?k.navigation.location.pathname:null;n||(O=O.toLowerCase(),M=M?M.toLowerCase():null,N=N.toLowerCase()),M&&T&&(M=Ke(M,T)||M);const K=N!=="/"&&N.endsWith("/")?N.length-1:N.length;let be=O===N||!i&&O.startsWith(N)&&O.charAt(K)==="/",y=M!=null&&(M===N||!i&&M.startsWith(N)&&M.charAt(N.length)==="/"),D={isActive:be,isPending:y,isTransitioning:R},ee=be?r:void 0,H;typeof o=="function"?H=o(D):H=[o,be?"active":null,y?"pending":null,R?"transitioning":null].filter(
53Boolean).join(" ");let ie=typeof c=="function"?c(D):c;return b.createElement(oe,Nt({},u,{"aria-current":ee,className:H,ref:s,style:ie,to:l,viewTransition:d}),typeof p=="function"?p(D):p)});var nr;(function(e){e.UseScrollRestoration="useScrollRestoration",e.UseSubmit="useSubmit",e.UseSubmitFetcher="useSubmitFetcher",e.UseFetcher="useFetcher",e.useViewTransitionState="useViewTransitionState"})(nr||(nr={}));var Ps;(function(e){e.UseFetcher="useFetcher",e.UseFetchers="useFetchers",e.UseScrollRestoration="useScrollRestoration"})(Ps||(Ps={}));function Nl(e){let a=b.useContext(Ht);return a||Q(!1),a}function kr(e,a){let{target:s,replace:r,state:n,preventScrollReset:o,relative:i,viewTransition:c}=a===void 0?{}:a,l=ln(),d=mt(),p=Ta(e,{relative:i});return b.useCallback(u=>{if(ll(u,s)){u.preventDefault();let f=r!==void 0?r:pt(d)===pt(p);l(e,{replace:f,state:n,preventScrollReset:o,relative:i,viewTransition:c})}},[d,l,p,r,n,s,e,o,i,c])}function Tl(e,a){a===void 0&&(a={});let s=b.useContext(pn);s==null&&Q(!1);let{basename:r}=Nl(nr.useViewTransitionState),n=Ta(e,{relative:a.relative});if(!s.isTransitioning)return!1;let o=Ke(s.currentLocation.pathname,r)||s.currentLocation.pathname,i=Ke(s.nextLocation.pathname,r)||s.nextLocation.pathname;return xa(n.pathname,i)!=null||xa(n.pathname,o)!=null}const Pl="modulepreload",Al=function(e){return"/"+e},As={},Ll=function(a,s,r){let n=Promise.resolve();if(s&&s.length>0){let i=function(d){return Promise.all(d.map(p=>Promise.resolve(p).then(u=>({status:"fulfilled",value:u}),u=>({status:"rejected",reason:u}))))};document.getElementsByTagName("link");const c=document.querySelector("meta[property=csp-nonce]"),l=(c==null?void 0:c.nonce)||(c==null?void 0:c.getAttribute("nonce"));n=i(s.map(d=>{if(d=Al(d),d in As)return;As[d]=!0;const p=d.endsWith(".css"),u=p?'[rel="stylesheet"]':"";if(document.querySelector(`link[href="${d}"]${u}`))return;const f=document.createElement("link");if(f.rel=p?"stylesheet":Pl,p||(f.as="script"),f.crossOrigin="",f.href=d,l&&f.setAttribute("nonce",l),document.head.appendChild(f),p)return new Promise((v,k)=>{f.addEventListener("load",v),f.addEventListener("error",()=>k(new Error(`Unable to preload CSS for ${d}`)))})}))}function o(i){const c=new Event("vite:preloadError",{cancelable:!0});if(c.payload=i,window.dispatchEvent(c),!c.defaultPrevented)throw i}return n.then(i=>{for(const c of i||[])c.status==="rejected"&&o(c.reason);return a().catch(o)})},pa={...Ks},{version:fn,hydrate:Cl}=pa,ql=Number((fn||"").split(".")[0])>17,El=Number((fn||"").split(".")[0])>18;function Ol(e,a,s={}){const{useLegacyRender:r}=s;if(r||!ql)Cl(e,a);else if(El)Ll(()=>import("./client-DcB6eLlw.js").then(n=>n.c),[]).then(({default:{hydrateRoot:n}})=>{Ie.startTransition(()=>{n(a,e)})});else{pa.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.usingClientEntryPoint=!0;const{hydrateRoot:n}=pa;if(!n)throw new Error("hydrateRoot not found");Ie.startTransition(()=>{n(a,e),pa.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.usingClientEntryPoint=!1})}}function Rl(e){return document.readyState==="loading"?new Promise(a=>{document.addEventListener("DOMContentLoaded",()=>a(e))}):Promise.resolve(e)}function Ul(e){return t.jsx(ua,{...e})}function Il(e,a){return!e||!a?e||a||"":(e[e.length-1]==="/"&&(e=e.substring(0,e.length-1)),a[0]!=="/"&&(a=`/${a}`),e+a)}function _l(e,a){if(e===a)return"/";const s=Dl(a);return e.startsWith(s)?e.slice(s.length-1):e}function Dl(e){return e[e.length-1]!=="/"?`${e}/`:e}function Ml(e){return e[0]!=="/"?`/${e}`:e}function gn(e,a,s=[]){return e.map((r,n)=>{const o=[...s,String(n)],i=typeof r.id=="string"?r.id:o.join("-");if(r.id=i,zl(r))return{...r,...a(r),id:i};{const c={...r,...a(r),id:i,children:void 0};return r.children&&(c.children=gn(r.children,a,o)),c}})}function zl(e){return e.index===!0}function Bl(e){try{return JSON.parse(e||"{}")}catch(a){return console.error("[SSG] On state deserialization -",a,e),{}}}const Fl=b.forwardRef((e,a)=>{const{replace:s,state:r,target:n,preventScrollReset:o,relative:i,to:c,onClick:l}=e,d=kr(c,{replace:s,state:r,target:n,preventScrollReset:o,relative:i});function p(u){l&&l(u),u.defaultPrevented||Ie.startTransition(()=>{d(u)}),u.defaultPrevented=!0,u.preventDefault()}return t.jsx(oe,{...e,ref:a,onClick:p})});Fl.displayName="Link";const $l=b.forwardRef((e,a)=>{const{replace:s,state:r,target:n,preventScrollReset:o,relative:i,to:c,onClick:l}=e,d=kr(c,{replace:s,state:r,target:n,preventScrollReset:o,relative:i});function p(u){l&&l(u),u.defaultPrevented||Ie.startTransition(()=>{d(u)}),u.defaultPrevented=!0,u.preventDefault()}return t.jsx(mn,{...e,ref:a,onClick:p})});$l.displayName="NavLink";function Wl(e,a,s={}){const{transformState:r,rootContainer:n="#root",ssrWhenDev:o,getStyleCollector:i=null}=s,c=typeof window<"u",l=e.basename??"/",{v7_startTransition:d=!0,...p}=e.future??{};async function u(v=!1,k){const w=v?hl(gn(e.routes,f),{basename:l,future:p}):void 0,T=[],R=v?()=>{}:K=>T.push(K),N=()=>Promise.all(T.map(K=>K())),O={isClient:c,routes:e.routes,router:w,routerOptions:e,onSSRAppRendered:R,triggerOnSSRAppRendered:N,initialState:{},transformState:r,routePath:k,base:l,getStyleCollector:i,routerType:"remix"};v&&(await Rl(),O.initialState=(r==null?void 0:r(window.__INITIAL_STATE__||{}))||Bl(window.__INITIAL_STATE__)),await(a==null?void 0:a(O));const M=O.initialState;return{...O,initialState:M}}return c&&(async()=>{var N;const v=typeof n=="string"?document.querySelector(n):n;if(!v){typeof $jsdom>"u"&&console.warn("[vite-react-ssg] Root container not found.");return}const k=(N=et(e.routes,window.location,l))==null?void 0:N.filter(O=>O.route.lazy);k&&(k==null?void 0:k.length)>0&&await Promise.all(k.map(async O=>{const M=await O.route.lazy();Object.assign(O.route,{...M,lazy:void 0})}));const w=await u(!0);window.__VITE_REACT_SSG_CONTEXT__=w;const{router:T}=w,R=t.jsx(jt,{children:t.jsx(vl,{router:T,future:{v7_startTransition:d}})});document.querySelector("[data-server-rendered=true]"),Ol(R,v,s)})(),u;function f(v){if(!(document.querySelector("[data-server-rendered=true]")!==null))return v;const w=async({request:T})=>{var R;{let N;if(window.__VITE_REACT_SSG_STATIC_LOADER_DATA__)N=window.__VITE_REACT_SSG_STATIC_LOADER_DATA__;else{const be=Il(l,`static-loader-data-manifest-${window.__VITE_REACT_SSG_HASH__}.json`);N=await(await fetch(Ml(be))).json(),window.__VITE_REACT_SSG_STATIC_LOADER_DATA__=N}const{url:O}=T;let{pathname:M}=new URL(O);return l!=="/"&&(M=_l(M,l)),((R=N==null?void 0:N[M])==null?void 0:R[v.id])??null}};return v.loader=w,v}}/** 54 * @license lucide-react v0.468.0 - ISC 55 * 56 * This source code is licensed under the ISC license. 57 * See the LICENSE file in the root directory of this source tree. 58 */const Hl=e=>e.replace(/([a-z0-9])([A-Z])/g,"$1-$2").toLowerCase(),yn=(...e)=>e.filter((a,s,r)=>!!a&&a.trim()!==""&&r.indexOf(a)===s).join(" ").trim();/** 59 * @license lucide-react v0.468.0 - ISC 60 * 61 * This source code is licensed under the ISC license. 62 * See the LICENSE file in the root directory of this source tree. 63 */var Vl={xmlns:"http://www.w3.org/2000/svg",width:24,height:24,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:2,strokeLinecap:"round",strokeLinejoin:"round"};/** 64 * @license lucide-react v0.468.0 - ISC 65 * 66 * This source code is licensed under the ISC license. 67 * See the LICENSE file in the root directory of this source tree. 68 */const Gl=b.forwardRef(({color:e="currentColor",size:a=24,strokeWidth:s=2,absoluteStrokeWidth:r,className:n="",children:o,iconNode:i,...c},l)=>b.createElement("svg",{ref:l,...Vl,width:a,height:a,stroke:e,strokeWidth:r?Number(s)*24/Number(a):s,className:yn("lucide",n),...c},[...i.map(([d,p])=>b.createElement(d,p)),...Array.isArray(o)?o:[o]]));/** 69 * @license lucide-react v0.468.0 - ISC 70 * 71 * This source code is licensed under the ISC license. 72 * See the LICENSE file in the root directory of this source tree. 73 */const ae=(e,a)=>{const s=b.forwardRef(({className:r,...n},o)=>b.createElement(Gl,{ref:o,iconNode:a,className:yn(`lucide-${Hl(e)}`,r),...n}));return s.displayName=`${e}`,s};/** 74 * @license lucide-react v0.468.0 - ISC 75 * 76 * This source code is licensed under the ISC license. 77 * See the LICENSE file in the root directory of this source tree. 78 */const Yl=ae("ArrowLeft",[["path",{d:"m12 19-7-7 7-7",key:"1l729n"}],["path",{d:"M19 12H5",key:"x3x0zl"}]]);/** 79 * @license lucide-react v0.468.0 - ISC 80 * 81 * This source code is licensed under the ISC license. 82 * See the LICENSE file in the root directory of this source tree. 83 */const Ae=ae("ArrowRight",[["path",{d:"M5 12h14",key:"1ays0h"}],["path",{d:"m12 5 7 7-7 7",key:"xquz4c"}]]);/** 84 * @license lucide-react v0.468.0 - ISC 85 * 86 * This source code is licensed under the ISC license. 87 * See the LICENSE file in the root directory of this source tree. 88 */const xn=ae("Bell",[["path",{d:"M10.268 21a2 2 0 0 0 3.464 0",key:"vwvbt9"}],["path",{d:"M3.262 15.326A1 1 0 0 0 4 17h16a1 1 0 0 0 .74-1.673C19.41 13.956 18 12.499 18 8A6 6 0 0 0 6 8c0 4.499-1.411 5.956-2.738 7.326",key:"11g9vi"}]]);/** 89 * @license lucide-react v0.468.0 - ISC 90 * 91 * This source code is licensed under the ISC license. 92 * See the LICENSE file in the root directory of this source tree. 93 */const Kl=ae("CalendarDays",[["path",{d:"M8 2v4",key:"1cmpym"}],["path",{d:"M16 2v4",key:"4m81vk"}],["rect",{width:"18",height:"18",x:"3",y:"4",rx:"2",key:"1hopcy"}],["path",{d:"M3 10h18",key:"8toen8"}],["path",{d:"M8 14h.01",key:"6423bh"}],["path",{d:"M12 14h.01",key:"1etili"}],["path",{d:"M16 14h.01",key:"1gbofw"}],["path",{d:"M8 18h.01",key:"lrp35t"}],["path",{d:"M12 18h.01",key:"mhygvu"}],["path",{d:"M16 18h.01",key:"kzsmim"}]]);/** 94 * @license lucide-react v0.468.0 - ISC 95 * 96 * This source code is licensed under the ISC license. 97 * See the LICENSE file in the root directory of this source tree. 98 */const De=ae("Check",[["path",{d:"M20 6 9 17l-5-5",key:"1gmf2c"}]]);/** 99 * @license lucide-react v0.468.0 - ISC 100 * 101 * This source code is licensed under the ISC license. 102 * See the LICENSE file in the root directory of this source tree. 103 */const Ql=ae("ChevronDown",[["path",{d:"m6 9 6 6 6-6",key:"qrunsl"}]]);/** 104 * @license lucide-react v0.468.0 - ISC 105 * 106 * This source code is licensed under the ISC license. 107 * See the LICENSE file in the root directory of this source tree. 108 */const bn=ae("Clock",[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["polyline",{points:"12 6 12 12 16 14",key:"68esgv"}]]);/** 109 * @license lucide-react v0.468.0 - ISC 110 * 111 * This source code is licensed under the ISC license. 112 * See the LICENSE file in the root directory of this source tree. 113 */const Jl=ae("CloudUpload",[["path",{d:"M12 13v8",key:"1l5pq0"}],["path",{d:"M4 14.899A7 7 0 1 1 15.71 8h1.79a4.5 4.5 0 0 1 2.5 8.242",key:"1pljnt"}],["path",{d:"m8 17 4-4 4 4",key:"1quai1"}]]);/** 114 * @license lucide-react v0.468.0 - ISC 115 * 116 * This source code is licensed under the ISC license. 117 * See the LICENSE file in the root directory of this source tree. 118 */const Zl=ae("CodeXml",[["path",{d:"m18 16 4-4-4-4",key:"1inbqp"}],["path",{d:"m6 8-4 4 4 4",key:"15zrgr"}],["path",{d:"m14.5 4-5 16",key:"e7oirm"}]]);/** 119 * @license lucide-react v0.468.0 - ISC 120 * 121 * This source code is licensed under the ISC license. 122 * See the LICENSE file in the root directory of this source tree. 123 */const Wt=ae("ExternalLink",[["path",{d:"M15 3h6v6",key:"1q9fwt"}],["path",{d:"M10 14 21 3",key:"gplh6r"}],["path",{d:"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6",key:"a6xqqp"}]]);/** 124 * @license lucide-react v0.468.0 - ISC 125 * 126 * This source code is licensed under the ISC license. 127 * See the LICENSE file in the root directory of this source tree. 128 */const Xl=ae("EyeOff",[["path",{d:"M10.733 5.076a10.744 10.744 0 0 1 11.205 6.575 1 1 0 0 1 0 .696 10.747 10.747 0 0 1-1.444 2.49",key:"ct8e1f"}],["path",{d:"M14.084 14.158a3 3 0 0 1-4.242-4.242",key:"151rxh"}],["path",{d:"M17.479 17.499a10.75 10.75 0 0 1-15.417-5.151 1 1 0 0 1 0-.696 10.75 10.75 0 0 1 4.446-5.143",key:"13bj9a"}],["path",{d:"m2 2 20 20",key:"1ooewy"}]]);/** 129 * @license lucide-react v0.468.0 - ISC 130 * 131 * This source code is licensed under the ISC license. 132 * See the LICENSE file in the root directory of this source tree. 133 */const Ls=ae("Eye",[["path",{d:"M2.062 12.348a1 1 0 0 1 0-.696 10.75 10.75 0 0 1 19.876 0 1 1 0 0 1 0 .696 10.75 10.75 0 0 1-19.876 0",key:"1nclc0"}],["circle",{cx:"12",cy:"12",r:"3",key:"1v7zrd"}]]);/** 134 * @license lucide-react v0.468.0 - ISC 135 * 136 * This source code is licensed under the ISC license. 137 * See the LICENSE file in the root directory of this source tree. 138 */const vn=ae("Fingerprint",[["path",{d:"M12 10a2 2 0 0 0-2 2c0 1.02-.1 2.51-.26 4",key:"1nerag"}],["path",{d:"M14 13.12c0 2.38 0 6.38-1 8.88",key:"o46ks0"}],["path",{d:"M17.29 21.02c.12-.6.43-2.3.5-3.02",key:"ptglia"}],["path",{d:"M2 12a10 10 0 0 1 18-6",key:"ydlgp0"}],["path",{d:"M2 16h.01",key:"1gqxmh"}],["path",{d:"M21.8 16c.2-2 .131-5.354 0-6",key:"drycrb"}
138],["path",{d:"M5 19.5C5.5 18 6 15 6 12a6 6 0 0 1 .34-2",key:"1tidbn"}],["path",{d:"M8.65 22c.21-.66.45-1.32.57-2",key:"13wd9y"}],["path",{d:"M9 6.8a6 6 0 0 1 9 5.2v2",key:"1fr1j5"}]]);/** 139 * @license lucide-react v0.468.0 - ISC 140 * 141 * This source code is licensed under the ISC license. 142 * See the LICENSE file in the root directory of this source tree. 143 */const ed=ae("FolderTree",[["path",{d:"M20 10a1 1 0 0 0 1-1V6a1 1 0 0 0-1-1h-2.5a1 1 0 0 1-.8-.4l-.9-1.2A1 1 0 0 0 15 3h-2a1 1 0 0 0-1 1v5a1 1 0 0 0 1 1Z",key:"hod4my"}],["path",{d:"M20 21a1 1 0 0 0 1-1v-3a1 1 0 0 0-1-1h-2.9a1 1 0 0 1-.88-.55l-.42-.85a1 1 0 0 0-.92-.6H13a1 1 0 0 0-1 1v5a1 1 0 0 0 1 1Z",key:"w4yl2u"}],["path",{d:"M3 5a2 2 0 0 0 2 2h3",key:"f2jnh7"}],["path",{d:"M3 3v13a2 2 0 0 0 2 2h3",key:"k8epm1"}]]);/** 144 * @license lucide-react v0.468.0 - ISC 145 * 146 * This source code is licensed under the ISC license. 147 * See the LICENSE file in the root directory of this source tree. 148 */const jr=ae("Globe",[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["path",{d:"M12 2a14.5 14.5 0 0 0 0 20 14.5 14.5 0 0 0 0-20",key:"13o1zl"}],["path",{d:"M2 12h20",key:"9i4pu4"}]]);/** 149 * @license lucide-react v0.468.0 - ISC 150 * 151 * This source code is licensed under the ISC license. 152 * See the LICENSE file in the root directory of this source tree. 153 */const td=ae("History",[["path",{d:"M3 12a9 9 0 1 0 9-9 9.75 9.75 0 0 0-6.74 2.74L3 8",key:"1357e3"}],["path",{d:"M3 3v5h5",key:"1xhq8a"}],["path",{d:"M12 7v5l4 2",key:"1fdv2h"}]]);/** 154 * @license lucide-react v0.468.0 - ISC 155 * 156 * This source code is licensed under the ISC license. 157 * See the LICENSE file in the root directory of this source tree. 158 */const Gt=ae("KeyRound",[["path",{d:"M2.586 17.414A2 2 0 0 0 2 18.828V21a1 1 0 0 0 1 1h3a1 1 0 0 0 1-1v-1a1 1 0 0 1 1-1h1a1 1 0 0 0 1-1v-1a1 1 0 0 1 1-1h.172a2 2 0 0 0 1.414-.586l.814-.814a6.5 6.5 0 1 0-4-4z",key:"1s6t7t"}],["circle",{cx:"16.5",cy:"7.5",r:".5",fill:"currentColor",key:"w0ekpg"}]]);/** 159 * @license lucide-react v0.468.0 - ISC 160 * 161 * This source code is licensed under the ISC license. 162 * See the LICENSE file in the root directory of this source tree. 163 */const ad=ae("Link2",[["path",{d:"M9 17H7A5 5 0 0 1 7 7h2",key:"8i5ue5"}],["path",{d:"M15 7h2a5 5 0 1 1 0 10h-2",key:"1b9ql8"}],["line",{x1:"8",x2:"16",y1:"12",y2:"12",key:"1jonct"}]]);/** 164 * @license lucide-react v0.468.0 - ISC 165 * 166 * This source code is licensed under the ISC license. 167 * See the LICENSE file in the root directory of this source tree. 168 */const Sr=ae("Lock",[["rect",{width:"18",height:"11",x:"3",y:"11",rx:"2",ry:"2",key:"1w4ew1"}],["path",{d:"M7 11V7a5 5 0 0 1 10 0v4",key:"fwvmzm"}]]);/** 169 * @license lucide-react v0.468.0 - ISC 170 * 171 * This source code is licensed under the ISC license. 172 * See the LICENSE file in the root directory of this source tree. 173 */const rd=ae("LogIn",[["path",{d:"M15 3h4a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2h-4",key:"u53s6r"}],["polyline",{points:"10 17 15 12 10 7",key:"1ail0h"}],["line",{x1:"15",x2:"3",y1:"12",y2:"12",key:"v6grx8"}]]);/** 174 * @license lucide-react v0.468.0 - ISC 175 * 176 * This source code is licensed under the ISC license. 177 * See the LICENSE file in the root directory of this source tree. 178 */const wa=ae("Puzzle",[["path",{d:"M15.39 4.39a1 1 0 0 0 1.68-.474 2.5 2.5 0 1 1 3.014 3.015 1 1 0 0 0-.474 1.68l1.683 1.682a2.414 2.414 0 0 1 0 3.414L19.61 15.39a1 1 0 0 1-1.68-.474 2.5 2.5 0 1 0-3.014 3.015 1 1 0 0 1 .474 1.68l-1.683 1.682a2.414 2.414 0 0 1-3.414 0L8.61 19.61a1 1 0 0 0-1.68.474 2.5 2.5 0 1 1-3.014-3.015 1 1 0 0 0 .474-1.68l-1.683-1.682a2.414 2.414 0 0 1 0-3.414L4.39 8.61a1 1 0 0 1 1.68.474 2.5 2.5 0 1 0 3.014-3.015 1 1 0 0 1-.474-1.68l1.683-1.682a2.414 2.414 0 0 1 3.414 0z",key:"w46dr5"}]]);/** 179 * @license lucide-react v0.468.0 - ISC 180 * 181 * This source code is licensed under the ISC license. 182 * See the LICENSE file in the root directory of this source tree. 183 */const sd=ae("Scale",[["path",{d:"m16 16 3-8 3 8c-.87.65-1.92 1-3 1s-2.13-.35-3-1Z",key:"7g6ntu"}],["path",{d:"m2 16 3-8 3 8c-.87.65-1.92 1-3 1s-2.13-.35-3-1Z",key:"ijws7r"}],["path",{d:"M7 21h10",key:"1b0cd5"}],["path",{d:"M12 3v18",key:"108xh3"}
183],["path",{d:"M3 7h2c2 0 5-1 7-2 2 1 5 2 7 2h2",key:"3gwbw2"}]]);/** 184 * @license lucide-react v0.468.0 - ISC 185 * 186 * This source code is licensed under the ISC license. 187 * See the LICENSE file in the root directory of this source tree. 188 */const nd=ae("Send",[["path",{d:"M14.536 21.686a.5.5 0 0 0 .937-.024l6.5-19a.496.496 0 0 0-.635-.635l-19 6.5a.5.5 0 0 0-.024.937l7.93 3.18a2 2 0 0 1 1.112 1.11z",key:"1ffxy3"}],["path",{d:"m21.854 2.147-10.94 10.939",key:"12cjpa"}]]);/** 189 * @license lucide-react v0.468.0 - ISC 190 * 191 * This source code is licensed under the ISC license. 192 * See the LICENSE file in the root directory of this source tree. 193 */const od=ae("Share2",[["circle",{cx:"18",cy:"5",r:"3",key:"gq8acd"}],["circle",{cx:"6",cy:"12",r:"3",key:"w7nqdw"}],["circle",{cx:"18",cy:"19",r:"3",key:"1xt0gg"}],["line",{x1:"8.59",x2:"15.42",y1:"13.51",y2:"17.49",key:"47mynk"}],["line",{x1:"15.41",x2:"8.59",y1:"6.51",y2:"10.49",key:"1n3mei"}]]);/** 194 * @license lucide-react v0.468.0 - ISC 195 * 196 * This source code is licensed under the ISC license. 197 * See the LICENSE file in the root directory of this source tree. 198 */const We=ae("ShieldAlert",[["path",{d:"M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z",key:"oel41y"}],["path",{d:"M12 8v4",key:"1got3b"}],["path",{d:"M12 16h.01",key:"1drbdi"}]]);/** 199 * @license lucide-react v0.468.0 - ISC 200 * 201 * This source code is licensed under the ISC license. 202 * See the LICENSE file in the root directory of this source tree. 203 */const Yt=ae("ShieldCheck",[["path",{d:"M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z",key:"oel41y"}],["path",{d:"m9 12 2 2 4-4",key:"dzmm74"}]]);/** 204 * @license lucide-react v0.468.0 - ISC 205 * 206 * This source code is licensed under the ISC license. 207 * See the LICENSE file in the root directory of this source tree. 208 */const id=ae("Smartphone",[["rect",{width:"14",height:"20",x:"5",y:"2",rx:"2",ry:"2",key:"1yt0o3"}],["path",{d:"M12 18h.01",key:"mhygvu"}]]);/** 209 * @license lucide-react v0.468.0 - ISC 210 * 211 * This source code is licensed under the ISC license. 212 * See the LICENSE file in the root directory of this source tree. 213 */const ld=ae("Sparkles",[["path",{d:"M9.937 15.5A2 2 0 0 0 8.5 14.063l-6.135-1.582a.5.5 0 0 1 0-.962L8.5 9.936A2 2 0 0 0 9.937 8.5l1.582-6.135a.5.5 0 0 1 .963 0L14.063 8.5A2 2 0 0 0 15.5 9.937l6.135 1.581a.5.5 0 0 1 0 .964L15.5 14.063a2 2 0 0 0-1.437 1.437l-1.582 6.135a.5.5 0 0 1-.963 0z",key:"4pj2yx"}],["path",{d:"M20 3v4",key:"1olli1"}],["path",{d:"M22 5h-4",key:"1gvqau"}],["path",{d:"M4 17v2",key:"vumght"}],["path",{d:"M5 18H3",key:"zchphs"}]]);/** 214 * @license lucide-react v0.468.0 - ISC 215 * 216 * This source code is licensed under the ISC license. 217 * See the LICENSE file in the root directory of this source tree. 218 */const Qe=ae("UserPlus",[["path",{d:"M16 21v-2a4 4 0 0 0-4-4H6a4 4 0 0 0-4 4v2",key:"1yyitq"}],["circle",{cx:"9",cy:"7",r:"4",key:"nufk8"}],["line",{x1:"19",x2:"19",y1:"8",y2:"14",key:"1bvyxn"}],["line",{x1:"22",x2:"16",y1:"11",y2:"11",key:"1shjgl"}]]);/** 219 * @license lucide-react v0.468.0 - ISC 220 * 221 * This source code is licensed under the ISC license. 222 * See the LICENSE file in the root directory of this source tree. 223 */const Pa=ae("Users",[["path",{d:"M16 21v-2a4 4 0 0 0-4-4H6a4 4 0 0 0-4 4v2",key:"1yyitq"}],["circle",{cx:"9",cy:"7",r:"4",key:"nufk8"}],["path",{d:"M22 21v-2a4 4 0 0 0-3-3.87",key:"kshegd"}],["path",{d:"M16 3.13a4 4 0 0 1 0 7.75",key:"1da9ce"}]]);/** 224 * @license lucide-react v0.468.0 - ISC 225 * 226 * This source code is licensed under the ISC license. 227 * See the LICENSE file in the root directory of this source tree. 228 */const dd=ae("WifiOff",[["path",{d:"M12 20h.01",key:"zekei9"}],["path",{d:"M8.5 16.429a5 5 0 0 1 7 0",key:"1bycff"}],["path",{d:"M5 12.859a10 10 0 0 1 5.17-2.69",key:"1dl1wf"}],["path",{d:"M19 12.859a10 10 0 0 0-2.007-1.523",key:"4k23kn"}],["path",{d:"M2 8.82a15 15 0 0 1 4.177-2.643",key:"1grhjp"}],["path",{d:"M22 8.82a15 15 0 0 0-11.288-3.764",key:"z3jwby"}],["path",{d:"m2 2 20 20",key:"1ooewy"}]]);/** 229 * @license lucide-react v0.468.0 - ISC 230 * 231 * This source code is licensed under the ISC license. 232 * See the LICENSE file in the root directory of this source tree. 233 */const Nr=ae("X",[["path",{d:"M18 6 6 18",key:"1bl5f8"}
233],["path",{d:"m6 6 12 12",key:"d8bk6v"}]]);/** 234 * @license lucide-react v0.468.0 - ISC 235 * 236 * This source code is licensed under the ISC license. 237 * See the LICENSE file in the root directory of this source tree. 238 */const cd=ae("Zap",[["path",{d:"M4 14a1 1 0 0 1-.78-1.63l9.9-10.2a.5.5 0 0 1 .86.46l-1.92 6.02A1 1 0 0 0 13 10h7a1 1 0 0 1 .78 1.63l-9.9 10.2a.5.5 0 0 1-.86-.46l1.92-6.02A1 1 0 0 0 11 14z",key:"1xq2db"}]]),ud={platform:{id:"u2grad",from:"#4F46E5",to:"#22D3EE",label:"u2secured"},authenticator:{id:"u2grad-auth",from:"#F97316",to:"#FBBF24",label:"U2 Secured Authenticator"}};function na({size:e=28,className:a,variant:s="platform"}){const r=ud[s];return t.jsxs("svg",{width:e,height:e,viewBox:"0 0 86 86",className:a,role:"img","aria-label":r.label,children:[t.jsx("defs",{children:t.jsxs("linearGradient",{id:r.id,x1:"0",y1:"0",x2:"1",y2:"1",children:[t.jsx("stop",{offset:"0",stopColor:r.from}),t.jsx("stop",{offset:"1",stopColor:r.to})]})}),t.jsxs("g",{transform:"translate(6,0)",children:[t.jsx("path",{d:"M37 8 L64 19 V46 c0 20 -15 30 -27 37 c-12 -7 -27 -17 -27 -37 V19 Z",fill:`url(#${r.id})`}),t.jsx("text",{x:"37",y:"52",textAnchor:"middle",fontFamily:"'Space Grotesk', system-ui, sans-serif",fontWeight:"700",fontSize:"30",fill:"#fff",children:"u2"})]})]})}function Cs({className:e}){return t.jsxs("span",{className:`font-brand font-bold tracking-tight ${e??""}`,children:["u",t.jsx("span",{className:"text-cyan-400",children:"2"}),t.jsx("span",{className:"text-slate-400 font-medium",children:"secured"})]})}const hd=["share","invite","verify-email","sso"],pd=new Set(["utm_source","utm_medium","utm_campaign","utm_term","utm_content","utm_id","gclid","gbraid","wbraid","msclkid","fbclid","ref"]);function md(e){let a;try{a=new URL(e)}catch{return"/"}a.hash="";const s=new URLSearchParams;for(const[o,i]of a.searchParams)pd.has(o.toLowerCase())&&s.append(o,i);a.search=s.toString();const[,r]=a.pathname.split("/");hd.includes(r)&&(a.pathname=`/${r}/:token`);const n=a.toString();return a.pathname==="/"?n:n.replace(/\/$/,"")}const qs="G-WLJRW30QYN",wn="u2secured.analytics-consent";function Kt(){return typeof window<"u"&&!0}function Tr(){if(typeof window>"u")return null;const e=window.localStorage.getItem(wn);return e==="granted"||e==="denied"?e:null}function zt(...e){window.dataLayer=window.dataLayer??[],window.dataLayer.push(e)}let Es=!1;function fd(){if(!Kt()||Es)return;Es=!0,zt("consent","default",{ad_storage:"denied",ad_user_data:"denied",ad_personalization:"denied",analytics_storage:"denied",wait_for_update:500}),zt("js",new Date),zt("config",qs,{send_page_view:!1,anonymize_ip:!0});const e=document.createElement("script");e.async=!0,e.src=`https://www.googletagmanager.com/gtag/js?id=${qs}`,document.head.appendChild(e),Tr()==="granted"&&kn("granted")}function kn(e){typeof window<"u"&&window.localStorage.setItem(wn,e),Kt()&&zt("consent","update",{ad_storage:e,ad_user_data:e,ad_personalization:e,analytics_storage:e})}function or(e=window.location.href){if(!Kt())return;const a=md(e);zt("event","page_view",{page_location:a,page_path:new URL(a,window.location.origin).pathname,page_title:document.title})}const gd={nav:{passwordVault:"Password Vault",authenticator:"Authenticator",contact:"Contact",privacy:"Privacy",talkToUs:"Talk to us",browserExtension:"Browser extension",mobileApp:"Mobile app",pricing:"Pricing",security:"Security"},consent:{title:"Cookies and analytics",body:"We would like to use Google Analytics to understand how people find this site. Nothing about your vault or your secrets is ever sent â those never leave your device. You can decline and the site works exactly the same.",accept:"Accept",decline:"Decline"},privacy:{seoTitle:"Privacy policy | u2secured",seoDescription:"What u2secured.com collects and why. Analytics runs on the root domain only â never on the password vault, the authenticator, or the mobile apps.",title:"Privacy policy",updated:"Last updated 14 September 2026",lead:"This policy covers u2secured.com, the root domain. The products have their own policies, because they handle entirely different data.",scope:{heading:"Analytics runs here, and nowhere else",body:"u2secured.com is the only place we measure anything. The password vault, the authenticator portal and both mobile apps ship no analytics code at all, and the two sitesâ security policies block analytics providers outright â so none could load there even by mistake. This is a property of how the softw
238are is built, not a promise about intent.",elsewhereBefore:"For what the products collect once you have an account, see the policies at ",elsewhereMid:" and ",elsewhereAfter:"."},collect:{heading:"What this site collects",body:"Two things: anonymous usage statistics, if you accept them in the banner, and whatever you type into the contact form so that we can reply. There are no accounts here, and nothing is kept about you between visits beyond your analytics choice, which stays in your own browser."},analytics:{heading:"Cookies and analytics",what:"We use Google Analytics to understand how people find and move through this site â which pages are read, roughly which country a visit came from, what browser and device were used, and which link or search brought someone here. Google acts as our processor and sets a cookie so a returning visit is not counted as a new person. It is not used to identify you, and we do not connect it to any account.",signals:"Google Signals is enabled, which adds aggregated age, gender and interest data â but only for visitors who are signed in to Google and have allowed that there, and we only ever see it in aggregate.",consent:"None of it starts until you accept the banner. Decline and the site behaves exactly the same. Before anything is sent we remove the part of a URL after the # and every query parameter except campaign tags; your vault contents, master password and encryption keys are not on this site at all.",optOutBefore:"You can withdraw consent at any time by clearing this siteâs data in your browser, which brings the banner back, or by installing the ",optOutLink:"Google Analytics opt-out add-on",optOutMid:". Googleâs own ",googlePolicyLink:"privacy policy",optOutAfter:" explains what they do with the data."},sharing:{heading:"Sharing",body:"Analytics is processed by Google. Contact form messages reach our own support desk on our own infrastructure. We use no advertising networks, no data brokers and no session-recording tools, and we do not sell your personal information."},rights:{heading:"Your rights",body:"Depending on where you live, you may have the right to access, correct or delete the personal information we hold, to object to how it is processed, or to withdraw consent. Declining analytics, or clearing this siteâs data, withdraws it immediately. For anything else, ask us and we will action it."},contact:{heading:"Contact",body:"Questions about this policy, or a request about your data? Reach us through the",link:"contact form"}},footer:{tagline:"A privacy-first security platform: a zero-knowledge password vault and a push-based authenticator.",products:"Products",company:"Company",signIn:"Sign in",vault:"Vault",devPortal:"Developer portal",compare:"Compare",rights:"© 2026 u2secured. All rights reserved.",strap:"Zero-knowledge security platform",merchant:"U2 Secured is a service by {brand}. Payments are securely processed and billed by {brand}."},landing:{badge:"Zero-knowledge security platform",heroLead:"Security that ",heroEmphasis:"never sees your secrets.",heroSub:"u2secured is two products on one zero-knowledge foundation: a password vault that encrypts everything on your device, and an authenticator that turns 2FA into a single tap.",readMore:"Read more",signIn:"Sign in",foundationTitle:"One secure foundation",talkTitle:"Talk to us",talkSub:"Questions about either product, billing, or security? Send us a message and our support team will reply by email.",seoTitle:"u2secured â Zero-knowledge password vault & push 2FA",seoDescription:"A zero-knowledge password manager and a push-based 2FA authenticator app. Everything is encrypted on your device â we store ciphertext we cannot read. Free to start."},trust:[{title:"Zero-knowledge by design",body:"Encryption happens on your device. We store only ciphertext we cannot read."},{title:"One platform, two products",body:"A password vault and an authenticator that share a single secure foundation."},{title:"Privacy first",body:"No selling data, no tracking your secrets â security is the entire product."}],stores:{appStoreLead:"Download on the",appStoreName:"App Store",playLead:"Get it on",playName:"Google Play",appStoreAria:"Download U2 Secured Vault on the App Store",authAppStoreAria:"Download U2 Secured Authenticator on the App Store",playAria:"Get U2 Secured Vault on Google Play",authPlayAria:"Get U2 Secured Authenticator on Google Play",qrAppStoreAlt:"QR code that opens the U2 Secured Vault App Store listing",qrPlayAlt:"QR code that opens the U2 Secured Vault Google Play listing",scanHint:"Point your phone camera at a code"},product:{whatYouGet:"What you get",securityModel:"Security model",questionsTitle:"Questions before you start?",questions
238Help:"Our support team is happy to help you evaluate {name}.",contactSupport:"Contact support",signIn:"Sign in",createAccount:"Create account",comingSoon:"Coming soon"},pm:{name:"Password Vault",kicker:"Zero-knowledge vault",tagline:"A password vault the server can never read.",intro:"Every secret is encrypted on your device before it ever leaves it. We store ciphertext we cannot decrypt â your master password never touches our servers.",body:["u2secured derives your keys locally with Argon2id and encrypts each vault item with AES-256-GCM. The server only ever sees opaque ciphertext, so a breach of our infrastructure reveals nothing about your secrets.","Organise secrets into folders, keep a full version history of every change, and hand a single secret to someone with a link that expires â and that we can never read, because its key travels in the link itself."],features:[{title:"Client-side encryption",body:"AES-256-GCM per item, keys derived on-device. We never see plaintext."},{title:"Strong key derivation",body:"Argon2id stretches your master password into keys that never leave the device."},{title:"Breach monitoring",body:"Saved passwords are checked against known breach corpora. Only a five-character hash prefix ever leaves your device."},{title:"Multiple workspaces",body:"Keep personal and team vaults separate, and move between them without signing out."},{title:"Version history",body:"Every change is versioned, so you can recover an earlier value at any time."},{title:"Public share links",body:"Send a single secret with an expiring, optionally burn-after-read link."},{title:"Autofill everywhere",body:"A Chrome extension that fills your logins as you browse and captures new ones."}],security:["Master password and keys never leave your device","Row-level tenant isolation in PostgreSQL","Encrypted item versions and audit logging"],ctaLabel:"Open the vault",extensionCtaLabel:"Add to Chrome",storeBadgeLabel:"Also on your phone",mobileTitle:"Take your vault anywhere",mobileBody:"The Password Vault app puts every secret on your phone, unlocked with Face ID or your fingerprint and readable even with no signal. Same zero-knowledge encryption as the web vault.",mobileCtaLabel:"About the app",seoTitle:"Zero-knowledge password manager | u2secured Vault",seoDescription:"A zero-knowledge password manager: client-side AES-256-GCM encryption, Argon2id key derivation, breach monitoring, and full version history."},ext:{name:"Browser extension",kicker:"Browser extension",taglineLead:"Your vault, in ",taglineEmphasis:"every login box.",intro:"Autofill and capture logins as you browse. The extension unlocks from the vault you are already signed in to â your keys never leave the device, and it never runs on u2secured.comâs own pages.",ctaLabel:"Add to Chrome",secondaryCta:"Open the vault",availability:"Chrome & Edge · free on every plan",howTitle:"How it works",steps:[{title:"Install",body:"One click from the Chrome Web Store. Nothing about your account changes."},{title:"Sign in once",body:"Signing in to the vault hands the extension your key â held in memory, never sent to us."},{title:"Fill and capture",body:"The inline pill offers matching logins, and offers to save new ones as you create them."}],featuresTitle:"What you get",features:[{title:"Inline autofill",body:"Matching logins surface right in the field â no copy-
238paste, no tab switching."},{title:"Capture on save",body:"New credentials are offered to your vault the moment you create them."},{title:"Strong generator",body:"Generate and store a unique password without leaving the form."},{title:"Real-time sync",body:"Changes made in the vault appear in the extension immediately."},{title:"Locks with your vault",body:"Lock the vault and the extension seals with it."},{title:"Zero-knowledge",body:"Decryption happens inside the extension. We only ever store ciphertext."}],securityTitle:"Security model",security:["The vault key lives in extension memory only â never written to disk, never sent to a server","Content scripts are explicitly excluded from u2secured.comâs own pages","The hand-off channel is pinned to our origin and the published extension ID"],questionsTitle:"Questions before you install?",questionsHelp:"Our support team is happy to help you get set up.",contactSupport:"Contact support",seoTitle:"Password manager Chrome extension â autofill | u2secured",seoDescription:"Autofill passwords in Chrome from your u2secured vault. Capture new logins as you create them and generate strong ones â your keys never leave the device."},mobileApp:{name:"Mobile app",kicker:"iPhone & Android",taglineLead:"Your vault, ",taglineEmphasis:"in your pocket.",intro:"The Password Vault app keeps every secret with you â unlocked by Face ID or your fingerprint, and readable even with no signal. Your keys are derived on the device and never sent to us.",secondaryCta:"Open the web vault",availability:"Free on both stores · iOS 15.1+ and Android",howTitle:"How it works",steps:[{title:"Install",body:"Free from the App Store or Google Play. Nothing about your account changes."},{title:"Sign in once",body:"Your master password derives the key on the device â it is never sent to us."},{title:"Unlock with a look",body:"After the first sign-in, Face ID or your fingerprint reopens the vault."}],screensTitle:"A look inside",screens:[{alt:"The vault list on iPhone, with search and folders",caption:"Search and folders"},{alt:"The settings screen on iPhone, showing profile, security and workspace",caption:"Account and security"}],featuresTitle:"What you get",features:[{title:"Biometric unlock",body:"Face ID or your fingerprint reopens the vault â the key is held in the device keychain."},{title:"Works offline",body:"An encrypted copy of your vault lives on the device, so it opens without a signal."},{title:"Same encryption",body:"Argon2id runs natively on the device and each item is sealed with AES-256-GCM."},{title:"Folders and search",body:"The same folders as the web vault, with search across every item."},{title:"Breach alerts",body:"A saved password found in a known breach is flagged on the item and in Alerts."},{title:"Alerts",body:"Notifications for breaches, expiring items and account activity."}],securityTitle:"Security model",security:["Your master password and keys never leave the device â Argon2id runs natively on your phone","The offline copy of your vault is stored encrypted and opens only with your biometrics or master password","The server holds the same ciphertext it holds for the web vault, and can decrypt none of it"],questionsTitle:"Questions before you install?",questionsHelp:"Our support team is happy to help you get set up on your phone.",contactSupport:"Contact support",seoTitle:"Password manager app for iPhone & Android | u2secured",seoDescription:"Download the u2secured Password Vault app for iPhone and Android: biometric unlock, offline access, and the same zero-knowledge encryption â your keys never leave the device."},auth:{name:"Authenticator",kicker:"Push-based 2FA + SDK",tagline:"Tap-to-approve two-factor auth in three lines of code.",intro:"Give your users phishing-resistant, push-based 2FA with biometric unlock â and give your developers a clean SDK for Go, Node, and Python.",body:["The U2 Secured Authenticator supports the standard RFC 6238 TOTP flow plus a modern push approval flow: your user taps Approve on their phone instead of typing a code.","Integrate with a single client and a few methods. Generate secrets, render QR codes, verify codes, and request push approvals â you choose the flow per request."],features:[{title:"Tap-to-approve",body:"Passwordless push approvals with biometric unlock â no codes to type."},{title:"Phishing-resistant",body:"Approvals are bound to the requesting context, not a shared 6-digit code."},{title:"Developer SDK",body:"Clean clients for Go, Node, and Python. Wire up 2FA in three lines."},{title:"Webhooks",body:"Get notified the moment a user approves or denies a sign-in."}
238,{title:"Standard TOTP",body:"RFC 6238 6-digit codes work with any authenticator app, too."},{title:"Fast verification",body:"Codes stay valid for about 90 seconds, so clock drift never costs a login."}],security:["Zero-knowledge backup of authenticator secrets","Biometric unlock on device","Scoped API keys, hashed at rest"],ctaLabel:"Open the developer portal",storeBadgeLabel:"Now on iPhone and Android",mobileTitle:"Get the Authenticator on your phone",mobileBody:"Approve sign-ins with a tap, unlock with biometrics, and keep your TOTP codes backed up with zero-knowledge encryption. Free on the App Store and Google Play.",seoTitle:"Authenticator app â push 2FA & TOTP codes | u2secured",seoDescription:"Push-based, biometric two-factor authentication with a zero-knowledge backup and a developer SDK for Go, Node, and Python."},contact:{heading:"Contact support",intro:"Tell us what you need help with. Pick a topic so we can route your message to the right team â we'll reply by email.",seoTitle:"Contact support â u2secured password vault & 2FA",seoDescription:"Get in touch with the u2secured team about the password vault, the authenticator, billing, or anything else.",form:{name:"Name",email:"Email",topic:"Topic",message:"Message",topics:{password_manager:"Password Vault",authenticator:"Authenticator",billing:"Billing",general:"General"},validation:"Please fill in your name, a valid email, and a message.",sending:"Sendingâ¦",send:"Send message",sentTitle:"Message sent",sentBody:"Thanks for reaching out â our support team will get back to you by email.",genericError:"Something went wrong."}},notFound:{seoTitle:"Page not found â u2secured",seoDescription:"The page you were looking for does not exist.",heading:"404",body:"That page doesn't exist.",backHome:"Back home"}},yd={nav:{passwordVault:"Coffre-fort de mots de passe",authenticator:"Authentificateur",contact:"Contact",privacy:"Confidentialité",talkToUs:"Contactez-nous",browserExtension:"Extension de navigateur",mobileApp:"Application mobile",pricing:"Tarifs",security:"Sécurité"},consent:{title:"Cookies et statistiques",body:"Nous aimerions utiliser Google Analytics pour comprendre comment les visiteurs trouvent ce site. Rien de votre coffre-fort ni de vos secrets nâest transmis â ils ne quittent jamais votre appareil. Vous pouvez refuser : le site fonctionne à lâidentique.",accept:"Accepter",decline:"Refuser"},privacy:{seoTitle:"Politique de confidentialité | u2secured",seoDescription:"Ce que u2secured.com collecte, et pourquoi. Les statistiques ne fonctionnent que sur le domaine racine â jamais sur le coffre-fort, lâauthentificateur ou les applications mobiles.",title:"Politique de confidentialité",updated:"Dernière mise à jour : 14 septembre 2026",lead:"Cette politique couvre u2secured.com, le domaine racine. Les produits ont leurs propres politiques, car ils traitent des données entièrement différentes.",scope:{heading:"Les statistiques sâexécutent ici, et nulle part ailleurs",body:"u2secured.com est le seul endroit où nous mesurons quoi que ce soit. Le coffre-fort de mots de passe, le portail de lâauthentificateur et les deux applications mobiles ne contiennent aucun code de statistiques, et les politiques de sécurité des deux sites bloquent purement et simplement les fournisseurs de statistiques â rien ne pourrait donc sây charger, même par erreur. Câest une propriété de la façon dont le logiciel est conçu, et non une promesse dâintention.",elsewhereBefore:"Pour savoir ce que les produits collectent une fois que vous avez un compte, consultez les politiques sur ",elsewhereMid:" et ",elsewhereAfter:"."},collect:{heading:"Ce que ce site collecte",body:"Deux choses : des statistiques dâusage anonymes, si vous les acceptez dans la bannière, et ce que vous saisissez dans le formulaire de contact afin que nous puissions répondre. Il nây a pas de comptes ici, et rien nâest conservé à votre sujet entre deux visites, hormis votre choix concernant les statistiques, qui reste dans votre propre navigateur."},analytics:{heading:"Cookies et statistiques",what:"Nous utilisons Google Analytics pour comprendre comment les visiteurs trouvent ce site et sây déplacent â quelles pages sont lues, de quel pays provient approximativement une visite, quels navigateur et appareil ont été utilisés, et quel lien ou quelle recherche y a mené. Google agit comme notre sous-traitant et dépose un cookie afin quâune visite de retour ne soit pas comptée comme une nouvelle personne. Cela ne sert pas à vous identifier, et nous ne le relions à aucun compte.",signals:"Google Signals est activé, ce qui ajoute des données agrégées dââge, de genre et de centres dâintérêt â mais uniquement pour les visiteurs connectés à Google et lâayant autorisé de leur côté, et nous ne les voyons jamais autrement quâagrégées.",consent:"Rien ne commence avant votre acceptation de la bannière. Refusez, et le site se comporte exactement de la même manière. Avant tout envoi, nous retirons la partie dâune URL située après le # ainsi que tous les paramètres de requête, sauf les étiquettes de campagne ; le contenu de votre coffre-fort, votre mot de passe principal et vos clés de chiffrement ne se trouvent pas du tout sur ce site.",optOutBefore:"Vous pouvez retirer votre consentement à tout moment en effaçant les données de ce site dans votre navigateur, ce qui fait revenir la bannière, ou en installant le ",optOutLink:"module de désactivation de Google Analytics",optOutMid:". La ",googlePolicyLink:"politique de confidentialité",optOutAfter:" de Google explique ce quâils en font."},sharing:{heading:"Partage",body:"Les statistiques sont traitées par Google. Les messages du formulaire de contact parviennent à notre propre service dâassistance, sur notre propre infrastru
238cture. Nous nâutilisons aucun réseau publicitaire, aucun courtier en données et aucun outil dâenregistrement de session, et nous ne vendons pas vos informations personnelles."},rights:{heading:"Vos droits",body:"Selon votre lieu de résidence, vous pouvez avoir le droit dâaccéder aux informations personnelles que nous détenons, de les corriger ou de les supprimer, de vous opposer à leur traitement, ou de retirer votre consentement. Refuser les statistiques, ou effacer les données de ce site, le retire immédiatement. Pour toute autre demande, écrivez-nous et nous y donnerons suite."},contact:{heading:"Contact",body:"Des questions sur cette politique, ou une demande concernant vos données ? Contactez-nous via le",link:"formulaire de contact"}},footer:{tagline:"Une plateforme de sécurité axée sur la confidentialité : un coffre-fort de mots de passe à divulgation nulle de connaissance et un authentificateur push.",products:"Produits",company:"Entreprise",signIn:"Connexion",vault:"Coffre-fort",devPortal:"Portail développeur",compare:"Comparer",rights:"© 2026 u2secured. Tous droits réservés.",strap:"Plateforme de sécurité à divulgation nulle de connaissance",merchant:"U2 Secured est un service de {brand}. Les paiements sont traités et facturés en toute sécurité par {brand}."},landing:{badge:"Plateforme de sécurité à divulgation nulle de connaissance",heroLead:"Une sécurité qui ",heroEmphasis:"ne voit jamais vos secrets.",heroSub:"u2secured, ce sont deux produits sur une même fondation à divulgation nulle de connaissance : un coffre-fort de mots de passe qui chiffre tout sur votre appareil, et un authentificateur qui transforme la 2FA en un simple geste.",readMore:"En savoir plus",signIn:"Se connecter",foundationTitle:"Une seule fondation sécurisée",talkTitle:"Contactez-nous",talkSub:"Des questions sur lâun de nos produits, la facturation ou la sécurité ? Envoyez-nous un message et notre équipe dâassistance vous répondra par e-mail.",seoTitle:"Gestionnaire de mots de passe et 2FA | u2secured",seoDescription:"Un gestionnaire de mots de passe et un authentificateur 2FA push. Tout est chiffré sur votre appareil : nous stockons un texte chiffré que nous ne pouvons pas lire."},trust:[{title:"Conçu pour la divulgation nulle de connaissance",body:"Le chiffrement a lieu sur votre appareil. Nous ne stockons quâun texte chiffré que nous ne pouvons pas lire."},{title:"Une plateforme, deux produits",body:"Un coffre-fort de mots de passe et un authentificateur qui partagent une même fondation sécurisée."},{title:"La confidentialité avant tout",body:"Aucune vente de données, aucun suivi de vos secrets â la sécurité est notre seul produit."}],stores:{appStoreLead:"Télécharger dans lâ",appStoreName:"App Store",playLead:"Disponible sur",playName:"Google Play",appStoreAria:"Télécharger U2 Secured Vault dans lâApp Store",authAppStoreAria:"Télécharger U2 Secured Authenticator dans lâApp Store",playAria:"Obtenir U2 Secured Vault sur Google Play",authPlayAria:"Obtenir U2 Secured Authenticator sur Google Play",qrAppStoreAlt:"Code QR ouvrant la fiche App Store de U2 Secured Vault",qrPlayAlt:"Code QR ouvrant la fiche Google Play de U2 Secured Vault",scanHint:"Visez un code avec lâappareil photo de votre téléphone"},product:{whatYouGet:"Ce que vous obtenez",securityModel:"Modèle de sécurité",questionsTitle:"Des questions avant de commencer ?",questionsHelp:"Notre équipe dâassistance se fera un plaisir de vous aider à évaluer {name}.",contactSupport:"Contacter le support",signIn:"Se connecter",createAccount:"Créer un compte",comingSoon:"Bientôt disponible"},pm:{name:"Coffre-fort de mots de passe",kicker:"Coffre-fort à divulgation nulle de connaissance",tagline:"Un coffre-fort de mots de passe que le serveur ne peut jamais lire.",intro:"Chaque secret est chiffré sur votre appareil avant de le quitter. Nous stockons un texte chiffré que nous ne pouvons pas déchiffrer â votre mot de passe principal nâatteint jamais nos serveurs.",body:["u2secured dérive vos clés localement avec Argon2id et chiffre chaque élément du coffre-fort avec AES-256-GCM. Le serveur ne voit quâun texte chiffré opaque : une compromission de notre infrastru
238cture ne révèle rien de vos secrets.","Organisez vos secrets en dossiers, conservez un historique complet de chaque modification, et transmettez un secret unique via un lien qui expire â un lien que nous ne pouvons jamais lire, car sa clé voyage dans le lien lui-même."],features:[{title:"Chiffrement côté client",body:"AES-256-GCM pour chaque élément, clés dérivées sur lâappareil. Nous ne voyons jamais le texte en clair."},{title:"Dérivation de clé robuste",body:"Argon2id transforme votre mot de passe principal en clés qui ne quittent jamais lâappareil."},{title:"Surveillance des fuites",body:"Vos mots de passe enregistrés sont comparés aux bases de fuites connues. Seul un préfixe de hachage de cinq caractères quitte votre appareil."},{title:"Plusieurs espaces de travail",body:"Séparez vos coffres personnels et dâéquipe, et passez de lâun à lâautre sans vous déconnecter."},{title:"Historique des versions",body:"Chaque modification est versionnée : vous pouvez récupérer une valeur antérieure à tout moment."},{title:"Liens de partage publics",body:"Envoyez un secret unique via un lien qui expire, éventuellement détruit après lecture."},{title:"Remplissage automatique partout",body:"Une extension Chrome qui remplit vos identifiants au fil de votre navigation et enregistre les nouveaux."}],security:["Le mot de passe principal et les clés ne quittent jamais votre appareil","Isolation des locataires au niveau des lignes dans PostgreSQL","Versions dâéléments chiffrées et journalisation dâaudit"],ctaLabel:"Ouvrir le coffre-fort",extensionCtaLabel:"Ajouter à Chrome",storeBadgeLabel:"Aussi sur votre téléphone",mobileTitle:"Emportez votre coffre-fort partout",mobileBody:"Lâapplication Coffre-fort de mots de passe place tous vos secrets sur votre téléphone, déverrouillés par Face ID ou votre empreinte digitale et consultables même sans réseau. Le même chiffrement à divulgation nulle de connaissance que le coffre-fort web.",mobileCtaLabel:"à propos de lâapplication",seoTitle:"Gestionnaire de mots de passe chiffré | u2secured",seoDescription:"Gestionnaire de mots de passe chiffré côté client : AES-256-GCM, Argon2id, surveillance des fuites et historique des versions. Le serveur ne lit jamais vos secrets."},ext:{name:"Extension de navigateur",kicker:"Extension de navigateur",taglineLead:"Votre coffre-fort, dans ",taglineEmphasis:"chaque champ de connexion.",intro:"Remplissez et enregistrez vos identifiants au fil de votre navigation. Lâextension se déverrouille depuis le coffre-fort auquel vous êtes déjà connecté â vos clés ne quittent jamais lâappareil, et elle ne sâexécute jamais sur les pages de u2secured.com.",ctaLabel:"Ajouter à Chrome",secondaryCta:"Ouvrir le coffre-fort",availability:"Chrome et Edge · inclus dans toutes les formules",howTitle:"Comment ça marche",steps:[{title:"Installer",body:"Un clic depuis le Chrome Web Store. Rien ne change dans votre compte."},{title:"Se connecter une fois",body:"La connexion au coffre-fort transmet votre clé à lâextension â conservée en mémoire, jamais envoyée chez nous."},{title:"Remplir et enregistrer",body:"La pastille intégrée propose les identifiants correspondants et propose dâenregistrer les nouveaux au fur et à mesure."}],featuresTitle:"Ce que vous obtenez",features:[{title:"Remplissage intégré",body:"Les identifiants correspondants apparaissent directement dans le champ â sans copier-coller ni changement dâonglet."},{title:"Enregistrement automatique",body:"Les nouveaux identifiants sont proposés à votre coffre-fort dès leur création."},{title:"Générateur robuste",body:"Générez et enregistrez un mot de passe unique sans quitter le formulaire."},{title:"Synchronisation en temps réel",body:"Les modifications du coffre-fort apparaissent immédiatement dans lâextension."},{title:"Se verrouille avec le coffre-fort",body:"Verrouillez le coffre-fort et lâextension se scelle avec lui."},{title:"Divulgation nulle de connaissance",body:"Le déchiffrement a lieu dans lâextension. Nous ne stockons que du texte chiffré."}],securityTitle:"Modèle de sécurité",security:["La clé du coffre-fort reste uniquement en mémoire â jamais écrite sur disque, jamais envoyée à un serveur","Les scripts de contenu sont explicitement exclus des pages de u2secured.com","Le canal de transmission est limité à notre origine et à lâidentifiant publié de lâextension"],questionsTitle:"Des questions avant dâinstaller ?",questions
238Help:"Notre équipe dâassistance est là pour vous aider à démarrer.",contactSupport:"Contacter lâassistance",seoTitle:"Extension Chrome â mots de passe | u2secured",seoDescription:"Remplissez vos mots de passe dans Chrome depuis votre coffre u2secured, enregistrez les nouveaux identifiants et générez-en de forts. Vos clés restent sur lâappareil."},mobileApp:{name:"Application mobile",kicker:"iPhone et Android",taglineLead:"Votre coffre-fort, ",taglineEmphasis:"dans votre poche.",intro:"Lâapplication Coffre-fort de mots de passe garde tous vos secrets près de vous â déverrouillés par Face ID ou votre empreinte digitale, et consultables même sans réseau. Vos clés sont dérivées sur lâappareil et ne nous sont jamais transmises.",secondaryCta:"Ouvrir le coffre-fort web",availability:"Gratuite sur les deux boutiques · iOS 15.1+ et Android",howTitle:"Comment ça marche",steps:[{title:"Installer",body:"Gratuitement depuis lâApp Store ou Google Play. Rien ne change dans votre compte."},{title:"Se connecter une fois",body:"Votre mot de passe maître dérive la clé sur lâappareil â il ne nous est jamais transmis."},{title:"Déverrouiller dâun regard",body:"Après la première connexion, Face ID ou votre empreinte digitale rouvre le coffre-fort."}],screensTitle:"Un aperçu",screens:[{alt:"La liste du coffre-fort sur iPhone, avec la recherche et les dossiers",caption:"Recherche et dossiers"},{alt:"Lâécran des réglages sur iPhone, avec le profil, la sécurité et lâespace de travail",caption:"Compte et sécurité"}],featuresTitle:"Ce que vous obtenez",features:[{title:"Déverrouillage biométrique",body:"Face ID ou votre empreinte digitale rouvre le coffre-fort â la clé reste dans le trousseau de lâappareil."},{title:"Fonctionne hors ligne",body:"Une copie chiffrée de votre coffre-fort réside sur lâappareil : il sâouvre sans réseau."},{title:"Le même chiffrement",body:"Argon2id sâexécute nativement sur lâappareil et chaque élément est scellé en AES-256-GCM."},{title:"Dossiers et recherche",body:"Les mêmes dossiers que le coffre-fort web, avec la recherche sur tous les éléments."},{title:"Alertes de fuite",body:"Un mot de passe enregistré trouvé dans une fuite connue est signalé sur lâélément et dans les alertes."},{title:"Alertes",body:"Des notifications pour les fuites, les éléments qui expirent et lâactivité du compte."}],securityTitle:"Modèle de sécurité",security:["Votre mot de passe maître et vos clés ne quittent jamais lâappareil â Argon2id sâexécute nativement sur votre téléphone","La copie hors ligne de votre coffre-fort est stockée chiffrée et ne sâouvre quâavec votre biométrie ou votre mot de passe maître","Le serveur ne détient que le même texte chiffré que pour le coffre-fort web, et ne peut en déchiffrer aucune partie"],questionsTitle:"Des questions avant dâinstaller ?",questionsHelp:"Notre équipe dâassistance se ferait un plaisir de vous aider à démarrer sur votre téléphone.",contactSupport:"Contacter le support",seoTitle:"Mots de passe sur iPhone & Android | u2secured",seoDescription:"Le coffre-fort u2secured sur votre téléphone : déverrouillage biométrique, accès hors ligne et le même chiffrement à divulgation nulle que le coffre web."},auth:{name:"Authentificateur",kicker:"2FA push + SDK",tagline:"Authentification à deux facteurs par approbation tactile en trois lignes de code.",intro:"Offrez à vos utilisateurs une 2FA push résistante au hameçonnage avec déverrouillage biométrique â et à vos développeurs un SDK clair pour Go, Node et Python.",body:["Lâauthentificateur U2 Secured prend en charge le flux TOTP standard RFC 6238 ainsi quâun flux dâapprobation push moderne : votre utilisateur appuie sur Approuver sur son téléphone au lieu de saisir un code.","Intégrez avec un seul client et quelques méthodes. Générez des secrets, affichez des QR codes, vérifiez des codes et demandez des approbations push â vous choisissez le flux pour chaque requête."],features:[{title:"Approbation tactile",body:"Approbations push sans mot de passe avec déverrouillage biométrique â aucun code à saisir."},{title:"Résistant au hameçonnage",body:"Les approbations sont liées au contexte de la demande, et non à un code à 6 chiffres partagé."},{title:"SDK pour développeurs",body:"Des clients clairs pour Go, Node et Python. Mettez en place la 2FA en trois lignes."},{title:"Webhooks",body:"Soyez notifié dès quâun utilisateur approuve ou refuse une connexion."},{title:"TOTP standard",body:"Les codes à 6 chiffres RFC 6238 fonctionnent aussi avec nâimporte quelle application dâauthentification."},{title:"Vérification rapide",body:"Les codes restent valides environ 90 secondes : la dérive dâhorloge ne coûte jamais une connexion."}],security:["Sauvegarde à divulgation nulle de connaissance des secrets de lâauthentificateur","Déverrouillage biométrique sur lâappareil","Clés dâAPI à portée limitée, hachées au repos"],ctaLabel:"Ouvrir le portail développeur",storeBadgeLabel:"Maintenant sur iPhone et Android",mobileTitle:"Installez lâAuthentificateur sur votre téléphone",mobileBody:"Approuvez vos connexions dâun geste, déverrouillez avec la biométrie et gardez vos codes TOTP sauvegardés avec un chiffrement à divulgation nulle de connaissance. Gratuit sur lâApp Store et Google Play.",seoTitle:"Authentificateur â 2FA push et codes TOTP | u2secured",seoDescription:"Authentification à deux facteur
238s push et biométrique avec une sauvegarde à divulgation nulle de connaissance et un SDK pour développeurs pour Go, Node et Python."},contact:{heading:"Contacter le support",intro:"Dites-nous comment nous pouvons vous aider. Choisissez un sujet pour que nous puissions transmettre votre message à la bonne équipe â nous vous répondrons par e-mail.",seoTitle:"Contacter le support â u2secured",seoDescription:"Contactez lâéquipe u2secured au sujet du coffre-fort de mots de passe, de lâauthentificateur, de la facturation ou de toute autre question.",form:{name:"Nom",email:"E-mail",topic:"Sujet",message:"Message",topics:{password_manager:"Coffre-fort de mots de passe",authenticator:"Authentificateur",billing:"Facturation",general:"Général"},validation:"Veuillez indiquer votre nom, une adresse e-mail valide et un message.",sending:"Envoiâ¦",send:"Envoyer le message",sentTitle:"Message envoyé",sentBody:"Merci de nous avoir contactés â notre équipe dâassistance vous répondra par e-mail.",genericError:"Une erreur sâest produite."}},notFound:{seoTitle:"Page introuvable â u2secured",seoDescription:"La page que vous recherchez nâexiste pas.",heading:"404",body:"Cette page nâexiste pas.",backHome:"Retour à lâaccueil"}},xd=["en","fr"],jn={en:gd,fr:yd},Sn=b.createContext(null);function bd({locale:e,children:a}){const s=b.useMemo(()=>({locale:e,m:jn[e]}),[e]);return t.jsx(Sn.Provider,{value:s,children:a})}const Me=()=>{const e=b.useContext(Sn);if(!e)throw new Error("useI18n must be used inside I18nProvider");return e},ze=()=>Me().locale;function W(e,a){return a==="en"?e:e==="/"?"/fr":"/fr"+e}function vd(e){return e==="/fr"?{locale:"fr",path:"/"}:e.startsWith("/fr/")?{locale:"fr",path:e.slice(3)}:{locale:"en",path:e}}function wd(){const{m:e}=Me(),[a,s]=b.useState(!1);if(b.useEffect(()=>{if(!Kt())return;const n=Tr();fd(),n===null?s(!0):n==="granted"&&or()},[]),!a)return null;const r=n=>{kn(n),s(!1),n==="granted"&&or()};return t.jsx("div",{role:"dialog","aria-live":"polite","aria-label":e.consent.title,className:"fixed inset-x-0 bottom-0 z-[60] border-t border-slate-800 bg-slate-950/95 backdrop-blur-md",children:t.jsxs("div",{className:"mx-auto flex max-w-6xl flex-col gap-4 px-6 py-5 sm:flex-row sm:items-center sm:justify-between",children:[t.jsx("p",{className:"text-sm leading-relaxed text-slate-300",children:e.consent.body}),t.jsxs("div",{className:"flex shrink-0 gap-3",children:[t.jsx("button",{type:"button",onClick:()=>r("denied"),className:"inline-flex min-h-[44px] items-center justify-center rounded-xl border border-slate-700 bg-slate-900 px-4 py-2.5 text-sm font-semibold text-slate-200 transition-colors hover:border-slate-500",children:e.consent.decline}),t.jsx("button",{type:"button",onClick:()=>r("granted"),className:"inline-flex min-h-[44px] items-center justify-center rounded-xl bg-gradient-to-r from-indigo-500 to-cyan-400 px-4 py-2.5 text-sm font-semibold text-white transition-transform hover:-translate-y-0.5",children:e.consent.accept})]})]})})}function kd(){const{pathname:e}=mt(),a=b.useRef(!0);b.useEffect(()=>{if(a.current){a.current=!1;return}!Kt()||Tr()!=="granted"||or()},[e])}function oa(...e){return e.filter(Boolean).join(" ")}const Os=e=>e.findIndex(a=>!a.disabled),jd=e=>{for(let a=e.length-1;a>=0;a--)if(!e[a].disabled)return a;return-1};function Sd({value:e,onChange:a,options:s,placeholder:r,emptyLabel:n="No options",disabled:o,icon:i,className:c,labelClassName:l,id:d,"aria-label":p,"aria-labelledby":u}){const[f,v]=b.useState(!1),[k,w]=b.useState(-1),[T,R]=b.useState(null),N=b.useRef(null),O=b.useRef(null),M=b.useRef({buffer:"",timer:null}),K=b.useId(),be=`${K}-listbox`,y=L=>`${K}-opt-${L}`,D=s.find(L=>L.value===e),ee=D!=null,H=b.useCallback(()=>{const L=N.current;if(!L)return;const q=L.getBoundingClientRect(),de=Math.min(s.length*40+8,288),ye=window.innerHeight-q.bottom,m=ye<de&&q.top>ye;R({left:q.left,top:m?q.top-de-4:q.bottom+4,minWidth:q.width,maxWidth:window.innerWidth-q.left-8})},[s.length]);b.useLayoutEffect(()=>{if(!f)return;H();const L=()=>H();return window.addEventListener("scroll",L,!0),window.addEventListener("resize",L),(
238)=>{window.removeEventListener("scroll",L,!0),window.removeEventListener("resize",L)}},[f,H]),b.useLayoutEffect(()=>{var L,q;!f||k<0||(q=(L=O.current)==null?void 0:L.querySelector(`#${CSS.escape(y(k))}`))==null||q.scrollIntoView({block:"nearest"})},[f,k]),b.useEffect(()=>{if(!f)return;const L=q=>{var ye,m;const de=q.target;(ye=N.current)!=null&&ye.contains(de)||(m=O.current)!=null&&m.contains(de)||(v(!1),w(-1))};return document.addEventListener("mousedown",L),()=>document.removeEventListener("mousedown",L)},[f]);const ie=()=>{if(o)return;const L=s.findIndex(q=>q.value===e);w(L>=0?L:Os(s)),v(!0)},le=(L=!0)=>{var q;v(!1),w(-1),L&&((q=N.current)==null||q.focus())},ke=L=>{const q=s[L];!q||q.disabled||(a(q.value),le())},ge=L=>w(q=>{if(s.length===0)return-1;let de=q<0?L===1?-1:0:q;for(let ye=0;ye<s.length;ye++)if(de=(de+L+s.length)%s.length,!s[de].disabled)return de;return q}),Oe=L=>{const q=M.current;q.buffer+=L.toLowerCase(),q.timer&&window.clearTimeout(q.timer),q.timer=window.setTimeout(()=>{q.buffer="",q.timer=null},500);const de=s.findIndex(ye=>!ye.disabled&&ye.label.toLowerCase().startsWith(q.buffer));de>=0&&(f?w(de):a(s[de].value))},Re=L=>{switch(L.key){case"ArrowDown":L.preventDefault(),f?ge(1):ie();break;case"ArrowUp":L.preventDefault(),f?ge(-1):ie();break;case"Enter":case" ":L.preventDefault(),f?ke(k):ie();break;case"Escape":f&&(L.preventDefault(),le());break;case"Tab":f&&(v(!1),w(-1));break;case"Home":f&&(L.preventDefault(),w(Os(s)));break;case"End":f&&(L.preventDefault(),w(jd(s)));break;default:L.key.length===1&&!L.metaKey&&!L.ctrlKey&&!L.altKey&&(L.preventDefault(),Oe(L.key))}};return t.jsxs(t.Fragment,{children:[t.jsxs("button",{ref:N,type:"button",id:d,role:"combobox","aria-haspopup":"listbox","aria-expanded":f,"aria-controls":f?be:void 0,"aria-activedescendant":f&&k>=0?y(k):void 0,"aria-label":p,"aria-labelledby":u,disabled:o,onClick:()=>f?le(!1):ie(),onKeyDown:Re,className:oa("inline-flex min-h-[44px] items-center justify-between gap-2 rounded-md border border-slate-700 bg-slate-900 px-3 py-2 text-left text-sm text-slate-200 transition-colors","hover:border-slate-600 focus:outline-none focus:ring-2 focus:ring-blue-500","disabled:cursor-not-allowed disabled:opacity-50",!o&&"cursor-pointer",c),children:[t.jsxs("span",{className:"flex min-w-0 items-center gap-2",children:[i&&t.jsx("span",{className:"shrink-0 text-slate-400",children:i}),t.jsx("span",{className:oa("truncate",!ee&&"text-slate-400",l),children:ee?D.label:r})]}),t.jsx(Ql,{size:16,className:oa("shrink-0 text-slate-400 transition-transform",f&&"rotate-180",l)})]}),f&&T&&pr.createPortal(t.jsxs("ul",{ref:O,id:be,role:"listbox",tabIndex:-1,style:{position:"fixed",left:T.left,top:T.top,minWidth:T.minWidth,maxWidth:T.maxWidth,maxHeight:288},className:"z-50 overflow-y-auto rounded-lg border border-slate-700 bg-slate-900 p-1 shadow-xl shadow-black/40",children:[s.length===0&&t.jsx("li",{className:"px-3 py-2 text-sm text-slate-500",children:n}),s.map((L,q)=>{const de=L.value===e,ye=q===k;return t.jsxs("li",{id:y(q),role:"option","aria-selected":de,"aria-disabled":L.disabled||void 0,onMouseEnter:()=>!L.disabled&&w(q),onClick:()=>ke(q),className:oa("flex items-center justify-between gap-2 rounded-md px-3 py-2 text-sm",L.disabled?"cursor-not-allowed text-slate-600":"cursor-pointer text-slate-300",ye&&!L.disabled&&"bg-slate-800 text-slate-100",de&&!L.disabled&&"text-slate-100"),children:[t.jsx("span",{className:"truncate",children:L.label}),de&&t.jsx(De,{size:15,className:"shrink-0 text-blue-400"})]},L.value||`opt-${q}`)})]}),document.body)]})}const Nd=["/","/password-vault","/browser-extension","/mobile-app","/authenticator","/pricing","/security","/free-password-manager","/switch/from-lastpass","/switch/from-bitwarden","/switch/from-chrome","/vs/lastpass","/vs/bitwarden","/vs/1password","/vs/proton-pass","/blog","/blog/2fa-codes-in-your-password-manager","/blog/what-zero-knowledge-means","/contact","/privacy"],Td=["/switch/from-lastpass","/switch/from-bitwarden","/switch/from-chrome","/vs/lastpass","/vs/bitwarden","/vs/1password","/vs/proton-pass","/free-password-manager","/blog","/blog/2fa-codes-in-your-password-manager","/blog/what-zero-knowledge-means"];function Pr(e){return Td.includes(e)?"en-only":"bilingual"}function ut(e,a){return a==="en"||Pr(e)==="bilingual"}const Pd=["free","basic","premium"],he={free:{pricePerBlockUsd:0,maxUsers:1,maxSecrets:500,maxGroups:0,auditLogDays:7,maxPublicSharesPerMonth:60,apiAccess:!1,ssoEnabled:!1,breachMonitoring:!1,lockPolicy:!1},basic:{pricePerBlockUsd:5,maxUsers:-1,maxSecrets:1e3,maxGroups:50,auditLogDays:30,maxPublicSharesPerMonth:700,apiAccess:!1,ssoEnabled:!1,breachMonitoring:!0,lockPolicy:!0},premium:{pricePerBlockUsd:9,maxUsers:-1,maxSecrets:1e4,maxGroups:500,auditLogDays:365,maxPublicSharesPerMonth:7e3,a
238piAccess:!0,ssoEnabled:!0,breachMonitoring:!0,lockPolicy:!0}},Ad=-1,Tt=5,Ld=1;function Nn(e){return Math.max(Ld,Math.ceil(e/Tt))}function Rs(e,a){return he[e].pricePerBlockUsd*Nn(a)}function ir(e){return he[e].pricePerBlockUsd/Tt}const Ge={argon2MemoryKib:65536,argon2Iterations:3,argon2Parallelism:4,keyBytes:32,nonceBits:96,breachPrefixChars:5},Tn=Ge.argon2MemoryKib/1024,I={freeItems:`${he.free.maxSecrets} items`,freeUsers:"1 user",freeGroups:"No group folders on free (max_groups = 0)",totpFraming:"Free and unlimited, in the separate U2 Secured Authenticator app â not stored in the vault",basicAnnual:`$${he.basic.pricePerBlockUsd*12}/yr for up to 5 users`,premiumAnnual:`$${he.premium.pricePerBlockUsd*12}/yr for up to 5 users`,perUserBasic:`$${ir("basic").toFixed(2)}/user/mo at a full block`,perUserPremium:`$${ir("premium").toFixed(2)}/user/mo at a full block`,auditLog:`${he.free.auditLogDays}-day free / ${he.basic.auditLogDays}-day basic / ${he.premium.auditLogDays}-day premium`,sharing:"Public share links only â no user-to-user or organisation sharing",autoLock:"Per-surface timeout on every plan including free; the workspace-wide ceiling is basic/premium",audit:"No published third-party security audit yet",blockFloor:`Billed per block of ${Tt} users, floor 1 â one person on a paid plan pays for a full block`},ma={path:"/free-password-manager",seoTitle:"Free Password Manager â U2 Secured",seoDescription:"A real free password manager: 500 items, full zero-knowledge encryption, per-surface auto-lock, and a free unlimited Authenticator app for two-factor codes. No trial, no card.",navLabel:"Free password manager",kicker:"Free tier",title:"U2 Secured as a free password manager",lead:["U2 Secured's free plan is a complete, zero-knowledge password vault â the same client-side Argon2id-to-AES-256-GCM encryption every paid plan runs, per-surface auto-lock, and a free unlimited Authenticator app for two-factor codes â for one person storing up to 500 items, at no cost, indefinitely. Nothing about the cryptography is held back for a paid tier.","This is not a trial and not a stripped-down demo. What follows is exactly what the plan gives, who it's built for, and when adding a paid block is worth the money."],breadcrumb:[{name:"Home",path:"/"},{name:"Password Vault",path:"/password-vault"},{name:"Free password manager",path:"/free-password-manager"}],reviewedOn:"2026-09-25",reviewedLabel:"Numbers last checked",gives:{heading:"What the free plan actually gives you",lead:"Every figure below is a real `plan_limits` value the backend enforces, not a marketing number â the same ones the pricing page reads.",items:[`${I.freeUsers} on the workspace â free is a single-person plan, not a shared one.`,`${I.freeItems}, the vault cap for the workspace â more than most people will ever store.`,`${he.free.auditLogDays}-day audit log â who did what to which item, kept for a week.`,`${he.free.maxPublicSharesPerMonth} public share links a month, for handing someone a single item without giving them an account.`,`${I.freeGroups}.`]},rightFor:{heading:"Who the free plan is built for",lead:"500 items and one user cover a typical personal vault outright â the plan is sized for exactly that reader, not apologised for falling short of a different one.",items:["Anyone starting a first real password vault, who wants full zero-knowledge encryption from day one rather than a limited trial of it.","A personal vault under 500 items â most people's actual logins, notes and cards fit comfortably inside that.","Anyone who wants their two-factor codes free and unlimited, in the separate U2 Secured Authenticator app, without paying anything to get them.","Anyone who wants to know exactly what a plan costs before committing â free costs nothing, forever, with no card and no expiry date."]},notFor:{heading:"Who the free plan is not for",lead:"Stated here so a buyer can decide before building a vault around it, not after.",items:[`Anyone who needs to share a vault with another person. Free is ${I.freeUsers.toLowerCase()} and ${I.freeGroups.toLowerCase()} â there is nobody to share a folder with on this plan.`,`A vault over ${I.freeItems} â a very large personal collection, or years of accumulated logins, needs a paid block.`,"Any team. Group-based folder access needs Basic or Premium; free has none at all.",`Anyone who wants more than ${he.free.auditLogDays} days of audit history, breach monitoring, or SSO â those start on Basic or Premium.`]},includes:{heading:"What free genuinely includes that other free tiers gate",lead:"The cap is on items and users, not on security. Free gets exactly what every paid plan gets on these three points.",items:["Full client-side zero-knowledge encryption â Argon2id, then AES-256-GCM, entirely in your browser. This is not a paid add-on on any U2 Secured plan; free runs the exact same cryptography Premium does.",`${I.autoLock}.`,"Two-factor (TOTP) codes, free and unlimited, in the separate U2 Secured Authenticator app â see below for why that is a separate product, deliberately, not a missing feature."]},totp:{heading:"Two products, not one â and the second one is free",lead:"Competitors sell both factors in one vault. U2 Secured sells them as two products, deliberately kept apart, because a password and its second factor in one store are not tw
238o factors.",body:[`${I.totpFraming}.`,"U2 Secured does not store TOTP seeds in the vault at all. Import detects them, lifts them out before encryption, and hands them back as otpauth:// QR codes for the separate Authenticator app. TOTP storage is a paid feature at Bitwarden and Proton Pass â both keep the password and its TOTP seed in the same vault record.","That split is on every U2 Secured plan including free â it does not require upgrading the vault, and the Authenticator app itself is free to use for the codes themselves."]},upgrade:{heading:"When upgrading is worth it, and what it costs",body:[`Upgrade when you outgrow one of the real free-plan limits above: more than ${I.freeItems}, more than one person needing access, or wanting group-based folder permissions. Nothing about the cryptography changes â Basic and Premium run the same zero-knowledge encryption free already has.`,`Basic is $${he.basic.pricePerBlockUsd}/mo per block of ${Tt} users (${I.basicAnnual}), and Premium is $${he.premium.pricePerBlockUsd}/mo per block (${I.premiumAnnual}). ${I.blockFloor}.`,"That floor matters most if you are a single person upgrading just for the higher item cap or the longer audit-log window: you pay for a full 5-user block whether or not anyone else ever joins. The full pricing breakdown, including the block ladder at larger workspace sizes, is on the pricing page."],items:[`You've reached ${I.freeItems} and need more room.`,`You want to add a second person, or a group, to your workspace â free is ${I.freeUsers.toLowerCase()} with ${I.freeGroups.toLowerCase()}.`,`You want more than ${he.free.auditLogDays} days of audit history, breach monitoring, or SSO.`]},honesty:{heading:"Said out loud, not left for you to discover",items:[`U2 Secured's free tier is capped at ${I.freeItems}; Bitwarden's and Proton Pass's free tiers do not publish an item cap.`,`${I.blockFloor}.`,`${I.freeGroups}.`,"U2 Secured is a new product with no published third-party security audit yet."]},faq:{heading:"Questions people actually ask",items:[{q:"Is U2 Secured's free plan actually unlimited?",a:`No â it's capped at ${I.freeItems} for ${I.freeUsers.toLowerCase()}, with ${I.freeGroups.toLowerCase()}. That covers a typical personal vault; Bitwarden's and Proton Pass's free tiers don't publish an item cap, which matters most for a very large collection.`},{q:"Does U2 Secured's free plan include two-factor (TOTP) codes?",a:`${I.totpFraming}. Bitwarden and Proton Pass both gate their integrated authenticator behind a paid plan; U2 Secured's Authenticator app is free on every tier, including free.`},{q:"Is the free plan's encryption weaker than the paid plans'?",a:"No â every U2 Secured plan uses the same client-side Argon2id-to-AES-256-GCM encryption. Free does not get a lesser cipher; it gets fewer items, one user, and a shorter audit log."},{q:"Can I share my free vault with my partner or a group?",a:`No â free is ${I.freeUsers.toLowerCase()} and ${I.freeGroups.toLowerCase()}, so there is nobody to share a folder with on this plan. Group-based folder sharing needs Basic or Premium.`},{q:`What happens if I go over ${I.freeItems} on free?`,a:`New items are refused until you delete something or upgrade â nothing already in the vault is deleted automatically. Basic raises the cap to ${he.basic.maxSecrets.toLocaleString("en-US")} items and Premium to ${he.premium.maxSecrets.toLocaleString("en-US")} items.`}]},sources:{heading:"Sources for the competitor figures",note:"Every competitor figure above was read directly from the vendor's own site on the date shown. Free tiers change from time to time; if something has changed, their own pages are the authority and this page is out of date.",refs:[{label:"Bitwarden â Password Manager Plans",url:"https://bitwarden.com/help/password-manager-plans/",verifiedOn:"2026-09-25"},{label:"Proton Pass â Pricing",url:"https://proton.me/pass/pricing",verifiedOn:"2026-09-25"}]},cta:{heading:"Start free",body:"Create a free U2 Secured workspace in a couple of minutes â no card, no trial clock. Compare plans first if you think you will outgrow it.",primaryLabel:"Create a free account",secondaryLabel:"Compare plans"},related:{heading:"More about U2 Secured",links:[{label:"Pricing",path:"/pricing"},{label:"Security",path:"/security"},{label:"U2 Secured vs Bitwarden",path:"/vs/bitwarden"},{label:"U2 Secured vs Proton Pass",path:"/vs/proton-pass"}]}},Us="14.99",Pn={path:"/blog/2fa-codes-in-your-password-manager",seoTitle:"Should your password manager store your 2FA codes? | u2secured",seoDescription:"Most password managers will hold your TOTP secrets next to the password they protect. Here is what that costs you, what it buys y
238ou, and why U2 Secured keeps the two factors in separate apps.",navLabel:"2FA codes in your password manager",kicker:"Two factors",title:"Should your password manager store your 2FA codes?",summary:"Every major vault will keep a TOTP secret in the same record as the password it protects. That is genuinely convenient, and it quietly collapses two factors into one.",publishedOn:"2026-09-27",updatedOn:"2026-09-27",lead:["Open almost any password manager, edit a login, and there is a field waiting for a one-time-password secret. Paste it in and the vault will generate your six-digit codes alongside the password, autofill both, and sync them everywhere. It is a genuinely good feature, and it is the reason this post exists â because it is also the one design decision we made differently from everyone else.","The short version: a password and its second factor in the same store are not two factors. We think that matters more than the convenience, so U2 Secured ships them as two apps. The long version is below, including the cases where we think the other choice is the right one."],breadcrumb:[{name:"Home",path:"/"},{name:"Blog",path:"/blog"},{name:"2FA codes in your password manager",path:"/blog/2fa-codes-in-your-password-manager"}],sections:[{heading:"What putting TOTP in the vault actually buys you",body:["It is worth being precise about the upside, because it is real and most arguments against vault-stored TOTP skip it.","One app means one thing to set up, one thing to back up, and one thing to move to a new phone. The vault can autofill the password and the code in the same gesture, so the slowest part of signing in stops being slow. And there is exactly one recovery story to understand instead of two â which, for someone who has never thought about what happens when their phone falls in a river, is not a small thing."],items:["One setup, one backup, one migration when the phone changes.","Autofill can supply the password and the code in a single step.","One recovery story rather than two â fewer ways to lock yourself out.","Codes sync to every device the vault syncs to, for free."]},{heading:"Why one store is not two factors",body:["Two-factor authentication works because the two factors fail independently. Someone who learns your password should still be stopped, because the second factor lives somewhere the password did not.","A TOTP secret in the vault removes that independence. It is not a claim about encryption strength â the seed is encrypted exactly as well as the password next to it. It is a claim about blast radius. Anything that opens the vault opens both: a phished master password, a malicious or compromised browser extension, a device left unlocked, a session token lifted from a machine with malware on it. In each of those cases the attacker does not need to beat your second factor, because your second factor is in the box they just opened.","The strongest version of this is the one a security reviewer will put to you: if losing the vault loses both factors, what did the second factor add? On the phishing path it still adds something real, since a phishing page that captures a password does not capture the vault. But against anything that takes the vault itself, it adds nothing at all."],caution:"This is an argument about where secrets are STORED, not about which device they sit on. Two apps on one phone are still one device, and a phone that is unlocked and compromised is a bad day either way. Separation limits what a single compromised STORE gives up; it is not a claim that one handset is two factors."},{heading:"Where the industry actually stands",body:["Two things are true at once here, and the second one surprised us when we went and checked.","First, storing TOTP in the vault is the norm. Bitwarden, Proton Pass and 1Password all keep the seed in the same record as the password. Second, all of them put it behind payment. Bitwarden puts the authenticator behind Premium. Proton labels it a paid feature in its own comparison table. 1Password has no free tier for it to be gated from. LastPass is the outlier in the other direction: its TOTP-in-vault row is a business-plan feature, not a consumer one.","So the feature that collapses your two factors into one store is, across the market, the feature you pay extra for. We would rather give the codes away in a place that keeps them separate. Every claim in this paragraph links to the vendorâs own page at the foot of this post â please check them rather than taking our word for it."]},{heading:"What we do instead",body:[`U2 Secured is two products. The vault stores passwords, secure notes, cards, API keys, SSH keys and the rest of it. The U2 Secured Authenticator stores TOTP secrets and does tap-to-approve push. The Authenticator's codes are ${I.totpFraming.toLowerCase()} â unlimited accounts, no payment, no account tier that unlocks them.`,`Its Premium tier ($${Us}/year) exists, and it is worth being exact about what it gates: encrypted backup and restore, moving your co
238des to a new device, and the web portal. Not the codes. Generating one-time passwords is free forever, because a second factor you can lose when a subscription lapses is not a second factor anyone should build a security model on.`,"The vault has no TOTP field at all, and this is enforced rather than merely intended â including on the path where it would have been easiest to give in. Importing from Bitwarden, LastPass, 1Password or Chrome brings a per-login TOTP seed with it. Our importer detects those seeds, counts them in the pre-flight, and hands them over after the import as standard otpauth:// QR codes for you to scan into the Authenticator, or into any other TOTP app you already trust. It never writes them into the vault, and never drops one silently."]},{heading:"When keeping them together is the right call",body:["We would rather say this plainly than have you find the gap yourself.","If the realistic alternative is no second factor at all, then TOTP in your password manager is better than nothing, by a wide margin. An account with a vault-stored second factor beats an account with only a password on every threat that matters to most people, phishing included. âPerfectâ is not the bar here; âactually switched onâ is.","There is also a real cost to our way, and it is the one we take most seriously: two apps means two recovery stories. If you set up the Authenticator and never enable backup, a lost phone is a lost set of codes, and you are back to the account recovery queue of every site you enrolled. Whichever product you choose, write down the recovery material and store it somewhere that is not the device."],items:["No second factor today, and one app is what you will actually keep using â take the vault-stored codes.","Shared team logins where the codes must be available to whoever is on shift â one store is the simpler operational answer.","You already run a separate authenticator and it works â nothing here is a reason to change it. The split is the point, not our app."]},{heading:"Splitting them, without locking yourself out",body:["If you decide to separate the two, the order matters. Do not delete anything until the new app is producing codes that a site actually accepts."],items:["Install the Authenticator and add one account to it â not all of them. Sign in to that site with the new code and confirm it works.","Where a site offers it, re-enrol rather than copying the seed across. Re-enrolling rotates the secret, so an old copy in an old vault stops being useful.","Regenerate and re-save that siteâs recovery codes while you are in there. They are the thing that saves you, and most people have never read them.","Only then remove the TOTP secret from the vault entry, and repeat for the next account.","Turn on encrypted backup in the Authenticator before you own more than a handful of codes."],caution:"Never remove a code from your old app until the new one has signed you in successfully. A code that works âin the appâ but has not been tested against the site is not yet a working second factor."}],faq:{heading:"Questions we get about this",items:[{q:"Is a TOTP code in a password manager insecure?",a:"No â the seed is encrypted like everything else in the vault. The argument is not about encryption strength, it is about independence: anything that opens the vault gives up both the password and the code, so the second factor stops adding protection against exactly the attacks that take the vault."},{q:"Does U2 Secured support TOTP at all?",a:`Yes, free and unlimited, in the U2 Secured Authenticator app. What it does not do is store the seed in the password vault. Premium ($${Us}/year) adds encrypted backup, moving codes to a new device and the web portal â never the codes themselves.`},{q:"What happens to TOTP secrets when I import from another manager?",a:"They are detected, counted in the pre-flight, and handed to you after the import as standard otpauth:// QR codes to scan into the Authenticator or any other TOTP app. They are never written into the vault and never dropped without telling you."},{q:"Do I need two subscriptions to use both products?",a:`No. The Authenticator is free and unlimited for codes, and the vault has a free plan (${I.freeUsers}, ${he.free.maxSecrets} items). They are separate products, so paying for one does not include the other â which is worth knowing before you compare our price with a single all-in-one subscription.`},{q:"Are two apps on one phone really two factors?",a:"Not in the hardware sense, no, and we would rather say so. The separation limits what a single compromised store gives up. If you want factor independence at the device level, a hardware security ke
238y is the honest answer, and both products work alongside one."}]},sources:{heading:"Sources",note:"Every claim about another product below is taken from that vendorâs own published page, with the date we last read it. Please check them â they change.",refs:[{label:"Bitwarden â Pricing (authenticator behind Premium)",url:"https://bitwarden.com/pricing/",verifiedOn:"2026-09-25"},{label:"Proton Pass â Pricing (integrated 2FA shown as a paid feature)",url:"https://proton.me/pass/pricing",verifiedOn:"2026-09-25"},{label:"1Password â Personal pricing (no free tier)",url:"https://1password.com/pricing/personal",verifiedOn:"2026-09-23"},{label:"LastPass â Pricing (TOTP row is Teams/Business)",url:"https://www.lastpass.com/pricing",verifiedOn:"2026-09-25"}]},cta:{heading:"Two products, deliberately kept apart",body:"The vault encrypts everything on your device. The Authenticator keeps your second factor somewhere the vault cannot reach. Both have a free plan.",primaryLabel:"Create a free vault",secondaryLabel:"Ask us something"},related:{heading:"Read next",links:[{label:"What zero-knowledge actually means",path:"/blog/what-zero-knowledge-means"},{label:"U2 Secured vs Bitwarden",path:"/vs/bitwarden"},{label:"The free plan, in full",path:"/free-password-manager"},{label:"How the encryption works",path:"/security"}]}},An={path:"/blog/what-zero-knowledge-means",seoTitle:"What âzero-knowledgeâ actually means â and how to check it | u2secured",seoDescription:"Zero-knowledge is the most overloaded word in password management. The precise claim, what the server still sees when it is true, and four checks that separate it from marketing.",navLabel:"What zero-knowledge means",kicker:"Plain language",title:"What âzero-knowledgeâ actually means â and how to check it",summary:"The phrase is on every vendorâs homepage, ours included. It has a precise meaning, a set of things it does not cover, and four checks you can run without trusting anybody.",publishedOn:"2026-09-27",updatedOn:"2026-09-27",lead:["Every password manager on the market says it is zero-knowledge, which means the phrase has stopped doing any work. It does have a precise meaning, though, and â more usefully â it has edges. Knowing where they are tells you what a breach at your provider would and would not expose.","This post is the definition, the honest limits, and four checks you can run on any vendor, us included."],breadcrumb:[{name:"Home",path:"/"},{name:"Blog",path:"/blog"},{name:"What zero-knowledge means",path:"/blog/what-zero-knowledge-means"}],sections:[{heading:"The claim, stated precisely",body:["Zero-knowledge means the provider cannot read your data, because the keys that decrypt it are derived on your device and are never sent. The server holds ciphertext it has no way to open. That is the whole claim â and notice what it does not say: not that the provider is trustworthy, not that they are well run, not that they have never been breached. It says that those questions matter less, because a server that cannot read your vault is a much less interesting thing to steal.","The test is uncomfortable and simple: if you forget your master password, can the provider get your data back? If yes, they can read it. Every real zero-knowledge system answers no, and that answer is the cost of the guarantee."]},{heading:"What actually happens on your device",body:[`Concretely, in our case: your master password and your email go into Argon2id â ${Tn} MiB of memory, ${Ge.argon2Iterations} passes, ${Ge.argon2Parallelism} lanes â which produces a master key. That key is stretched, and the result is split two ways.`,`One branch is hashed and sent to the server as your authentication hash; it is the only derived value that ever crosses the wire, and it cannot be run backwards into the other branch. The other branch becomes the vault encryption key, which stays on the device. Items are encrypted with AES-256-GCM under a fresh ${Ge.nonceBits}-bit nonce each time.`,"The important property is the split, not the algorithm names. Plenty of products use the same primitives and still hold a key that can open your data. What makes it zero-knowledge is that the value proving who you are and the value decrypting your vault are different, and only the first one leaves."]},{heading:"What the server still sees",body:["This is the part most explanations skip, and it is the part that decides what a breach would actually cost you. Encrypted contents are not the same as no information.","Our server knows your email address, because you log in with it. It knows when you logged in, from roughly where, and on what device â that is what makes a ânew sign-inâ alert possible. It knows how many items you have and when each one changed, because it stores and syncs them. It holds an audit log for as long as your plan keeps one. Those are metadata, they are real, and n
238o amount of client-side encryption removes them.","What it does not hold is anything that opens the box: not your master password, not your vault key, not the plaintext of any item, and not enough to reconstruct any of the three."],items:["Seen: your email, sign-in times, the IP a request came from, the devices you sign in from, item and folder counts, modification timestamps, billing status, audit events.","Not seen: master password, vault key, item titles, usernames, passwords, card numbers, secure notes â every item reaches the server as one encrypted blob. TOTP secrets are not there at all: they live in a different app.",`Kept for: ${I.auditLog}, depending on plan.`]},{heading:"The asterisk on ânever leaves your deviceâ",body:["Here is one we would rather you heard from us. âThe key never leaves your deviceâ is a statement about the network, not about memory or storage, and on a phone it needs qualifying.","On the web and in the browser extension, the vault key exists only in RAM for the length of the session. On mobile it is different: the key is written to the OS keychain, protected by biometrics or the device passcode, because that is what makes Face ID unlock possible at all. It is deliberately not cleared when the app locks â only signing out removes it.","The consequence is worth stating in one sentence, because no vendor volunteers it: on a phone, the practical floor on your vault is your device credential, not your master password. That is an accepted trade for unlock that people will actually use, not an oversight, and it is written down in our code with a test that fails if someone changes it quietly. Any vendor offering biometric unlock has made some version of this same trade â it is a fair question to ask them."],caution:"A phone with a four-digit PIN and biometric vault unlock is protected by that PIN. If that is not a trade you want, turn biometric unlock off and type the master password."},{heading:"Four checks you can run on any vendor",body:["None of these require trusting a marketing page, and all four work on us."],items:["Try the forgotten-password flow. If support can restore your vault, the claim is false. If the answer is âyour data is gone unless you have a recovery keyâ, it is behaving like a real one.","Look for published parameters. A vendor that tells you which KDF it uses and with what cost parameters is making a checkable claim; âbank-grade encryptionâ is not a claim at all.","Watch the network on a web client. The vault should load as ciphertext and decrypt after you type the password â no request should be fetching a key.","Ask what the server holds besides ciphertext. A vendor that can answer this quickly and specifically has thought about it. A vendor that says ânothingâ has not."]},{heading:"What we cannot claim yet",body:[`Applying the fourth check to ourselves: ${I.audit.toLowerCase()}. Our cryptography is documented, our client code ships to your browser where it can be read, and the design is described on our security page in the same detail as above â but an independent audit is a different kind of evidence, and we will not imply we have one until we do.`,"Until then, the honest position is that you should verify the checkable parts rather than take the claim on trust. That is what they are for."]}],faq:{heading:"Questions we get about this",items:[{q:"If it is zero-knowledge, what happens when I forget my master password?",a:"Your data cannot be recovered by us, because we hold no key that opens it. That is the direct consequence of the guarantee, not a gap in it â which is why recovery material is worth storing somewhere safe the day you set the vault up."},{q:"Does zero-knowledge mean the provider learns nothing about me?",a:"No. It means they cannot read your vault contents. They still hold metadata â your email, sign-in times and devices, item counts, modification timestamps, billing status â because those are what make logging in, syncing and alerting work."},{q:"Is biometric unlock a weakness?",a:"It is a trade. On mobile the vault key is stored in the OS keychain behind biometrics or the device passcode, so the practical floor becomes your device credential rather than your master password. That buys unlock people will actually use; if you would rather not take it, turn it off."},{q:"Has U2 Secured been independently audited?",a:"Not yet, and we say so on every page where it is relevant rather than only when asked. The cryptography and its parameters are published, and the client code is readable, so the claims can be checked in the meantime."}]},cta:{heading:"Read the design, then decide",body:"The security page sets out the same chain in full detail, including the things the server can see and the places the headline is weaker than
238it sounds.",primaryLabel:"Create a free vault",secondaryLabel:"Ask us something"},related:{heading:"Read next",links:[{label:"Should your password manager store your 2FA codes?",path:"/blog/2fa-codes-in-your-password-manager"},{label:"How the encryption works",path:"/security"},{label:"The free plan, in full",path:"/free-password-manager"}]}},Is=[An,Pn];function Ln(e){var s;const a=[...e.lead,...e.sections.flatMap(r=>[r.heading,...r.body,...r.items??[],r.caution??""]),...((s=e.faq)==null?void 0:s.items.flatMap(r=>[r.q,r.a]))??[]].join(" ");return Math.max(1,Math.ceil(a.split(/\s+/).filter(Boolean).length/200))}const fe={path:"/blog",seoTitle:"Blog â password security, in plain language | u2secured",seoDescription:"Posts on password security, two-factor authentication and zero-knowledge encryption from the team building U2 Secured. Specific, checkable, and honest about the limits.",navLabel:"Blog",kicker:"Writing",title:"Security, in plain language",lead:["Notes from building a zero-knowledge password vault and an authenticator: the decisions behind them, the trade-offs we took, and the parts we would rather you heard from us than found out later.","Every factual claim about another product links to that vendorâs own page, with the date we last read it."],breadcrumb:[{name:"Home",path:"/"},{name:"Blog",path:"/blog"}],readLabel:"Read",readingTimeLabel:"min read",cta:{heading:"Try the products the posts are about",body:"A zero-knowledge vault with a free plan, and an authenticator whose codes are free and unlimited.",primaryLabel:"Create a free vault",secondaryLabel:"Ask us something"}},Cn={path:"/switch/from-lastpass",seoTitle:"Switch from LastPass to U2 Secured â import your vault",seoDescription:"Move a LastPass CSV export into U2 Secured: logins and secure notes, encrypted in your browser. What comes across, what deliberately does not, and what it costs.",kicker:"Migration guide",title:"Switching from LastPass",navLabel:"Switch from LastPass",lead:["U2 Secured imports LastPass's CSV export directly: logins and secure notes, parsed and encrypted in your browser before anything reaches a server.","This page is the whole journey â the export, what crosses over, what deliberately does not, what it will cost for a vault your size, and what to do with the export file when you are done. No step is hidden until you are halfway through it."],breadcrumb:[{name:"Home",path:"/"},{name:"Password Vault",path:"/password-vault"},{name:"Switch from LastPass",path:"/switch/from-lastpass"}],steps:{heading:"The move, step by step",items:[{title:"Export your vault from LastPass",body:["In the LastPass web vault, choose Advanced options â Export and enter your master password. LastPass emails you a verification message; open it, select Continue export, then run Advanced options â Export again. Your data opens in a browser page and, if you let the pop-up through, downloads as a CSV.","The export has eight columns: url, username, password, totp, extra, name, grouping, fav. Older exports have no totp or fav column â that is fine, U2 Secured does not require either.","LastPass owns this part of the journey and occasionally moves the menus. Their support articles, linked at the foot of this page, are the authority on it."],caution:"That file is your entire vault in plain text, sitting in your Downloads folder. Nothing in it is encrypted. Keep it on your own machine, do not email it to yourself, and delete it as soon as the import is done â step 5."},{title:"Open Settings â Import in the U2 Secured web vault",body:["Sign in to the web vault, go to Settings â Import, choose LastPass, and pick your file. Import lives in the web vault only â the browser extension and the mobile apps do not have it.","You need to be the workspace owner or an admin; the server enforces that, not just the screen. The file may be up to 10 MB.","You also choose where the items land: an existing folder you can write to, or a new one created there and then."]},{title:"Read the review screen before anything is uploaded",body:["The review step is the point of the whole flow. For the file you handed it, it reports how many items are ready, how many are already in your vault, how many rows it could not use and why, and how much room your plan has left. Every skipped row is named by its row
238number in your own file, so you can go and look at it.","If the file is missing any column the parser needs â url, username, password, extra, name, grouping â it is refused right there, with a message naming both what was missing and the headers it did find. A Chrome export shares four of those column names, so handing over the wrong file is an easy mistake; this is what catches it.","If the import would take you past your plan's item limit, the screen says by how many, before a single item is uploaded."]},{title:"Confirm, then collect your two-factor codes",body:["Each item is encrypted in your browser and uploaded in batches. If your session locks part-way through, the run pauses and resumes from where it stopped rather than starting over or uploading anything twice.","When the upload finishes, any authenticator secrets found in the file are handed to you as QR codes. They are not imported â that is deliberate, and the next section explains why."]},{title:"Delete the export file",body:["Delete the CSV, then empty your trash: a file in the trash is still a file. Close the LastPass export tab too, and clear any second copy you made while moving it about.","Nothing needs the file again. Re-running the same import later is safe â duplicates are detected in your browser against what is already in your vault, so importing the same file twice does not double your entries."]}]},comes:{heading:"What comes across",items:["Logins: name, website, username, password, and whatever was in the extra column, which becomes the item's note.","Secure notes. LastPass marks them by writing http://sn in the url column; U2 Secured recognises the marker and imports them as notes rather than as logins pointing at a host that does not exist.","The LastPass folder name from the grouping column, kept as an annotation on the item so you can still see where each credential came from.","Names and notes in any language. Fields are length-capped and stripped of control characters on the way in, and anything trimmed, flagged or dropped is reported against its row number instead of disappearing quietly."]},missing:{heading:"What does not",lead:"Said plainly, because finding it out mid-import is worse than reading it now.",items:["Your folder tree is not rebuilt. Everything lands in the single folder you chose; the LastPass folder name survives as text on the item, not as a recreated hierarchy.","Authenticator (TOTP) secrets are never written to the vault. They are handed back to you instead â see below.","Anything a CSV cannot hold, file attachments being the obvious one.","LastPass exports form fills and identities separately from the vault CSV; U2 Secured reads the vault CSV, so those files are not covered here.","Rows with no password, no username and no note. They are not credentials, so they are skipped and listed rather than imported as empty entries you would have to explain to yourself later."]},totp:{heading:"Your two-factor codes are handed over, not imported",lead:"This is a deliberate design decision, and the one place where switching costs you real effort. It is not a missing feature, and we would rather you heard the reasoning than discovered the behaviour.",body:["LastPass keeps a site's password and its TOTP secret in the same record, and its export has a totp column to match. U2 Secured will not put that secret in the vault.","The reason is simple arithmetic: a password and its second factor in one store are not two factors. Whatever reaches that store reaches both, and the second factor has stopped being a second anything. Keeping them apart is the entire point of having one.","So the importer lifts any seed out of the item before encryption. Seeds are never uploaded â they exist only in the page in front of you. At the end of the import you get one QR code per seed, ready to scan into U2 Secured Authenticator or any other TOTP app, plus a plain otpauth:// file to download if you would rather move them in bulk.","Not every LastPass export carries a totp column â it arrived in a later version â and a file without one imports perfectly well."],caution:"Re-enrol each code and test it before you delete anything in LastPass, and treat the downloaded seed file exactly like the CSV: it is plaintext, and it should not outlive the migration."},pricing:{heading:"What it will cost for a vault your size",lead:"Item limits are per workspace and they count what is already in there. A typical LastPass vault fits comfortably inside the free plan's 500-item limit, so free is enough to bring your whole vault across and actually use it â not just kick the tyres. Basic is for a vault bigger than that, or for anything free does not include: a second user, breach monitoring, or a longer audit log.",plans:[{name:"Free",price:"$0",priceNote:"one user",items:"500 items",bullets:["7-day audit log","The same cryptography as every paid plan â encryption does not improve with price","No breach monitoring, no SSO"],recommended:!0,recommendedNote:"Where most LastPass vaults land."},{name:"Basic",price:"$5",priceNote:"per block of 5 users, per month â $1.00 per user",items:"1,000 items",bullets:["Unlimited users, billed
238in blocks of five","30-day audit log","Breach monitoring","Auto-lock policy across web, extension and mobile"]},{name:"Premium",price:"$9",priceNote:"per block of 5 users, per month â $1.80 per user",items:"10,000 items",bullets:["Single sign-on with OIDC and SAML","365-day audit log","API access","Breach monitoring and auto-lock policy"]}],notes:["Paid plans bill per block of five users with a minimum of one block, so one person on Basic pays $5 a month and a team of twelve pays for three blocks.","Basic and Premium start with a 7-day trial at sign-up and ask for no card. If no payment method is added by the end of it, the workspace is paused rather than charged.","The import review screen shows the room left on your plan before you commit to an upload, and refuses an import that would exceed it."]},caveats:{heading:"Two things this is not",lead:"If either of these is how you use LastPass, read it now rather than after you have moved.",items:["There are no shared folders. The only sharing U2 Secured has is a temporary public link to a single item; there is no user-to-user and no team or organisation sharing. If you rely on LastPass shared folders, this is not a like-for-like move.","The browser extension is Chrome and Edge only â there is no Firefox or Safari extension. The web vault works in any modern browser, and there are iOS and Android apps."]},faq:{heading:"Questions people actually ask",items:[{q:"Does U2 Secured import from LastPass?",a:"Yes. The web vault reads LastPass's CSV export under Settings â Import, and also imports from Chrome, Bitwarden and 1Password. Import is available to the workspace owner and admins."},{q:"Will my LastPass folders be recreated?",a:"No. Every imported item goes into the one folder you pick during the import â an existing folder or a new one. The LastPass folder name from the grouping column is kept as an annotation on each item, so the information survives even though the hierarchy is not rebuilt."},{q:"Do my authenticator (TOTP) codes come across?",a:"No, by design. Storing a password and its second factor together collapses two factors into one, so seeds found in the export are never written to the vault. They are shown to you as otpauth:// QR codes at the end of the import, to scan into U2 Secured Authenticator or any TOTP app, and can also be downloaded as a plain text file. The seeds are never uploaded."},{q:"Are my LastPass secure notes imported?",a:"Yes. LastPass marks a secure note by putting http://sn in the url column, and U2 Secured imports those rows as secure notes rather than as logins pointing at a URL that does not resolve."},{q:"How many items can I import?",a:"The free plan holds 500 items for one user, Basic holds 1,000 and Premium holds 10,000. The limit is per workspace and counts items already in the vault, so the review screen shows the room remaining before anything is uploaded and refuses an import that would exceed it. A typical LastPass vault fits inside the free plan's 500 items, so most switchers can bring everything across without paying anything; Basic is for a vault bigger than that, or for a second user, breach monitoring, or a longer audit log."},{q:"Can U2 Secured see my passwords during the import?",a:"No. The CSV is parsed in your browser and each item is encrypted there, with a key derived from your master password via Argon2id and HKDF; items travel as AES-256-GCM ciphertext. The server stores blobs it cannot read, and neither the master password nor the vault key is ever sent to it."},{q:"Why does the import refuse my file?",a:"The LastPass parser requires the url, username, password, extra, name and grouping columns. If any is absent the file is refused with a message naming what was missing and the headers it found â most often because the file came from somewhere else, since a Chrome export shares four of those column names. The totp and fav columns are optional."},{q:"What should I do with the exported CSV afterwards?",a:"Delete it and empty your trash. It is an unencrypted copy of every credential you own, and it has no further use once the import has finished. Do the same with the otpauth:// seed file if you downloaded one."}]},sources:{heading:"Sources for the LastPass side",note:"The steps above were read from LastPass's own support articles on the date shown. LastPass changes its interface from time to time; if the menus have moved, their article is the authority and this page is out of date.",refs:[{label:"LastPass â How do I export vault data while logged in through the LastPass website?",url:"https://support.lastpass.com/s/document-item?language=en_US&bundleId=lastpass&topicId=LastPass%2Fexport-web-vault.html",verifiedOn:"2026-09-25"},{label:"LastPass â How do I export vault data from LastPass as a generic CSV file?",url:"https://support.lastpass.com/s/document-item?language=en_US&bundleId=lastpass&topicId=LastPass%2Fexport-generic-csv.html",verifiedOn:"2026-09-25"}]},cta:{heading:"Ready when you are",body:"Create a workspace, export from LastPass, and run the import. The review screen tells you what will happen before anything is uploaded â and if something about your vault does not fit, ask us first.",primaryLabel:"Create an account",secondaryLabel:"Ask a question first"},related:{heading:"More about the vault",links:[{label:"U2 Secured vs LastPass",path:"/vs/lastpass"},{label:"Password Vault",path:"/password-vault"},{label:"Browser extension",path:"/browser-extension"},{label:"Mobile app",path:"/mobile-app"}]}},qn={path:"/switch/from-bitwarden",seoTitle:"Switch from Bitwarden to U2 Secured â import your vault",seoDescription:"Move a Bitwarden export into U2 Secured: logins, secure notes and cards, encrypted in your browser. What comes across, what your free tier gives up, and what it costs.",kicker:"Migration guide",title:"Switching from Bitwarden",navLabel:"Switch from Bitwarden",lead:["U2 Secured imports Bitwarden's own export directly â either the unencrypted JSON or the CSV â parsed and encrypted in your browser before anything reaches a server.","Bitwarden is a good product and its free tier is genuinely unlimited on items, which U2 Secured's is not. This page is the honest version of that trade: the export, what crosses over, what does not, what happens to your two-factor codes, and what it will cost for a vault your size."],breadcrumb:[{name:"Home",path:"/"},{name:"Password Vault",path:"/password-vault"},{name:"Switch from Bitwarden",path:"/switch/from-bitwarden"}],steps:{heading:"The move, step by step",items:[{title:"Export your vault from Bitwarden",body:['In the Bitwarden web vault, go to Tools â Export vault. Leave "Export from" set to My vault â an organisation vault exports separately and is not covered here. Choose a file format, then confirm with your master password or an email verification code.',"Bitwarden offers four formats: .json, .csv, an encrypted .json (account-restr
238icted or password-protected), and a .zip with attachments. Pick plain .json or .csv. U2 Secured refuses an encrypted JSON export outright â it is a different cryptographic format, not vault content â and the zip export is a container this importer does not open.","JSON keeps more of your vault than CSV: item types (card, identity), TOTP secrets and folder names all survive JSON in a way CSV's flatter shape cannot fully hold. If your vault has any cards or identities, export JSON.","Bitwarden owns this part of the journey and occasionally moves the menus. Their support article, linked at the foot of this page, is the authority on it."],caution:"That file is your entire vault in plain text the moment it lands in your Downloads folder â .json and .csv are both unencrypted regardless of what format you picked. Keep it on your own machine, do not email it to yourself, and delete it as soon as the import is done â step 5."},{title:"Open Settings â Import in the U2 Secured web vault",body:["Sign in to the web vault, go to Settings â Import, choose Bitwarden, and pick your file â either .json or .csv is accepted from the same option. Import lives in the web vault only â the browser extension and the mobile apps do not have it.","You need to be the workspace owner or an admin; the server enforces that, not just the screen. The file may be up to 10 MB.","You also choose where the items land: an existing folder you can write to, or a new one created there and then."]},{title:"Read the review screen before anything is uploaded",body:["The review step is the point of the whole flow. For the file you handed it, it reports how many items are ready, how many are already in your vault, how many rows it could not use and why, and how much room your plan has left. Every skipped row is named by its position in your own file, so you can go and look at it.","A CSV needs the type, name, notes, login_uri, login_username and login_password columns; if any is missing, the file is refused right there, naming both what was missing and the headers it did find. A JSON file that will not parse, or that turns out to be one of the encrypted formats, is refused the same way, with a message that does not quote your data back at you.","If the import would take you past your plan's item limit, the screen says by how many, before a single item is uploaded."]},{title:"Confirm, then collect your two-factor codes",body:["Each item is encrypted in your browser and uploaded in batches. If your session locks part-way through, the run pauses and resumes from where it stopped rather than starting over or uploading anything twice.","When the upload finishes, any authenticator secrets found in the file are handed to you as QR codes. They are not imported â that is deliberate, and the next section explains why."]},{title:"Delete the export file",body:["Delete the export, then empty your trash: a file in the trash is still a file. Close the Bitwarden export tab too, and clear any second copy you made while moving it about.","Nothing needs the file again. Re-running the same import later is safe â duplicates are detected in your browser against what is already in your vault, so importing the same file twice does not double your entries."]}]},comes:{heading:"What comes across",items:["Logins: name, website, username, password and notes.","Secure notes, as a native note type in both JSON and CSV.","Credit cards â number, cardholder name, CVV and expiry â but only from a JSON export. Bitwarden's CSV has no dedicated card columns, so a card row in a CSV export is refused rather than guessed at.","Identity entries, from JSON only, folded into a note: every field Bitwarden recorded (name, address, passport number, and so on) is written out as text in the note body, since there is no identity item type here to receive it natively.","The Bitwarden folder each item was in, kept as an annotation on the item so you can still see where each credential came from.","Names and notes in any language. Fields are length-capped and stripped of control characters on the way in, and anything trimmed, flagged or dropped is reported against its position in the file instead of disappearing quietly."]},missing:{heading:"What does not",lead:"Said plainly, because finding it out mid-import is worse than reading it now.",items:["Your folder tree is not rebuilt. Everything lands in the single folder you chose; the Bitwarden folder name survives as text on the item, not as a recreated hierarchy.","Authenticator (TOTP) secrets are never written to the vault. They are handed back to you instead â see below.","Cards and identities do not survive a CSV export â export JSON instead if your vault has either.","File attachments. Bitwarden Premium can attach files to an item; nothing in any export format this importer reads carries that attachment's bytes.","Passkeys stored in Bitwarden. Neither export format this importer reads carries them.","Rows with
238no usable content â no password, no username, no card number and no note. They are not credentials, so they are skipped and listed rather than imported as empty entries you would have to explain to yourself later."]},totp:{heading:"Your two-factor codes are handed over, not imported",lead:"This is a deliberate design decision, and the one place where switching costs you real effort. It is not a missing feature, and we would rather you heard the reasoning than discovered the behaviour.",body:["Storing a TOTP code alongside its password is Bitwarden's own Premium feature â it costs $19.80 a year there, on top of whatever plan you are already on, precisely because it keeps both factors in the same record. U2 Secured will not put that secret in the vault at any price, on any plan.","The reason is simple arithmetic: a password and its second factor in one store are not two factors. Whatever reaches that store reaches both, and the second factor has stopped being a second anything. Competitors sell both factors in one vault; U2 Secured sells them as two products, deliberately kept apart.","So if your Bitwarden export carries a totp secret â the login.totp field in JSON, or login_totp in CSV â the importer lifts it out before encryption. Seeds are never uploaded; they exist only in the page in front of you. At the end of the import you get one QR code per seed, ready to scan into U2 Secured Authenticator or any other TOTP app, plus a plain otpauth:// file to download if you would rather move them in bulk.","U2 Secured Authenticator reads that code for free, with no Premium tier gating the codes themselves. If you were paying Bitwarden for integrated 2FA, this is where that cost goes away; the Authenticator's own paid tier ($14.99/year) is for encrypted backup and multi-device restore, not for generating codes."],caution:"Re-enrol each code and test it before you delete anything in Bitwarden, and treat the downloaded seed file exactly like the export: it is plaintext, and it should not outlive the migration."},pricing:{heading:"What it will cost for a vault your size",lead:"Bitwarden's free tier is unlimited on items; U2 Secured's caps at 500. Said plainly, because it is the one place U2 Secured does not win: a vault that has grown past 500 items over the years needs Basic here, where it would not have needed anything there. Most personal vaults fit inside 500 comfortably, but this is worth checking before you commit to the move.",plans:[{name:"Free",price:"$0",priceNote:"one user",items:"500 items",bullets:["7-day audit log","The same cryptography as every paid plan â encryption does not improve with price","No breach monitoring, no SSO"],recommended:!0,recommendedNote:"Check your Bitwarden item count first â this is not automatically enough."},{name:"Basic",price:"$5",priceNote:"per block of 5 users, per month â $1.00 per user",items:"1,000 items",bullets:["Unlimited users, billed in blocks of five","30-day audit log","Breach monitoring","Group-based folder access control for a team","Auto-lock policy across web, extension and mobile"]},{name:"Premium",price:"$9",priceNote:"per block of 5 users, per month â $1.80 per user",items:"10,000 items",bullets:["Single sign-on with OIDC and SAML","365-day audit log","API access","Group-based folder access control at team scale","Breach monitoring and auto-lock policy"]}],notes:["Paid plans bill per block of five users with a minimum of one block, so one person on Basic pays $5 a month and a team of twelve pays for three blocks.","Basic and Premium start with a 7-day trial at sign-up and ask for no card. If no payment method is added by the end of it, the workspace is paused rather than charged.","The import review screen shows the room left on your plan before you commit to an upload, and refuses an import that would exceed it."]},caveats:{heading:"Two things this is not",lead:"If either of these is how you use Bitwarden, read it now rather than after you have moved.",items:["There are no shared folders or organisation collections. The only sharing U2 Secured has is a temporary public link to a single item;
238 there is no user-to-user and no team or organisation sharing. If you rely on a Bitwarden organisation and its collections, this is not a like-for-like move â group-based folder access control on Basic and Premium is for access control within one workspace, not multi-party sharing across accounts.","The browser extension is Chrome and Edge only â there is no Firefox or Safari extension. The web vault works in any modern browser, and there are iOS and Android apps."]},faq:{heading:"Questions people actually ask",items:[{q:"Does U2 Secured import from Bitwarden?",a:"Yes. The web vault reads either Bitwarden export format â unencrypted JSON or CSV â under Settings â Import, and also imports from Chrome, LastPass and 1Password. Import is available to the workspace owner and admins."},{q:"Should I export JSON or CSV from Bitwarden?",a:"JSON if you can. It keeps item types CSV cannot hold â credit cards import natively, and identity entries are folded into a note â plus your folder names and TOTP secrets. CSV works for logins and secure notes, but a card or identity row in a CSV export is refused rather than guessed at."},{q:"Can I use the encrypted JSON or the zip export?",a:"No. An account-restricted or password-protected JSON export is a different cryptographic format, not your vault content in a shape this importer reads, and it is refused outright. The zip-with-attachments export is a container only the 1Password import path opens. Export plain, unencrypted .json or .csv instead."},{q:"Will my Bitwarden folders be recreated?",a:"No. Every imported item goes into the one folder you pick during the import â an existing folder or a new one. The Bitwarden folder name is kept as an annotation on each item, so the information survives even though the hierarchy is not rebuilt."},{q:"Do my authenticator (TOTP) codes come across?",a:"No, by design. Bitwarden itself only stores a TOTP code alongside its password on Premium, for $19.80/year â U2 Secured will not do that at any price, because storing a password and its second factor together collapses two factors into one. Any seed found in your export is shown to you as an otpauth:// QR code at the end of the import, to scan into U2 Secured Authenticator â free, in a separate app â or any TOTP app, and can also be downloaded as a plain text file. The seeds are never uploaded."},{q:"How many items can I import?",a:"The free plan holds 500 items for one user, Basic holds 1,000 and Premium holds 10,000. Bitwarden's free tier has no item cap, so this is the one place the comparison does not favour U2 Secured â check your Bitwarden item count before assuming free will fit it. The limit is per workspace and counts items already in the vault; the review screen shows the room remaining before anything is uploaded and refuses an import that would exceed it."},{q:"Can U2 Secured see my passwords during the import?",a:"No. The file is parsed in your browser and each item is encrypted there, with a key derived from your master password via Argon2id and HKDF; items travel as AES-256-GCM ciphertext. The server stores blobs it cannot read, and neither the master password nor the vault key is ever sent to it."},{q:"What should I do with the exported file afterwards?",a:"Delete it and empty your trash. Both .json and .csv are unencrypted copies of every credential you own, and neither has any further use once the import has finished. Do the same with the otpauth:// seed file if you downloaded one."}]},sources:{heading:"Sources for the Bitwarden side",note:"The steps above were read from Bitwarden's own help article on the date shown. Bitwarden changes its interface from time to time; if the menus have moved, their article is the authority and this page is out of date.",refs:[{label:"Bitwarden â Export your data",url:"https://bitwarden.com/help/export-your-data/",verifiedOn:"2026-09-25"}]},cta:{heading:"Ready when you are",body:"Create a workspace, export from Bitwarden, and run the import. The review screen tells you what will happen before anything is uploaded â and if something about your vault does not fit, ask us first.",primaryLabel:"Create an account",secondaryLabel:"Ask a question first"},related:{heading:"More about the vault",links:[{label:"U2 Secured vs Bitwarden",path:"/vs/bitwarden"},{label:"Password Vault",path:"/password-vault"},{label:"Browser extension",path:"/browser-extension"},{label:"Mobile app",path:"/mobile-app"}]}},En={path:"/switch/from-chrome",seoTitle:"Switch from Chrome passwords to U2 Secured",seoDescription:"Move your saved Chrome passwords into U2 Secured: export the CSV, import it, and get zero-knowledge encryption, cross-browser access and free two-factor codes Chrome never had",kicker:"Migration guide",title:"Switching from Chrome",navLabel:"Switch from Chrome",lead:["U2 Secured imports the CSV that Chrome's own password export produces, parsed and encrypted in your browser before anything reaches a server.","Chrome's password manager is genuinely convenient, and it encrypts what it stores. The argument for moving is not that it is unsafe â it is that your passwords are tied to one browser and one Google account, there is no published zero-knowledge design, no way to share a credential with anyone, and n
238o second factor stored anywhere. This page covers the export, the import, and what changes once you have made the move."],breadcrumb:[{name:"Home",path:"/"},{name:"Password Vault",path:"/password-vault"},{name:"Switch from Chrome",path:"/switch/from-chrome"}],steps:{heading:"The move, step by step",items:[{title:"Export your passwords from Chrome",body:["In Chrome, go to Settings â Autofill and passwords â Google Password Manager â Settings, and choose Export passwords â Download file. You may be asked to confirm with your device screen lock or your Google password first.","Chrome produces a CSV with a name, url, username and password column, plus an optional note column when a password has one attached. That is everything Chrome exports â there is no secondary file for anything else, because Chrome's password manager does not track item types beyond a single login.","Google owns this part of the journey and occasionally moves the menus. Their support article, linked at the foot of this page, is the authority on it."],caution:"That file is every one of your saved passwords in plain text, sitting in your Downloads folder. Nothing in it is encrypted. Keep it on your own machine, do not email it to yourself, and delete it as soon as the import is done â step 4."},{title:"Open Settings â Import in the U2 Secured web vault",body:["Sign in to the web vault â creating an account takes a couple of minutes if you have not already â go to Settings â Import, choose Chrome, and pick your CSV file. Import lives in the web vault only â the browser extension and the mobile apps do not have it.","You need to be the workspace owner or an admin; on a brand-new personal workspace, that is simply you. The file may be up to 10 MB, which comfortably covers even a saved-password list in the thousands.","You also choose where the items land: an existing folder you can write to, or a new one created there and then."]},{title:"Read the review screen before anything is uploaded",body:["The review step is the point of the whole flow. For the file you handed it, it reports how many items are ready, how many are already in your vault, how many rows it could not use and why, and how much room your plan has left. Every skipped row is named by its row number in your own file, so you can go and look at it.","The parser needs the name, url, username and password columns; if any is missing, the file is refused right there, with a message naming both what was missing and the headers it did find â the surest sign you handed over a file from somewhere else.","If the import would take you past your plan's item limit, the screen says by how many, before a single item is uploaded."]},{title:"Confirm, then delete the export file",body:["Each item is encrypted in your browser and uploaded in batches. If your session locks part-way through, the run pauses and resumes from where it stopped rather than starting over or uploading anything twice.","When it finishes, delete the CSV and empty your trash: a file in the trash is still a file. Nothing needs it again, and re-running the same import later is safe â duplicates are detected in your browser against what is already in your vault, so importing the same file twice does not double your entries."]}]},comes:{heading:"What comes across",items:["Every saved login: site, username, password, and whatever was in the note column.","Names and notes in any language. Fields are length-capped and stripped of control characters on the way in, and anything trimmed, flagged or dropped is reported against its row number instead of disappearing quietly."]}
238,missing:{heading:"What does not",lead:"Chrome's export is the narrowest of the sources this importer reads, so there is less to lose than with a dedicated password manager â but read this before assuming everything came across.",items:["Passkeys. Chrome's own passkey manager is a separate system from its password export and is not included in the CSV at all â nothing here can move a passkey for you.","Payment cards and addresses saved in Chrome's autofill. Those export separately, if at all, and are not vault content this importer reads.","There is no folder or category concept in a Chrome export to preserve â Chrome's manager does not have one, so nothing is lost there, and every item lands in the single folder you chose during import.","There is no second factor to bring across, because Chrome does not store one â see below.","Rows with no password, no username and no note. They are not credentials, so they are skipped and listed rather than imported as empty entries you would have to explain to yourself later."]},totp:{heading:"Chrome never had your two-factor codes â U2 Secured does, for free",lead:"This is the one place this move adds something rather than costing you anything: Chrome's password manager has no concept of a two-factor code, so there is nothing to hand over during this import.",body:["Every source format this importer reads is checked for a TOTP secret and, when one is found, lifted out before encryption and handed back as a QR code rather than written into the vault â that is a deliberate design decision, not an oversight, and it is explained on the other migration guides on this site. Chrome's CSV simply never carries one, because Chrome's password manager was never built to store a second factor at all.","If you currently keep your authenticator codes in a different app, or on paper, or nowhere, U2 Secured Authenticator generates them for free â it is a separate app from the vault, on purpose, so a password and its second factor are never sitting in the same store.","Set it up any time after this import: scan the QR code your bank, email provider or any other site shows you when you turn on two-factor authentication, the same way you would with any authenticator app."],caution:"If you already use a different authenticator app for some accounts, there is no need to move those â U2 Secured Authenticator is for accounts you have not set up two-factor authentication on yet, or want in one place going forward."},pricing:{heading:"What it will cost",lead:"Chrome's password manager is free, and comparing it to a paid plan would be misleading â this move is worth making on the free plan alone for most people coming from Chrome, since a personal password list rarely runs past a few hundred entries. Paid plans exist for when a vault grows past that, or a household or small team wants more than one person on it.",plans:[{name:"Free",price:"$0",priceNote:"one user",items:"500 items",bullets:["7-day audit log","The same cryptography as every paid plan â encryption does not improve with price","No breach monitoring, no SSO"],recommended:!0,recommendedNote:"Where a Chrome password list almost always fits."},{name:"Basic",price:"$5",priceNote:"per block of 5 users, per month â $1.00 per user",items:"1,000 items",bullets:["Unlimited users, billed in blocks of five â a household or small team","30-day audit log","Breach monitoring","Auto-lock policy across web, extension and mobile"]},{name:"Premium",price:"$9",priceNote:"per block of 5 users, per month â $1.80 per user",items:"10,000 items",bullets:["Single sign-on with OIDC and SAML","365-day audit log","API access","Breach monitoring and auto-lock policy"]}],notes:["Paid plans bill per block of five users with a minimum of one block, so one person on Basic pays $5 a month and a team of twelve pays for three blocks.","Basic and Premium start with a 7-day trial at sign-up and ask for no card. If no payment method is added by the end of it, the workspace is paused rather than charged.","The import review screen shows the room left on your plan before you commit to an upload, and refuses an import that would exceed it."]},caveats:{heading:"Two things this is not",lead:"Worth reading now rather than assuming.",items:["There are no shared folders. The only sharing U2 Secured has is a temporary public link to a single item;
238 there is no user-to-user and no team or organisation sharing. Chrome's passwords were never shareable either, so this is not a step backward â just not a feature this move gives you.","The browser extension is Chrome and Edge only, which â coming from Chrome â is not a limitation for you specifically. There is no Firefox or Safari extension, and there are iOS and Android apps if you use another device."]},faq:{heading:"Questions people actually ask",items:[{q:"Does U2 Secured import from Chrome?",a:"Yes. The web vault reads the CSV Chrome's own password export produces under Settings â Import, and also imports from Bitwarden, LastPass and 1Password. Import is available to the workspace owner and admins â on a new personal workspace, that is you."},{q:"Is Chrome not secure enough already?",a:"Chrome's password manager encrypts what it stores and is genuinely convenient. The reason to move is not that it is unsafe today â it is that your passwords stay tied to one browser and one Google account, there is no published zero-knowledge guarantee, no way to share a credential with anyone, and no second factor stored anywhere."},{q:"What is zero-knowledge, and does Chrome have it?",a:"Zero-knowledge means the service storing your data cannot read it, even in principle: U2 Secured derives your vault key from your master password on your device via Argon2id and HKDF, and only AES-256-GCM ciphertext ever reaches the server. Chrome does not publish an equivalent design for its password manager, and access to your Google account is what protects your saved passwords there."},{q:"Do my Chrome passwords come with two-factor codes?",a:"No â Chrome's password manager has never stored two-factor codes, so there is nothing to bring across on that front. U2 Secured Authenticator generates them for free, in a separate app from the vault, and you can set it up for any account any time after this import."},{q:"What about passkeys I saved in Chrome?",a:"Not covered by this import. Chrome's passkey manager is a separate system from its password export, and the CSV this importer reads does not include them."},{q:"How many passwords can I import?",a:"The free plan holds 500 items for one user, Basic holds 1,000 and Premium holds 10,000. Most people coming from Chrome have a personal list well inside 500. The limit is per workspace and counts items already in the vault, so the review screen shows the room remaining before anything is uploaded and refuses an import that would exceed it."},{q:"Can U2 Secured see my passwords during the import?",a:"No. The CSV is parsed in your browser and each item is encrypted there, with a key derived from your master password via Argon2id and HKDF; items travel as AES-256-GCM ciphertext. The server stores blobs it cannot read, and neither the master password nor the vault key is ever sent to it."},{q:"What should I do with the exported CSV afterwards?",a:"Delete it and empty your trash. It is an unencrypted copy of every password you saved in Chrome, and it has no further use once the import has finished."}]},sources:{heading:"Source for the Chrome side",note:"The steps above were read from Google's own support article on the date shown. Chrome changes its interface from time to time; if the menus have moved, their article is the authority and this page is out of date.",refs:[{label:"Google Chrome Help â Save, delete, edit and manage passwords in Chrome",url:"https://support.google.com/chrome/answer/95606",verifiedOn:"2026-09-25"}]},cta:{heading:"Ready when you are",body:"Create a workspace, export from Chrome, and run the import. The review screen tells you what will happen before anything is uploaded â and if something about your list does not fit, ask us first.",primaryLabel:"Create an account",secondaryLabel:"Ask a question first"},related:{heading:"More about the vault",links:[{label:"Password Vault",path:"/password-vault"},{label:"Browser extension",path:"/browser-extension"},{label:"Mobile app",path:"/mobile-app"}]}},On={path:"/vs/lastpass",competitor:"LastPass",seoTitle:"U2 Secured vs LastPass â Switch Password Managers",seoDescription:"No device-type restriction on any plan, and TOTP free in a separate app â not gated to LastPass Business. See the full comparison, sourced and dated, before you switch.",navLabel:"U2 Secured vs LastPass",kicker:"Comparison",title:"U2 Secured vs LastPass",lead:["Two things are worth knowing if you're on LastPass today: Free restricts you to one device type â desktop or mobile, never both â and vault-integrated TOTP isn't available on Premium or Families at any price; LastPass reserves it for Teams and Business. U2 Secured has no device-type restriction on any plan, and TOTP is free and unlimited in the separate U2 Secured Authenticator app, not a business-tier upgrade.","What follows is the full comparison, sourced directly from lastpass.com and dated. If you've already decided to move, the step-by-step import guide is linked below."],breadcrumb:[{name:"Home",path:"/"},{name:"Password Vault",path:"/password-vault"},{name:"U2 Secured vs LastPass",path:"/vs/lastpass"}],suits:{heading:"Who U2 Secured suits",lead:"Built for a reader who moves between devices freely and wants a second factor that is never gated behind a business plan.",items:["Anyone who switches between a laptop and a phone and doesn't want a free plan that picks one device type for them.","Anyone who wants TOTP codes free and unlimited without a business-tier upgrade â LastPass reserves vault-integrated TOTP for Teams and above.","An organisation that wants group-based folder access control on Basic or Premium."]},table:{heading:"What each plan actually includes",lead:"Every LastPass figure below is read from lastpass.com â the citation link on each row goes straight to it, dated the day it was read.",rows:[{feature:"TOTP co
238des for other sites, from inside the vault",ours:I.totpFraming,theirs:'Not available on Premium or Families at any price â the "Time-based one-time passcodes (TOTP)" row is Teams/Business/Business Max only',source:"https://www.lastpass.com/pricing",sourceLabel:"LastPass â Pricing (plan comparison grid)",verifiedOn:"2026-09-25",note:`Read from the grid's own icon markup: Premium and Families both show "no" for this row, Teams and both Business tiers show "yes".`},{feature:"Free tier device access",ours:"Every surface, every plan â web vault, the browser extension, iOS and Android, with no device-type restriction",theirs:"Free is limited to ONE device type: computer (all desktop/laptop browsers) OR mobile (phone, watch, tablet) â not both",source:"https://www.lastpass.com/pricing",sourceLabel:"LastPass â Pricing",verifiedOn:"2026-09-25"},{feature:"Free tier item limit",ours:I.freeItems,theirs:"Unlimited password storage on Free",source:"https://www.lastpass.com/pricing/lastpass-premium-vs-free",sourceLabel:"LastPass â Free vs. Premium FAQ",verifiedOn:"2026-09-25",note:"U2 Secured's free plan holds up to 500 items â ample for a typical personal vault. LastPass states unlimited password storage on Free."},{feature:"Sharing with other people",ours:I.sharing,theirs:'"Basic password sharing" on Free; Premium adds one-to-many sharing',source:"https://www.lastpass.com/pricing/lastpass-premium-vs-free",sourceLabel:"LastPass â Free vs. Premium FAQ",verifiedOn:"2026-09-25"},{feature:"Paid plan price and user count",ours:`${I.basicAnnual} (${I.blockFloor.toLowerCase()}
238)`,theirs:"Premium is 1 user, Families is 6 users, both a single price â but the price itself renders client-side on both LastPass pages, so no verified figure is quoted here",source:"https://www.lastpass.com/pricing",sourceLabel:"LastPass â Pricing",verifiedOn:"2026-09-25",note:"Third-party sites quote LastPass numbers; this page only states what was read directly off lastpass.com, which does not include a price in its static markup."}]},totp:{heading:"Two products, not one, and LastPass personal plans have neither at the vault level",lead:"Competitors sell both factors in one vault. U2 Secured sells them as two products, deliberately kept apart, because a password and its second factor in one store are not two factors.",body:["U2 Secured's TOTP codes live in the separate U2 Secured Authenticator app, free and unlimited. They are never written to the password vault â import lifts a seed out and hands it back as a QR code rather than storing it.","LastPass's own plan-comparison grid shows its vault-integrated TOTP row as unavailable on Premium and Families â the two plans an individual or a family actually buys. It only turns on for Teams and Business, organisational plans with a very different buyer. A LastPass Premium subscriber who wants TOTP next to their passwords cannot get it by upgrading; they would need a business account.","U2 Secured's Authenticator app is a real, free, unlimited product built for exactly this. LastPass has no comparable free option for storing codes on a personal plan."]},whereTheyWin:{heading:"Where LastPass is ahead",lead:"Stated once, factually.",items:["LastPass's free tier holds an unlimited number of items; U2 Secured's caps at 500 â ample for most personal vaults, a real ceiling for a very large one.","Families bundles a purpose-built family manager dashboard and shared folders into one plan, with no separate configuration step."]},whoShouldPick:{heading:"What tips the decision",ours:{heading:"Choose U2 Secured if",items:["You use more than one kind of device and don't want a free plan that restricts you to one.","You want TOTP free, unlimited and in a dedicated app â not gated behind a business-tier upgrade you don't otherwise need.","Group-based folder access control matters to you, and 500 free items or a $5-per-block-of-5 paid plan works for your vault."]},theirs:{heading:"What LastPass's plans optimise for",items:["No item cap on Free, so a very large personal vault never forces an upgrade.","A shared-folder dashboard and family manager tools packaged into Families, with no separate setup.","A longer operating history and a fuller tier ladder â Teams, Business, Business Max â for buyers who expect to grow into an enterprise plan."]}},honesty:{heading:"Said out loud, not left for you to discover",items:["Passwords and TOTP with U2 Secured are two products, not one subscription â the vault and the free U2 Secured Authenticator app.",`A single person on Basic still pays for a full 5-user block: ${I.basicAnnual}, whether one seat is used or five.`,`${I.freeGroups} â group-based folder access needs Basic or Premium.`,"U2 Secured is a new product with no published third-party security audit yet. LastPass has operated for far longer."]},faq:{heading:"Questions people actually ask",items:[{q:"Does U2 Secured store two-factor (TOTP) codes?",a:"Yes â free and unlimited, in the separate U2 Secured Authenticator app. They are deliberately not stored in the password vault itself, because a password and its second factor in one store are not two factors. LastPass's own vault-integrated TOTP is unavailable on its Premium and Families plans; only Teams and Business get it."},{q:"Is LastPass Free really limited to one device type?",a:"Yes, by LastPass's own description: Free access is restricted to a single device type â either all your desktop/laptop browsers, or your mobile devices, not both at once. U2 Secured has no device-type restriction on any plan."},{q:"Is U2 Secured cheaper than LastPass?",a:`U2 Secured Basic is ${I.basicAnnual}. LastPass does not publish a price in its page's static markup â Premium and Families both render as placeholders client-side â so this page does not claim a specific LastPass number to compare against.`},{q:"Does LastPass Free hold more items than U2 Secured Free?",a:`Yes. LastPass states its free plan has unlimited password storage. U2 Secured's free plan holds ${he.free.maxSecrets} items â enough for a typical personal vault, though a very large one will reach it before LastPass's uncapped free tier would.`},{q:"Can I move my LastPass vault into U2 Secured?",a:"Yes â the web vault imports a LastPass CSV export directly, encrypting each item in y
238our browser. The full step-by-step guide, including what does and does not come across, is the switch guide linked below."}]},sources:{heading:"Sources for the LastPass side",note:"Every LastPass figure above was read directly from lastpass.com's own markup on the date shown, not from a third-party pricing summary. LastPass changes its site from time to time; if a plan has changed, these pages are the authority and this comparison is out of date.",refs:[{label:"LastPass â Pricing",url:"https://www.lastpass.com/pricing",verifiedOn:"2026-09-25"},{label:"LastPass â Premium vs. Free",url:"https://www.lastpass.com/pricing/lastpass-premium-vs-free",verifiedOn:"2026-09-25"}]},cta:{heading:"Start your switch",body:"Create a free U2 Secured workspace, or jump straight to the LastPass import guide if you already know you're moving.",primaryLabel:"Create an account",secondaryLabel:"Ask a question first"},related:{heading:"More about U2 Secured",links:[{label:"Switch from LastPass",path:"/switch/from-lastpass"},{label:"Pricing",path:"/pricing"},{label:"Security",path:"/security"}]}},Rn={path:"/vs/bitwarden",competitor:"Bitwarden",seoTitle:"U2 Secured vs Bitwarden â Zero-Knowledge Password Manager",seoDescription:"Free TOTP in a separate Authenticator app, group-based folder access, and a 500-item zero-knowledge vault â see how U2 Secured compares to Bitwarden, sourced and dated.",navLabel:"U2 Secured vs Bitwarden",kicker:"Comparison",title:"U2 Secured vs Bitwarden",lead:["U2 Secured keeps two-factor codes out of the password vault entirely: TOTP is free and unlimited in the separate U2 Secured Authenticator app, while Bitwarden folds its integrated authenticator into a $19.80/yr Premium subscription. Passwords and their second factor are two products here, not one â deliberately, because a single store holding both is not two factors.","Basic and Premium also add group-based folder access control, so an organisation can scope exactly who sees which folder. What follows is the full comparison, sourced from Bitwarden's own site and dated."],breadcrumb:[{name:"Home",path:"/"},{name:"Password Vault",path:"/password-vault"},{name:"U2 Secured vs Bitwarden",path:"/vs/bitwarden"}],suits:{heading:"Who U2 Secured suits",lead:"Built for a reader who wants the second factor kept structurally apart from the vault it protects, and does not want to pay to combine them.",items:["Anyone who wants two-factor codes free and unlimited, in a dedicated app, rather than bundled into a paid vault subscription.","An organisation that wants group-based folder permissions on Basic or Premium, so members see only the folders relevant to them.","A personal vault that fits inside 500 items â which is most people's â in exchange for that separation."]},table:{heading:"What each plan actually includes",lead:"Every Bitwarden figure below is read from Bitwarden's own site â the citation on each row goes straight to it, dated the day it was read.",rows:[{feature:"TOTP codes for other sites, from inside the vault",ours:I.totpFraming,theirs:"Requires Premium, $19.80/yr â not on Free",source:"https://bitwarden.com/pricing/",sourceLabel:"Bitwarden â Pricing",verifiedOn:"2026-09-25"},{feature:"Free tier item limit",ours:I.freeItems,theirs:"Unlimited storage of logins, notes, cards and identities",source:"https://bitwarden.com/help/password-manager-plans/",sourceLabel:"Bitwarden â Password Manager Plans (help docs)",verifiedOn:"2026-09-25",note:"U2 Secured's free plan holds up to 500 items â ample for a typical personal vault. Bitwarden's free tier carries no published cap, which matters for a very large one."},{feature:"Devices on the free plan",ours:"Unlimited devices on every plan",theirs:"Unlimited devices on Free",source:"https://bitwarden.com/help/password-manager-plans/",sourceLabel:"Bitwarden â Password Manager Plans (help docs)",verifiedOn:"2026-09-25",note:"Both products match here."},{feature:"Entry paid plan, price and users",ours:`${I.basicAnnual}`,theirs:"Premium $19.80/yr for 1 account; Families $47.88/yr for up to 6 users",source:"https://bitwarden.com/pricing/",sourceLabel:"Bitwarden â Pricing",verifiedOn:"2026-09-25"}]},totp:{heading:"Two products, not one",lead:"Competitors sell both factors in one vault. U2 Secured sells them as two products, deliberately kept apart, because a password and its second factor in one store are not tw
238o factors.",body:["Bitwarden's integrated authenticator lives inside the same Premium subscription as the vault: one login, one record, both factors, for $19.80/yr.","U2 Secured keeps TOTP out of the vault entirely, in the free U2 Secured Authenticator app. The codes never touch the same store as the passwords they protect, and using the app for codes costs nothing. Its own Premium ($14.99/yr) gates encrypted backup, moving codes to a new device, and web portal access â not the codes themselves.","If you'd rather your second factor never share a store with the password it protects, that separation is the whole point â and it doesn't cost anything extra to get it."]},whereTheyWin:{heading:"Where Bitwarden is ahead",lead:"Stated once, factually.",items:["Bitwarden's free tier carries no published item cap. U2 Secured's holds up to 500 items â ample for a typical personal vault, but a real ceiling for someone with a very large one."]},whoShouldPick:{heading:"What tips the decision",ours:{heading:"Choose U2 Secured if",items:["You want TOTP kept structurally apart from your passwords, for free, rather than paying to combine them.","Group-based folder access control across an organisation matters to your team.","500 items covers your vault, and the free-and-separate second factor is worth more to you than an uncapped item count."]},theirs:{heading:"What Bitwarden's design optimises for",items:["No published item cap on Free, so a very large personal vault never forces an upgrade.","Passwords and TOTP in one Premium subscription, favouring a single login over structural separation.","A decade of independent security audits and an open-source codebase, for buyers who weight track record heavily."]}},honesty:{heading:"Said out loud, not left for you to discover",items:["Passwords and TOTP with U2 Secured are two products, not one subscription â the vault and the free U2 Secured Authenticator app.",`A single person on Basic still pays for a full 5-user block: ${I.basicAnnual}, whether one seat is used or five.`,`${I.freeGroups} â group-based folder access needs Basic or Premium.`,"U2 Secured is a new product with no published third-party security audit yet. Bitwarden has been audited repeatedly over roughly a decade."]},faq:{heading:"Questions people actually ask",items:[{q:"Does U2 Secured store two-factor (TOTP) codes?",a:"Yes â free and unlimited, in the separate U2 Secured Authenticator app, never in the password vault. Bitwarden's integrated authenticator is genuinely good too, but it requires Premium ($19.80/yr); it is not on Bitwarden's free plan."},{q:"Is Bitwarden free really unlimited?",a:"Yes, by Bitwarden's own help documentation: unlimited storage of logins, notes, cards and identities, on unlimited devices, at no cost. U2 Secured's free plan caps at 500 items for 1 user â enough for most personal vaults, though a very large one will hit it before Bitwarden's would."},{q:"Is U2 Secured cheaper than Bitwarden?",a:`U2 Secured Basic is ${I.basicAnnual}. Bitwarden Premium is $19.80/yr for 1 account, and Families is $47.88/yr for up to 6 â cheaper per user at the Families size, more expensive per user for a single account, since U2 Secured's block price does not shrink below 5 users' worth of coverage.`},{q:"What does group-based access control add over Bitwarden?",a:"U2 Secured's Basic and Premium plans let an organisation manage folder access by group, so a set of members can share exactly the folders relevant to them â a feature Bitwarden's personal plans don't offer at all; this page has not compared it against Bitwarden's separate business tiers."},{q:"Can I move my Bitwarden vault into U2 Secured?",a:"Yes â the web vault imports a Bitwarden JSON or CSV export directly, encrypting each item in your browser. The full step-by-step guide, including what does and does not come across, is the switch guide linked below."}]},sources:{heading:"Sources for the Bitwarden side",note:"Every Bitwarden figure above was read directly from bitwarden.com on the date shown. Bitwarden changes its plans from time to time; if something has changed, its own pages are the authority and this comparison is out of date.",refs:[{label:"Bitwarden â Password Manager Plans",url:"https://bitwarden.com/help/password-manager-plans/",verifiedOn:"2026-09-25"},{label:"Bitwarden â Pricing",url:"https://bitwarden.com/pricing/",verifiedOn:"2026-09-25"}]},cta:{heading:"Start free",body:"Create a free U2 Secured workspace, or jump straight to the Bitwarden import guide if you already know y
238ou're moving.",primaryLabel:"Create an account",secondaryLabel:"Ask a question first"},related:{heading:"More about U2 Secured",links:[{label:"Switch from Bitwarden",path:"/switch/from-bitwarden"},{label:"Pricing",path:"/pricing"},{label:"Security",path:"/security"}]}},Un={path:"/vs/1password",competitor:"1Password",seoTitle:"U2 Secured vs 1Password â Free Tier vs None",seoDescription:"U2 Secured has a genuinely free plan; 1Password has a 14-day trial and then a subscription. Basic is $60/yr for 5 users against 1Password Families at $71.88/yr.",navLabel:"U2 Secured vs 1Password",kicker:"Comparison",title:"U2 Secured vs 1Password",lead:["1Password has no free tier â a 14-day trial, then a subscription, full stop. U2 Secured gives you a genuinely free plan with no card required, ever, and when you do need a team plan, Basic is $60/yr for up to 5 users against 1Password Families at $71.88/yr for 5.","That's the shape of this whole comparison: a free entry point versus none, and a cheaper 5-person team plan. What follows is sourced directly from 1Password's own pricing page and dated."],breadcrumb:[{name:"Home",path:"/"},{name:"Password Vault",path:"/password-vault"},{name:"U2 Secured vs 1Password",path:"/vs/1password"}],suits:{heading:"Who U2 Secured suits",lead:"Built for a reader who wants to use a password manager before paying for one, and a team that wants the lower of the two five-person prices.",items:["Anyone who wants to actually use a password manager before paying for one â free, indefinitely, no trial clock and no card.","A team of up to 5 people who wants the lower price: $60/yr against 1Password Families' $71.88/yr.","Anyone who'd rather get TOTP free in a separate app than pay for it bundled in from day one."]},table:{heading:"What each plan actually includes",lead:"1Password figures below are read from 1password.com/pricing/personal, not the bare /pricing page, which renders no numbers at all.",rows:[{feature:"Free tier",ours:`${I.freeItems}, ${I.freeUsers}`,theirs:"None â a 14-day trial, then a paid subscription is required",source:"https://1password.com/pricing/personal",sourceLabel:"1Password â Personal Pricing",verifiedOn:"2026-09-23",note:"The single biggest structural difference between the two products: U2 Secured has a free plan with no expiry date; 1Password does not."},{feature:"Entry paid plan for 5 people",ours:`${I.basicAnnual}`,theirs:"Families $5.99/mo = $71.88/yr, up to 5 members",source:"https://1password.com/pricing/personal",sourceLabel:"1Password â Personal Pricing",verifiedOn:"2026-09-23",note:"U2 Secured Basic is cheaper for 5 people, though 1Password's Individual plan ($47.88/yr, 1 person) is cheaper than a full 5-user U2 Secured block for someone who does not need to cover 5 seats."},{feature:"TOTP codes for other sites, from inside the vault",ours:I.totpFraming,theirs:"Included on every paid tier â there is no free tier to gate it from",source:"https://1password.com/pricing/personal",sourceLabel:"1Password â Personal Pricing",verifiedOn:"2026-09-23"}]},totp:{heading:"Two products, not one",lead:"Competitors sell both factors in one vault. U2 Secured sells them as two products, deliberately kept apart, because a password and its second factor in one store are not two factors.",body:["1Password includes TOTP on every paid tier â every 1Password user is already paying, so TOTP being 'included' costs nothing extra to sell, because there is no free tier for it to be excluded from.","U2 Secured keeps TOTP out of the vault entirely, in the free U2 Secured Authenticator app, on every tier including free â no subscription required at all to get codes. Its own Premium ($14.99/yr) gates encrypted backup, device moves and web portal access, never the codes themselves.","If you were always going to pay for a password manager anyway, 1Password's one-subscription convenience is a real advantage. If you would rather not pay anything just to get TOTP, U2 Secured's split gets you there for free."]},whereTheyWin:{heading:"Where 1Password is ahead",lead:"Stated once, factually.",items:["Polish and ecosystem. 1Password's apps, browser support and third-party integrations are the product of many more years of development than U2 Secured has had.","A single account, 1 person, is cheaper on 1Password ($47.88/yr) than a full U2 Secured Basic block ($60/yr for up to 5 users) â U2 Secured's per-block pricing is built around covering several people, not one.","1Password has a long operating history and an established audit trail that a new product has not accumulated yet."]},whoShouldPick:{heading:"What tips the decision",ours:{heading:"Cho
238ose U2 Secured if",items:["You want a genuinely free tier, not a time-boxed trial, before ever entering a card.","You're covering up to 5 people and want $60/yr rather than $71.88/yr for that.","You'd rather get TOTP for free in a separate app than pay for it bundled from day one."]},theirs:{heading:"What 1Password optimises for",items:["A single account at $47.88/yr, cheaper than a full 5-user U2 Secured block that isn't needed.","The most polished, most integrated option, for buyers already committed to paying for a password manager.","A long track record and broad ecosystem, for those who weight that above free-tier access or TOTP separation."]}},honesty:{heading:"Said out loud, not left for you to discover",items:["Passwords and TOTP with U2 Secured are two products, not one subscription â the vault and the free U2 Secured Authenticator app.",`A single person on Basic still pays for a full 5-user block: ${I.basicAnnual}, whether one seat is used or five â so a solo user is genuinely cheaper on 1Password Individual.`,`${I.freeGroups} â group-based folder access needs Basic or Premium.`,"U2 Secured is a new product with no published third-party security audit yet. 1Password has a long operating history and an established one."]},faq:{heading:"Questions people actually ask",items:[{q:"Does U2 Secured store two-factor (TOTP) codes?",a:"Yes â free and unlimited, in the separate U2 Secured Authenticator app, never in the password vault. 1Password includes TOTP too, but only ever as part of a paid subscription â it has no free tier for TOTP or anything else to be excluded from."},{q:"Does 1Password have a free plan?",a:"No. 1Password offers a 14-day trial and then requires a paid subscription. U2 Secured has a genuinely free tier â 500 items, 1 user â that does not expire."},{q:"Is U2 Secured cheaper than 1Password?",a:`For 5 people, yes: U2 Secured Basic is ${I.basicAnnual} versus 1Password Families at $71.88/yr. For a single person, no: 1Password Individual is $47.88/yr, cheaper than a full U2 Secured block, because U2 Secured's pricing is built around 5-user blocks rather than a per-single-seat price.`},{q:"Is 1Password more polished than U2 Secured?",a:"In terms of ecosystem and years of development, yes â 1Password has been building apps and integrations far longer than U2 Secured has existed. This page does not claim otherwise."}]},sources:{heading:"Sources for the 1Password side",note:"Every 1Password figure above was read from 1password.com/pricing/personal on the date shown â not the bare /pricing page, which renders no figures at all. If 1Password's prices have changed since, its own page is the authority and this comparison is out of date.",refs:[{label:"1Password â Personal Pricing",url:"https://1password.com/pricing/personal",verifiedOn:"2026-09-23"}]},cta:{heading:"Start free",body:"Create a free U2 Secured workspace â no trial clock, no card required to start.",primaryLabel:"Create an account",secondaryLabel:"Ask a question first"},related:{heading:"More about U2 Secured",links:[{label:"Pricing",path:"/pricing"},{label:"Security",path:"/security"},{label:"Password Vault",path:"/password-vault"}]}},In={path:"/vs/proton-pass",competitor:"Proton Pass",seoTitle:"U2 Secured vs Proton Pass â Free 2FA Comparison",seoDescription:"Proton Pass labels integrated 2FA a paid feature on its own pricing page. U2 Secured's TOTP is free and unlimited on every tier, in a separate Authenticator app.",navLabel:"U2 Secured vs Proton Pass",kicker:"Comparison",title:"U2 Secured vs Proton Pass",lead:["Proton Pass's own pricing page labels its integrated 2FA authenticator a 'Paid feature' â a dash under Free, 'Included' starting at Pass Plus. U2 Secured's TOTP is free and unlimited on every tier, in the separate U2 Secured Authenticator app, never gated behind a vault upgrade.","Both products lead with the same pitch â client-side encryption, a server that can't read your vault â so this page is about where they genuinely differ: TOTP, group access, and price. Sourced from proton.me/pass/pricing and dated."],breadcrumb:[{name:"Home",path:"/"},{name:"Password Vault",path:"/password-vault"},{name:"U2 Secured vs Proton Pass",path:"/vs/proton-pass"}],suits:{heading:"Who U2 Secured suits",lead:"Built for a reader who wants the second factor free from day one, and an organisation that wants group-based folder control.",items:["Anyone who wants TOTP free and unlimited rather than paying to unlock it inside the vault, the way Proton Pass does.","An organisation that wants group-based folder access control on Basic or Premium.","Someone who doesn't need email aliasing and would rather compare the two products on the vault and the second factor."]},table:{heading:"What each plan actually includes",lead:"Every Proton figure below is read from proton.me/pass/pricing â the citation on each row goes straight to it. Proton's own prices render client-side, so none is quoted here.",rows:[{feature:"TOTP co
238des for other sites, from inside the vault",ours:I.totpFraming,theirs:`Explicitly labelled "Paid feature" in Proton's own table â shown as "-" for Free, "Included" from Pass Plus up`,source:"https://proton.me/pass/pricing",sourceLabel:"Proton Pass â Pricing",verifiedOn:"2026-09-25",note:"The clearest first-party admission of the TOTP-split argument across any of the four competitors compared on this site."},{feature:"Free tier item limit",ours:I.freeItems,theirs:"Unlimited logins, notes and credit cards",source:"https://proton.me/pass/pricing",sourceLabel:"Proton Pass â Pricing",verifiedOn:"2026-09-25",note:"U2 Secured's free plan holds up to 500 items â ample for a typical personal vault. Proton's free item count is unlimited."},{feature:"Email aliases",ours:"Not a feature of U2 Secured",theirs:"10 hide-my-email aliases included free",source:"https://proton.me/pass/pricing",sourceLabel:"Proton Pass â Pricing",verifiedOn:"2026-09-25",note:"A genuine Proton Pass feature with no U2 Secured equivalent, stated as a gap."},{feature:"Paid plan price",ours:I.basicAnnual,theirs:"Pass Plus and Pass Family plans exist; Proton renders their prices client-side (the static page carries a placeholder, not a figure), so no number is quoted here",source:"https://proton.me/pass/pricing",sourceLabel:"Proton Pass â Pricing",verifiedOn:"2026-09-25",note:"Kept deliberately qualitative â every Proton cost claim on this page is, because none is verifiable from the page itself."}]},totp:{heading:"Two products, not one â and Proton says it plainly too",lead:"Competitors sell both factors in one vault. U2 Secured sells them as two products, deliberately kept apart, because a password and its second factor in one store are not two factors.",body:["Proton's own pricing table calls its 2FA authenticator a 'Paid feature', with a bare dash under Free and 'Included' starting at Pass Plus â Proton stating the trade-off in their own words, not this page's characterisation of it.","U2 Secured's TOTP codes live in the separate U2 Secured Authenticator app, free and unlimited on every tier of that app, never written to the password vault. Its own Premium ($14.99/yr) gates encrypted backup, device moves and web portal access â not the codes themselves.","Both products agree TOTP doesn't belong bundled into a password vault's free tier. They differ on where it lives instead: Proton keeps it in the same vault behind a paid unlock; U2 Secured keeps it in a wholly separate, free product."]},whereTheyWin:{heading:"Where Proton Pass is ahead",lead:"Stated once, factually.",items:["Free is unlimited on items, and includes 10 email aliases at no cost â a real feature U2 Secured has no equivalent of at all.","Proton is an established, well-known privacy brand with products beyond a password manager, giving it a broader ecosystem than a single-product newcomer."]},whoShouldPick:{heading:"What tips the decision",ours:{heading:"Choose U2 Secured if",items:["You want TOTP free and unlimited, in a separate dedicated app, rather than paying to unlock it inside the vault.","Group-based folder access control across an organisation matters to you â available on Basic and Premium.","You don't need email aliasing and would rather compare on the vault itself."]},theirs:{heading:"What Proton Pass's plans optimise for",items:["10 free email aliases, at no cost, for anyone who'll actually use them.","One account across Proton's other products, for anyone already inside that ecosystem.","Combining TOTP with your passwords in one vault, for buyers who'd rather pay to have both in the same place."]}},honesty:{heading:"Said out loud, not left for you to discover",items:["Passwords and TOTP with U2 Secured are two products, not one subscription â the vault and the free U2 Secured Authenticator app.",`A single person on Basic still pays for a full 5-user block: ${I.basicAnnual}, whether one seat is used or five.`,`${I.freeGroups} â group-based folder access needs Basic or Premium.`,"U2 Secured is a new product with no published third-party security audit yet. Proton is an established privacy vendor with a longer track record."]},faq:{heading:"Questions people actually ask",items:[{q:"Does U2 Secured store two-factor (TOTP) codes?",a:"Yes â free and unlimited, in the separate U2 Secured Authenticator app, never in the password vault. Proton Pass's own pricing table labels its integrated 2FA authenticator a 'Paid feature', unavailable on its free plan."},{q:"Is Proton Pass cheaper than U2 Secured?",a:"Not verifiable either way. Proton Pass's Pass Plus and Pass Family prices render client-side on its pricing page, which carries no figure in its static HTML â so this page does not quote a number for either side of that comparison."},{q:"Does Proton Pass include email aliases?",a:"Yes â 10 free hide-my-email aliases, by Proton's own description. U2 Secured has no equivalent feature; this is a genuine Proton Pass advantage."},{q:"Are both products zero-knowledge?",a:"Both lead with client-side encryption in their own marketing. This page compares plan features and where TOTP lives, not the two products' cryptographic designs against each other â see U2 Secured's own security page for how its encryption works."}]},sources:{heading:"Sources for the Proton Pass side",note:"Every Proton figure above was read directly from proton.me/pass/pricing on the date shown. Proton changes its site from time to time; if something has changed, its own page is the authority and this comparison is out of date.",refs:[{label:"Proton Pass â Pricing",url:"https://proton.me/pass/pricing",verifiedOn:"2026-09-25"}]},cta:{heading:"Start free",body:"Create a free U2 Secured workspace and see how the vault and the free Authenticator app fit together.",primaryLabel:"Create an account",secondaryLabel:"Ask a question first"},related:{heading:"More about U2 Secured",links:[{label:"Pricing",path:"/pricing"},{label:"Security",path:"/security"},{label:"Password Vault",path:"/password-vault"}]}},je="https://u2secured.com",Se="https://vault.u2secured.com",Bt="https://auth.u2secured.com",Cd="https://www.dollarmates.com",lr="https://chromewebstore.google.com/detail/u2-secured-password-vault/elfcemikihpcgjgopmeedjdoklniigod",_n="https://apps.apple.com/app/id6791010358",qd="https://apps.apple.com/app/id6804895125",Ed="https://play.google.com/store/apps/details?id=com.u2secured.authenticator",Dn="https://play.google.com/store/apps/details?id=com.u2secured.passwordvault",ka=je+"/og.png";function Od(e){return Pr(e)==="en-only"?[]:["en","fr","x-default"]}function Qt(e,a){const s=a==="fr"&&Pr(e)==="bilingual";return je+W(e,s?"fr":"en")}function At(e){return{"@context":"https://schema.org","@type":"FAQPage",mainEntity:e.map(a=>
238({"@type":"Question",name:a.q,acceptedAnswer:{"@type":"Answer",text:a.a}}))}}function ft(e,a){return{"@context":"https://schema.org","@type":"BreadcrumbList",itemListElement:e.map((s,r)=>({"@type":"ListItem",position:r+1,name:s.name,item:Qt(s.path,a)}))}}function Rd(){return{"@context":"https://schema.org","@type":"Organization",name:"u2secured",url:je,logo:je+"/favicon.svg",sameAs:[Se,Bt]}}function Ud(e){return{"@context":"https://schema.org","@type":"WebSite",name:"u2secured",url:je,inLanguage:e}}function ja(e,a,s,r,n="Web, iOS, Android"){return{"@context":"https://schema.org","@type":"SoftwareApplication",name:e,applicationCategory:"SecurityApplication",operatingSystem:n,description:a,url:s,inLanguage:r,offers:{"@type":"Offer",price:"0",priceCurrency:"USD"}}}function Mn(e,a,s,r){return{"@context":"https://schema.org","@type":"MobileApplication",name:e,applicationCategory:"SecurityApplication",operatingSystem:"iOS, Android",description:a,url:s,installUrl:[_n,Dn],inLanguage:r,offers:{"@type":"Offer",price:"0",priceCurrency:"USD"}}}function Id(e,a,s,r){return{"@context":"https://schema.org","@type":"SoftwareApplication",name:e,description:a,url:s,applicationCategory:"SecurityApplication",operatingSystem:"Web, iOS, Android",image:ka,brand:{"@type":"Brand",name:"u2secured"},offers:r.map(n=>({"@type":"Offer",name:n.name,url:s,price:he[n.id].pricePerBlockUsd.toFixed(2),priceCurrency:"USD",availability:"https://schema.org/InStock",priceSpecification:{"@type":"UnitPriceSpecification",price:he[n.id].pricePerBlockUsd.toFixed(2),priceCurrency:"USD",billingDuration:1,billingIncrement:Tt,unitText:`block of ${Tt} users per month`}}))}}function zn(e){return{"@context":"https://schema.org","@type":"TechArticle",headline:e.headline,description:e.description,url:e.url,inLanguage:e.locale,dateModified:e.reviewedOn,author:{"@type":"Organization",name:"u2secured",url:je},publisher:{"@type":"Organization",name:"u2secured",url:je}}}function _d(e){return{"@context":"https://schema.org","@type":"BlogPosting",headline:e.headline,description:e.description,url:e.url,mainEntityOfPage:{"@type":"WebPage","@id":e.url},datePublished:e.publishedOn,dateModified:e.updatedOn,inLanguage:e.locale,image:ka,author:{"@type":"Organization",name:"u2secured",url:je},publisher:{"@type":"Organization",name:"u2secured",url:je,logo:{"@type":"ImageObject",url:je+"/favicon.svg"}}}}function Dd(e,a){return{"@context":"https://schema.org","@type":"Blog",name:e.title,description:e.description,url:e.url,inLanguage:e.locale,publisher:{"@type":"Organization",name:"u2secured",url:je},blogPost:a.map(s=>({"@type":"BlogPosting",headline:s.title,description:s.summary,url:je+s.path,datePublished:s.publishedOn,dateModified:s.updatedOn}))}}function Md(){const{m:e,locale:a}=Me();kd();const s=[{to:"/password-vault",label:e.nav.passwordVault},{to:"/authenticator",label:e.nav.authenticator},{to:"/pricing",label:e.nav.pricing},{to:"/contact",label:e.nav.contact}];return t.jsxs("div",{className:"min-h-screen bg-slate-950 text-slate-200 antialiased overflow-x-hidden flex flex-col",children:[t.jsx("nav",{className:"sticky top-0 z-50 border-b border-slate-800/70 bg-slate-950/80 backdrop-blur-md",children:t.jsxs("div",{className:"mx-auto flex max-w-6xl items-center justify-between px-6 py-3",children:[t.jsxs(oe,{to:W("/",a),className:"flex items-center gap-2.5",children:[t.jsx(na,{size:26}),t.jsx(Cs,{className:"text-lg"}),t.jsx(na,{size:26,variant:"authenticator"})]}),t.jsx("div",{className:"hidden items-center gap-7 text-base text-slate-400 md:flex",children:s.map(r=>t.jsx(mn,{to:W(r.to,a),end:!0,className:({isActive:n})=>`inline-flex items-center transition-colors hover:text-slate-100 ${n?"text-slate-100":""}`,children:r.label},r.to))}),t.jsxs("div",{className:"flex items-center gap-4",children:[t.jsx(zd,{}),t.jsxs(oe,{to:W("/contact",a),className:"inline-flex items-center gap-1.5 rounded-lg bg-gradient-to-r from-indigo-500 to-cyan-400 px-3.5 py-2 text-sm font-semibold text-white transition-transform hover:-translate-y-0.5",children:[e.nav.talkToUs," ",t.jsx(Ae,{size:14})]})]})]})}),t.jsx("main",{className:"flex-1",children:t.jsx(sl,{})}),t.jsxs("footer",{className:"border-t border-slate-800/80 bg-slate-950",children:[t.jsxs("div",{className:"mx-auto grid max-w-6xl gap-10 px-6 py-14 sm:grid-cols-2 lg:grid-cols-5",children:[t.jsxs("div",{children:[t.jsxs("div",{className:"flex items-center gap-2.5",children:[t.jsx(na,{size:24}),t.jsx(Cs,{className:"text-base"}),t.jsx(na,{size:24,variant:"authenticator"})]}),t.jsx("p",{className:"mt-3 max-w-xs text-sm leading-relaxed text-slate-500",children:e.footer.tagline}),t.jsxs("div",{className:"mt-4 inline-flex items-center gap-1.5 text-xs text-slate-600",children:[t.jsx(jr,{size:13})," u2secured.com"]})]}),t.jsx(ia,{title:e.footer.products,links:[{label:e.nav.passwordVault,to:W("/password-vault",a)}
238,{label:e.nav.mobileApp,to:W("/mobile-app",a)},{label:e.nav.browserExtension,to:W("/browser-extension",a)},{label:e.nav.authenticator,to:W("/authenticator",a)},...ut(ma.path,a)?[{label:ma.navLabel,to:W(ma.path,a)}]:[],...[Cn,qn,En].flatMap(r=>ut(r.path,a)?[{label:r.navLabel,to:W(r.path,a)}]:[])]}),t.jsx(ia,{title:e.footer.compare,links:[On,Rn,Un,In].flatMap(r=>ut(r.path,a)?[{label:r.navLabel,to:W(r.path,a)}]:[])}),t.jsx(ia,{title:e.footer.company,links:[{label:e.nav.pricing,to:W("/pricing",a)},{label:e.nav.security,to:W("/security",a)},...ut(fe.path,a)?[{label:fe.navLabel,to:W(fe.path,a)}]:[],{label:e.nav.contact,to:W("/contact",a)},{label:e.nav.privacy,to:W("/privacy",a)}]}),t.jsx(ia,{title:e.footer.signIn,links:[{label:e.footer.vault,href:Se}]})]}),t.jsx("div",{className:"border-t border-slate-800/80",children:t.jsxs("div",{className:"mx-auto max-w-6xl px-6 py-5 text-xs text-slate-600",children:[t.jsxs("div",{className:"flex flex-col items-center justify-between gap-2 sm:flex-row",children:[t.jsx("span",{children:e.footer.rights}),t.jsx("span",{children:e.footer.strap})]}),t.jsx(Bd,{text:e.footer.merchant})]})})]}),t.jsx(wd,{})]})}function zd(){const{pathname:e}=mt(),a=ln(),{path:s,locale:r}=vd(e);return t.jsx("div",{children:t.jsx(Sd,{value:r,onChange:n=>{typeof window<"u"&&window.localStorage.setItem("u2secured.locale",n),a(ut(s,n)?W(s,n):W("/",n))},options:[{value:"en",label:"English"},{value:"fr",label:"Français"}],icon:t.jsx(jr,{size:16,"aria-hidden":"true"}),"aria-label":"Language",className:"bg-slate-800 justify-center gap-0 px-2.5 sm:justify-between sm:gap-2 sm:px-3",labelClassName:"hidden sm:inline"})})}function Bd({text:e}){const a=e.split("{brand}");return t.jsx("p",{className:"mt-3 text-center text-slate-500",children:a.map((s,r)=>t.jsxs(b.Fragment,{children:[s,r<a.length-1&&t.jsx("a",{href:Cd,target:"_blank",rel:"noreferrer",className:"underline decoration-slate-700 underline-offset-2 transition-colors hover:text-slate-200 hover:decoration-slate-400",children:"DollarMates"})]},r))})}function ia({title:e,links:a}){return t.jsxs("div",{children:[t.jsx("div",{className:"text-xs font-semibold uppercase tracking-wider text-slate-500",children:e}),t.jsx("ul",{className:"mt-4 space-y-2.5 text-sm",children:a.map(s=>t.jsx("li",{children:s.to?t.jsx(oe,{to:s.to,className:"text-slate-400 transition-colors hover:text-slate-100",children:s.label}):t.jsx("a",{href:s.href,className:"text-slate-400 transition-colors hover:text-slate-100",children:s.label})},s.label))})]})}const dr={cyan:{ctaGradient:"bg-gradient-to-r from-indigo-500 to-cyan-400 shadow-lg shadow-indigo-500/25",text:"text-cyan-400",cardHover:"group-hover:border-cyan-500/40 group-hover:text-cyan-300",link:"text-cyan-300 hover:text-cyan-200",glowPrimary:"bg-indigo-600/20",glowSecondary:"bg-cyan-500/15"},orange:{ctaGradient:"bg-gradient-to-r from-orange-500 to-orange-400 shadow-lg shadow-orange-500/25",text:"text-orange-400",cardHover:"group-hover:border-orange-500/40 group-hover:text-orange-300",link:"text-orange-300 hover:text-orange-200",glowPrimary:"bg-orange-600/20",glowSecondary:"bg-orange-500/15"}},Fd=[Sr,Gt,We,Pa,td,ad,wa],$d=[vn,Yt,Zl,xn,id,cd],Wd=[Yt,jr,Sr];function Ar(e){const a=jn[e],s=(r,n)=>{if(r.length!==n.length)throw new Error(`getContent: icon/feature count mismatch (${r.length} icons vs ${n.length} entries) for locale ${e}`);return n.map((o,i)=>({icon:r[i],title:o.title,body:o.body}))};return{products:{pm:{key:"password-vault",accent:"cyan",ctaUrl:Se,signInUrl:`${Se}/login`,registerUrl:`${Se}/register`,...a.pm,mobileApp:"vault",companionUrl:lr,companionLabel:a.pm.extensionCtaLabel,features:s(Fd,a.pm.features)},auth:{key:"authenticator",accent:"orange",ctaUrl:Bt,signInUrl:`${Bt}/developer/login`,registerUrl:`${Bt}/developer/register`,...a.auth,mobileApp:"authenticator",features:s($d,a.auth.features)}},trust:s(Wd,a.trust)}}function Ee({title:e,description:a,path:s,jsonLd:r,noindex:n,ogType:o="website",publishedOn:i,updatedOn:c}){const l=ze(),d=je+W(s,"en"),p=je+W(s,"fr"),u=Qt(s,l),f=r?Array.isArray(r)?r:[r]:[],v=Od(s);return t.jsxs(Ul,{children:[t.jsx("html",{lang:l}),t.jsx("title",{children:e}),t.jsx("meta",{name:"description",content:a}),n&&t.jsx("meta",{name:"robots",content:"noindex"}),!n&&t.jsx("link",{rel:"canonical",href:u}),!n&&v.map(k=>t.jsx("link",{rel:"alternate",hrefLang:k,href:k==="fr"?p:d},k)),t.jsx("meta",{property:"og:type",content:o}),o==="article"&&i&&t.jsx("meta",{property:"article:published_time",content:i}),o==="article"&&c&&t.jsx("meta",{property:"article:modified_time",content:c}),t.jsx("meta",{property:"og:locale",content:l==="fr"?"fr_FR":"en_US"}),t.jsx("meta",{property:"og:title",content:e}),t.jsx("meta",{property:"og:description",content:a}),t.jsx("meta",{property:"og:url",content:u}),t.jsx("meta",{property:"og:image",content:ka}),t.jsx("meta",{name:"twitter:card",content:"summary_large_image"}),t.jsx("meta",{name:"twitter:title",content:e}),t.jsx("meta",{name:"twitter:description",content:a}),t.jsx("meta",{name:"twitter:image",content:ka}),f.map((k,w)=>t.jsx("script",{type:"application/ld+json",children:JSON.stringify(k)},w))]})}const Hd="";async function Vd(e){var s;const a=await fetch(`${Hd}/api/v1/public/contact`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(e)});if(!a.ok){const r=await a.json().catch(()=>null);throw new Error(((s=r==null?void 0:r.error)==null?void 0:s.message)??"Something went wrong. Please try again.")}}const Gd=["password_manager","authenticator","billing","general"];function Bn(){const{m:e,locale:a}=Me(),s=e.contact.form,[r,n]=b.useState({name:"",email:"",topic:"general",message:"",company:""}),[o,i]=b.useState("idle"),[c,l]=b.useState(null);function d(u,f){n(v=>({...v,[u]:f}))}async function p(u){if(u.preventDefault(),l(null),!r.name.trim()||!/^[^@\s]+@[^@\s]+\.[^@\s]+$/.test(r.email)||!r.message.trim()){l(s.validation);return}i("sending");try{await Vd({...r,locale:a}),i("sent")}catch(f){i("idle"),l(f instanceof Error?f.message:s.genericError)}}return o==="sent"?t.jsxs("div",{className:"rounded-2xl border border-emerald-500/30 bg-emerald-500/5 p-8 text-center",children:[t.jsx("div",{className:"mx-auto flex size-12 items-center justify-center rounded-full bg-emerald-500/15 text-emerald-300",children:t.jsx(De,{size:22})}),t.jsx("h3",{className:"font-brand mt-4 text-lg font-semibold text-slate-100",children:s.sentTitle}),t.jsx("p",{className:"mt-2 text-sm text-slate-400",children:s.sentBody})]}):t.jsxs("form",{onSubmit:p,className:"relative space-y-4",noValidate:!0,children:[t.jsx("input",{type:"text",name:"company",autoComplete:"off",tabIndex:-1,"aria-hidden":"true",value:r.company,onChange:u=>d("company",u.target.value),className:"absolute left-[-9999px] h-0 w-0 opacity-0"}),t.jsxs("div",{className:"grid gap-4 sm:grid-cols-2",children:[t.jsx(la,{label:s.name,children:t.jsx("input",{value:r.name,onChange:u=>d("name",u.target.value),required:!0,className:"w-full rounded-lg border border-slate-700 bg-slate-900 px-3 py-2 text-sm text-slate-100 outline-none focus:border-indigo-500"})}),t.jsx(la,{label:s.email,children:t.jsx("input",{type:"email",value:r.email,onChange:u=>d("email",u.target.value),required:!0,className:"w-full rounded-lg border border-slate-700 bg-slate-900 px-3 py-2 text-sm text-slate-100 outline-none focus:border-indigo-500"})})]}),t.jsx(la,{label:s.topic,children:t.jsx("select",{value:r.topic,onChange:u=>d("topic",u.target.value),className:"w-full rounded-lg border border-slate-700 bg-slate-900 px-3 py-2 text-sm text-slate-100 outline-none focus:border-indigo-500",children:Gd.map(u=>t.jsx("option",{value:u,children:s.topics[u]},u))})}),t.jsx(la,{label:s.message,children:t.jsx("textarea",{value:r.message,onChange:u=>d("message",u.target.value),required:!0,rows:5,className:"w-full rounded-lg border border-slate-700 bg-slate-900 px-3 py-2 text-sm text-slate-100 outline-none focus:border-indigo-500"})}),c&&t.jsx("p",{className:"text-sm text-red-400",children:c}),t.jsx("button",{type:"submit",disabled:o==="sending",className:"group inline-flex items-center gap-2 rounded-xl bg-gradient-to-r from-indigo-500 to-cyan-400 px-5 py-3 text-sm font-semibold text-white shadow-lg shadow-indigo-500/25 transition-transform hover:-translate-y-0.5 disabled:opacity-60",children:o==="sending"?s.sending:t.jsxs(t.Fragment,{children:[s.send," ",t.jsx(nd,{size:15})]})})]})}function la({label:e,children:a}){return t.jsxs("label",{className:"block",children:[t.jsx("span",{className:"mb-1.5 block text-sm font-medium text-slate-300",children:e}),a]})}const _s="M17.05 20.28c-.98.95-2.05.8-3.08.35-1.09-.46-2.09-.48-3.24 0-1.44.62-2.2.44-3.06-.35C2.79 15.25 3.51 7.59 9.05 7.31c1.35.07 2.29.74 3.08.8 1.18-.24 2.31-.93 3.57-.84 1.51.12 2.65.72 3.4 1.8-3.12 1.87-2.38 5.98.48 7.13-.57 1.5-1.31 2.99-2.53 4.09zM12.03 7.25c-.15-2.23 1.66-4.07 3.74-4.25.29 2.58-2.34 4.5-3.74 4.25z",Ds="M5 2.72c0-.86.94-1.4 1.68-.96l12.4 7.4a1.12 1.12 0 0 1 0 1.92l-12.4 7.4A1.12 1.12 0 0 1 5 17.52V2.72z";function Yd(e,a){return a==="authenticator"?[{href:qd,mark:_s,lead:e.stores.appStoreLead,name:e.stores.appStoreName,aria:e.stores.authAppStoreAria},{href:Ed,mark:Ds,lead:e.stores.playLead,name:e.stores.playName,aria:e.stores.authPlayAria}]:[{href:_n,mark:_s,lead:e.stores.appStoreLead,name:e.stores.appStoreName,aria:e.stores.appStoreAria,qr:"/qr/app-store.svg",qrAlt:e.stores.qrAppStoreAlt},{href:Dn,mark:Ds,lead:e.stores.playLead,name:e.stores.playName,aria:e.stores.playAria,qr:"/qr/google-play.svg",qrAlt:e.stores.qrPlayAlt}]}function Ms({store:e,small:a}){return t.jsxs("a",{href:e.href,target:"_blank",rel:"noreferrer","aria-label":e.aria,className:`inline-flex items-center gap-3 rounded-xl border border-slate-700 bg-black transition-colors hover:border-slate-500 ${a?"px-3.5 py-2":"px-4 py-2.5"}`,children:[t.jsx("svg",{viewBox:"0 0 24 24",className:`shrink-0 fill-white ${a?"size-6":"size-7"}`,"aria-hidden":"true",children:t.jsx("path",{d:e.mark})}),t.jsxs("span",{className:"flex flex-col items-start leading-none",children:[t.jsx("span",{className:`uppercase tracking-wide text-slate-300 ${a?"text-[0.55rem]":"text-[0.6rem]"}`,children:e.lead}),t.jsx("span",{className:`font-brand mt-1 font-semibold text-white ${a?"text-sm":"text-base"}`,children:e.name})]})]})}function Sa({variant:e="compact",app:a="vault",className:s=""}){const{m:r}=Me(),n=Yd(r,a);return e==="compact"?t.jsx("div",{className:`flex flex-wrap items-center gap-3 ${s}`,children:n.map(o=>t.jsx(Ms,{store:o,small:!0},o.href))}):t.jsxs("div",{className:s,children:[t.jsx("div",{className:"flex flex-wrap justify-center gap-5",children:n.map(o=>t.jsxs("div",{className:"flex flex-col items-center gap-3",children:[o.qr&&t.jsx("img",{src:o.qr,alt:o.qrAlt,width:160,height:160,loading:"lazy",className:"hidden rounded-xl sm:block"}),t.jsx(Ms,{store:o})]},o.href))}),t.jsx("p",{className:"mt-4 hidden text-center text-xs text-slate-500 sm:block",children:r.stores.scanHint})]})}function Kd(){const{m:e,locale:a}=Me(),{products:s,trust:r}=Ar(a),n=[s.pm,s.auth];return t.jsxs(t.Fragment,{children:[t.jsx(Ee,{title:e.landing.seoTitle,de
238scription:e.landing.seoDescription,path:"/",jsonLd:[Rd(),Ud(a),ja(s.pm.name,s.pm.seoDescription,s.pm.ctaUrl,a),ja(s.auth.name,s.auth.seoDescription,s.auth.ctaUrl,a),Mn(e.mobileApp.name,e.mobileApp.seoDescription,je+W("/mobile-app",a),a)]}),t.jsxs("header",{className:"relative isolate",children:[t.jsx("div",{className:"u2-grid absolute inset-0 -z-10 opacity-60 [mask-image:radial-gradient(ellipse_at_top,black,transparent_70%)]"}),t.jsx("div",{className:"absolute -z-10 left-1/2 top-[-12rem] h-[36rem] w-[60rem] -translate-x-1/2 rounded-full bg-indigo-600/20 blur-[120px]"}),t.jsxs("div",{className:"mx-auto max-w-4xl px-6 pt-24 pb-16 text-center",children:[t.jsx("span",{className:"inline-flex items-center gap-2 rounded-full border border-slate-700/70 bg-slate-900/60 px-3 py-1 text-xs font-medium text-slate-300",children:e.landing.badge}),t.jsxs("h1",{className:"font-brand mt-6 text-4xl font-bold leading-[1.05] tracking-tight text-slate-50 sm:text-6xl",children:[e.landing.heroLead,t.jsx("span",{className:"bg-gradient-to-r from-indigo-400 via-violet-300 to-cyan-300 bg-clip-text text-transparent",children:e.landing.heroEmphasis})]}),t.jsx("p",{className:"mx-auto mt-6 max-w-2xl text-lg leading-relaxed text-slate-400",children:e.landing.heroSub})]})]}),t.jsx("section",{className:"mx-auto max-w-6xl px-6 py-16",children:t.jsx("div",{className:"grid gap-6 lg:grid-cols-2",children:n.map(o=>t.jsxs("article",{className:"flex flex-col rounded-2xl border border-slate-800 bg-slate-900/40 p-8",children:[t.jsxs("div",{className:"flex flex-wrap items-center gap-3",children:[t.jsx("span",{className:`font-mono text-xs font-medium uppercase tracking-[0.2em] ${dr[o.accent].text}`,children:o.kicker}),o.comingSoon&&t.jsx("span",{className:"inline-flex items-center rounded-full border border-indigo-400/40 bg-indigo-400/15 px-2.5 py-0.5 text-[0.65rem] font-semibold uppercase tracking-wider text-indigo-200",children:e.product.comingSoon})]}),t.jsx("h2",{className:"font-brand mt-3 text-2xl font-bold text-slate-50",children:o.name}),t.jsx("p",{className:"mt-3 text-slate-400",children:o.tagline}),t.jsx("p",{className:"mt-3 text-sm leading-relaxed text-slate-500",children:o.intro}),t.jsxs("div",{className:"mt-6 mb-6 flex flex-wrap gap-3",children:[t.jsxs(oe,{to:W(`/${o.key}`,a),className:"inline-flex items-center gap-2 rounded-xl bg-slate-800 px-4 py-2.5 text-sm font-semibold text-slate-100 hover:bg-slate-700",children:[e.landing.readMore," ",t.jsx(Ae,{size:15})]}),o.comingSoon?t.jsx("span",{"aria-disabled":"true",className:"inline-flex cursor-not-allowed items-center gap-2 rounded-xl border border-slate-800 px-4 py-2.5 text-sm font-semibold text-slate-500",children:e.product.comingSoon}):t.jsxs(t.Fragment,{children:[t.jsx("a",{href:o.ctaUrl,className:"inline-flex items-center gap-2 rounded-xl border border-slate-700 px-4 py-2.5 text-sm font-semibold text-slate-300 hover:border-slate-500",children:o.ctaLabel}),o.signInUrl&&t.jsxs("a",{href:o.signInUrl,className:`group inline-flex items-center gap-2 rounded-xl px-4 py-2.5 text-sm font-semibold text-white transition-transform hover:-translate-y-0.5 ${dr[o.accent].ctaGradient}`,children:[e.landing.signIn," ",t.jsx(Ae,{size:15,className:"transition-transform group-hover:translate-x-0.5"})]})]})]}),o.mobileApp&&o.storeBadgeLabel&&!o.comingSoon&&t.jsxs("div",{className:"mt-auto border-t border-slate-800/80 pt-5",children:[t.jsx("span",{className:"text-xs uppercase tracking-wider text-slate-500",children:o.storeBadgeLabel}),t.jsx(Sa,{app:o.mobileApp,className:"mt-3"})]})]},o.key))})}),t.jsx("section",{className:"border-y border-slate-800/80 bg-slate-900/20",children:t.jsxs("div",{className:"mx-auto max-w-6xl px-6 py-16",children:[t.jsx("h2",{className:"font-brand text-center text-3xl font-bold text-slate-50",children:e.landing.foundationTitle}),t.jsx("div",{className:"mt-10 grid gap-6 md:grid-cols-3",children:r.map(o=>t.jsxs("div",{className:"rounded-2xl border border-slate-800 bg-slate-900/40 p-7",children:[t.jsx("div",{className:"flex size-11 items-center justify-center rounded-xl bg-gradient-to-br from-indigo-500/20 to-cyan-400/10 text-cyan-300",children:t.jsx(o.icon,{size:20})}),t.jsx("h3",{className:"font-brand mt-5 text-lg font-semibold text-slate-100",children:o.title}),t.jsx("p",{className:"mt-2 text-sm leading-relaxed text-slate-400",children:o.body})]},o.title))})]})}),t.jsxs("section",{id:"contact",className:"mx-auto max-w-3xl px-6 py-20",children:[t.jsxs("div",{className:"text-center",children:[t.jsx("h2",{className:"font-brand text-3xl font-bold text-slate-50",children:e.landing.talkTitle}),t.jsx("p",{className:"mx-auto mt-3 max-w-xl text-slate-400",children:e.landing.talkSub})]}),t.jsx("div",{className:"mt-10 rounded-2xl border border-slate-800 bg-slate-900/40 p-6 sm:p-8",children:t.jsx(Bn,{})})]})]})}function nt(e){b.useEffect(()=>{var r;const a=(r=e.current)==null?void 0:r.querySelectorAll("[data-reveal]");if(!(a!=null&&a.length))return;if(!("IntersectionObserver"in window)){a.forEach(n=>n.classList.add("is-visible"));return}const s=new IntersectionObserver(n=>{for(const o of n)o.isIntersecting&&(o.target.classList.add("is-visible"),s.unobserve(o.target))}
238,{rootMargin:"0px 0px -10% 0px",threshold:.1});return a.forEach(n=>s.observe(n)),()=>s.disconnect()},[e])}function Fn({product:e}){const{m:a,locale:s}=Me(),r=dr[e.accent],n=b.useRef(null);return nt(n),t.jsxs("div",{ref:n,children:[t.jsx(Ee,{title:e.seoTitle,description:e.seoDescription,path:`/${e.key}`,jsonLd:ja(e.name,e.seoDescription,e.ctaUrl,s)}),t.jsxs("header",{className:"relative isolate",children:[t.jsx("div",{className:"u2-grid absolute inset-0 -z-10 opacity-50 [mask-image:radial-gradient(ellipse_at_top,black,transparent_70%)]"}),t.jsx("div",{"aria-hidden":"true",className:`absolute -z-10 left-1/2 top-[-12rem] h-[36rem] w-[60rem] -translate-x-1/2 rounded-full blur-[120px] ${r.glowPrimary}`}),t.jsx("div",{"aria-hidden":"true",className:`absolute -z-10 right-[-8rem] top-[6rem] h-[26rem] w-[26rem] rounded-full blur-[110px] ${r.glowSecondary}`}),t.jsxs("div",{className:"mx-auto max-w-4xl px-6 pt-20 pb-12 text-center",children:[t.jsxs("div",{className:"flex flex-wrap items-center justify-center gap-3",children:[t.jsx("span",{className:`font-mono text-xs font-medium uppercase tracking-[0.2em] ${r.text}`,children:e.kicker}),e.comingSoon&&t.jsx("span",{className:"inline-flex items-center rounded-full border border-indigo-400/40 bg-indigo-400/15 px-2.5 py-0.5 text-[0.65rem] font-semibold uppercase tracking-wider text-indigo-200",children:a.product.comingSoon})]}),t.jsx("h1",{className:"font-brand mt-4 text-4xl font-bold tracking-tight text-slate-50 sm:text-5xl",children:e.tagline}),t.jsx("p",{className:"mx-auto mt-5 max-w-2xl text-lg leading-relaxed text-slate-400",children:e.intro}),t.jsx("div",{className:"mt-8 flex flex-wrap justify-center gap-3",children:e.comingSoon?t.jsx("span",{"aria-disabled":"true",className:"inline-flex cursor-not-allowed items-center gap-2 rounded-xl border border-slate-700 bg-slate-900/60 px-5 py-3 text-sm font-semibold text-slate-400",children:a.product.comingSoon}):t.jsxs(t.Fragment,{children:[t.jsxs("a",{href:e.ctaUrl,className:`group inline-flex items-center gap-2 rounded-xl px-5 py-3 text-sm font-semibold text-white transition-transform hover:-translate-y-0.5 ${r.ctaGradient}`,children:[e.ctaLabel," ",t.jsx(Ae,{size:16,className:"transition-transform group-hover:translate-x-0.5"})]}),e.registerUrl&&t.jsxs("a",{href:e.registerUrl,className:"inline-flex items-center gap-2 rounded-xl border border-slate-700 bg-slate-900/60 px-5 py-3 text-sm font-semibold text-slate-200 hover:border-slate-500",children:[t.jsx(Qe,{size:16})," ",a.product.createAccount]}),e.signInUrl&&t.jsxs("a",{href:e.signInUrl,className:"inline-flex items-center gap-2 rounded-xl border border-slate-700 bg-slate-900/60 px-5 py-3 text-sm font-semibold text-slate-200 hover:border-slate-500",children:[t.jsx(rd,{size:16})," ",a.product.signIn]}),e.companionUrl&&e.companionLabel&&t.jsxs("a",{href:e.companionUrl,target:"_blank",rel:"noreferrer",className:"inline-flex items-center gap-2 rounded-xl border border-slate-700 bg-slate-900/60 px-5 py-3 text-sm font-semibold text-slate-200 hover:border-slate-500",children:[t.jsx(wa,{size:16})," ",e.companionLabel]})]})})]})]}),t.jsx("section",{className:"mx-auto max-w-4xl px-6 py-12",children:e.body.map((o,i)=>t.jsx("p",{"data-reveal":!0,className:"mx-auto mt-4 max-w-2xl text-base leading-relaxed text-slate-400",children:o},i))}),e.mobileTitle&&e.mobileBody&&t.jsx("section",{className:"border-y border-slate-800/80 bg-slate-900/20",children:t.jsxs("div",{"data-reveal":!0,className:"mx-auto max-w-3xl px-6 py-14 text-center",children:[t.jsx("span",{className:`font-mono text-xs font-medium uppercase tracking-[0.2em] ${r.text}`,children:a.nav.mobileApp}),t.jsx("h2",{className:"font-brand mt-3 text-2xl font-bold text-slate-50",children:e.mobileTitle}),t.jsx("p",{className:"mx-auto mt-3 max-w-xl text-sm leading-relaxed text-slate-400",children:e.mobileBody}
238),t.jsx(Sa,{app:e.mobileApp,className:"mt-6 justify-center"}),e.mobileCtaLabel&&t.jsxs(oe,{to:W("/mobile-app",s),className:`mt-6 inline-flex items-center gap-1.5 text-sm font-semibold ${r.link}`,children:[e.mobileCtaLabel," ",t.jsx(Ae,{size:14})]})]})}),t.jsxs("section",{className:"mx-auto max-w-6xl px-6 py-12",children:[t.jsx("h2",{"data-reveal":!0,className:"font-brand text-center text-3xl font-bold text-slate-50",children:a.product.whatYouGet}),t.jsx("div",{className:"mt-10 grid gap-px overflow-hidden rounded-2xl border border-slate-800 bg-slate-800/60 sm:grid-cols-2 lg:grid-cols-3",children:e.features.map((o,i)=>t.jsxs("div",{"data-reveal":!0,style:{"--reveal-delay":`${i%3*60}ms`},className:"group bg-slate-950 p-6 transition-colors hover:bg-slate-900",children:[t.jsx("div",{className:`flex size-10 items-center justify-center rounded-lg border border-slate-800 bg-gradient-to-br from-slate-900 to-slate-950 transition-colors ${r.text} ${r.cardHover}`,children:t.jsx(o.icon,{size:18})}),t.jsx("h3",{className:"font-brand mt-4 text-base font-semibold text-slate-100",children:o.title}),t.jsx("p",{className:"mt-2 text-sm leading-relaxed text-slate-400",children:o.body})]},o.title))})]}),t.jsx("section",{className:"border-y border-slate-800/80 bg-slate-900/20",children:t.jsxs("div",{"data-reveal":!0,className:"mx-auto max-w-3xl px-6 py-16",children:[t.jsx("h2",{className:"font-brand text-2xl font-bold text-slate-50",children:a.product.securityModel}),t.jsx("ul",{className:"mt-6 space-y-3",children:e.security.map(o=>t.jsxs("li",{className:"flex items-start gap-3 text-slate-300",children:[t.jsx(Yt,{size:18,className:`mt-0.5 shrink-0 ${r.text}`}),o]},o))})]})}),t.jsxs("section",{className:"mx-auto max-w-4xl px-6 py-16 text-center",children:[t.jsx("h2",{className:"font-brand text-2xl font-bold text-slate-50",children:a.product.questionsTitle}),t.jsx("p",{className:"mx-auto mt-3 max-w-xl text-slate-400",children:a.product.questionsHelp.replace("{name}",e.name)}),t.jsxs("div",{className:"mt-6 flex flex-wrap justify-center gap-3",children:[e.comingSoon?t.jsx("span",{"aria-disabled":"true",className:"inline-flex cursor-not-allowed items-center gap-2 rounded-xl border border-slate-700 bg-slate-900/60 px-5 py-3 text-sm font-semibold text-slate-400",children:a.product.comingSoon}):t.jsxs(t.Fragment,{children:[t.jsxs("a",{href:e.ctaUrl,className:`inline-flex items-center gap-2 rounded-xl px-5 py-3 text-sm font-semibold text-white ${r.ctaGradient}`,children:[e.ctaLabel," ",t.jsx(Ae,{size:15})]}),e.registerUrl&&t.jsxs("a",{href:e.registerUrl,className:"inline-flex items-center gap-2 rounded-xl border border-slate-700 bg-slate-900 px-5 py-3 text-sm font-semibold text-slate-100 hover:border-slate-500",children:[t.jsx(Qe,{size:15})," ",a.product.createAccount]})]}),t.jsx(oe,{to:W("/contact",s),className:"inline-flex items-center gap-2 rounded-xl border border-slate-700 bg-slate-900 px-5 py-3 text-sm font-semibold text-slate-100 hover:border-slate-500",children:a.product.contactSupport})]})]})]})}function Qd(){return t.jsx(Fn,{product:Ar(ze()).products.pm})}const zs="/browser-extension";function Jd(){const{m:e,locale:a}=Me(),s=je+W(zs,a);return t.jsxs(t.Fragment,{children:[t.jsx(Ee,{title:e.ext.seoTitle,description:e.ext.seoDescription,path:zs,jsonLd:ja(e.ext.name,e.ext.seoDescription,s,a,"Chrome")}),t.jsxs("header",{className:"relative isolate",children:[t.jsx("div",{className:"u2-grid absolute inset-0 -z-10 opacity-50 [mask-image:radial-gradient(ellipse_at_top,black,transparent_70%)]"}),t.jsxs("div",{className:"mx-auto max-w-4xl px-6 pt-20 pb-12 text-center",children:[t.jsx("span",{className:"font-mono text-xs font-medium uppercase tracking-[0.2em] text-cyan-400",children:e.ext.kicker}),t.jsxs("h1",{className:"font-brand mt-4 text-4xl font-bold tracking-tight text-slate-50 sm:text-5xl",children:[e.ext.taglineLead,t.jsx("span",{className:"bg-gradient-to-r from-indigo-400 via-violet-300 to-cyan-300 bg-clip-text text-transparent",children:e.ext.taglineEmphasis})]}),t.jsx("p",{className:"mx-auto mt-5 max-w-2xl text-lg leading-relaxed text-slate-400",children:e.ext.intro}),t.jsxs("div",{className:"mt-8 flex flex-wrap justify-center gap-3",children:[t.jsxs("a",{href:lr,target:"_blank",rel:"noreferrer",className:"group inline-flex items-center gap-2 rounded-xl bg-gradient-to-r from-indigo-500 to-cyan-400 px-5 py-3 text-sm font-semibold text-white shadow-lg shadow-indigo-500/25 transition-transform hover:-translate-y-0.5",children:[t.jsx(wa,{size:16})," ",e.ext.ctaLabel]}),t.jsx("a",{href:Se,className:"inline-flex items-center gap-2 rounded-xl border border-slate-700 bg-slate-900/60 px-5 py-3 text-sm font-semibold text-slate-200 hover:border-slate-500",children:e.ext.secondaryCta})]}),t.jsx("p",{className:"mt-4 text-xs text-slate-500",children:e.ext.availability})]})]}),t.jsx("section",{className:"border-y border-slate-800/80 bg-slate-900/20",children:t.jsxs("div",{className:"mx-auto max-w-6xl px-6 py-16",children:[t.jsx("h2",{className:"font-brand text-center text-3xl font-bold text-slate-50",children:e.ext.howTitle}),t.jsx("div",{className:"mt-10 grid gap-6 md:grid-cols-3",children:e.ext.steps.map((r,n)=>t.jsxs("div",{className:"rounded-2xl border border-slate-800 bg-slate-900/40 p-7",children:[t.jsx("div",{className:"font-mono text-xs font-bold tracking-[0.2em] text-cyan-400",children:String(n+1).padStart(2,"0")}),t.jsx("h3",{className:"font-brand mt-4 text-lg font-semibold text-slate-100",children:r.title}),t.jsx("p",{className:"mt-2 text-sm leading-relaxed text-slate-400",children:r.body})]},r.title))})]})}),t.jsxs("section",{className:"mx-auto max-w-6xl px-6 py-16",children:[t.jsx("h2",{className:"font-brand text-center text-3xl font-bold text-slate-50",children:e.ext.featuresTitle}),t.jsx("div",{className:"mt-10 grid gap-px overflow-hidden rounded-2xl border border-slate-800 bg-slate-800/60 sm:grid-cols-2 lg:grid-cols-3",children:e.ext.features.map(r=>
238t.jsxs("div",{className:"group bg-slate-950 p-6 transition-colors hover:bg-slate-900",children:[t.jsx("h3",{className:"font-brand text-base font-semibold text-slate-100",children:r.title}),t.jsx("p",{className:"mt-2 text-sm leading-relaxed text-slate-400",children:r.body})]},r.title))})]}),t.jsx("section",{className:"border-y border-slate-800/80 bg-slate-900/20",children:t.jsxs("div",{className:"mx-auto max-w-3xl px-6 py-16",children:[t.jsx("h2",{className:"font-brand text-2xl font-bold text-slate-50",children:e.ext.securityTitle}),t.jsx("ul",{className:"mt-6 space-y-3",children:e.ext.security.map(r=>t.jsxs("li",{className:"flex items-start gap-3 text-slate-300",children:[t.jsx(Yt,{size:18,className:"mt-0.5 shrink-0 text-cyan-400"}),r]},r))})]})}),t.jsxs("section",{className:"mx-auto max-w-4xl px-6 py-16 text-center",children:[t.jsx("h2",{className:"font-brand text-2xl font-bold text-slate-50",children:e.ext.questionsTitle}),t.jsx("p",{className:"mx-auto mt-3 max-w-xl text-slate-400",children:e.ext.questionsHelp}),t.jsxs("div",{className:"mt-6 flex flex-wrap justify-center gap-3",children:[t.jsxs("a",{href:lr,target:"_blank",rel:"noreferrer",className:"inline-flex items-center gap-2 rounded-xl bg-gradient-to-r from-indigo-500 to-cyan-400 px-5 py-3 text-sm font-semibold text-white",children:[t.jsx(wa,{size:15})," ",e.ext.ctaLabel]}),t.jsxs(oe,{to:W("/contact",a),className:"inline-flex items-center gap-2 rounded-xl border border-slate-700 bg-slate-900 px-5 py-3 text-sm font-semibold text-slate-100 hover:border-slate-500",children:[e.ext.contactSupport," ",t.jsx(Ae,{size:15})]})]})]})]})}const Bs="/mobile-app",Qa=[vn,dd,Sr,ed,od,xn],Ja=["/screens/vault-list.webp","/screens/settings.webp"];function Zd(){const{m:e,locale:a}=Me(),s=je+W(Bs,a);if(Qa.length!==e.mobileApp.features.length)throw new Error(`MobileApp: icon/feature count mismatch (${Qa.length} icons vs ${e.mobileApp.features.length} entries) for locale ${a}`);if(Ja.length!==e.mobileApp.screens.length)throw new Error(`MobileApp: screenshot/caption count mismatch (${Ja.length} images vs ${e.mobileApp.screens.length} entries) for locale ${a}`);return t.jsxs(t.Fragment,{children:[t.jsx(Ee,{title:e.mobileApp.seoTitle,description:e.mobileApp.seoDescription,path:Bs,jsonLd:Mn(e.mobileAp
238p.name,e.mobileApp.seoDescription,s,a)}),t.jsxs("header",{className:"relative isolate",children:[t.jsx("div",{className:"u2-grid absolute inset-0 -z-10 opacity-50 [mask-image:radial-gradient(ellipse_at_top,black,transparent_70%)]"}),t.jsxs("div",{className:"mx-auto max-w-4xl px-6 pt-20 pb-12 text-center",children:[t.jsx("span",{className:"font-mono text-xs font-medium uppercase tracking-[0.2em] text-cyan-400",children:e.mobileApp.kicker}),t.jsxs("h1",{className:"font-brand mt-4 text-4xl font-bold tracking-tight text-slate-50 sm:text-5xl",children:[e.mobileApp.taglineLead,t.jsx("span",{className:"bg-gradient-to-r from-indigo-400 via-violet-300 to-cyan-300 bg-clip-text text-transparent",children:e.mobileApp.taglineEmphasis})]}),t.jsx("p",{className:"mx-auto mt-5 max-w-2xl text-lg leading-relaxed text-slate-400",children:e.mobileApp.intro}),t.jsx(Sa,{variant:"full",className:"mt-10"}),t.jsx("div",{className:"mt-8 flex flex-wrap justify-center gap-3",children:t.jsx("a",{href:Se,className:"inline-flex items-center gap-2 rounded-xl border border-slate-700 bg-slate-900/60 px-5 py-3 text-sm font-semibold text-slate-200 hover:border-slate-500",children:e.mobileAp
238p.secondaryCta})}),t.jsx("p",{className:"mt-4 text-xs text-slate-500",children:e.mobileApp.availability})]})]}),t.jsx("section",{className:"border-y border-slate-800/80 bg-slate-900/20",children:t.jsxs("div",{className:"mx-auto max-w-6xl px-6 py-16",children:[t.jsx("h2",{className:"font-brand text-center text-3xl font-bold text-slate-50",children:e.mobileApp.howTitle}),t.jsx("div",{className:"mt-10 grid gap-6 md:grid-cols-3",children:e.mobileApp.steps.map((r,n)=>t.jsxs("div",{className:"rounded-2xl border border-slate-800 bg-slate-900/40 p-7",children:[t.jsx("div",{className:"font-mono text-xs font-bold tracking-[0.2em] text-cyan-400",children:String(n+1).padStart(2,"0")}),t.jsx("h3",{className:"font-brand mt-4 text-lg font-semibold text-slate-100",children:r.title}),t.jsx("p",{className:"mt-2 text-sm leading-relaxed text-slate-400",children:r.body})]},r.title))})]})}),t.jsxs("section",{className:"mx-auto max-w-6xl px-6 py-16",children:[t.jsx("h2",{className:"font-brand text-center text-3xl font-bold text-slate-50",children:e.mobileAp
238p.screensTitle}),t.jsx("div",{className:"mt-10 flex flex-wrap justify-center gap-8",children:Ja.map((r,n)=>t.jsxs("figure",{className:"flex flex-col items-center",children:[t.jsx("div",{className:"relative w-[220px] overflow-hidden rounded-[2rem] border border-slate-700 bg-slate-900 p-2 shadow-2xl shadow-indigo-500/10",children:t.jsx("div",{className:"h-[300px] overflow-hidden rounded-[1.6rem] [mask-image:linear-gradient(to_bottom,black_78%,transparent)]",children:t.jsx("img",{src:r,alt:e.mobileApp.screens[n].alt,width:440,height:956,loading:"lazy",className:"w-full object-cover object-top"})})}),t.jsx("figcaption",{className:"mt-4 text-sm text-slate-400",children:e.mobileApp.screens[n].caption})]},r))})]}),t.jsx("section",{className:"border-y border-slate-800/80 bg-slate-900/20",children:t.jsxs("div",{className:"mx-auto max-w-6xl px-6 py-16",children:[t.jsx("h2",{className:"font-brand text-center text-3xl font-bold text-slate-50",children:e.mobileApp.featuresTitle}),t.jsx("div",{className:"mt-10 grid gap-px overflow-hidden rounded-2xl border border-slate-800 bg-slate-800/60 sm:grid-cols-2 lg:grid-cols-3",children:e.mobileAp
238p.features.map((r,n)=>{const o=Qa[n];return t.jsxs("div",{className:"group bg-slate-950 p-6 transition-colors hover:bg-slate-900",children:[t.jsx("div",{className:"flex size-10 items-center justify-center rounded-lg border border-slate-800 bg-gradient-to-br from-slate-900 to-slate-950 text-cyan-400",children:t.jsx(o,{size:18})}),t.jsx("h3",{className:"font-brand mt-4 text-base font-semibold text-slate-100",children:r.title}),t.jsx("p",{className:"mt-2 text-sm leading-relaxed text-slate-400",children:r.body})]},r.title)})})]})}),t.jsxs("section",{className:"mx-auto max-w-3xl px-6 py-16",children:[t.jsx("h2",{className:"font-brand text-2xl font-bold text-slate-50",children:e.mobileApp.securityTitle}),t.jsx("ul",{className:"mt-6 space-y-3",children:e.mobileApp.security.map(r=>t.jsxs("li",{className:"flex items-start gap-3 text-slate-300",children:[t.jsx(Yt,{size:18,className:"mt-0.5 shrink-0 text-cyan-400"}),r]},r))})]}),t.jsx("section",{className:"border-t border-slate-800/80",children:t.jsxs("div",{className:"mx-auto max-w-4xl px-6 py-16 text-center",children:[t.jsx("h2",{className:"font-brand text-2xl font-bold text-slate-50",children:e.mobileAp
238p.questionsTitle}),t.jsx("p",{className:"mx-auto mt-3 max-w-xl text-slate-400",children:e.mobileApp.questionsHelp}),t.jsx(Sa,{className:"mt-6 justify-center"}),t.jsx("div",{className:"mt-6 flex flex-wrap justify-center gap-3",children:t.jsxs(oe,{to:W("/contact",a),className:"inline-flex items-center gap-2 rounded-xl border border-slate-700 bg-slate-900 px-5 py-3 text-sm font-semibold text-slate-100 hover:border-slate-500",children:[e.mobileApp.contactSupport," ",t.jsx(Ae,{size:15})]})})]})})]})}function Xd(){return t.jsx(Fn,{product:Ar(ze()).products.auth})}const ec="â¯",tc=" ",ac={en:",",fr:ec};function Na(e,a){return(e<0?"-":"")+String(Math.abs(Math.trunc(e))).replace(/\B(?=(\d{3})+(?!\d))/g,ac[a])}function $n(e,a,s){return!s&&Number.isInteger(e)?String(e):e.toFixed(2).replace(".",a==="fr"?",":".")}function Wn(e,a){return a==="fr"?`${e}${tc}$`:`$${e}`}function cr(e,a){return Wn($n(e,a,!1),a)}function rc(e,a){return Wn($n(e,a,!0),a)}function sc({content:e}){const a=ze(),s=b.useRef(null);return nt(s),t.jsxs("div",{ref:s,children:[t.jsx(Ee,{title:e.seoTitle,description:e.seoDescription,path:e.path,jsonLd:[Id(e.title,e.seoDescription,Qt(e.path,a),e.plans),At(e.faq.items),ft(e.breadcrumb,a)]}),t.jsxs("header",{className:"relative isolate",children:[t.jsx("div",{className:"u2-grid absolute inset-0 -z-10 opacity-50 [mask-image:radial-gradient(ellipse_at_top,black,transparent_70%)]"}),t.jsx("div",{"aria-hidden":"true",className:"absolute -z-10 left-1/2 top-[-12rem] h-[36rem] w-[60rem] -translate-x-1/2 rounded-full blur-[120px] bg-indigo-600/20"}),t.jsx("div",{"aria-hidden":"true",className:"absolute -z-10 right-[-8rem] top-[6rem] h-[26rem] w-[26rem] rounded-full blur-[110px] bg-cyan-500/15"}),t.jsxs("div",{className:"mx-auto max-w-3xl px-6 pt-20 pb-10",children:[t.jsx("span",{className:"font-mono text-xs font-medium uppercase tracking-[0.2em] text-cyan-400",children:e.kicker}),t.jsx("h1",{className:"font-brand mt-4 text-4xl font-bold tracking-tight text-slate-50 sm:text-5xl",children:e.title}),e.lead.map(r=>t.jsx("p",{className:"mt-5 text-lg leading-relaxed text-slate-400",children:r},r))]})]}),t.jsx("section",{className:"mx-auto max-w-6xl px-6 pb-4",children:t.jsx("div",{className:"grid gap-4 md:grid-cols-3",children:e.plans.map(r=>t.jsx(nc,{plan:r,locale:a,table:e.table},r.id))})}),t.jsxs("section",{className:"mx-auto max-w-3xl px-6 py-14",children:[t.jsx("h2",{"data-reveal":!0,className:"font-brand text-2xl font-bold text-slate-50",children:e.blocks.heading}),e.blocks.body.map(r=>t.jsx("p",{"data-reveal":!0,className:"mt-4 text-base leading-relaxed text-slate-400",children:r},r)),t.jsx(oc,{content:e,locale:a}),t.jsx(Hn,{text:e.blocks.caution})]}),t.jsx("section",{className:"border-y border-slate-800/80 bg-slate-900/20",children:t.jsxs("div",{className:"mx-auto max-w-3xl px-6 py-14",children:[t.jsxs("div",{"data-reveal":!0,className:"flex items-center gap-2.5 text-cyan-300",children:[t.jsx(Pa,{size:18,"aria-hidden":"true"}),t.jsx("span",{className:"font-mono text-xs font-medium uppercase tracking-[0.2em]",children:e.plans[0].name})]}),t.jsx(Za,{section:e.solo})]})}),t.jsx("section",{className:"mx-auto max-w-3xl px-6 py-14",children:t.jsx(Za,{section:e.trial})}),t.jsx("section",{className:"border-y border-slate-800/80 bg-slate-900/20",children:t.jsxs("div",{className:"mx-auto max-w-5xl px-6 py-14",children:[t.jsx("h2",{"data-reveal":!0,className:"font-brand text-2xl font-bold text-slate-50",children:e.table.heading}),t.jsx("p",{"data-reveal":!0,className:"mt-3 max-w-2xl text-base leading-relaxed text-slate-400",children:e.table.body}),t.jsx(lc,{content:e,locale:a})]})}),t.jsx("section",{className:"mx-auto max-w-3xl px-6 py-14",children:t.jsx(Za,{section:e.absent})}),t.jsx("section",{className:"border-y border-slate-800/80 bg-slate-900/20",children:t.jsxs("div",{className:"mx-auto max-w-3xl px-6 py-14",children:[t.jsx("h2",{"data-reveal":!0,className:"font-brand text-2xl font-bold text-slate-50",children:e.faq.heading}),t.jsx("dl",{className:"mt-8",children:e.faq.items.map(r=>t.jsxs(b.Fragment,{children:[t.jsx("dt",{"data-reveal":!0,className:"font-brand mt-7 text-base font-semibold text-slate-100 first:mt-0",children:r.q}),t.jsx("dd",{"data-reveal":!0,className:"mt-2 text-base leading-relaxed text-slate-400",children:r.a})]},r.q))})]})}),t.jsxs("section",{className:"mx-auto max-w-3xl px-6 pb-20 pt-14 text-center",children:[t.jsx("h2",{className:"font-brand text-2xl font-bold text-slate-50",children:e.cta.heading}),t.jsx("p",{className:"mx-auto mt-3 max-w-xl text-base leading-relaxed text-slate-400",children:e.cta.body}),t.jsxs("div",{className:"mt-6 flex flex-wrap justify-center gap-3",children:[t.jsxs("a",{href:`${Se}/register`,className:"inline-flex items-center gap-2 rounded-xl bg-gradient-to-r from-indigo-500 to-cyan-400 px-5 py-3 text-sm font-semibold text-white shadow-lg shadow-indigo-500/25",children:[t.jsx(Qe,{size:15})," ",e.cta.primaryLabel]}),t.jsx(oe,{to:W("/contact",a),className:"inline-flex items-center gap-2 rounded-xl border border-slate-700 bg-slate-900 px-5 py-3 text-sm font-semibold text-slate-100 hover:border-slate-500",children:e.cta.secondaryLabel})]}),t.jsx("ul",{className:"mx-auto mt-10 max-w-xl space-y-2 text-left",children:e.footnote.map(r=>
238t.jsx("li",{className:"text-sm leading-relaxed text-slate-500",children:r},r))}),t.jsx(Vn,{related:e.related,locale:a})]})]})}function nc({plan:e,locale:a,table:s}){const r=he[e.id],n=r.pricePerBlockUsd===0;return t.jsxs("div",{"data-reveal":!0,className:`flex flex-col rounded-2xl border p-6 ${e.highlight?"border-cyan-500/40 bg-slate-950":"border-slate-800 bg-slate-950"}`,children:[t.jsxs("div",{className:"flex items-baseline justify-between gap-3",children:[t.jsx("h2",{className:"font-brand text-base font-semibold text-slate-100",children:e.name}),t.jsx("span",{className:"font-brand text-3xl font-bold text-slate-50",children:cr(r.pricePerBlockUsd,a)})]}),t.jsx("p",{className:"mt-2 text-xs leading-relaxed text-slate-500",children:e.priceNote}),!n&&t.jsxs("p",{className:"mt-1 font-mono text-xs text-cyan-300",children:[rc(ir(e.id),a)," ",s.perUser]}),t.jsx("p",{className:"mt-4 text-sm leading-relaxed text-slate-300",children:e.tagline}),t.jsxs("p",{className:"mt-4 font-mono text-sm text-cyan-300",children:[Na(r.maxSecrets,a)," ",s.items]}),t.jsx("ul",{className:"mt-4 flex-1 space-y-2",children:e.bullets.map(o=>t.jsx("li",{className:"text-sm leading-relaxed text-slate-400",children:o},o))}),t.jsxs("a",{href:`${Se}/register`,className:`mt-6 inline-flex items-center justify-center gap-2 rounded-xl px-4 py-2.5 text-sm font-semibold transition-transform hover:-translate-y-0.5 ${e.highlight?"bg-gradient-to-r from-indigo-500 to-cyan-400 text-white shadow-lg shadow-indigo-500/25":"border border-slate-700 bg-slate-900 text-slate-100 hover:border-slate-500"}`,children:[e.ctaLabel," ",t.jsx(Ae,{size:14})]}),e.highlight&&t.jsx("p",{className:"mt-4 border-t border-slate-800 pt-4 text-sm font-medium text-cyan-300",children:e.highlight})]})}function oc({content:e,locale:a}){const{columns:s,ladder:r}=e.blocks;return t.jsx("div",{"data-reveal":!0,className:"mt-8 overflow-x-auto rounded-2xl border border-slate-800",children:t.jsxs("table",{className:"w-full min-w-[26rem] border-collapse text-sm",children:[t.jsx("thead",{children:t.jsxs("tr",{className:"bg-slate-900/60 text-left",children:[t.jsx("th",{scope:"col",className:"px-4 py-3 font-semibold text-slate-300",children:s.users}),t.jsx("th",{scope:"col",className:"px-4 py-3 font-semibold text-slate-300",children:s.blocks}),t.jsx("th",{scope:"col",className:"px-4 py-3 font-semibold text-slate-300",children:s.basic}),t.jsx("th",{scope:"col",className:"px-4 py-3 font-semibold text-slate-300",children:s.premium})]})}),t.jsx("tbody",{children:r.map(n=>t.jsxs("tr",{className:"border-t border-slate-800/80",children:[t.jsx("th",{scope:"row",className:"px-4 py-3 text-left font-normal text-slate-300",children:Na(n,a)}),t.jsx("td",{className:"px-4 py-3 text-slate-400",children:Na(Nn(n),a)}),t.jsx("td",{className:"px-4 py-3 font-mono text-slate-200",children:cr(Rs("basic",n),a)}),t.jsx("td",{className:"px-4 py-3 font-mono text-slate-200",children:cr(Rs("premium",n),a)})]},n))})]})})}function ic(e,a,s,r){const n=he[a][e],o=s.table;if(typeof n=="boolean")return n?o.yes:o.no;if(n===Ad)return o.unlimited;const i=Na(n,r);switch(e){case"maxUsers":return`${i} ${o.users}`;case"maxSecrets":return`${i} ${o.items}`;case"auditLogDays":return`${i} ${o.days}`;case"maxPublicSharesPerMonth":return`${i} ${o.perMonth}`;default:return i}}function lc({content:e,locale:a}){return t.jsx("div",{"data-reveal":!0,className:"mt-8 overflow-x-auto rounded-2xl border border-slate-800",children:t.jsxs("table",{className:"w-full min-w-[40rem] border-collapse text-sm",children:[t.jsx("thead",{children:t.jsxs("tr",{className:"bg-slate-900/60 text-left",children:[t.jsx("th",{scope:"col",className:"px-4 py-3 font-semibold text-slate-300"}),e.plans.map(s=>t.jsx("th",{scope:"col",className:"px-4 py-3 font-semibold text-slate-100",children:s.name},s.id))]})}),t.jsx("tbody",{children:e.table.rows.map(s=>t.jsxs("tr",{className:"border-t border-slate-800/80 align-top",children:[t.jsxs("th",{scope:"row",className:"px-4 py-3 text-left font-normal text-slate-300",children:[s.label,s.note&&t.jsx("span",{className:"mt-1 block text-xs leading-relaxed text-slate-500",children:s.note})]}),Pd.map(r=>{const n=he[r][s.key],o=n===!1||n===0;return t.jsx("td",{className:`px-4 py-3 ${o?"text-slate-500":"text-slate-200"}`,children:t.jsxs("span",{className:"inline-flex items-center gap-1.5",children:[typeof n=="boolean"&&(n?t.jsx(De,{size:15,className:"shrink-0 text-cyan-400","aria-hidden":"true"}):t.jsx(Nr,{size:15,className:"shrink-0 text-slate-600","aria-hidden":"true"})),ic(s.key,r,e,a)]})},r)})]},s.key))})]})})}function Za({section:e}){return t.jsxs(t.Fragment,{children:[t.jsx("h2",{"data-reveal":!0,className:"font-brand mt-3 text-2xl font-bold text-slate-50",children:e.heading}),e.body.map(a=>t.jsx("p",{"data-reveal":!0,className:"mt-4 text-base leading-relaxed text-slate-400",children:a},a)),e.items&&t.jsx("ul",{className:"mt-6 space-y-3",children:e.items.map(a=>t.jsxs("li",{"data-reveal":!0,className:"flex items-start gap-3 text-sm leading-relaxed text-slate-300",children:[t.jsx(Nr,{size:17,className:"mt-0.5 shrink-0 text-slate-600","aria-hidden":"true"}),a]},a))}),e.caution&&t.jsx(Hn,{text:e.caution})]})}function Hn({text:e}){return t.jsxs("p",{"data-reveal":!0,className:"mt-6 flex items-start gap-2.5 rounded-xl border border-amber-500/30 bg-amber-500/5 p-4 text-sm leading-relaxed text-amber-200/90",children:[t.jsx(We,{size:18,className:"mt-0.5 shrink-0 text-amber-400"}),t.jsx("span",{children:e})]})}function Vn({related:e,locale:a}){const s=e.links.filter(r=>ut(r.path,a));return s.length===0?null:t.jsxs("nav",{className:"mt-10 border-t border-slate-800/80 pt-6",children:[t.jsx("span",{className:"text-xs font-semibold uppercase tracking-wider text-slate-500",children:e.heading}),t.jsx("div",{className:"mt-3 flex flex-wrap justify-center gap-x-6 gap-y-2 text-sm",children:s.map(r=>
238t.jsx(oe,{to:W(r.path,a),className:"text-cyan-300 hover:text-cyan-200",children:r.label},r.path))})]})}const Gn={path:"/pricing",seoTitle:"Pricing â U2 Secured password vault",seoDescription:"What the U2 Secured password vault costs: a free single-person plan, and paid plans billed per block of five users. Every limit, and the awkward parts, stated in full.",navLabel:"Pricing",kicker:"Pricing",title:"Priced per five people, not per person",lead:["Free is a complete vault for one person. Paid plans are billed per block of five users, with a minimum of one block â so they are cheap for a team and not especially cheap for an individual.","That is the whole shape of it, said at the top rather than discovered at checkout. Below: what each plan holds, how the blocks add up at real team sizes, and what no plan buys because the product does not have it yet."],breadcrumb:[{name:"Home",path:"/"},{name:"Pricing",path:"/pricing"}],plans:[{id:"free",name:"Free",priceNote:"one person, no card, no trial to expire",tagline:"A real vault for one person â not a sampler.",bullets:["The same cryptography as every paid plan. Encryption does not improve with price.","Folders, version history, expiry reminders and multi-factor sign-in","Public share links, capped per month","No second user, no groups, no breach monitoring"],ctaLabel:"Create a free workspace",highlight:"Where one person should start."},{id:"basic",name:"Basic",priceNote:"per block of five users, per month",tagline:"For a team that needs shared folder access.",bullets:["Unlimited users, billed five at a time","Groups, so a folder can be opened to more than one person","Breach monitoring on every saved password","A workspace-wide auto-lock ceiling across web, extension and mobile"],ctaLabel:"Start a 7-day trial",highlight:"The first plan where a second person is possible."},{id:"premium",name:"Premium",priceNote:"per block of five users, per month",tagline:"For a team with an identity provider and an auditor.",bullets:["Single sign-on with OIDC and SAML, on verified domains","A full year of audit log, readable and retained","API access with scoped keys","Everything in Basic"],ctaLabel:"Start a 7-day trial"}],blocks:{heading:"How the blocks add up",body:["A block is five users. Your workspace is billed for as many blocks as it takes to cover everyone in it, rounded up, and never fewer than one. Adding a sixth person to a five-person workspace opens a second block; removing them closes it again at the next sync.","The rounding is the part worth reading twice. At a full block the price per person is as low as it gets; one person into a new block pays for five. The table below is the real arithmetic at a handful of team sizes, not an illustration."],columns:{users:"People",blocks:"Blocks",basic:"Basic",premium:"Premium"},ladder:[1,5,6,12,25],caution:"A single person on a paid plan pays a full block. If you are one person, the free plan is almost certainly the right answer â it holds a real vault, and nothing about the encryption is different."},solo:{heading:"The free plan is for exactly one person",body:[`Not "one person to begin with". One person, structurally. A free workspace is capped at one user and at zero groups, and a group is the only thing that can grant another person access to a folder â access is granted by re-wrapping that folder's key for a group, so with no groups there is no one to wrap it for.`,"This is not a soft limit you would bump into and then upgrade around. It means a free workspace has no mechanism for a second person at all, which is worth knowing before you invite a colleague and find there is nowhere for them to go.","What free does give you is a vault you can genuinely live in: hundreds of items, the full folder structure, version history on every change, expiry reminders, multi-factor sign-in, the browser extension, both mobile apps, and a monthly allowance of public share links. It is the same client and the same cryptography a paying customer gets."],caution:"The moment you need a second person, you need a paid plan â and a paid plan starts at a full block of five. That is the real upgrade step, and it is a step rather than a slope."},trial:{heading:"The trial asks for no card",body:["Both paid plans start with a seven-day trial that begins when you sign up. No payment method is collected, and nothing is charged during it.","If the trial ends with no card on file, the subscription is paused rather than billed. A paused workspace is locked â your data is untouched and you can still sign in, reach billing, and export or deactivate â but the vault is not readable until a payment method is added. Nothing is deleted and nothing is charged."]},table:{heading:"Every limit, on one screen",body:"These are the numbers the server actually enforces, not a summary of them. A limit is per workspace and counts what is already in it.",rows:[{key:"maxUsers",label:"Users"},{key:"maxSecrets",label:"Vault items"},{key:"maxGroups",label:"Groups",note:"How folder access is shared. Zero on free is why free is single-person."},{key:"auditLogDays",label:"Audit log",note:"Both how far back you can read and how long the events are kept."},{key:"maxPublicSharesPerMonth",label:"Public share links",note:"The only sharing that reaches outside the workspace. Resets monthly."},{key:"breachMonitoring",label:"Breach monitoring"},{key:"lockPolicy",label:"Workspace auto-lock ceiling",note:"Every plan lets each person set their own auto-lock timeout per surface. Capping all three workspace-wide is the paid part."},{key:"ssoEnabled",label:"Single sign-on (OIDC, SAML)"},{key:"apiAccess",label:"API access"}],yes:"Included",no:"Not included",unlimited:"Unlimited",users:"users",items:"items",days:"days",perMonth:"per month",perUser:"per user, but only at a full block"},absent:{heading:"What no plan buys",body:["Said here rather than left to be inferred from a table of ticks. These are not roadmap teases; they are things the product does not do today, on any plan, at any price."],items:["Person-to-person sharing. You cannot hand an item to a named colleague. Folder access via a group, and a temporary public link, are the two sharing mechanisms that exist.","Organisation-wide or cross-team vaults. Organisations and groups exist as structure; there is no separate shared-vault surface on top of them.","A Firefox or Safari extension. The browser extension is Chrome and Edge. The web vault works in any modern browser, and there are iOS and Android apps.","Storage for your two-factor secrets. That is deliberate and it is not coming â a password and its second factor in one store are not tw
238o factors. The Authenticator is a separate product for exactly that reason."]},faq:{heading:"The questions the pricing actually raises",items:[{q:"I am one person. What does Basic cost me?",a:"A full block: the same as a team of five. There is no single-user price on a paid plan, because a block is the unit that is billed and the minimum is one block. If you are one person and the free plan's item limit fits, free is the better answer â the cryptography is identical and there is no trial to expire."},{q:"What happens when I add a sixth person?",a:"Your workspace moves to two blocks and the price doubles. Blocks are recounted after every membership change and converged with Stripe, so the change lands immediately rather than at the end of the month. Removing that person moves you back to one block."},{q:"Is there a user limit on a paid plan?",a:"No. Both paid plans are unlimited on users â the cap that used to exist was removed when block billing arrived. What grows is the number of blocks, five users at a time. The item, group and share limits are still per plan."},{q:"Can I try a paid plan without a card?",a:"Yes, for seven days, and that is the only trial. No payment method is collected at sign-up. If the trial ends without one, the subscription is paused instead of charged: the workspace locks, your encrypted data stays exactly where it was, and you can still sign in to add a card, export, or close the workspace."},{q:"Why is the free plan capped at one user?",a:"Because sharing a folder means giving a group its own copy of that folder's key, and the free plan allows no groups. It is a cryptographic limit rather than a billing switch, which is also why it is absolute: there is no second-user state a free workspace can be in."},{q:"What counts towards the item limit?",a:"Every item currently in the workspace, of every type â logins, secure notes, cards, keys, documents. Deleted items do not count once they are gone. The import screen shows the room remaining before it uploads anything, and refuses an import that would exceed it."},{q:"Do I need Premium to get the good encryption?",a:"No, and there is no version of this product where you would. Key derivation, item encryption and the zero-knowledge model are identical on every plan, free included. Premium buys single sign-on, a year of audit log and API access â organisational features, not stronger cryptography."},{q:"What happens to my data if I stop paying?",a:"The workspace locks and the data stays. A paused or unpaid subscription blocks the vault routes but leaves the authentication, billing and settings routes open, so you can always sign in, settle up, or deactivate the workspace deliberately. Nothing is deleted as a side effect of billing."},{q:"Is there an annual price?",a:"No. Both paid plans are monthly, per block, and can be cancelled from the billing portal at any time."}]},cta:{heading:"Start on free and move when you have to",body:"A free workspace takes a minute to create, needs no card, and holds a real vault. If you already know you need a second person, start the trial on a paid plan instead â it also needs no card.",primaryLabel:"Create an account",secondaryLabel:"Ask about pricing"},related:{heading:"Read next",links:[{label:"How the encryption works",path:"/security"},{label:"Password Vault",path:"/password-vault"},{label:"Switch from LastPass",path:"/switch/from-lastpass"},{label:"U2 Secured vs LastPass",path:"/vs/lastpass"},{label:"U2 Secured vs Bitwarden",path:"/vs/bitwarden"},{label:"U2 Secured vs 1Password",path:"/vs/1password"},{label:"U2 Secured vs Proton Pass",path:"/vs/proton-pass"}]},footnote:["Prices are in US dollars and exclude any tax your local rules add at checkout. Billing is handled by our merchant of record.","Every plan may hold up to 1,000 folders. That figure is an abuse guard rather than a plan difference â it is the same on free as on Premium â and support can raise it for a workspace that legitimately needs more."]},dc={path:"/pricing",seoTitle:"Tarifs â coffre-fort de mots de passe U2 Secured",seoDescription:"Ce que coûte le coffre-fort U2 Secured : un plan gratuit pour une personne, et des plans payants facturés par bloc de cinq utilisateurs. Toutes les limites, sans détour.",navLabel:"Tarifs",kicker:"Tarifs",title:"Facturé par cinq personnes, pas par personne",lead:["Le plan gratuit est un vrai coffre-fort pour une seule personne. Les plans payants sont facturés par bloc de cinq utilisateurs, avec un minimum dâun bloc â ils sont donc peu chers pour une équipe et nettement moins avantageux pour un individu.","Voilà toute la logique, annoncée en haut de page plutôt que découverte au moment de payer. Ci-dessous : ce que contient chaque plan, ce que donnent les blocs à des tailles dâéquipe réelles, et
238ce quâaucun plan nâachète parce que le produit ne le fait pas encore."],breadcrumb:[{name:"Accueil",path:"/"},{name:"Tarifs",path:"/pricing"}],plans:[{id:"free",name:"Gratuit",priceNote:"une personne, sans carte, sans essai qui expire",tagline:"Un vrai coffre-fort pour une personne â pas un aperçu.",bullets:["La même cryptographie que sur tous les plans payants. Le chiffrement ne sâaméliore pas avec le prix.","Dossiers, historique des versions, rappels dâexpiration et connexion multifacteur","Liens de partage publics, plafonnés par mois","Pas de deuxième utilisateur, pas de groupes, pas de surveillance des fuites"],ctaLabel:"Créer un espace gratuit",highlight:"Le point de départ dâune personne seule."},{id:"basic",name:"Basic",priceNote:"par bloc de cinq utilisateurs et par mois",tagline:"Pour une équipe qui doit partager lâaccès à des dossiers.",bullets:["Utilisateurs illimités, facturés par cinq","Des groupes, pour ouvrir un dossier à plus dâune personne","Surveillance des fuites sur chaque mot de passe enregistré","Un plafond de verrouillage automatique à lâéchelle de lâespace, sur le web, lâextension et le mobile"],ctaLabel:"Démarrer un essai de 7 jours",highlight:"Le premier plan où une deuxième personne est possible."},{id:"premium",name:"Premium",priceNote:"par bloc de cinq utilisateurs et par mois",tagline:"Pour une équipe avec un fournisseur dâidentité et un auditeur.",bullets:["Authentification unique OIDC et SAML, sur domaines vérifiés","Une année complète de journal dâaudit, consultable et conservée","Accès API avec des clés à portée limitée","Tout ce que contient Basic"],ctaLabel:"Démarrer un essai de 7 jours"}],blocks:{heading:"Comment les blocs sâadditionnent",body:["Un bloc, câest cinq utilisateurs. Votre espace est facturé autant de blocs quâil en faut pour couvrir tout le monde, arrondi au bloc supérieur, et jamais moins dâun. Ajouter une sixième personne à un espace de cinq ouvre un deuxième bloc ; la retirer le referme à la synchronisation suivante.","Câest lâarrondi qui mérite une seconde lecture. à bloc plein, le prix par personne est au plus bas ; une seule personne entamant un nouveau bloc paie pour cinq. Le tableau ci-dessous donne le calcul réel à quelques tailles dâéquipe, ce nâest pas une illustration."],columns:{users:"Personnes",blocks:"Blocs",basic:"Basic",premium:"Premium"},ladder:[1,5,6,12,25],caution:"Une personne seule sur un plan payant paie un bloc entier. Si vous êtes seul, le plan gratuit est presque toujours la bonne réponse â il contient un vrai coffre-fort, et rien nây change côté chiffrement."},solo:{heading:"Le plan gratuit est fait pour exactement une personne",body:["Pas « une personne pour commencer ». Une personne, par construction. Un espace gratuit est plafonné à un utilisateur et à zéro groupe, et un groupe est la seule chose qui puisse donner à quelquâun dâautre lâaccès à un dossier â lâaccès sâaccorde en réenveloppant la clé du dossier pour un groupe, donc sans groupe il nây a personne pour qui lâenvelopper.","Ce nâest pas une limite souple que lâon contourne en passant au plan suivant. Un espace gratuit nâa aucun mécanisme pour une deuxième personne, ce qui vaut la peine dâêtre su avant dâinviter un collègue et de découvrir quâil nây a nulle part où le mettre.","Ce que le gratuit donne, en revanche, câest un coffre-fort dans lequel on peut vraiment vivre : des centaines dâéléments, toute la structure de dossiers, lâhistorique de chaque modification, les rappels dâexpiration, la connexion multifacteur, lâextension de navigateur, les deux applications mobiles et une réserve mensuelle de liens de partage publics. Câest le même client et la même cryptographie quâun client payant."],caution:"Dès quâil vous faut une deuxième personne, il vous faut un plan payant â et un plan payant commence à un bloc complet de cinq. Câest là la vraie marche à franchir, et câest une marche, pas une pente."},trial:{heading:"Lâessai ne demande aucune carte",body:["Les deux plans payants démarrent par un essai de sept jours qui commence à lâinscription. Aucun moyen de paiement nâest collecté et rien nâest débité pendant cette période.","Si lâessai se termine sans carte enregistrée, lâabonnement est mis en pause au lieu dâêtre facturé. Un espace en pause est verrouillé â vos données sont intactes et vous pouvez toujours vous connecter, accéder à la facturation, exporter ou désactiver â mais le coffre-fort reste illisible jusquâà lâajout dâun moyen de paiement. Rien nâest supprimé et rien nâest débité."]},table:{heading:"Toutes les limites, sur un seul écran",body:"Ce sont les chiffres que le serveur applique réellement, pas un résumé. Une limite vaut par espace de travail et compte ce qui sây trouve déjà .",rows:[{key:"maxUsers",label:"Utilisateurs"},{key:"maxSecrets",label:"Ãléments du coffre-fort"},{key:"maxGroups",label:"Groupes",note:"Le mécanisme de partage dâaccès aux dossiers. Zéro sur le gratuit : câest pour cela quâil est mono-utilisateur."},{key:"auditLogDays",label:"Journal dâaudit",note:"à la fois la profondeur de consultation et la durée de conservation des événements."},{key:"maxPublicSharesPerMonth",label:"Liens de partage publics",note:"Le seul partage qui sorte de lâespace de travail. Réinitialisé chaque mois."},{key:"breachMonitoring",label:"Surveillance des fuites"},{key:"lockPolicy",label:"Plafond de verrouillage automatique",note:"Tous les plans laissent chacun régler son propre délai de verrouillage par surface. Ce qui est payant, câest de plafonner les trois à lâéchelle de lâespace."},{key:"ssoEnabled",label:"Authentification unique (OIDC, SAML)"},{key:"apiAccess",label:"Accès API"}],yes:"Inclus",no:"Non inclus",unlimited:"Illimité",users:"utilisateurs",items:"éléments",days:"jours",perMonth:"par mois",perUser:"par utilisateur, mais seulement à bloc plein"},absent:{heading:"Ce quâaucun plan nâachète",body:["Dit ici plutôt que laissé à deviner dans un tableau de coches. Il ne sâagit pas de promesses de feuille de route : ce sont des choses que le produit ne fait pas aujourdâhui, sur aucun plan, à aucun prix."],items:["Le partage de personne à personne. Vous ne pouvez pas transmettre un élément à un collègue nommé. Lâaccès à un dossier via un groupe et le lien public temporaire sont les deux mécanismes de partage qui existent.","Les coffres-forts à lâéchelle de lâorganisation ou entre équipes. Les organisations et les groupes existent comme structure ; il nây a pas de surface de coffre-fort partagé par-dessus.","Une extension Firefox ou Safari. Lâextension de navigateur cible Chrome et Edge. Le coffre-fort web fonctionne dans tout navigateur moderne, et il existe des applications iOS et Android.","Le stockage de vos secrets à deux facteur
238s. Câest délibéré et ce nâest pas prévu â un mot de passe et son second facteur dans le même magasin ne font pas deux facteurs. LâAuthenticator est un produit distinct précisément pour cette raison."]},faq:{heading:"Les questions que ces tarifs soulèvent vraiment",items:[{q:"Je suis seul. Combien me coûte Basic ?",a:"Un bloc entier : autant quâune équipe de cinq. Il nâexiste pas de tarif mono-utilisateur sur un plan payant, parce que le bloc est lâunité facturée et que le minimum est dâun bloc. Si vous êtes seul et que la limite dâéléments du plan gratuit vous convient, le gratuit est la meilleure réponse â la cryptographie est identique et aucun essai nâexpire."},{q:"Que se passe-t-il quand jâajoute une sixième personne ?",a:"Votre espace passe à deux blocs et le prix double. Les blocs sont recomptés après chaque changement de composition puis synchronisés avec Stripe, donc le changement sâapplique tout de suite et non en fin de mois. Retirer cette personne vous ramène à un bloc."},{q:"Y a-t-il une limite dâutilisateurs sur un plan payant ?",a:"Non. Les deux plans payants sont illimités en utilisateurs â le plafond qui existait autrefois a disparu avec la facturation par bloc. Ce qui augmente, câest le nombre de blocs, cinq utilisateurs à la fois. Les limites dâéléments, de groupes et de partages restent propres à chaque plan."},{q:"Puis-je essayer un plan payant sans carte ?",a:"Oui, pendant sept jours, et câest le seul essai. Aucun moyen de paiement nâest demandé à lâinscription. Si lâessai se termine sans carte, lâabonnement est mis en pause au lieu dâêtre facturé : lâespace se verrouille, vos données chiffrées restent exactement où elles étaient, et vous pouvez toujours vous connecter pour ajouter une carte, exporter ou fermer lâespace."},{q:"Pourquoi le plan gratuit est-il limité à un utilisateur ?",a:"Parce que partager un dossier consiste à donner à un groupe sa propre copie de la clé de ce dossier, et que le plan gratuit nâautorise aucun groupe. Câest une limite cryptographique et non un interrupteur de facturation, ce qui explique aussi son caractère absolu : un espace gratuit ne peut pas être dans un état « deuxième utilisateur »."},{q:"Quâest-ce qui compte dans la limite dâéléments ?",a:"Tout élément présent dans lâespace, de tout type â identifiants, notes sécurisées, cartes, clés, documents. Les éléments supprimés ne comptent plus une fois effacés. Lâécran dâimport affiche la place restante avant tout envoi et refuse un import qui dépasserait la limite."},{q:"Faut-il Premium pour avoir le bon chiffrement ?",a:"Non, et il nâexiste aucune version de ce produit où ce serait le cas. La dérivation de clés, le chiffrement des éléments et le modèle « zéro connaissance » sont identiques sur tous les plans, gratuit compris. Premium achète lâauthentification unique, une année de journal dâaudit et lâaccès API â des fonctions organisationnelles, pas une cryptographie plus forte."},{q:"Quâarrive-t-il à mes données si je cesse de payer ?",a:"Lâespace se verrouille et les données restent. Un abonnement en pause ou impayé bloque les routes du coffre-fort mais laisse ouvertes celles de lâauthentification, de la facturation et des réglages : vous pouvez toujours vous connecter, régulariser ou désactiver lâespace volontairement. Rien nâest supprimé comme effet de bord de la facturation."},{q:"Existe-t-il un tarif annuel ?",a:"Non. Les deux plans payants sont mensuels, par bloc, et résiliables à tout moment depuis le portail de facturation."}]},cta:{heading:"Commencez en gratuit, changez quand il le faut",body:"Créer un espace gratuit prend une minute, ne demande aucune carte et donne un vrai coffre-fort. Si vous savez déjà quâil vous faut une deuxième personne, démarrez plutôt lâessai dâun plan payant â lui non plus ne demande pas de carte.",primaryLabel:"Créer un compte",secondaryLabel:"Poser une question sur les tarifs"},related:{heading:"à lire ensuite",links:[{label:"Comment fonctionne le chiffrement",path:"/security"},{label:"Coffre-fort de mots de passe",path:"/password-vault"},{label:"Switch from LastPass",path:"/switch/from-lastpass"},{label:"U2 Secured vs LastPass",path:"/vs/lastpass"},{label:"U2 Secured vs Bitwarden",path:"/vs/bitwarden"},{label:"U2 Secured vs 1Password",path:"/vs/1password"},{label:"U2 Secured vs Proton Pass",path:"/vs/proton-pass"}]},footnote:["Les prix sont en dollars américains et hors taxes éventuelles ajoutées au paiement selon votre pays. La facturation est assurée par notre revendeur officiel.","Chaque plan peut contenir jusquâà 1â¯000 dossiers. Ce chiffre est un garde-fou contre les abus et non une différence entre plans â il est le même en gratuit quâen Premium â et le support peut le relever pour un espace qui en a légitimement besoin."]},cc={en:Gn,fr:dc};Gn.path;function uc(){return t.jsx(sc,{content:cc[ze()]})}function hc({content:e}){const a=ze(),s=b.useRef(null);nt(s);
238const r=Qt(e.path,a);return t.jsxs("div",{ref:s,children:[t.jsx(Ee,{title:e.seoTitle,description:e.seoDescription,path:e.path,jsonLd:[zn({headline:e.title,description:e.seoDescription,url:r,reviewedOn:e.reviewedOn,locale:a}),At(e.faq.items),ft(e.breadcrumb,a)]}),t.jsxs("header",{className:"relative isolate",children:[t.jsx("div",{className:"u2-grid absolute inset-0 -z-10 opacity-50 [mask-image:radial-gradient(ellipse_at_top,black,transparent_70%)]"}),t.jsx("div",{"aria-hidden":"true",className:"absolute -z-10 left-1/2 top-[-12rem] h-[36rem] w-[60rem] -translate-x-1/2 rounded-full blur-[120px] bg-indigo-600/20"}),t.jsx("div",{"aria-hidden":"true",className:"absolute -z-10 right-[-8rem] top-[6rem] h-[26rem] w-[26rem] rounded-full blur-[110px] bg-cyan-500/15"}),t.jsxs("div",{className:"mx-auto max-w-3xl px-6 pt-20 pb-10",children:[t.jsx("span",{className:"font-mono text-xs font-medium uppercase tracking-[0.2em] text-cyan-400",children:e.kicker}),t.jsx("h1",{className:"font-brand mt-4 text-4xl font-bold tracking-tight text-slate-50 sm:text-5xl",children:e.title}),e.lead.map(n=>t.jsx("p",{className:"mt-5 text-lg leading-relaxed text-slate-400",children:n},n)),t.jsxs("p",{className:"mt-6 font-mono text-xs text-slate-500",children:[e.reviewedLabel," ",t.jsx("time",{dateTime:e.reviewedOn,children:e.reviewedOn})]})]})]}),t.jsxs("section",{className:"mx-auto max-w-3xl px-6 py-12",children:[t.jsx("h2",{"data-reveal":!0,className:"font-brand text-2xl font-bold text-slate-50",children:e.chain.heading}),e.chain.body.map(n=>t.jsx("p",{"data-reveal":!0,className:"mt-4 text-base leading-relaxed text-slate-400",children:n},n)),t.jsx("ol",{className:"mt-8 space-y-4",children:e.chain.steps.map((n,o)=>t.jsx(pc,{step:n,index:o},n.to))}),t.jsx(fc,{spec:e.chain.spec}),t.jsx(ur,{text:e.chain.caution})]}),e.sections.map((n,o)=>t.jsx("section",{className:o%2===0?"border-y border-slate-800/80 bg-slate-900/20":"",children:t.jsx("div",{className:"mx-auto max-w-3xl px-6 py-14",children:t.jsx(gc,{section:n})})},n.heading)),t.jsx("section",{className:"border-y border-slate-800/80 bg-slate-950",children:t.jsxs("div",{className:"mx-auto max-w-5xl px-6 py-16",children:[t.jsx("h2",{"data-reveal":!0,className:"font-brand text-2xl font-bold text-slate-50",children:e.ledger.heading}),e.ledger.body.map(n=>t.jsx("p",{"data-reveal":!0,className:"mt-4 max-w-2xl text-base leading-relaxed text-slate-400",children:n},n)),t.jsxs("div",{className:"mt-10 grid gap-8 md:grid-cols-2",children:[t.jsxs("div",{"data-reveal":!0,className:"rounded-2xl border border-cyan-500/25 bg-cyan-500/5 p-6",children:[t.jsxs("h3",{className:"font-brand flex items-center gap-2.5 text-base font-semibold text-cyan-200",children:[t.jsx(Xl,{size:18,"aria-hidden":"true"})," ",e.ledger.hiddenHeading]}),t.jsx("ul",{className:"mt-5 space-y-3",children:e.ledger.hidden.map(n=>t.jsxs("li",{className:"flex items-start gap-3 text-sm leading-relaxed text-slate-300",children:[t.jsx(De,{size:16,className:"mt-0.5 shrink-0 text-cyan-400","aria-hidden":"true"}),n]},n))})]}),t.jsxs("div",{"data-reveal":!0,className:"rounded-2xl border border-amber-500/30 bg-amber-500/5 p-6",children:[t.jsxs("h3",{className:"font-brand flex items-center gap-2.5 text-base font-semibold text-amber-200",children:[t.jsx(Ls,{size:18,"aria-hidden":"true"})," ",e.ledger.seenHeading]}),t.jsx("ul",{className:"mt-5 space-y-3",children:e.ledger.seen.map(n=>t.jsxs("li",{className:"flex items-start gap-3 text-sm leading-relaxed text-slate-300",children:[t.jsx(Ls,{size:16,className:"mt-0.5 shrink-0 text-amber-400/80","aria-hidden":"true"}),n]},n))})]})]}),e.ledger.closing.map(n=>t.jsx("p",{"data-reveal":!0,className:"mt-6 max-w-3xl text-base leading-relaxed text-slate-300",children:n},n))]})}),t.jsxs("section",{className:"mx-auto max-w-3xl px-6 py-16",children:[t.jsx("h2",{"data-reveal":!0,className:"font-brand text-2xl font-bold text-slate-50",children:e.caveats.heading}),t.jsx("p",{"data-reveal":!0,className:"mt-3 text-base leading-relaxed text-slate-400",children:e.caveats.body}),t.jsx("div",{className:"mt-8 space-y-6",children:e.caveats.items.map(n=>t.jsxs("div",{"data-reveal":!0,className:"rounded-2xl border border-slate-800 bg-slate-950 p-6",children:[t.jsx("h3",{className:"font-brand text-lg font-semibold text-slate-100",children:n.heading}),n.body.map(o=>t.jsx("p",{className:"mt-3 text-base leading-relaxed text-slate-400",children:o},o)),n.caution&&t.jsx(ur,{text:n.caution}
238)]},n.heading))})]}),t.jsx("section",{className:"border-y border-slate-800/80 bg-slate-900/20",children:t.jsxs("div",{className:"mx-auto max-w-3xl px-6 py-14",children:[t.jsx("h2",{"data-reveal":!0,className:"font-brand text-2xl font-bold text-slate-50",children:e.entitlements.heading}),t.jsx("p",{"data-reveal":!0,className:"mt-3 text-base leading-relaxed text-slate-400",children:e.entitlements.body}),t.jsx("ul",{className:"mt-6 space-y-3",children:e.entitlements.items.map(n=>t.jsxs("li",{"data-reveal":!0,className:"flex items-start gap-3 text-sm leading-relaxed text-slate-300",children:[t.jsx(Gt,{size:16,className:"mt-0.5 shrink-0 text-cyan-400","aria-hidden":"true"}),n]},n))})]})}),t.jsx("section",{className:"mx-auto max-w-3xl px-6 py-14",children:t.jsxs("div",{"data-reveal":!0,className:"rounded-2xl border border-cyan-500/25 bg-cyan-500/5 p-7",children:[t.jsxs("div",{className:"flex items-center gap-2.5 text-cyan-300",children:[t.jsx(Jl,{size:18,"aria-hidden":"true"}),t.jsx("span",{className:"font-mono text-xs font-medium uppercase tracking-[0.2em]",children:"verify"})]}),t.jsx("h2",{className:"font-brand mt-3 text-2xl font-bold text-slate-50",children:e.check.heading}),t.jsx("p",{className:"mt-3 text-base leading-relaxed text-slate-300",children:e.check.body}),t.jsx("ol",{className:"mt-5 space-y-3",children:e.check.items.map((n,o)=>t.jsxs("li",{className:"flex items-start gap-3 text-sm leading-relaxed text-slate-300",children:[t.jsx("span",{"aria-hidden":"true",className:"mt-0.5 flex size-5 shrink-0 items-center justify-center rounded border border-slate-700 bg-slate-900 font-mono text-[11px] text-cyan-300",children:o+1}),n]},n))})]})}),t.jsx("section",{className:"border-y border-slate-800/80 bg-slate-900/20",children:t.jsxs("div",{className:"mx-auto max-w-3xl px-6 py-14",children:[t.jsx("h2",{"data-reveal":!0,className:"font-brand text-2xl font-bold text-slate-50",children:e.faq.heading}),t.jsx("dl",{className:"mt-8",children:e.faq.items.map(n=>t.jsxs(b.Fragment,{children:[t.jsx("dt",{"data-reveal":!0,className:"font-brand mt-7 text-base font-semibold text-slate-100 first:mt-0",children:n.q}),t.jsx("dd",{"data-reveal":!0,className:"mt-2 text-base leading-relaxed text-slate-400",children:n.a})]},n.q))})]})}),t.jsxs("section",{className:"mx-auto max-w-3xl px-6 pb-20 pt-14 text-center",children:[t.jsx("h2",{className:"font-brand text-2xl font-bold text-slate-50",children:e.cta.heading}),t.jsx("p",{className:"mx-auto mt-3 max-w-xl text-base leading-relaxed text-slate-400",children:e.cta.body}),t.jsxs("div",{className:"mt-6 flex flex-wrap justify-center gap-3",children:[t.jsxs("a",{href:`${Se}/register`,className:"inline-flex items-center gap-2 rounded-xl bg-gradient-to-r from-indigo-500 to-cyan-400 px-5 py-3 text-sm font-semibold text-white shadow-lg shadow-indigo-500/25",children:[t.jsx(Qe,{size:15})," ",e.cta.primaryLabel]}),t.jsx(oe,{to:W("/contact",a),className:"inline-flex items-center gap-2 rounded-xl border border-slate-700 bg-slate-900 px-5 py-3 text-sm font-semibold text-slate-100 hover:border-slate-500",children:e.cta.secondaryLabel})]}),t.jsx(Vn,{related:e.related,locale:a})]})]})}function pc({step:e,index:a}){const s=e.leavesDevice===!0;return t.jsx("li",{"data-reveal":!0,className:`rounded-2xl border p-5 ${s?"border-amber-500/40 bg-amber-500/5":"border-slate-800 bg-slate-950"}`,children:t.jsxs("div",{className:"flex items-start gap-3",children:[t.jsx("span",{"aria-hidden":"true",className:`mt-0.5 flex size-7 shrink-0 items-center justify-center rounded-lg border font-mono text-xs font-semibold ${s?"border-amber-500/40 bg-slate-900 text-amber-300":"border-slate-800 bg-slate-900 text-cyan-300"}`,children:a+1}),t.jsxs("div",{className:"min-w-0",children:[t.jsxs("p",{className:"flex flex-wrap items-center gap-x-2 gap-y-1 text-sm",children:[t.jsx("span",{className:"text-slate-300",children:e.from}),t.jsx(Ae,{size:13,className:"shrink-0 text-slate-600","aria-hidden":"true"}),t.jsx("span",{className:"font-mono text-xs text-cyan-300",children:e.via}),t.jsx(Ae,{size:13,className:"shrink-0 text-slate-600","aria-hidden":"true"}),t.jsx("span",{className:`font-semibold ${s?"text-amber-200":"text-slate-100"}`,children:e.to})]}),t.jsx("p",{className:"mt-2 text-sm leading-relaxed text-slate-400",children:e.note})]})]})})}function mc(e){return e.replace("{memory}",String(Tn)).replace("{iterations}",String(Ge.argon2Iterations)).replace("{lanes}",String(Ge.argon2Parallelism)).replace("{bytes}",String(Ge.keyBytes)).replace("{nonce}",String(Ge.nonceBits)).replace("{prefix}",String(Ge.breachPrefixChars))}function fc({spec:e}){return t.jsxs("div",{"data-reveal":!0,className:"mt-8 rounded-2xl border border-slate-800 bg-slate-900/40 p-5",children:[t.jsx("span",{className:"font-mono text-xs font-medium uppercase tracking-[0.2em] text-slate-500",children:e.heading}),t.jsx("ul",{className:"mt-3 space-y-2",children:[e.argon2,e.aes,e.breach].map(a=>t.jsx("li",{className:"font-mono text-xs leading-relaxed text-slate-300",children:mc(a)},a))})]})}function gc({section:e}){return t.jsxs(t.Fragment,{children:[t.jsx("h2",{"data-reveal":!0,className:"font-brand text-2xl font-bold text-slate-50",children:e.heading}),e.body.map(a=>t.jsx("p",{"data-reveal":!0,className:"mt-4 text-base leading-relaxed text-slate-400",children:a},a)),e.items&&t.jsx("ul",{className:"mt-6 space-y-3",children:e.items.map(a=>t.jsxs("li",{"data-reveal":!0,className:"flex items-start gap-3 text-sm leading-relaxed text-slate-300",children:[t.jsx(De,{size:17,className:"mt-0.5 shrink-0 text-cyan-400","aria-hidden":"true"}),a]},a))}),e.caution&&t.jsx(ur,{text:e.caution})]})}function ur({text:e}){return t.jsxs("p",{"data-reveal":!0,className:"mt-6 flex items-start gap-2.5 rounded-xl border border-amber-500/30 bg-amber-500/5 p-4 text-sm leading-relaxed text-amber-200/90",children:[t.jsx(We,{size:18,className:"mt-0.5 shrink-0 text-amber-400"}),t.jsx("span",{children:e})]})}const Yn={path:"/security",seoTitle:"Security architecture â U2 Secured password vault",seoDescription:"How the U2 Secured vault is built: Argon2id, AES-256-GCM, per-folder keys, and an honest list of the metadata the server can see. Written to be checked.",navLabel:"Security",kicker:"Security architecture",title:"What the server can read, and what it cannot",lead:["Your vault is encrypted on your device with a key the server never receives. That sentence is on every password managerâs website, so this page does the part that is usually missing: it says exactly which values are derived where, which one is sent, what the server can still see, and where the model is weaker than the headline.","Everything below is checkable. Where a claim rests on a mechanism rather than a promise, the mechanism is named."],breadcrumb:[{name:"Home",path:"/"},{name:"Security",path:"/security"}],reviewedOn:"2026-09-25",reviewedLabel:"Claims on this page were last read out of the source on",chain:{heading:"Where each key comes from",body:["Your master password is never transmitted, and neither is the key that decrypts your vault. Both are produced on your device, from the password and your email address, every time you sign in.","One derived value does go to the server, and it is the third step below. It is a one-way function of a one-way function of your password: enough to prove you know the password, useless for decrypting anything."],steps:[{from:"Master password + your email address as the salt",via:"Argon2id",to:"Master key, 32 bytes",note:"Memory-hard on purpose: the cost parameters are chosen so that guessing at scale is expensive even with the hash in hand. Runs in your browser, in the extension, or natively on your phone."},{from:"Master key",via:'HKDF-SHA256, info "stretch"',to:"Stretch key",note:"One derivation splits into the two independent values below, so neither can be computed from the other."},{from:"Stretch key",via:"SHA-256",to:"Master password hash",note:"This is the only derived value that is sent. The server hashes it again with bcrypt before storing it, so what sits in the database is a bcrypt hash of a SHA-256 of an HKDF of an Argon2id. It verifies a sign-in and decrypts nothing.",leavesDevice:!0},{from:"Stretch key",via:'HKDF-SHA256, info "vault"',to:"Vault key",note:"Never sent, never logged, never escrowed. It exists to unwrap the key below and nothing else."},{from:"Vault key",via:"AES-256-GCM",to:"Your X25519 private key",note:"Each account has an X25519 key pair. The public half is stored in the clear; the private half is stored only as ciphertext the server cannot open. This indirection is why changing your master password does not require re-encrypting your vault."},{from:"Your X25519 private key",via:"group key, then folder key",to:"The items themselves",note:"Your private key unwraps the key of each group you are in; a group key unwraps the key of each folder that group may read; a folder key decrypts the items inside it."}],spec:{heading:"The parameters, as configured today",argon2:"Argon2id · {memory} MiB of memory · {iterations} passes · {lanes} lanes · {bytes}-byte output",aes:"AES-256-GCM · a fresh random {nonce}-bit nonce for every single encryption",breach:"Breach lookup · {prefix}
238 characters of a SHA-1 hash leave the device, and nothing else"},caution:"The cost parameters are fetched from the server at sign-in because they have to match the ones your account was created with. Sending weaker ones would not quietly downgrade you â it would produce a different hash, and the sign-in would simply fail."},sections:[{heading:"An item is sealed under the key of the folder it lives in",body:["Each item is encrypted with AES-256-GCM under its folderâs key, with a fresh random nonce for every single encryption â a new one each time you save, never reused. What reaches the server is the ciphertext, the nonce, and the structural fields it needs to store the row.","Version history is the same ciphertext, kept per revision, so recovering last weekâs value is a client-side decryption of an older blob rather than something the server does for you. Folder names are encrypted too: the server holds the tree, not the labels on it."]},{heading:"Folder access is cryptographic, not a permission flag",body:["This is the part most worth checking, because it is where a lot of products keep a boolean. Giving a group access to a folder writes that group its own copy of the folderâs key, encrypted so that only the groupâs members can open it. The access record and the key are the same row.","So revoking a group removes its copy of the key. There is no flag left set to false with a readable key sitting behind it, and no code path in which the server decides whether to hand over plaintext â it has no plaintext to hand over. The same construction is what makes the free plan single-person: with no groups, there is nobody to wrap a folder key for."],caution:"Revocation is forward-looking, as it is in every system of this shape. Removing a key copy stops future reads; it cannot unsee what somebody already decrypted. When a person leaves, rotate the credentials themselves, not just their access."},{heading:"Your two-factor secrets are deliberately not in here",body:["The vault has no field for a TOTP secret and will not be given one. This is a design position, not a gap in the roadmap, and it is worth stating plainly because storing both in one record is common.","A password and its second factor in the same store are not two factors. Whatever reaches that store reaches both at once, and the second factor has stopped being a second anything â which is the entire reason for having one. Keeping them apart is the feature.","The import tool holds the line where it would be easiest to cross: when a file you import carries authenticator seeds, they are lifted out before anything is encrypted, never uploaded, and handed back to you at the end as otpauth:// QR codes to scan into an authenticator app. A separate product is the honest answer here, and we ship one."]},{heading:"Breach monitoring that never sends a password",body:["Saved passwords are checked against known breach corpora without the password, or its full hash, leaving your device. The client hashes the password locally with SHA-1, sends the first five hex characters of that hash, and matches the remainder against the response in memory.","Five characters is roughly one millionth of the hash space, shared with hundreds of thousands of unrelated passwords. The server learns a prefix, never which entry matched, and never whether anything matched at all. The lookup is proxied through our backend rather than made from your browser, which also keeps your IP address away from the third party.","The report of what was found is itself encrypted before it is stored, and bound to your account so that a blob lifted from one account fails to decrypt for another rather than opening in the wrong dashboard."]},{heading:"Losing the password, and the one way back",body:["You can generate a recovery key. It is high-entropy, shown once, and the server never sees it: what the server stores is a second copy of your X25519 private key, wrapped under a key derived from the recovery key. Presenting the recovery key unwraps that copy and restores access.",'If you have not set one up and you forget your master password, your data is gone, and we cannot help â not "will not", cannot. That is the cost of the rest of this page, and it is the right way round: a vendor who can recover your vault for you is a vendor who can read it.']},{heading:"Separation that is not cryptographic, but is still structural",body:["Every row in the database carries a workspace id, and PostgreSQL row-level security rejects a query that does not scope to one â so cross-wor
238kspace data access is a database-level refusal rather than a filter some handler has to remember to add.","Sessions are short-lived access tokens with rotating refresh tokens in HTTP-only cookies. API keys are scoped and stored as SHA-256 hashes, so the key we hold cannot be used to make a request. None of this protects your plaintext â the encryption does that â but it is what stands between two customers, and between a stolen key and your workspace."]}],ledger:{heading:"What we can see",body:["A zero-knowledge page that lists only what is hidden is not credible, so here is the other column. The server necessarily knows a great deal about the shape of your vault, because it has to store, index and bill for it.","This list was worked out from the database schema rather than written from intention. If you find something we hold that is not here, that is a mistake in this page and we want to know."],hiddenHeading:"Ciphertext only â we cannot read these",hidden:["The contents of every item: names, usernames, passwords, notes, card numbers, keys, every field","Folder names","Every earlier version of every item","The contents behind a public share link â its key travels in the link, not in our database","Your X25519 private key, which is stored wrapped under your vault key","Your master password and your vault key, which are never sent at all","Your two-factor secrets, which are not stored here in any form"],seenHeading:"In the clear â we can see all of these",seen:["How many items you have, and what KIND each one is: login, secure note, card, document, Wi-Fi, API key, SSH key, database, server","When each item was created and last changed, how many revisions it has, and when it is set to expire","Which folder each item is in, the shape of your folder tree, and how many folders there are","Which member created each item","Every memberâs email address and full name, their date of birth if they entered one, and their profile picture","Your group names, in plain text, and who belongs to each group","Your workspace name, its plan, its billing status, trial dates, and your payment-processor customer id","The audit log: each action, the kind of resource it touched, the exact time, and the IP address it came from","For each share link: that it exists, how long it lasts, whether it has a passphrase, whether it burns on first read, how many times it has been opened and when","Your master password hash â enough to verify a sign-in, not enough to decrypt anything","The five-character hash prefixes a breach check sends, and the addresses your sessions come from"],closing:["None of that is your passwords. All of it is information about you, and metadata is not nothing.","Stated as bluntly as it deserves: somebody with access to our database could tell that you keep four payment cards, that a folder they cannot name gained an item at 02:14 on a Sunday, and which address you were at when it happened. They could not tell you what any of it says."]},caveats:{heading:"Where this is weaker than the headline",body:"Four places. None of them is a defect we are about to fix, which is why they are written down rather than left for a reader to find.",items:[{heading:"On a phone, the key is stored at rest",body:['"Never leaves the device" is a statement about the wire, not about memory. On the web and in the extension the vault key exists only in RAM for the session. On iOS and Android it is persisted in the operating systemâs keychain, protected by the platform and released only after a biometric check or the device passcode.',"That is what biometric unlock re-reads, and it is deliberately not cleared when the app locks â clearing it would make biometric unlock impossible, because nothing on that path can re-derive the key from a master password that is not kept anywhere. Signing out removes it."],caution:"The consequence, stated plainly: on a phone the security floor is the device credential, not your master password. Someone who can satisfy your phoneâs unlock can open your vault. It is an accepted trade, pinned by a test so that changing it is a decision rather than a tidy-up."},{heading:"On the web, we serve the code that does the encryption",body:["A browser application is fetched fresh on each visit, so its integrity depends on us shipping honest code and on that delivery not being tampered with. No amount of client-side cryptography escapes that: the client is ours.","The packaged clients are in a better position on this specific risk. The extension is a versioned, signed package from the Chrome Web Store and the mobile apps are signed store builds â each is a fixed artefact you can inspect, rather than a fresh download you have to trust. If this is your threat model, prefer them."]},{heading:"There is no published third-party audit",body:["The construction here is standard â Argon2id, HKDF, AES-256-GCM, X25519, all used in the ordinary way and with well-reviewed implementations â but nobody outside the team has published a review of this particular implementation, and we are not going to imply otherwise by talking around it.","What we offer instead is specificity: this page names the mechanism behind every claim, so you can check the behaviour yourself rather than take a certificateâs word for it. A certificate would be better. It does not exist yet."]},{heading:"Sharing is narrower than you may expect",body:["There is no person-to-person sharing and no organisation-wide shared vault. The two mechanisms that exist are group access to a folder, inside a workspace, and a temporary public link to a single item.","A public link is still zero-knowledge â its key is in the link, so we cannot read what was shared â but it is a link, and anybody who has it can open it until it expires, burns, or is revoked. Treat it as a way to hand something over once, not as a way to give a colleague ongoing access."]}]},entitlements:{heading:"Which plan gets which of this",body:"The cryptography is not one of them. Key derivation, item encryption and the zero-knowledge model are identical on every plan, free included â there is no version of this product where paying more means your data is better encrypted.",items:["Client-side encryption, per-folder keys, version history, multi-factor sign-in and device trust: every plan, free included","Breach monitoring on saved passwords: paid plans","Auto-lock timeouts, set per surface for web, extension and mobile: every plan. The workspace-wide CEILING an admin can impose on all three: paid plans","Single sign-on with OIDC or SAML, on a DNS-verified domain, with just-in-time provisioning, optional enforcement and an owner break-glass route: Premium","Audit log: the window is both how far back you can read and how long events are kept, and it lengthens with the plan","API access with scoped, hashed keys: Premium","Row-level workspace isolation in the database: not a plan feature, it is how the database is built"]},check:{heading:"How to check this yourself",body:"Four things you can verify without our help. If any of them does not behave as described, this page is wrong and we would like to hear about it.",items:["Open your browserâs network inspector and save an item. The request body carries an encrypted blob and a nonce. There is no field containing what you typed.","Change your master password and watch what is uploaded: your re-wrapped private key, and not your items. That is only possible because the items were never encrypted under the password in the first place.","Unp
238ack the browser extension from the Chrome Web Store and read the code that derives the key and encrypts the item. It is a published, versioned artefact, not something we hand you differently each time.","Ask us for everything we hold about you. What we can produce is the ciphertext and the metadata listed above â that is genuinely the whole of it."]},faq:{heading:"Questions people ask about the model",items:[{q:"Can U2 Secured read my passwords?",a:"No. Items are encrypted on your device with AES-256-GCM under a key derived from your master password with Argon2id and HKDF, and that key is never transmitted. The server stores ciphertext and a nonce. The one derived value it does receive is a hash used to verify your sign-in, which it re-hashes with bcrypt before storing."},{q:"What can you see, if not the passwords?",a:"The structure and the timing. How many items you have and what type each one is, your folder treeâs shape, who created what and when, your group names, your membersâ names and email addresses, the audit log including the IP addresses actions came from, and your billing data. Folder names, item contents and version history are ciphertext. The full list is on this page."},{q:"What happens if your servers are breached?",a:"Whoever took the data would hold ciphertext they have no key for, plus the metadata listed above, plus bcrypt hashes of already-derived password values. They could see the shape of your vault. They could not read it, and there is no key of ours anywhere that would change that â the keys are on your devices."},{q:"Why are my two-factor codes not stored in the vault?",a:"Because a password and its second factor in one store are not two factors: whatever opens that store opens both. The vault has no field for a TOTP secret, and the importer deliberately lifts any it finds out of the data and hands them back as otpauth:// QR codes instead of uploading them. The Authenticator is a separate product for the same reason."},{q:"Is the mobile app as safe as the website?",a:"It is different rather than simply better or worse. The phone stores your vault key at rest in the OS keychain, released after biometrics or the device passcode, so the floor there is your device credential rather than your master password. In exchange, a store build is a fixed signed artefact rather than code re-delivered on every visit. Both facts are on this page in full."},{q:"If I forget my master password, can you reset it?",a:"Only if you set up a recovery key beforehand, which we never see â it unwraps a second stored copy of your private key. Without one, we cannot recover your vault. A vendor who could would be a vendor who could read it."},{q:"Do I get weaker encryption on the free plan?",a:"No. Key derivation, item encryption and the zero-knowledge model are identical on every plan. What paid plans add is organisational: more capacity, breach monitoring, a longer audit log, single sign-on and API access."}]},cta:{heading:"Read it, then try it",body:"A free workspace needs no card and uses exactly the architecture described above. If something on this page does not match what you observe, tell us â that is a bug in the page or in the product, and both matter.",primaryLabel:"Create an account",secondaryLabel:"Ask a security question"},related:{heading:"Read next",links:[{label:"Pricing",path:"/pricing"},{label:"Password Vault",path:"/password-vault"},{label:"Mobile app",path:"/mobile-app"},{label:"U2 Secured vs Bitwarden",path:"/vs/bitwarden"},{label:"U2 Secured vs Proton Pass",path:"/vs/proton-pass"}]}},yc={path:"/security",seoTitle:"Architecture de sécurité â coffre-fort U2 Secured",seoDescription:"Comment le coffre-fort U2 Secured est construit : Argon2id, AES-256-GCM, clés par dossier, et la liste honnête des métadonnées visibles côté serveur.",navLabel:"Sécurité",kicker:"Architecture de sécurité",title:"Ce que le serveur peut lire, et ce quâil ne peut pas",lead:["Votre coffre-fort est chiffré sur votre appareil avec une clé que le serveur ne reçoit jamais. Cette phrase figure sur le site de tous les gestionnaires de mots de passe ; cette page fait donc la partie qui manque dâhabitude : elle dit exactement quelles valeurs sont dérivées où, laquelle est envoyée, ce que le serveur voit malgré tout, et où le modèle est plus faible que le slogan.","Tout ce qui suit est vérifiable. Quand une affirmation repose sur un mécanisme plutôt que sur une promesse, le mécanisme est nommé."],breadcrumb:[{name:"Accueil",path:"/"},{name:"Sécurité",path:"/security"}],reviewedOn:"2026-09-25",reviewedLabel:"Les affirmations de cette page ont été relues dans le code source le",chain:{heading:"Dâoù vient chaque clé",body:["Votre mot de passe maître nâest jamais transmis, et la clé qui déchiffre votre coffre-fort ne lâest pas davantage. Les deux sont produites sur votre appareil, à partir du mot de passe et de votre adresse e-mail, à chaque connexion.","Une valeur dérivée part bien vers le serveur : câest la troisième étape ci-dessous. Câest une fonction à sens unique dâune fonction à sens unique de votre mot de passe â suffisante pour prouver que vous le connaissez, inutile pour déchiffrer quoi que ce soit."],steps:[{from:"Mot de passe maître + votre adresse e-mail comme sel",via:"Argon2id",to:"Clé maîtresse, 32 octets",note:"Gourmande en mémoire à dessein : les paramètres de coût sont choisis pour rendre une attaque à grande échelle coûteuse, même avec lâempreinte en main. Le calcul a lieu dans votre navigateur, dans lâextension, ou nativement sur votre téléphone."},{from:"Clé maîtresse",via:"HKDF-SHA256, info « stretch »",to:"Clé étendue",note:"Une seule dérivation se sépare ensuite en deux valeurs indépendantes, si bien quâaucune ne permet de calculer lâautre."},{from:"Clé étendue",via:"SHA-256",to:"Empreinte du mot de passe maître",note:"Câest la seule valeur dérivée qui soit envoyée. Le serveur la hache à nouveau avec bcrypt avant de la stocker : ce qui se trouve en base est donc un bcrypt dâun SHA-256 dâun HKDF dâun Argon2id. Elle vérifie une connexion et ne déchiffre rien.",leavesDevice:!0},{from:"Clé étendue",via:"HKDF-SHA256, info « vault »",to:"Clé du coffre-fort",note:"Jamais envoyée, jamais journalisée, jamais mise sous séquestre. Elle nâexiste que pour déballer la clé suivante."},{from:"Clé du coffre-fort",via:"AES-256-GCM",to:"Votre clé privée X25519",note:"Chaque compte possède une paire de clés X25519. La moitié publique est stockée en clair ; la moitié privée nâest stockée que sous forme de chiffré que le serveur ne peut pas ouvrir. Câest cette indirection qui fait quâun changement de mot de passe maître nâoblige pas à rechiffrer le coffre-fort."},{from:"Votre clé privée X25519",via:"clé de groupe, puis clé de dossier",to:"Les éléments eux-mêmes",note:"Votre clé privée déballe la clé de chaque groupe dont vous faites partie ; une clé de groupe déballe la clé de chaque dossier que ce groupe peut lire ; une clé de dossier déchiffre les éléments quâil contient."}],spec:{heading:"Les paramètres, tels que configurés aujourdâhui",argon2:"Argon2id · {memory} Mio de mémoire · {iterations} passes · {lanes} voies · sortie de {bytes} octets",aes:"AES-256-GCM · un nonce aléatoire de {nonce} bits, neuf à chaque chiffrement",breach:"Vérification de fuite · {prefix} caractères dâune empreinte SHA-1 quittent lâappareil, et rien dâautre"},caution:"Les paramètres de coût sont récupérés auprès du serveur à la connexion parce quâils doivent c
238orrespondre à ceux utilisés à la création du compte. En envoyer de plus faibles ne vous affaiblirait pas en silence : cela produirait une empreinte différente, et la connexion échouerait tout simplement."},sections:[{heading:"Un élément est scellé avec la clé du dossier où il se trouve",body:["Chaque élément est chiffré en AES-256-GCM avec la clé de son dossier, et un nonce aléatoire neuf à chaque chiffrement â un nouveau à chaque enregistrement, jamais réutilisé. Ce qui parvient au serveur, câest le chiffré, le nonce, et les champs de structure nécessaires pour stocker la ligne.","Lâhistorique des versions est le même chiffré, conservé par révision : retrouver la valeur de la semaine dernière est donc un déchiffrement côté client dâun ancien bloc, et non un service que le serveur vous rend. Les noms de dossiers sont chiffrés eux aussi : le serveur détient lâarborescence, pas les étiquettes posées dessus."]},{heading:"Lâaccès à un dossier est cryptographique, pas un simple drapeau",body:["Câest la partie la plus utile à vérifier, parce que câest là que beaucoup de produits se contentent dâun booléen. Donner à un groupe lâaccès à un dossier écrit à ce groupe sa propre copie de la clé du dossier, chiffrée pour que seuls ses membres puissent lâouvrir. Lâautorisation et la clé sont la même ligne.","Révoquer un groupe supprime donc sa copie de la clé. Il ne reste pas un drapeau à « faux » avec une clé lisible derrière, et aucun chemin de code ne laisse le serveur décider de livrer du clair â il nâa pas de clair à livrer. Câest la même construction qui rend le plan gratuit mono-utilisateur : sans groupe, il nây a personne pour qui envelopper une clé de dossier."],caution:"La révocation ne vaut que pour lâavenir, comme dans tout système de cette forme. Supprimer une copie de clé empêche les lectures futures ; cela ne peut pas effacer ce que quelquâun a déjà déchiffré. Quand une personne part, changez les identifiants eux-mêmes, pas seulement ses accès."},{heading:"Vos secrets à deux facteurs nây sont pas, volontairement",body:["Le coffre-fort nâa aucun champ pour un secret TOTP et nâen aura pas. Câest une position de conception, pas un manque sur la feuille de route, et cela mérite dâêtre dit clairement parce que les stocker ensemble est courant.","Un mot de passe et son second facteur dans le même magasin ne font pas deux facteurs. Ce qui atteint ce magasin atteint les deux dâun coup, et le second facteur a cessé dâêtre un second quoi que ce soit â ce qui est précisément la raison dâen avoir un. Les garder séparés est la fonctionnalité.","Lâoutil dâimport tient la ligne là où il serait le plus facile de la franchir : si un fichier importé contient des graines dâauthentification, elles sont extraites avant tout chiffrement, jamais envoyées, et vous sont rendues à la fin sous forme de QR codes otpauth:// à scanner dans une application dâauthentification. Un produit distinct est la réponse honnête ici, et nous en publions un."]},{heading:"Une surveillance des fuites qui nâenvoie jamais un mot de passe",body:["Les mots de passe enregistrés sont comparés à des corpus de fuites connus sans que le mot de passe, ni son empreinte complète, ne quitte votre appareil. Le client calcule localement une empreinte SHA-1, envoie les cinq premiers caractères hexadécimaux, et compare le reste à la réponse en mémoire.","Cinq caractères représentent environ un millionième de lâespace des empreintes, partagé avec des centaines de milliers de mots de passe sans rapport. Le serveur apprend un préfixe, jamais quelle entrée a correspondu, ni même si quelque chose a correspondu. La requête passe par notre backend au lieu de partir de votre navigateur, ce qui garde aussi votre adresse IP hors de portée du tiers.","Le rapport de ce qui a été trouvé est lui-même chiffré avant dâêtre stocké, et lié à votre compte : un bloc prélevé sur un compte échoue au déchiffrement pour un autre au lieu de sâouvrir dans le mauvais tableau de bord."]},{heading:"Perdre son mot de passe, et la seule voie de retour",body:["Vous pouvez générer une clé de récupération. Elle a une forte entropie, elle est affichée une seule fois, et le serveur ne la voit jamais : ce que le serveur stocke, câest une seconde copie de votre clé privée X25519, enveloppée sous une clé dérivée de la clé de récupération. Présenter la clé de récupération déballe cette c
238opie et rétablit lâaccès.","Si vous nâen avez pas créé et que vous oubliez votre mot de passe maître, vos données sont perdues et nous ne pouvons rien faire â « ne pouvons pas », et non « ne voulons pas ». Câest le prix du reste de cette page, et câest le bon sens de la contrainte : un fournisseur capable de récupérer votre coffre-fort est un fournisseur capable de le lire."]},{heading:"Une séparation non cryptographique, mais structurelle",body:["Chaque ligne de la base porte un identifiant dâespace de travail, et la sécurité au niveau des lignes de PostgreSQL rejette toute requête qui nâen précise pas un â un accès entre espaces est donc un refus de la base de données, et non un filtre quâun gestionnaire doit penser à ajouter.","Les sessions reposent sur des jetons dâaccès de courte durée et des jetons de renouvellement rotatifs dans des cookies HTTP-only. Les clés dâAPI ont une portée limitée et sont stockées sous forme dâempreintes SHA-256 : la clé que nous détenons ne permet pas dâémettre une requête. Rien de cela ne protège votre clair â câest le chiffrement qui sâen charge â mais câest ce qui sépare deux clients, et une clé volée de votre espace."]}],ledger:{heading:"Ce que nous voyons",body:["Une page « zéro connaissance » qui nâénumère que ce qui est caché nâest pas crédible ; voici donc lâautre colonne. Le serveur sait nécessairement beaucoup de choses sur la forme de votre coffre-fort, puisquâil doit le stocker, lâindexer et le facturer.","Cette liste a été établie à partir du schéma de la base de données, et non écrite dâaprès nos intentions. Si vous trouvez quelque chose que nous détenons et qui nây figure pas, câest une erreur de cette page et nous voulons le savoir."],hiddenHeading:"Chiffré uniquement â illisible pour nous",hidden:["Le contenu de chaque élément : noms, identifiants, mots de passe, notes, numéros de carte, clés, tous les champs","Les noms de dossiers","Toutes les versions antérieures de chaque élément","Le contenu derrière un lien de partage public â sa clé voyage dans le lien, pas dans notre base","Votre clé privée X25519, stockée enveloppée sous la clé de votre coffre-fort","Votre mot de passe maître et la clé de votre coffre-fort, qui ne sont jamais envoyés","Vos secrets à deux facteurs, qui ne sont stockés ici sous aucune forme"],seenHeading:"En clair â tout cela nous est visible",seen:["Combien dâéléments vous avez, et de quel TYPE est chacun : identifiant, note sécurisée, carte, document, Wi-Fi, clé dâAPI, clé SSH, base de données, serveur","Quand chaque élément a été créé et modifié pour la dernière fois, combien de révisions il compte, et quand il doit expirer","Dans quel dossier se trouve chaque élément, la forme de votre arborescence, et combien de dossiers elle contient","Quel membre a créé chaque élément","Lâadresse e-mail et le nom complet de chaque membre, sa date de naissance sâil lâa renseignée, et sa photo de profil","Les noms de vos groupes, en clair, et qui appartient à chaque groupe","Le nom de votre espace de travail, son plan, son état de facturation, les dates dâessai, et votre identifiant client chez le prestataire de paiement","Le journal dâaudit : chaque action, le type de ressource touchée, lâheure exacte, et lâadresse IP dâoù elle provenait","Pour chaque lien de partage : son existence, sa durée de vie, sâil a une phrase secrète, sâil sâautodétruit à la première lecture, combien de fois il a été ouvert et quand","Lâempreinte de votre mot de passe maître â de quoi vérifier une connexion, pas de quoi déchiffrer quoi que ce soit","Les préfixes dâempreinte de cinq caractères quâenvoie une vérification de fuite, et les adresses dâoù viennent vos sessions"],closing:["Rien de tout cela nâest vos mots de passe. Tout cela est de lâinformation sur vous, et des métadonnées ne sont pas rien.","Dit aussi crûment que cela le mérite : une personne ayant accès à notre base pourrait constater que vous conservez quatre cartes de paiement, quâun dossier dont elle ne peut pas lire le nom a gagné un élément à 2 h 14 un dimanche, et depuis quelle adresse. Elle ne pourrait pas vous dire ce que tout cela contient."]},caveats:{heading:"Là où câest plus faible que le slogan",body:"Quatre endroits. Aucun nâest un défaut que nous allons corriger, et câest pourquoi ils sont écrits ici plutôt que laissés à découvrir.",items:[{heading:"Sur un téléphone, la clé est conservée au repos",body:["« Ne quitte jamais lâappareil » parle du réseau, pas de la mémoire. Sur le web et dans lâextension, la clé du coffre-fort nâexiste quâen mémoire vive, le temps de la session. Sur iOS et Android, elle est conservée dans le porte-clés du système dâexploitation, protégée par la plateforme et libérée seulement après une vérification biométrique ou le code de lâappareil.","Câest cela que relit le déverrouillage biométrique, et ce nâest volontairement pas effacé au verrouillage de lâapplication â lâeffacer rendrait le déverrouillage biométrique impossible, puisque rien sur ce chemin ne peut redériver la clé depuis un mot de passe maître qui nâest conservé nulle part. La déconnexion, elle, la supprime."],caution:"La conséquence, dite simplement : sur un téléphone, le plancher de sécurité est lâauthentification de lâappareil, pas votre mot de passe maître. Qui sait déverrouiller votre téléphone peut ouvrir votre coffre-fort. Câest un compromis assumé, figé par un test pour que le modifier soit une décision et non un nettoyage."},{heading:"Sur le web, câest nous qui servons le code qui chiffre",body:["Une application web est téléchargée à neuf à chaque visite : s
238on intégrité dépend donc de nous, qui devons livrer du code honnête, et de cette livraison, qui ne doit pas être altérée. Aucune cryptographie côté client nâéchappe à cela : le client est le nôtre.","Les clients empaquetés sont en meilleure position sur ce risque précis. Lâextension est un paquet versionné et signé, distribué par le Chrome Web Store, et les applications mobiles sont des builds signés des magasins â chacun est un artefact figé, inspectable, plutôt quâun téléchargement à refaire confiance à chaque fois. Si câest votre modèle de menace, préférez-les."]},{heading:"Il nâexiste aucun audit externe publié",body:["La construction employée ici est standard â Argon2id, HKDF, AES-256-GCM, X25519, utilisés de façon ordinaire et avec des implémentations bien relues â mais personne dâextérieur à lâéquipe nâa publié de revue de cette implémentation-ci, et nous nâallons pas laisser croire le contraire en contournant le sujet.","Ce que nous offrons à la place, câest la précision : cette page nomme le mécanisme derrière chaque affirmation, pour que vous puissiez vérifier le comportement vous-même au lieu de vous fier à un certificat. Un certificat serait mieux. Il nâexiste pas encore."]},{heading:"Le partage est plus étroit que vous ne lâimaginez peut-être",body:["Il nây a pas de partage de personne à personne, ni de coffre-fort partagé à lâéchelle de lâorganisation. Les deux mécanismes existants sont lâaccès dâun groupe à un dossier, au sein dâun espace de travail, et un lien public temporaire vers un seul élément.","Un lien public reste « zéro connaissance » â sa clé est dans le lien, nous ne pouvons donc pas lire ce qui a été partagé â mais câest un lien, et quiconque lâa peut lâouvrir jusquâà son expiration, son autodestruction ou sa révocation. Voyez-le comme un moyen de transmettre quelque chose une fois, pas de donner un accès durable à un collègue."]}]},entitlements:{heading:"Quel plan donne quoi, là -dedans",body:"La cryptographie nâen fait pas partie. La dérivation des clés, le chiffrement des éléments et le modèle « zéro connaissance » sont identiques sur tous les plans, gratuit compris â il nâexiste aucune version de ce produit où payer davantage signifierait un meilleur chiffrement.",items:["Chiffrement côté client, clés par dossier, historique des versions, connexion multifacteur et confiance dâappareil : tous les plans, gratuit compris","Surveillance des fuites sur les mots de passe enregistrés : plans payants","Délais de verrouillage automatique, réglables par surface pour le web, lâextension et le mobile : tous les plans. Le PLAFOND à lâéchelle de lâespace quâun administrateur peut imposer aux trois : plans payants","Authentification unique OIDC ou SAML, sur un domaine vérifié par DNS, avec provisionnement à la volée, application facultative et une voie de secours pour le propriétaire : Premium","Journal dâaudit : la fenêtre correspond à la fois à la profondeur de consultation et à la durée de conservation, et elle sâallonge avec le plan","Accès API avec des clés à portée limitée, stockées sous forme dâempreintes : Premium","Isolation des espaces de travail au niveau des lignes en base : ce nâest pas une option de plan, câest la construction de la base"]},check:{heading:"Comment le vérifier vous-même",body:"Quatre choses vérifiables sans notre aide. Si lâune dâelles ne se comporte pas comme décrit, cette page est fausse et nous aimerions le savoir.",items:["Ouvrez lâinspecteur réseau de votre navigateur et enregistrez un élément. Le corps de la requête contient un bloc chiffré et un nonce. Aucun champ ne contient ce que vous avez saisi.","Changez votre mot de passe maître et regardez ce qui est envoyé : votre clé privée réenveloppée, et non vos éléments. Ce nâest possible que parce que les éléments nâont jamais été chiffrés avec le mot de passe.","Décompressez lâextension de navigateur depuis le Chrome Web Store et lisez le code qui dérive la clé et chiffre lâélément. Câest un artefact publié et versionné, pas quelque chose que nous vous livrons différemment chaque fois.","Demandez-nous tout ce que nous détenons sur vous. Ce que nous pouvons produire, câest le chiffré et les métadonnées listées plus haut â câest vraiment tout."]},faq:{heading:"Questions fréquentes sur le modèle",items:[{q:"U2 Secured peut-il lire mes mots de passe ?",a:"Non. Les éléments sont chiffrés sur votre appareil en AES-256-GCM avec une clé dérivée de votre mot de passe maître par Argon2id puis HKDF, et cette clé nâest jamais transmise. Le serveur stocke un chiffré et un nonce. La seule valeur dérivée quâil reçoive est une empreinte servant à vérifier votre connexion, quâil hache à nouveau avec bcrypt avant de la stocker."},{q:"Que voyez-vous, si ce ne sont pas les mots de passe ?",a:"La structure et les horodatages. Combien dâéléments vous avez et de quel type, la forme de votre arborescence de dossiers, qui a créé quoi et quand, les noms de vos groupes, les noms et adresses e-mail de vos membres, le journal dâaudit avec les adresses IP dâorigine, et vos données de facturation. Les noms de dossiers, le contenu des éléments et lâhistorique des versions sont chiffrés. La liste complète est sur cette page."},{q:"Que se passe-t-il si vos serveurs sont compromis ?",a:"Qui emporterait les données détiendrait un chiffré dont il nâa aucune clé, les métadonnées listées plus haut, et des empreintes bcrypt de valeurs déjà dérivées. Il verrait la forme de votre coffre-fort. Il ne pourrait pas le lire, et aucune clé de notre côté nây changerait quoi que ce soit â les clés sont sur vos appareils."}
238,{q:"Pourquoi mes codes à deux facteurs ne sont-ils pas dans le coffre-fort ?",a:"Parce quâun mot de passe et son second facteur dans un même magasin ne font pas deux facteurs : ce qui ouvre ce magasin ouvre les deux. Le coffre-fort nâa aucun champ pour un secret TOTP, et lâoutil dâimport extrait volontairement ceux quâil trouve pour vous les rendre sous forme de QR codes otpauth:// au lieu de les envoyer. LâAuthenticator est un produit distinct pour la même raison."},{q:"Lâapplication mobile est-elle aussi sûre que le site web ?",a:"Elle est différente, plutôt que simplement meilleure ou moins bonne. Le téléphone conserve la clé de votre coffre-fort au repos dans le porte-clés du système, libérée après une biométrie ou le code de lâappareil : le plancher y est donc lâauthentification de lâappareil et non votre mot de passe maître. En échange, un build de magasin est un artefact signé et figé, et non du code relivré à chaque visite. Les deux faits sont détaillés sur cette page."},{q:"Si jâoublie mon mot de passe maître, pouvez-vous le réinitialiser ?",a:"Seulement si vous avez créé une clé de récupération au préalable, que nous ne voyons jamais â elle déballe une seconde copie stockée de votre clé privée. Sans elle, nous ne pouvons pas récupérer votre coffre-fort. Un fournisseur qui en serait capable serait un fournisseur capable de le lire."},{q:"Le chiffrement est-il plus faible sur le plan gratuit ?",a:"Non. La dérivation des clés, le chiffrement des éléments et le modèle « zéro connaissance » sont identiques sur tous les plans. Ce que les plans payants ajoutent est dâordre organisationnel : plus de capacité, la surveillance des fuites, un journal dâaudit plus long, lâauthentification unique et lâaccès API."}]},cta:{heading:"Lisez, puis essayez",body:"Un espace gratuit ne demande aucune carte et utilise exactement lâarchitecture décrite ci-dessus. Si quelque chose sur cette page ne correspond pas à ce que vous observez, dites-le nous â câest un défaut de la page ou du produit, et les deux comptent.",primaryLabel:"Créer un compte",secondaryLabel:"Poser une question de sécurité"},related:{heading:"à lire ensuite",links:[{label:"Tarifs",path:"/pricing"},{label:"Coffre-fort de mots de passe",path:"/password-vault"},{label:"Application mobile",path:"/mobile-app"},{label:"U2 Secured vs Bitwarden",path:"/vs/bitwarden"},{label:"U2 Secured vs Proton Pass",path:"/vs/proton-pass"}]}},xc={en:Yn,fr:yc};Yn.path;function bc(){return t.jsx(hc,{content:xc[ze()]})}function vc({page:e}){const a=ze(),s=b.useRef(null);nt(s);
238const r=Qt(e.path,a);return t.jsxs("div",{ref:s,children:[t.jsx(Ee,{title:e.seoTitle,description:e.seoDescription,path:e.path,jsonLd:[zn({headline:e.title,description:e.seoDescription,url:r,reviewedOn:e.reviewedOn,locale:a}),At(e.faq.items),ft(e.breadcrumb,a)]}),t.jsxs("header",{className:"relative isolate",children:[t.jsx("div",{className:"u2-grid absolute inset-0 -z-10 opacity-50 [mask-image:radial-gradient(ellipse_at_top,black,transparent_70%)]"}),t.jsx("div",{"aria-hidden":"true",className:"absolute -z-10 left-1/2 top-[-12rem] h-[36rem] w-[60rem] -translate-x-1/2 rounded-full blur-[120px] bg-indigo-600/20"}),t.jsx("div",{"aria-hidden":"true",className:"absolute -z-10 right-[-8rem] top-[6rem] h-[26rem] w-[26rem] rounded-full blur-[110px] bg-cyan-500/15"}),t.jsxs("div",{className:"mx-auto max-w-3xl px-6 pt-20 pb-10",children:[t.jsx("span",{className:"font-mono text-xs font-medium uppercase tracking-[0.2em] text-cyan-400",children:e.kicker}),t.jsx("h1",{className:"font-brand mt-4 text-4xl font-bold tracking-tight text-slate-50 sm:text-5xl",children:e.title}),e.lead.map(n=>t.jsx("p",{className:"mt-5 text-lg leading-relaxed text-slate-400",children:n},n)),t.jsxs("p",{className:"mt-6 font-mono text-xs text-slate-500",children:[e.reviewedLabel," ",t.jsx("time",{dateTime:e.reviewedOn,children:e.reviewedOn})]}),t.jsxs("div",{className:"mt-8 flex flex-wrap gap-3",children:[t.jsxs("a",{href:`${Se}/register`,className:"group inline-flex items-center gap-2 rounded-xl bg-gradient-to-r from-indigo-500 to-cyan-400 px-5 py-3 text-sm font-semibold text-white shadow-lg shadow-indigo-500/25 transition-transform hover:-translate-y-0.5",children:[e.cta.primaryLabel," ",t.jsx(Ae,{size:16,className:"transition-transform group-hover:translate-x-0.5"})]}),t.jsx(oe,{to:W("/pricing",a),className:"inline-flex items-center gap-2 rounded-xl border border-slate-700 bg-slate-900/60 px-5 py-3 text-sm font-semibold text-slate-200 hover:border-slate-500",children:e.cta.secondaryLabel})]})]})]}),t.jsx("section",{className:"border-y border-slate-800/80 bg-slate-900/20",children:t.jsxs("div",{className:"mx-auto max-w-3xl px-6 py-12",children:[t.jsx("h2",{"data-reveal":!0,className:"font-brand text-2xl font-bold text-slate-50",children:e.gives.heading}),e.gives.lead&&t.jsx("p",{"data-reveal":!0,className:"mt-3 text-base leading-relaxed text-slate-400",children:e.gives.lead}),t.jsx("ul",{className:"mt-6 space-y-3",children:e.gives.items.map(n=>t.jsxs("li",{className:"flex items-start gap-3 text-base leading-relaxed text-slate-300",children:[t.jsx(De,{size:17,className:"mt-1 shrink-0 text-cyan-400","aria-hidden":"true"}),n]},n))})]})}),t.jsxs("section",{className:"mx-auto max-w-3xl px-6 py-14",children:[t.jsx("h2",{"data-reveal":!0,className:"font-brand text-2xl font-bold text-slate-50",children:e.notFor.heading}),e.notFor.lead&&t.jsx("p",{"data-reveal":!0,className:"mt-3 text-base leading-relaxed text-slate-400",children:e.notFor.lead}),t.jsx("ul",{className:"mt-6 space-y-4",children:e.notFor.items.map(n=>t.jsx("li",{"data-reveal":!0,className:"rounded-xl border border-slate-800 bg-slate-950 p-5 text-sm leading-relaxed text-slate-300",children:n},n))})]}),t.jsx("section",{className:"border-y border-cyan-500/25 bg-cyan-500/5",children:t.jsxs("div",{className:"mx-auto max-w-3xl px-6 py-16",children:[t.jsxs("div",{className:"flex items-center gap-2.5 text-cyan-300",children:[t.jsx(ld,{size:18,"aria-hidden":"true"}),t.jsx("span",{className:"font-mono text-xs font-medium uppercase tracking-[0.2em]",children:"built for this"})]}),t.jsx("h2",{"data-reveal":!0,className:"font-brand mt-3 text-2xl font-bold text-slate-50",children:e.rightFor.heading}),t.jsx("p",{"data-reveal":!0,className:"mt-3 max-w-2xl text-base leading-relaxed text-slate-300",children:e.rightFor.lead}),t.jsx("ul",{className:"mt-8 space-y-3",children:e.rightFor.items.map(n=>t.jsxs("li",{"data-reveal":!0,className:"flex items-start gap-3 text-base leading-relaxed text-slate-200",children:[t.jsx(De,{size:17,className:"mt-1 shrink-0 text-cyan-400","aria-hidden":"true"}),n]},n))})]})}),t.jsxs("section",{className:"mx-auto max-w-3xl px-6 py-14",children:[t.jsx("h2",{"data-reveal":!0,className:"font-brand text-2xl font-bold text-slate-50",children:e.includes.heading}),e.includes.lead&&t.jsx("p",{"data-reveal":!0,className:"mt-3 text-base leading-relaxed text-slate-400",children:e.includes.lead}),t.jsx("ul",{className:"mt-6 space-y-3",children:e.includes.items.map(n=>t.jsxs("li",{className:"flex items-start gap-3 text-base leading-relaxed text-slate-300",children:[t.jsx(Pa,{size:17,className:"mt-1 shrink-0 text-cyan-400","aria-hidden":"true"}),n]},n))})]}),t.jsx("section",{className:"border-y border-slate-800/80 bg-slate-900/20",children:t.jsx("div",{className:"mx-auto max-w-3xl px-6 py-14",children:t.jsxs("div",{"data-reveal":!0,className:"rounded-2xl border border-cyan-500/25 bg-cyan-500/5 p-7",children:[t.jsxs("div",{className:"flex items-center gap-2.5 text-cyan-300",children:[t.jsx(Gt,{size:18,"aria-hidden":"true"}),t.jsx("span",{className:"font-mono text-xs font-medium uppercase tracking-[0.2em]",children:"two products, not one"})]}),t.jsx("h2",{className:"font-brand mt-3 text-2xl font-bold text-slate-50",children:e.totp.heading}),t.jsx("p",{className:"mt-3 text-base leading-relaxed text-slate-300",children:e.totp.lead}),e.totp.body.map(n=>t.jsx("p",{className:"mt-4 text-base leading-relaxed text-slate-400",children:n},n)),e.totp.caution&&t.jsxs("p",{className:"mt-5 flex items-start gap-2.5 rounded-xl border border-amber-500/30 bg-amber-500/5 p-4 text-sm leading-relaxed text-amber-200/90",children:[t.jsx(We,{size:18,className:"mt-0.5 shrink-0 text-amber-400"}),t.jsx("span",{children:e.totp.caution}
238)]})]})})}),t.jsxs("section",{className:"mx-auto max-w-3xl px-6 py-14",children:[t.jsx("h2",{"data-reveal":!0,className:"font-brand text-2xl font-bold text-slate-50",children:e.upgrade.heading}),e.upgrade.body.map(n=>t.jsx("p",{"data-reveal":!0,className:"mt-4 text-base leading-relaxed text-slate-400",children:n},n)),e.upgrade.items&&t.jsx("ul",{className:"mt-6 space-y-3",children:e.upgrade.items.map(n=>t.jsxs("li",{"data-reveal":!0,className:"flex items-start gap-3 text-sm leading-relaxed text-slate-300",children:[t.jsx(De,{size:16,className:"mt-0.5 shrink-0 text-cyan-400","aria-hidden":"true"}),n]},n))})]}),t.jsx("section",{className:"border-y border-slate-800/80 bg-slate-900/20",children:t.jsxs("div",{className:"mx-auto max-w-3xl px-6 py-14",children:[t.jsx("h2",{"data-reveal":!0,className:"font-brand text-2xl font-bold text-slate-50",children:e.honesty.heading}),e.honesty.lead&&t.jsx("p",{"data-reveal":!0,className:"mt-3 text-base leading-relaxed text-slate-400",children:e.honesty.lead}),t.jsx("ul",{className:"mt-6 space-y-3",children:e.honesty.items.map(n=>t.jsxs("li",{"data-reveal":!0,className:"flex items-start gap-3 rounded-xl border border-amber-500/20 bg-amber-500/5 p-4 text-sm leading-relaxed text-amber-100/90",children:[t.jsx(We,{size:16,className:"mt-0.5 shrink-0 text-amber-400","aria-hidden":"true"}),n]},n))})]})}),t.jsxs("section",{className:"mx-auto max-w-3xl px-6 py-14",children:[t.jsx("h2",{"data-reveal":!0,className:"font-brand text-2xl font-bold text-slate-50",children:e.faq.heading}),t.jsx("dl",{className:"mt-8",children:e.faq.items.map(n=>t.jsxs(b.Fragment,{children:[t.jsx("dt",{"data-reveal":!0,className:"font-brand mt-7 text-base font-semibold text-slate-100 first:mt-0",children:n.q}),t.jsx("dd",{"data-reveal":!0,className:"mt-2 text-base leading-relaxed text-slate-400",children:n.a})]},n.q))})]}),t.jsx("section",{className:"border-y border-slate-800/80 bg-slate-900/20",children:t.jsxs("div",{className:"mx-auto max-w-3xl px-6 py-12",children:[t.jsx("h2",{className:"font-brand text-lg font-bold text-slate-50",children:e.sources.heading}),t.jsx("p",{className:"mt-2 text-sm leading-relaxed text-slate-500",children:e.sources.note}),t.jsx("ul",{className:"mt-4 space-y-2.5",children:e.sources.refs.map(n=>t.jsxs("li",{className:"text-sm leading-relaxed text-slate-400",children:[t.jsxs("a",{href:n.url,target:"_blank",rel:"noreferrer nofollow",className:"inline-flex items-baseline gap-1.5 text-cyan-300 underline-offset-2 hover:underline",children:[n.label,t.jsx(Wt,{size:13,className:"shrink-0 self-center","aria-hidden":"true"})]}),t.jsxs("span",{className:"text-slate-600",children:[" · read ",n.verifiedOn]})]},n.url))})]})}),t.jsxs("section",{className:"mx-auto max-w-3xl px-6 pb-20 pt-14 text-center",children:[t.jsx("h2",{className:"font-brand text-2xl font-bold text-slate-50",children:e.cta.heading}),t.jsx("p",{className:"mx-auto mt-3 max-w-xl text-base leading-relaxed text-slate-400",children:e.cta.body}),t.jsxs("div",{className:"mt-6 flex flex-wrap justify-center gap-3",children:[t.jsxs("a",{href:`${Se}/register`,className:"inline-flex items-center gap-2 rounded-xl bg-gradient-to-r from-indigo-500 to-cyan-400 px-5 py-3 text-sm font-semibold text-white shadow-lg shadow-indigo-500/25",children:[t.jsx(Qe,{size:15})," ",e.cta.primaryLabel]}),t.jsx(oe,{to:W("/pricing",a),className:"inline-flex items-center gap-2 rounded-xl border border-slate-700 bg-slate-900 px-5 py-3 text-sm font-semibold text-slate-100 hover:border-slate-500",children:e.cta.secondaryLabel})]}),t.jsxs("nav",{className:"mt-10 border-t border-slate-800/80 pt-6",children:[t.jsx("span",{className:"text-xs font-semibold uppercase tracking-wider text-slate-500",children:e.related.heading}),t.jsx("div",{className:"mt-3 flex flex-wrap justify-center gap-x-6 gap-y-2 text-sm",children:e.related.links.map(n=>t.jsx(oe,{to:W(n.path,a),className:"text-cyan-300 hover:text-cyan-200",children:n.label},n.path))})]})]})]})}function wc(){return t.jsx(vc,{page:ma})}function Lr({guide:e}){const a=ze(),s=b.useRef(null);return nt(s),t.jsxs("div",{ref:s,children:[t.jsx(Ee,{title:e.seoTitle,de
238scription:e.seoDescription,path:e.path,jsonLd:[At(e.faq.items),ft(e.breadcrumb,a)]}),t.jsxs("header",{className:"relative isolate",children:[t.jsx("div",{className:"u2-grid absolute inset-0 -z-10 opacity-50 [mask-image:radial-gradient(ellipse_at_top,black,transparent_70%)]"}),t.jsx("div",{"aria-hidden":"true",className:"absolute -z-10 left-1/2 top-[-12rem] h-[36rem] w-[60rem] -translate-x-1/2 rounded-full blur-[120px] bg-indigo-600/20"}),t.jsx("div",{"aria-hidden":"true",className:"absolute -z-10 right-[-8rem] top-[6rem] h-[26rem] w-[26rem] rounded-full blur-[110px] bg-cyan-500/15"}),t.jsxs("div",{className:"mx-auto max-w-3xl px-6 pt-20 pb-10",children:[t.jsx("span",{className:"font-mono text-xs font-medium uppercase tracking-[0.2em] text-cyan-400",children:e.kicker}),t.jsx("h1",{className:"font-brand mt-4 text-4xl font-bold tracking-tight text-slate-50 sm:text-5xl",children:e.title}),e.lead.map(r=>t.jsx("p",{className:"mt-5 text-lg leading-relaxed text-slate-400",children:r},r)),t.jsxs("div",{className:"mt-8 flex flex-wrap gap-3",children:[t.jsxs("a",{href:`${Se}/register`,className:"group inline-flex items-center gap-2 rounded-xl bg-gradient-to-r from-indigo-500 to-cyan-400 px-5 py-3 text-sm font-semibold text-white shadow-lg shadow-indigo-500/25 transition-transform hover:-translate-y-0.5",children:[e.cta.primaryLabel," ",t.jsx(Ae,{size:16,className:"transition-transform group-hover:translate-x-0.5"})]}),t.jsx(oe,{to:W("/contact",a),className:"inline-flex items-center gap-2 rounded-xl border border-slate-700 bg-slate-900/60 px-5 py-3 text-sm font-semibold text-slate-200 hover:border-slate-500",children:e.cta.secondaryLabel})]})]})]}),t.jsxs("section",{className:"mx-auto max-w-3xl px-6 py-12",children:[t.jsx("h2",{className:"font-brand text-2xl font-bold text-slate-50",children:e.steps.heading}),t.jsx("ol",{className:"mt-8 space-y-10",children:e.steps.items.map((r,n)=>t.jsxs("li",{"data-reveal":!0,className:"relative pl-12",children:[t.jsx("span",{"aria-hidden":"true",className:"absolute left-0 top-0 flex size-8 items-center justify-center rounded-lg border border-slate-800 bg-slate-900 font-mono text-sm font-semibold text-cyan-300",children:n+1}),t.jsx("h3",{className:"font-brand text-lg font-semibold text-slate-100",children:r.title}),r.body.map(o=>t.jsx("p",{className:"mt-3 text-base leading-relaxed text-slate-400",children:o},o)),r.caution&&t.jsxs("p",{className:"mt-4 flex items-start gap-2.5 rounded-xl border border-amber-500/30 bg-amber-500/5 p-4 text-sm leading-relaxed text-amber-200/90",children:[t.jsx(We,{size:18,className:"mt-0.5 shrink-0 text-amber-400"}),t.jsx("span",{children:r.caution})]})]},r.title))})]}),t.jsx("section",{className:"border-y border-slate-800/80 bg-slate-900/20",children:t.jsxs("div",{className:"mx-auto grid max-w-5xl gap-10 px-6 py-14 md:grid-cols-2",children:[t.jsxs("div",{"data-reveal":!0,children:[t.jsx("h2",{className:"font-brand text-xl font-bold text-slate-50",children:e.comes.heading}),e.comes.lead&&t.jsx("p",{className:"mt-2 text-sm text-slate-500",children:e.comes.lead}),t.jsx("ul",{className:"mt-5 space-y-3",children:e.comes.items.map(r=>t.jsxs("li",{className:"flex items-start gap-3 text-sm leading-relaxed text-slate-300",children:[t.jsx(De,{size:17,className:"mt-0.5 shrink-0 text-cyan-400","aria-hidden":"true"}),r]},r))})]}),t.jsxs("div",{"data-reveal":!0,children:[t.jsx("h2",{className:"font-brand text-xl font-bold text-slate-50",children:e.missing.heading}),e.missing.lead&&t.jsx("p",{className:"mt-2 text-sm text-slate-500",children:e.missing.lead}),t.jsx("ul",{className:"mt-5 space-y-3",children:e.missing.items.map(r=>t.jsxs("li",{className:"flex items-start gap-3 text-sm leading-relaxed text-slate-300",children:[t.jsx(Nr,{size:17,className:"mt-0.5 shrink-0 text-slate-500","aria-hidden":"true"}),r]},r))})]})]})}),t.jsx("section",{className:"mx-auto max-w-3xl px-6 py-14",children:t.jsxs("div",{"data-reveal":!0,className:"rounded-2xl border border-cyan-500/25 bg-cyan-500/5 p-7",children:[t.jsxs("div",{className:"flex items-center gap-2.5 text-cyan-300",children:[t.jsx(Gt,{size:18,"aria-hidden":"true"}),t.jsx("span",{className:"font-mono text-xs font-medium uppercase tracking-[0.2em]",children:"by design"})]}),t.jsx("h2",{className:"font-brand mt-3 text-2xl font-bold text-slate-50",children:e.totp.heading}),t.jsx("p",{className:"mt-3 text-base leading-relaxed text-slate-300",children:e.totp.lead}),e.totp.body.map(r=>
238t.jsx("p",{className:"mt-4 text-base leading-relaxed text-slate-400",children:r},r)),t.jsxs("p",{className:"mt-5 flex items-start gap-2.5 rounded-xl border border-amber-500/30 bg-amber-500/5 p-4 text-sm leading-relaxed text-amber-200/90",children:[t.jsx(We,{size:18,className:"mt-0.5 shrink-0 text-amber-400"}),t.jsx("span",{children:e.totp.caution})]})]})}),t.jsx("section",{className:"border-y border-slate-800/80 bg-slate-900/20",children:t.jsxs("div",{className:"mx-auto max-w-5xl px-6 py-14",children:[t.jsx("h2",{"data-reveal":!0,className:"font-brand text-2xl font-bold text-slate-50",children:e.pricing.heading}),t.jsx("p",{"data-reveal":!0,className:"mt-3 max-w-2xl text-base leading-relaxed text-slate-400",children:e.pricing.lead}),t.jsx("div",{className:"mt-8 grid gap-4 md:grid-cols-3",children:e.pricing.plans.map(r=>t.jsx(kc,{plan:r},r.name))}),t.jsx("ul",{className:"mt-8 space-y-2.5",children:e.pricing.notes.map(r=>t.jsx("li",{className:"text-sm leading-relaxed text-slate-500",children:r},r))})]})}),t.jsxs("section",{className:"mx-auto max-w-3xl px-6 py-14",children:[t.jsx("h2",{"data-reveal":!0,className:"font-brand text-2xl font-bold text-slate-50",children:e.caveats.heading}),e.caveats.lead&&t.jsx("p",{"data-reveal":!0,className:"mt-3 text-base leading-relaxed text-slate-400",children:e.caveats.lead}),t.jsx("ul",{className:"mt-6 space-y-4",children:e.caveats.items.map(r=>t.jsx("li",{"data-reveal":!0,className:"rounded-xl border border-slate-800 bg-slate-950 p-5 text-sm leading-relaxed text-slate-300",children:r},r))})]}),t.jsx("section",{className:"border-y border-slate-800/80 bg-slate-900/20",children:t.jsxs("div",{className:"mx-auto max-w-3xl px-6 py-14",children:[t.jsx("h2",{"data-reveal":!0,className:"font-brand text-2xl font-bold text-slate-50",children:e.faq.heading}),t.jsx("dl",{className:"mt-8",children:e.faq.items.map(r=>t.jsxs(b.Fragment,{children:[t.jsx("dt",{"data-reveal":!0,className:"font-brand mt-7 text-base font-semibold text-slate-100 first:mt-0",children:r.q}),t.jsx("dd",{"data-reveal":!0,className:"mt-2 text-base leading-relaxed text-slate-400",children:r.a})]},r.q))})]})}),t.jsxs("section",{className:"mx-auto max-w-3xl px-6 py-12",children:[t.jsx("h2",{className:"font-brand text-lg font-bold text-slate-50",children:e.sources.heading}),t.jsx("p",{className:"mt-2 text-sm leading-relaxed text-slate-500",children:e.sources.note}),t.jsx("ul",{className:"mt-4 space-y-2.5",children:e.sources.refs.map(r=>t.jsxs("li",{className:"text-sm leading-relaxed text-slate-400",children:[t.jsxs("a",{href:r.url,target:"_blank",rel:"noreferrer nofollow",className:"inline-flex items-baseline gap-1.5 text-cyan-300 underline-offset-2 hover:underline",children:[r.label,t.jsx(Wt,{size:13,className:"shrink-0 self-center","aria-hidden":"true"})]}),t.jsxs("span",{className:"text-slate-600",children:[" · read ",r.verifiedOn]})]},r.url))})]}),t.jsxs("section",{className:"mx-auto max-w-3xl px-6 pb-20 text-center",children:[t.jsx("h2",{className:"font-brand text-2xl font-bold text-slate-50",children:e.cta.heading}),t.jsx("p",{className:"mx-auto mt-3 max-w-xl text-base leading-relaxed text-slate-400",children:e.cta.body}),t.jsxs("div",{className:"mt-6 flex flex-wrap justify-center gap-3",children:[t.jsxs("a",{href:`${Se}/register`,className:"inline-flex items-center gap-2 rounded-xl bg-gradient-to-r from-indigo-500 to-cyan-400 px-5 py-3 text-sm font-semibold text-white shadow-lg shadow-indigo-500/25",children:[t.jsx(Qe,{size:15})," ",e.cta.primaryLabel]}),t.jsx(oe,{to:W("/contact",a),className:"inline-flex items-center gap-2 rounded-xl border border-slate-700 bg-slate-900 px-5 py-3 text-sm font-semibold text-slate-100 hover:border-slate-500",children:e.cta.secondaryLabel})]}),t.jsxs("nav",{className:"mt-10 border-t border-slate-800/80 pt-6",children:[t.jsx("span",{className:"text-xs font-semibold uppercase tracking-wider text-slate-500",children:e.related.heading}),t.jsx("div",{className:"mt-3 flex flex-wrap justify-center gap-x-6 gap-y-2 text-sm",children:e.related.links.map(r=>t.jsx(oe,{to:W(r.path,a),className:"text-cyan-300 hover:text-cyan-200",children:r.label},r.path))})]})]})]})}function kc({plan:e}){return t.jsxs("div",{"data-reveal":!0,className:`rounded-2xl border p-6 ${e.recommended?"border-cyan-500/40 bg-slate-950":"border-slate-800 bg-slate-950"}`,children:[t.jsxs("div",{className:"flex items-baseline justify-between gap-3",children:[t.jsx("h3",{className:"font-brand text-base font-semibold text-slate-100",children:e.name}),t.jsx("span",{className:"font-brand text-2xl font-bold text-slate-50",children:e.price})]}),t.jsx("p",{className:"mt-1 text-xs leading-relaxed text-slate-500",children:e.priceNote}),t.jsx("p",{className:"mt-4 font-mono text-sm text-cyan-300",children:e.items}),t.jsx("ul",{className:"mt-4 space-y-2",children:e.bullets.map(a=>t.jsx("li",{className:"text-sm leading-relaxed text-slate-400",children:a},a))}),e.recommended&&e.recommendedNote&&t.jsx("p",{className:"mt-5 border-t border-slate-800 pt-4 text-sm font-medium text-cyan-300",children:e.recommendedNote})]})}function jc(){return t.jsx(Lr,{guide:Cn})}function Sc(){return t.jsx(Lr,{guide:qn})}function Nc(){return t.jsx(Lr,{guide:En})}function Aa({page:e}){const a=ze(),s=b.useRef(null);return nt(s),t.jsxs("div",{ref:s,children:[t.jsx(Ee,{title:e.seoTitle,de
238scription:e.seoDescription,path:e.path,jsonLd:[At(e.faq.items),ft(e.breadcrumb,a)]}),t.jsxs("header",{className:"relative isolate",children:[t.jsx("div",{className:"u2-grid absolute inset-0 -z-10 opacity-50 [mask-image:radial-gradient(ellipse_at_top,black,transparent_70%)]"}),t.jsx("div",{"aria-hidden":"true",className:"absolute -z-10 left-1/2 top-[-12rem] h-[36rem] w-[60rem] -translate-x-1/2 rounded-full blur-[120px] bg-indigo-600/20"}),t.jsx("div",{"aria-hidden":"true",className:"absolute -z-10 right-[-8rem] top-[6rem] h-[26rem] w-[26rem] rounded-full blur-[110px] bg-cyan-500/15"}),t.jsxs("div",{className:"mx-auto max-w-3xl px-6 pt-20 pb-10",children:[t.jsx("span",{className:"font-mono text-xs font-medium uppercase tracking-[0.2em] text-cyan-400",children:e.kicker}),t.jsx("h1",{className:"font-brand mt-4 text-4xl font-bold tracking-tight text-slate-50 sm:text-5xl",children:e.title}),e.lead.map(r=>t.jsx("p",{className:"mt-5 text-lg leading-relaxed text-slate-400",children:r},r)),t.jsxs("div",{className:"mt-8 flex flex-wrap gap-3",children:[t.jsxs("a",{href:`${Se}/register`,className:"group inline-flex items-center gap-2 rounded-xl bg-gradient-to-r from-indigo-500 to-cyan-400 px-5 py-3 text-sm font-semibold text-white shadow-lg shadow-indigo-500/25 transition-transform hover:-translate-y-0.5",children:[e.cta.primaryLabel," ",t.jsx(Ae,{size:16,className:"transition-transform group-hover:translate-x-0.5"})]}),t.jsx(oe,{to:W("/contact",a),className:"inline-flex items-center gap-2 rounded-xl border border-slate-700 bg-slate-900/60 px-5 py-3 text-sm font-semibold text-slate-200 hover:border-slate-500",children:e.cta.secondaryLabel})]})]})]}),t.jsx("section",{className:"border-y border-slate-800/80 bg-slate-900/20",children:t.jsxs("div",{className:"mx-auto max-w-3xl px-6 py-12",children:[t.jsx("h2",{"data-reveal":!0,className:"font-brand text-2xl font-bold text-slate-50",children:e.suits.heading}),e.suits.lead&&t.jsx("p",{"data-reveal":!0,className:"mt-3 text-base leading-relaxed text-slate-400",children:e.suits.lead}),t.jsx("ul",{className:"mt-6 space-y-3",children:e.suits.items.map(r=>t.jsxs("li",{className:"flex items-start gap-3 text-base leading-relaxed text-slate-300",children:[t.jsx(Pa,{size:17,className:"mt-1 shrink-0 text-cyan-400","aria-hidden":"true"}),r]},r))})]})}),t.jsxs("section",{className:"mx-auto max-w-5xl px-6 py-14",children:[t.jsx("h2",{"data-reveal":!0,className:"font-brand text-2xl font-bold text-slate-50",children:e.table.heading}),t.jsx("p",{"data-reveal":!0,className:"mt-3 max-w-2xl text-base leading-relaxed text-slate-400",children:e.table.lead}),t.jsx("div",{"data-reveal":!0,className:"mt-8 overflow-x-auto rounded-xl border border-slate-800",children:t.jsxs("table",{className:"w-full min-w-[640px] border-collapse text-left text-sm",children:[t.jsx("thead",{children:t.jsxs("tr",{className:"border-b border-slate-800 bg-slate-900/60 text-xs font-semibold uppercase tracking-wider text-slate-400",children:[t.jsx("th",{scope:"col",className:"px-5 py-3",children:"Feature"}),t.jsx("th",{scope:"col",className:"px-5 py-3",children:"U2 Secured"}),t.jsx("th",{scope:"col",className:"px-5 py-3",children:e.competitor})]})}),t.jsx("tbody",{children:e.table.rows.map(r=>t.jsxs("tr",{className:"border-b border-slate-800/70 last:border-0 odd:bg-slate-950 even:bg-slate-900/20",children:[t.jsx("th",{scope:"row",className:"px-5 py-4 align-top font-medium text-slate-200",children:r.feature}),t.jsx("td",{className:"px-5 py-4 align-top text-slate-300",children:r.ours}),t.jsxs("td",{className:"px-5 py-4 align-top text-slate-300",children:[r.theirs,t.jsx("a",{href:r.source,target:"_blank",rel:"noreferrer nofollow",title:`${r.sourceLabel} · read ${r.verifiedOn}`,"aria-label":`Source: ${r.sourceLabel}, read ${r.verifiedOn}`,className:"ml-1.5 inline-flex align-middle text-cyan-400/70 hover:text-cyan-300",children:t.jsx(Wt,{size:12,"aria-hidden":"true"})}),r.note&&t.jsx("p",{className:"mt-1.5 text-xs leading-relaxed text-slate-500",children:r.note})]})]},r.feature))})]})})]}),t.jsx("section",{className:"border-y border-slate-800/80 bg-slate-900/20",children:t.jsx("div",{className:"mx-auto max-w-3xl px-6 py-14",children:t.jsxs("div",{"data-reveal":!0,className:"rounded-2xl border border-cyan-500/25 bg-cyan-500/5 p-7",children:[t.jsxs("div",{className:"flex items-center gap-2.5 text-cyan-300",children:[t.jsx(Gt,{size:18,"aria-hidden":"true"}),t.jsx("span",{className:"font-mono text-xs font-medium uppercase tracking-[0.2em]",children:"two products, not one"})]}),t.jsx("h2",{className:"font-brand mt-3 text-2xl font-bold text-slate-50",children:e.totp.heading}),t.jsx("p",{className:"mt-3 text-base leading-relaxed text-slate-300",children:e.totp.lead}),e.totp.body.map(r=>
238t.jsx("p",{className:"mt-4 text-base leading-relaxed text-slate-400",children:r},r)),e.totp.caution&&t.jsxs("p",{className:"mt-5 flex items-start gap-2.5 rounded-xl border border-amber-500/30 bg-amber-500/5 p-4 text-sm leading-relaxed text-amber-200/90",children:[t.jsx(We,{size:18,className:"mt-0.5 shrink-0 text-amber-400"}),t.jsx("span",{children:e.totp.caution})]})]})})}),t.jsxs("section",{className:"mx-auto max-w-3xl px-6 py-14",children:[t.jsxs("div",{className:"flex items-center gap-2.5 text-slate-400",children:[t.jsx(sd,{size:18,"aria-hidden":"true"}),t.jsx("span",{className:"font-mono text-xs font-medium uppercase tracking-[0.2em]",children:"said plainly"})]}),t.jsx("h2",{"data-reveal":!0,className:"font-brand mt-3 text-2xl font-bold text-slate-50",children:e.whereTheyWin.heading}),e.whereTheyWin.lead&&t.jsx("p",{"data-reveal":!0,className:"mt-3 text-base leading-relaxed text-slate-400",children:e.whereTheyWin.lead}),t.jsx("ul",{className:"mt-6 space-y-4",children:e.whereTheyWin.items.map(r=>t.jsx("li",{"data-reveal":!0,className:"rounded-xl border border-slate-800 bg-slate-950 p-5 text-sm leading-relaxed text-slate-300",children:r},r))})]}),t.jsx("section",{className:"border-y border-slate-800/80 bg-slate-900/20",children:t.jsxs("div",{className:"mx-auto grid max-w-5xl gap-8 px-6 py-14 md:grid-cols-2",children:[t.jsxs("div",{"data-reveal":!0,className:"rounded-2xl border border-slate-800 bg-slate-950 p-6",children:[t.jsx("h3",{className:"font-brand text-lg font-bold text-slate-50",children:e.whoShouldPick.ours.heading}),e.whoShouldPick.ours.lead&&t.jsx("p",{className:"mt-2 text-sm text-slate-500",children:e.whoShouldPick.ours.lead}),t.jsx("ul",{className:"mt-5 space-y-3",children:e.whoShouldPick.ours.items.map(r=>t.jsxs("li",{className:"flex items-start gap-3 text-sm leading-relaxed text-slate-300",children:[t.jsx(De,{size:17,className:"mt-0.5 shrink-0 text-cyan-400","aria-hidden":"true"}),r]},r))})]}),t.jsxs("div",{"data-reveal":!0,className:"rounded-2xl border border-slate-800 bg-slate-950 p-6",children:[t.jsx("h3",{className:"font-brand text-lg font-bold text-slate-50",children:e.whoShouldPick.theirs.heading}),e.whoShouldPick.theirs.lead&&t.jsx("p",{className:"mt-2 text-sm text-slate-500",children:e.whoShouldPick.theirs.lead}),t.jsx("ul",{className:"mt-5 space-y-3",children:e.whoShouldPick.theirs.items.map(r=>t.jsxs("li",{className:"flex items-start gap-3 text-sm leading-relaxed text-slate-300",children:[t.jsx(De,{size:17,className:"mt-0.5 shrink-0 text-slate-500","aria-hidden":"true"}),r]},r))})]})]})}),t.jsxs("section",{className:"mx-auto max-w-3xl px-6 py-14",children:[t.jsx("h2",{"data-reveal":!0,className:"font-brand text-2xl font-bold text-slate-50",children:e.honesty.heading}),e.honesty.lead&&t.jsx("p",{"data-reveal":!0,className:"mt-3 text-base leading-relaxed text-slate-400",children:e.honesty.lead}),t.jsx("ul",{className:"mt-6 space-y-3",children:e.honesty.items.map(r=>t.jsxs("li",{"data-reveal":!0,className:"flex items-start gap-3 rounded-xl border border-amber-500/20 bg-amber-500/5 p-4 text-sm leading-relaxed text-amber-100/90",children:[t.jsx(We,{size:16,className:"mt-0.5 shrink-0 text-amber-400","aria-hidden":"true"}),r]},r))})]}),t.jsx("section",{className:"border-y border-slate-800/80 bg-slate-900/20",children:t.jsxs("div",{className:"mx-auto max-w-3xl px-6 py-14",children:[t.jsx("h2",{"data-reveal":!0,className:"font-brand text-2xl font-bold text-slate-50",children:e.faq.heading}),t.jsx("dl",{className:"mt-8",children:e.faq.items.map(r=>t.jsxs(b.Fragment,{children:[t.jsx("dt",{"data-reveal":!0,className:"font-brand mt-7 text-base font-semibold text-slate-100 first:mt-0",children:r.q}),t.jsx("dd",{"data-reveal":!0,className:"mt-2 text-base leading-relaxed text-slate-400",children:r.a})]},r.q))})]})}),t.jsxs("section",{className:"mx-auto max-w-3xl px-6 py-12",children:[t.jsx("h2",{className:"font-brand text-lg font-bold text-slate-50",children:e.sources.heading}),t.jsx("p",{className:"mt-2 text-sm leading-relaxed text-slate-500",children:e.sources.note}),t.jsx("ul",{className:"mt-4 space-y-2.5",children:e.sources.refs.map(r=>
238t.jsxs("li",{className:"text-sm leading-relaxed text-slate-400",children:[t.jsxs("a",{href:r.url,target:"_blank",rel:"noreferrer nofollow",className:"inline-flex items-baseline gap-1.5 text-cyan-300 underline-offset-2 hover:underline",children:[r.label,t.jsx(Wt,{size:13,className:"shrink-0 self-center","aria-hidden":"true"})]}),t.jsxs("span",{className:"text-slate-600",children:[" · read ",r.verifiedOn]})]},r.url))})]}),t.jsxs("section",{className:"mx-auto max-w-3xl px-6 pb-20 text-center",children:[t.jsx("h2",{className:"font-brand text-2xl font-bold text-slate-50",children:e.cta.heading}),t.jsx("p",{className:"mx-auto mt-3 max-w-xl text-base leading-relaxed text-slate-400",children:e.cta.body}),t.jsxs("div",{className:"mt-6 flex flex-wrap justify-center gap-3",children:[t.jsxs("a",{href:`${Se}/register`,className:"inline-flex items-center gap-2 rounded-xl bg-gradient-to-r from-indigo-500 to-cyan-400 px-5 py-3 text-sm font-semibold text-white shadow-lg shadow-indigo-500/25",children:[t.jsx(Qe,{size:15})," ",e.cta.primaryLabel]}),t.jsx(oe,{to:W("/contact",a),className:"inline-flex items-center gap-2 rounded-xl border border-slate-700 bg-slate-900 px-5 py-3 text-sm font-semibold text-slate-100 hover:border-slate-500",children:e.cta.secondaryLabel})]}),t.jsxs("nav",{className:"mt-10 border-t border-slate-800/80 pt-6",children:[t.jsx("span",{className:"text-xs font-semibold uppercase tracking-wider text-slate-500",children:e.related.heading}),t.jsx("div",{className:"mt-3 flex flex-wrap justify-center gap-x-6 gap-y-2 text-sm",children:e.related.links.map(r=>t.jsx(oe,{to:W(r.path,a),className:"text-cyan-300 hover:text-cyan-200",children:r.label},r.path))})]})]})]})}function Tc(){return t.jsx(Aa,{page:On})}function Pc(){return t.jsx(Aa,{page:Rn})}function Ac(){return t.jsx(Aa,{page:Un})}function Lc(){return t.jsx(Aa,{page:In})}function Cc(e){return new Date(`${e}T00:00:00Z`).toLocaleDateString("en-GB",{day:"numeric",month:"long",year:"numeric",timeZone:"UTC"})}function qc(){const e=ze(),a=b.useRef(null);return nt(a),t.jsxs("div",{ref:a,children:[t.jsx(Ee,{title:fe.seoTitle,description:fe.seoDescription,path:fe.path,jsonLd:[Dd({title:fe.title,description:fe.seoDescription,url:je+fe.path,locale:e},Is),ft(fe.breadcrumb,e)]}),t.jsxs("header",{className:"relative isolate",children:[t.jsx("div",{className:"u2-grid absolute inset-0 -z-10 opacity-50 [mask-image:radial-gradient(ellipse_at_top,black,transparent_70%)]"}),t.jsx("div",{"aria-hidden":"true",className:"absolute -z-10 left-1/2 top-[-12rem] h-[36rem] w-[60rem] -translate-x-1/2 rounded-full blur-[120px] bg-indigo-600/20"}),t.jsxs("div",{className:"mx-auto max-w-3xl px-6 pt-20 pb-10",children:[t.jsx("span",{className:"font-mono text-xs font-medium uppercase tracking-[0.2em] text-cyan-400",children:fe.kicker}),t.jsx("h1",{className:"font-brand mt-4 text-4xl font-bold tracking-tight text-slate-50 sm:text-5xl",children:fe.title}),fe.lead.map(s=>t.jsx("p",{className:"mt-5 text-lg leading-relaxed text-slate-400",children:s},s))]})]}),t.jsx("section",{className:"mx-auto max-w-3xl px-6 pb-8",children:t.jsx("ul",{className:"space-y-5",children:Is.map(s=>t.jsx("li",{"data-reveal":!0,children:t.jsxs(oe,{to:W(s.path,e),className:"group block rounded-2xl border border-slate-800 bg-slate-900/30 p-7 transition-colors hover:border-slate-600",children:[t.jsxs("div",{className:"flex flex-wrap items-center gap-x-4 gap-y-1 text-xs text-slate-500",children:[t.jsx("span",{className:"font-mono uppercase tracking-[0.2em] text-cyan-400",children:s.kicker}),t.jsx("time",{dateTime:s.publishedOn,children:Cc(s.publishedOn)}),t.jsxs("span",{className:"inline-flex items-center gap-1.5",children:[t.jsx(bn,{size:12,"aria-hidden":"true"})," ",Ln(s)," ",fe.readingTimeLabel]})]}),t.jsx("h2",{className:"font-brand mt-3 text-xl font-bold text-slate-50 group-hover:text-white sm:text-2xl",children:s.title}),t.jsx("p",{className:"mt-3 text-base leading-relaxed text-slate-400",children:s.summary}),t.jsxs("span",{className:"mt-4 inline-flex items-center gap-1.5 text-sm font-semibold text-cyan-300",children:[fe.readLabel," ",t.jsx(Ae,{size:14,className:"transition-transform group-hover:translate-x-0.5","aria-hidden":"true"})]})]})},s.path))})}),t.jsx("section",{className:"mx-auto max-w-3xl px-6 pb-20 text-center",children:t.jsxs("div",{"data-reveal":!0,className:"rounded-2xl border border-slate-800 bg-slate-900/30 p-8",children:[t.jsx("h2",{className:"font-brand text-2xl font-bold text-slate-50",children:fe.cta.heading}),t.jsx("p",{className:"mx-auto mt-3 max-w-xl text-base leading-relaxed text-slate-400",children:fe.cta.body}),t.jsxs("div",{className:"mt-6 flex flex-wrap justify-center gap-3",children:[t.jsxs("a",{href:`${Se}/register`,className:"inline-flex items-center gap-2 rounded-xl bg-gradient-to-r from-indigo-500 to-cyan-400 px-5 py-3 text-sm font-semibold text-white shadow-lg shadow-indigo-500/25",children:[t.jsx(Qe,{size:15,"aria-hidden":"true"})," ",fe.cta.primaryLabel]}),t.jsx(oe,{to:W("/contact",e),className:"inline-flex items-center gap-2 rounded-xl border border-slate-700 bg-slate-900 px-5 py-3 text-sm font-semibold text-slate-100 hover:border-slate-500",children:fe.cta.secondaryLabel})]})]})})]})}function Ec(){return t.jsx(qc,{})}function Fs(e){return new Date(`${e}T00:00:00Z`).toLocaleDateString("en-GB",{day:"numeric",month:"long",year:"numeric",timeZone:"UTC"})}function Kn({post:e}){const a=ze(),s=b.useRef(null);nt(s);const r=Ln(e),n=e.updatedOn!==e.publishedOn;return t.jsxs("div",{ref:s,children:[t.jsx(Ee,{title:e.seoTitle,de
238scription:e.seoDescription,path:e.path,ogType:"article",publishedOn:e.publishedOn,updatedOn:e.updatedOn,jsonLd:[_d({headline:e.title,description:e.seoDescription,url:je+e.path,publishedOn:e.publishedOn,updatedOn:e.updatedOn,locale:a}),ft(e.breadcrumb,a),...e.faq?[At(e.faq.items)]:[]]}),t.jsxs("header",{className:"relative isolate",children:[t.jsx("div",{className:"u2-grid absolute inset-0 -z-10 opacity-50 [mask-image:radial-gradient(ellipse_at_top,black,transparent_70%)]"}),t.jsx("div",{"aria-hidden":"true",className:"absolute -z-10 left-1/2 top-[-12rem] h-[36rem] w-[60rem] -translate-x-1/2 rounded-full blur-[120px] bg-indigo-600/20"}),t.jsxs("div",{className:"mx-auto max-w-3xl px-6 pt-20 pb-10",children:[t.jsxs(oe,{to:W(fe.path,a),className:"inline-flex items-center gap-1.5 text-sm text-slate-500 transition-colors hover:text-cyan-300",children:[t.jsx(Yl,{size:14,"aria-hidden":"true"})," ",fe.navLabel]}),t.jsx("span",{className:"mt-6 block font-mono text-xs font-medium uppercase tracking-[0.2em] text-cyan-400",children:e.kicker}),t.jsx("h1",{className:"font-brand mt-4 text-4xl font-bold tracking-tight text-slate-50 sm:text-5xl",children:e.title}),t.jsxs("div",{className:"mt-5 flex flex-wrap items-center gap-x-5 gap-y-2 text-sm text-slate-500",children:[t.jsxs("span",{className:"inline-flex items-center gap-1.5",children:[t.jsx(Kl,{size:14,"aria-hidden":"true"}),t.jsx("time",{dateTime:e.publishedOn,children:Fs(e.publishedOn)})]}),n&&t.jsxs("span",{className:"inline-flex items-center gap-1.5",children:["Updated ",t.jsx("time",{dateTime:e.updatedOn,children:Fs(e.updatedOn)})]}),t.jsxs("span",{className:"inline-flex items-center gap-1.5",children:[t.jsx(bn,{size:14,"aria-hidden":"true"})," ",r," ",fe.readingTimeLabel]})]}),e.lead.map(o=>t.jsx("p",{className:"mt-5 text-lg leading-relaxed text-slate-400",children:o},o))]})]}),t.jsx("article",{className:"mx-auto max-w-3xl px-6 pb-4",children:e.sections.map(o=>t.jsxs("section",{"data-reveal":!0,className:"mt-12 first:mt-0",children:[t.jsx("h2",{className:"font-brand text-2xl font-bold text-slate-50",children:o.heading}),o.body.map(i=>t.jsx("p",{className:"mt-4 text-base leading-relaxed text-slate-400",children:i},i)),o.items&&t.jsx("ul",{className:"mt-5 space-y-3",children:o.items.map(i=>t.jsxs("li",{className:"flex items-start gap-3 text-sm leading-relaxed text-slate-300",children:[t.jsx(De,{size:17,className:"mt-0.5 shrink-0 text-cyan-400","aria-hidden":"true"}),i]},i))}),o.caution&&t.jsxs("p",{className:"mt-5 flex items-start gap-2.5 rounded-xl border border-amber-500/30 bg-amber-500/5 p-4 text-sm leading-relaxed text-amber-200/90",children:[t.jsx(We,{size:18,className:"mt-0.5 shrink-0 text-amber-400","aria-hidden":"true"}),t.jsx("span",{children:o.caution})]})]},o.heading))}),e.faq&&t.jsxs("section",{className:"mx-auto max-w-3xl px-6 py-14",children:[t.jsx("h2",{className:"font-brand text-2xl font-bold text-slate-50",children:e.faq.heading}),t.jsx("dl",{className:"mt-8 space-y-7",children:e.faq.items.map(o=>t.jsxs("div",{"data-reveal":!0,children:[t.jsx("dt",{className:"font-brand text-base font-semibold text-slate-100",children:o.q}),t.jsx("dd",{className:"mt-2 text-sm leading-relaxed text-slate-400",children:o.a})]},o.q))})]}),e.sources&&t.jsxs("section",{className:"mx-auto max-w-3xl px-6 pb-8",children:[t.jsx("h2",{className:"font-brand text-lg font-bold text-slate-50",children:e.sources.heading}),t.jsx("p",{className:"mt-2 text-sm leading-relaxed text-slate-500",children:e.sources.note}),t.jsx("ul",{className:"mt-5 space-y-2.5 text-sm",children:e.sources.refs.map(o=>t.jsxs("li",{children:[t.jsxs("a",{href:o.url,target:"_blank",rel:"noreferrer nofollow",className:"inline-flex items-baseline gap-1.5 text-cyan-300 underline-offset-2 hover:underline",children:[o.label,t.jsx(Wt,{size:13,className:"shrink-0 self-center","aria-hidden":"true"})]}),t.jsxs("span",{className:"text-slate-600",children:[" · read ",o.verifiedOn]})]},o.url))})]}),t.jsxs("section",{className:"mx-auto max-w-3xl px-6 pb-20 text-center",children:[t.jsxs("div",{"data-reveal":!0,className:"rounded-2xl border border-slate-800 bg-slate-900/30 p-8",children:[t.jsx("h2",{className:"font-brand text-2xl font-bold text-slate-50",children:e.cta.heading}),t.jsx("p",{className:"mx-auto mt-3 max-w-xl text-base leading-relaxed text-slate-400",children:e.cta.body}),t.jsxs("div",{className:"mt-6 flex flex-wrap justify-center gap-3",children:[t.jsxs("a",{href:`${Se}/register`,className:"inline-flex items-center gap-2 rounded-xl bg-gradient-to-r from-indigo-500 to-cyan-400 px-5 py-3 text-sm font-semibold text-white shadow-lg shadow-indigo-500/25",children:[t.jsx(Qe,{size:15,"aria-hidden":"true"})," ",e.cta.primaryLabel]}),t.jsx(oe,{to:W("/contact",a),className:"inline-flex items-center gap-2 rounded-xl border border-slate-700 bg-slate-900 px-5 py-3 text-sm font-semibold text-slate-100 hover:border-slate-500",children:e.cta.secondaryLabel})]})]}),t.jsxs("nav",{className:"mt-10 border-t border-slate-800/80 pt-6",children:[t.jsx("span",{className:"text-xs font-semibold uppercase tracking-wider text-slate-500",children:e.related.heading}),t.jsx("div",{className:"mt-3 flex flex-wrap justify-center gap-x-6 gap-y-2 text-sm",children:e.related.links.map(o=>t.jsxs(oe,{to:W(o.path,a),className:"inline-flex items-center gap-1 text-cyan-300 hover:text-cyan-200",children:[o.label," ",t.jsx(Ae,{size:13,"aria-hidden":"true"})]},o.path))})]})]})]})}function Oc(){return t.jsx(Kn,{post:Pn})}function Rc(){return t.jsx(Kn,{post:An})}function Uc(){const{m:e}=Me();return t.jsxs(t.Fragment,{children:[t.jsx(Ee,{title:e.contact.seoTitle,de
238scription:e.contact.seoDescription,path:"/contact"}),t.jsxs("section",{className:"mx-auto max-w-3xl px-6 py-20",children:[t.jsxs("div",{className:"text-center",children:[t.jsx("h1",{className:"font-brand text-4xl font-bold text-slate-50",children:e.contact.heading}),t.jsx("p",{className:"mx-auto mt-4 max-w-xl text-slate-400",children:e.contact.intro})]}),t.jsx("div",{className:"mt-10 rounded-2xl border border-slate-800 bg-slate-900/40 p-6 sm:p-8",children:t.jsx(Bn,{})})]})]})}function Ic(){const{m:e,locale:a}=Me(),s=e.privacy,r=a==="fr"?"/fr/contact":"/contact";return t.jsxs(t.Fragment,{children:[t.jsx(Ee,{title:s.seoTitle,description:s.seoDescription,path:"/privacy"}),t.jsxs("header",{className:"mx-auto max-w-3xl px-6 pt-20 pb-8",children:[t.jsx("h1",{className:"font-brand text-4xl font-bold tracking-tight text-slate-50",children:s.title}),t.jsx("p",{className:"mt-3 text-sm text-slate-500",children:s.updated}),t.jsx("p",{className:"mt-6 text-lg leading-relaxed text-slate-400",children:s.lead})]}),t.jsxs("div",{className:"mx-auto max-w-3xl space-y-10 px-6 pb-20",children:[t.jsxs(kt,{heading:s.scope.heading,children:[t.jsx($e,{children:s.scope.body}),t.jsxs($e,{children:[s.scope.elsewhereBefore,t.jsx(da,{href:Se,children:"vault.u2secured.com"}),s.scope.elsewhereMid,t.jsx(da,{href:`${Bt}/privacy`,children:"auth.u2secured.com/privacy"}),s.scope.elsewhereAfter]})]}),t.jsx(kt,{heading:s.collect.heading,children:t.jsx($e,{children:s.collect.body})}),t.jsxs(kt,{heading:s.analytics.heading,children:[t.jsx($e,{children:s.analytics.what}),t.jsx($e,{children:s.analytics.signals}),t.jsx($e,{children:s.analytics.consent}),t.jsxs($e,{children:[s.analytics.optOutBefore,t.jsx(da,{href:"https://tools.google.com/dlpage/gaoptout",children:s.analytics.optOutLink}),s.analytics.optOutMid,t.jsx(da,{href:"https://policies.google.com/privacy",children:s.analytics.googlePolicyLink}),s.analytics.optOutAfter]})]}),t.jsx(kt,{heading:s.sharing.heading,children:t.jsx($e,{children:s.sharing.body})}),t.jsx(kt,{heading:s.rights.heading,children:t.jsx($e,{children:s.rights.body})}),t.jsx(kt,{heading:s.contact.heading,children:t.jsxs($e,{children:[s.contact.body," ",t.jsx("a",{href:r,className:"text-cyan-300 underline-offset-2 hover:underline",children:s.contact.link}),"."]})})]})]})}function kt({heading:e,children:a}){return t.jsxs("section",{children:[t.jsx("h2",{className:"font-brand text-2xl font-bold text-slate-50",children:e}),t.jsx("div",{className:"mt-2",children:a})]})}function $e({children:e}){return t.jsx("p",{className:"mt-4 text-base leading-relaxed text-slate-400",children:e})}function da({href:e,children:a}){const s=e.startsWith("http");return t.jsx("a",{href:e,...s?{target:"_blank",rel:"noreferrer"}:{},className:"text-cyan-300 underline-offset-2 hover:underline",children:a})}function $s(){const{m:e,locale:a}=Me();return t.jsxs(t.Fragment,{children:[t.jsx(Ee,{title:e.notFound.seoTitle,description:e.notFound.seoDescription,path:"/404",noindex:!0}),t.jsxs("section",{className:"mx-auto max-w-xl px-6 py-32 text-center",children:[t.jsx("h1",{className:"font-brand text-5xl font-bold text-slate-50",children:e.notFound.heading}),t.jsx("p",{className:"mt-4 text-slate-400",children:e.notFound.body}),t.jsx(oe,{to:W("/",a),className:"mt-8 inline-block rounded-xl bg-gradient-to-r from-indigo-500 to-cyan-400 px-5 py-3 text-sm font-semibold text-white",children:e.notFound.backHome})]})]})}const Ws={"/":t.jsx(Kd,{}),"/password-vault":t.jsx(Qd,{}),"/browser-extension":t.jsx(Jd,{}),"/mobile-app":t.jsx(Zd,{}),"/authenticator":t.jsx(Xd,{}),"/pricing":t.jsx(uc,{}),"/security":t.jsx(bc,{}),"/free-password-manager":t.jsx(wc,{}),"/switch/from-lastpass":t.jsx(jc,{}),"/switch/from-bitwarden":t.jsx(Sc,{}),"/switch/from-chrome":t.jsx(Nc,{}),"/vs/lastpass":t.jsx(Tc,{}),"/vs/bitwarden":t.jsx(Pc,{}),"/vs/1password":t.jsx(Ac,{}),"/vs/proton-pass":t.jsx(Lc,{}),"/blog":t.jsx(Ec,{}),"/blog/2fa-codes-in-your-password-manager":t.jsx(Oc,{}),"/blog/what-zero-knowledge-means":t.jsx(Rc,{}),"/contact":t.jsx(Uc,{}),"/privacy":t.jsx(Ic,{})};function _c(e){return{path:e==="en"?"/":"/fr",element:t.jsx(bd,{locale:e,children:t.jsx(Md,{})}),children:[...Nd.filter(a=>ut(a,e)).map(a=>a==="/"?{index:!0,element:Ws[a]}:{path:a.slice(1),element:Ws[a]}),{path:"404",element:t.jsx($s,{})},{path:"*",element:t.jsx($s,{})}]}}const Dc=xd.map(_c);Wl({routes:Dc});export{Fo as a,Pt as g,Vs as r};
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.