1const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["./page-BbATUUq_2.js","./app-card-CnlZr4MT.js","./platform-icons-6SsWDNs-.js","./fa6-B97p-Ah5.js","./responsive-image-CZ42fuRb.js","./json-ld-BYil6bK5.js","./browser-tools-Dgyd-uFR.js","./page-D3tzLdRT2.js","./page-rOHKpkQp.js","./page-BWazwq462.js","./search-pages-BU9w9i30.js","./page-GgpmDQvt.js","./page-DN7HECEk.js","./browser-tool-next-step-DOaV11Rf.js","./apple-screenshot-specifications-DOestiuq.js","./page-aMT2ivW6.js","./page-BQaQc-1T.js","./page-D5CMou42.js","./blog-share-BF8ZG6R4.js","./store-buttons-DMMOO62Y.js","./page-DqtENlFm.js","./page-5JNJwDZJ.js","./page-B_jFKV15.js","./studio-release-DS9pmhbJ.js","./page-D1iOvcOf2.js","./studio-screenshot-gallery-DddaEg1Q.js","./page-PtiCR39N.js","./blog-index-K1c3gTF9.js","./page-DWRU8cHK.js","./next-navigation-D-EgNJVb.js","./page-DCAhkQVV.js","./page-B8MQI2G5.js","./page-Dc2C4Gen.js","./page-gD6pY-UC.js","./page-D-0KNlbH.js","./page-DWDhwi5m.js","./page-DGY_ojyu.js","./page-DZ_PwzVU.js","./page-re5DLdnK.js","./page-BsZc9abh.js","./page-C2AUgZQe.js","./page-CdY0NgXd.js","./page-CFdmvn1-.js","./page-CsJU0bxx.js","./page-EhYnvULF.js","./problem-page-B4VKKm67.js","./page-B5H19AH2.js","./product-access-YzRJdml6.js","./page-D7ey4yfX2.js","./product-presentations-B4yrg5on.js","./metadata-B77SJMAY.js","./product-topics-Cgm4PKH6.js","./page-DvGHw14l.js","./product-subpage-header-r-mEkOSh.js","./studio-sales-zdRriHwp.js","./page-zyxVXkCa2.js","./page-DhiwkSSM2.js","./seo-pages-BrLz7n2S.js","./page-Ceyh7fzM.js","./page-BkKatb1b2.js","./page-Dl-TWnG02.js","./page-CF8Ztc5C2.js","./page-DgnOfE-y2.js"])))=>i.map(i=>d[i]); 2var Yf=Object.create,Ah=Object.defineProperty,Vf=Object.getOwnPropertyDescriptor,Xf=Object.getOwnPropertyNames,Kf=Object.getPrototypeOf,Qf=Object.prototype.hasOwnProperty,Et=(l,y)=>()=>(y||(l((y={exports:{}}).exports,y),l=null),y.exports),Zf=(l,y,D,j)=>{if(y&&typeof y=="object"||typeof y=="function")for(var p=Xf(y),G=0,H=p.length,L;G<H;G++)L=p[G],!Qf.call(l,L)&&L!==D&&Ah(l,L,{get:(W=>y[W]).bind(null,L),enumerable:!(j=Vf(y,L))||j.enumerable});return l},Jf=(l,y,D)=>(D=l!=null?Yf(Kf(l)):{},Zf(y||!l||!l.__esModule?Ah(D,"default",{value:l,enumerable:!0}):D,l));(function(){const y=document.createElement("link").relList;if(y&&y.supports&&y.supports("modulepreload"))return;for(const p of document.querySelectorAll('link[rel="modulepreload"]'))j(p);new MutationObserver(p=>{for(const G of p)if(G.type==="childList")for(const H of G.addedNodes)H.tagName==="LINK"&&H.rel==="modulepreload"&&j(H)}).observe(document,{childList:!0,subtree:!0});function D(p){const G={};return p.integrity&&(G.integrity=p.integrity),p.referrerPolicy&&(G.referrerPolicy=p.referrerPolicy),p.crossOrigin==="use-credentials"?G.credentials="include":p.crossOrigin==="anonymous"?G.credentials="omit":G.credentials="same-origin",G}function j(p){if(p.ep)return;p.ep=!0;const G=D(p);fetch(p.href,G)}})();var Wf=Et((l=>{function y(z,x){var C=z.length;z.push(x);e:for(;0<C;){var ae=C-1>>>1,ue=z[ae];if(0<p(ue,x))z[ae]=x,z[C]=ue,C=ae;else break e}}function D(z){return z.length===0?null:z[0]}function j(z){if(z.length===0)return null;var x=z[0],C=z.pop();if(C!==x){z[0]=C;e:for(var ae=0,ue=z.length,$e=ue>>>1;ae<$e;){var u=2*(ae+1)-1,S=z[u],T=u+1,U=z[T];if(0>p(S,C))T<ue&&0>p(U,S)?(z[ae]=U,z[T]=C,ae=T):(z[ae]=S,z[u]=C,ae=u);else if(T<ue&&0>p(U,C))z[ae]=U,z[T]=C,ae=T;else break e}}return x}function p(z,x){var C=z.sortIndex-x.sortIndex;return C!==0?C:z.id-x.id}if(l.unstable_now=void 0,typeof performance=="object"&&typeof performance.now=="function"){var G=performance;l.unstable_now=function(){return G.now()}}else{var H=Date,L=H.now();l.unstable_now=function(){return H.now()-L}}var W=[],R=[],A=1,q=null,M=3,ge=!1,we=!1,Ce=!1,Je=!1,Pt=typeof setTimeout=="function"?setTimeout:null,We=typeof clearTimeout=="function"?clearTimeout:null,Ft=typeof setImmediate<"u"?setImmediate:null;function Oe(z){for(var x=D(R);x!==null;){if(x.callback===null)j(R);else if(x.startTime<=z)j(R),x.sortIndex=x.expirationTime,y(W,x);else break;x=D(R)}}function bt(z){if(Ce=!1,Oe(z),!we)if(D(W)!==null)we=!0,Pe||(Pe=!0,Ie());else{var x=D(R);x!==null&&kt(bt,x.startTime-z)}}var Pe=!1,Fe=-1,$=5,He=-1;
vendor: 4,801 bytes, line 2
2function xt(){return Je?!0:!(l.unstable_now()-He<$)}function Aa(){if(Je=!1,Pe){var z=l.unstable_now();He=z;var x=!0;try{e:{we=!1,Ce&&(Ce=!1,We(Fe),Fe=-1),ge=!0;var C=M;try{t:{for(Oe(z),q=D(W);q!==null&&!(q.expirationTime>z&&xt());){var ae=q.callback;if(typeof ae=="function"){q.callback=null,M=q.priorityLevel;var ue=ae(q.expirationTime<=z);if(z=l.unstable_now(),typeof ue=="function"){q.callback=ue,Oe(z),x=!0;break t}q===D(W)&&j(W),Oe(z)}else j(W);q=D(W)}if(q!==null)x=!0;else{var $e=D(R);$e!==null&&kt(bt,$e.startTime-z),x=!1}}break e}finally{q=null,M=C,ge=!1}x=void 0}}finally{x?Ie():Pe=!1}}}var Ie;if(typeof Ft=="function")Ie=function(){Ft(Aa)};else if(typeof MessageChannel<"u"){var Tt=new MessageChannel,Va=Tt.port2;Tt.port1.onmessage=Aa,Ie=function(){Va.postMessage(null)}}else Ie=function(){Pt(Aa,0)};function kt(z,x){Fe=Pt(function(){z(l.unstable_now())},x)}l.unstable_IdlePriority=5,l.unstable_ImmediatePriority=1,l.unstable_LowPriority=4,l.unstable_NormalPriority=3,l.unstable_Profiling=null,l.unstable_UserBlockingPriority=2,l.unstable_cancelCallback=function(z){z.callback=null},l.unstable_forceFrameRate=function(z){0>z||125<z?console.error("forceFrameRate takes a positive int between 0 and 125, forcing frame rates higher than 125 fps is not supported"):$=0<z?Math.floor(1e3/z):5},l.unstable_getCurrentPriorityLevel=function(){return M},l.unstable_next=function(z){switch(M){case 1:case 2:case 3:var x=3;break;default:x=M}var C=M;M=x;try{return z()}finally{M=C}},l.unstable_requestPaint=function(){Je=!0},l.unstable_runWithPriority=function(z,x){switch(z){case 1:case 2:case 3:case 4:case 5:break;default:z=3}var C=M;M=z;try{return x()}finally{M=C}},l.unstable_scheduleCallback=function(z,x,C){var ae=l.unstable_now();switch(typeof C=="object"&&C!==null?(C=C.delay,C=typeof C=="number"&&0<C?ae+C:ae):C=ae,z){case 1:var ue=-1;break;case 2:ue=250;break;case 5:ue=1073741823;break;case 4:ue=1e4;break;default:ue=5e3}return ue=C+ue,z={id:A++,callback:x,priorityLevel:z,startTime:C,expirationTime:ue,sortIndex:-1},C>ae?(z.sortIndex=C,y(R,z),D(W)===null&&z===D(R)&&(Ce?(We(Fe),Fe=-1):Ce=!0,kt(bt,C-ae))):(z.sortIndex=ue,y(W,z),we||ge||(we=!0,Pe||(Pe=!0,Ie()))),z},l.unstable_shouldYield=xt,l.unstable_wrapCallback=function(z){var x=M;return function(){var C=M;M=x;try{return z.apply(this,arguments)}finally{M=C}}}})),Pf=Et(((l,y)=>{y.exports=Wf()})),Ff=Et((l=>{var y=Symbol.for("react.transitional.element"),D=Symbol.for("react.portal"),j=Symbol.for("react.fragment"),p=Symbol.for("react.strict_mode"),G=Symbol.for("react.profiler"),H=Symbol.for("react.consumer"),L=Symbol.for("react.context"),W=Symbol.for("react.forward_ref"),R=Symbol.for("react.suspense"),A=Symbol.for("react.memo"),q=Symbol.for("react.lazy"),M=Symbol.for("react.activity"),ge=Symbol.iterator;function we(u){return u===null||typeof u!="object"?null:(u=ge&&u[ge]||u["@@iterator"],typeof u=="function"?u:null)}var Ce={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},Je=Object.assign,Pt={};function We(u,S,T){this.props=u,this.context=S,this.refs=Pt,this.updater=T||Ce}We.prototype.isReactComponent={},We.prototype.setState=function(u,S){if(typeof u!="object"&&typeof u!="function"&&u!=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,u,S,"setState")},We.prototype.forceUpdate=function(u){this.updater.enqueueForceUpdate(this,u,"forceUpdate")};function Ft(){}Ft.prototype=We.prototype;function Oe(u,S,T){this.props=u,this.context=S,this.refs=Pt,this.updater=T||Ce}var bt=Oe.prototype=new Ft;bt.constructor=Oe,Je(bt,We.prototype),bt.isPureReactComponent=!0;var Pe=Array.isArray;function Fe(){}var $={H:null,A:null,T:null,S:null},He=Object.prototype.hasOwnProperty;function xt(u,S,T){var U=T.ref;return{$$typeof:y,type:u,key:S,ref:U!==void 0?U:null,props:T}}function Aa(u,S){return xt(u.type,S,u.props)}function Ie(u){return typeof u=="object"&&u!==null&&u.$$typeof===y}function Tt(u){var S={"=":"=0",":":"=2"};return"$"+u.replace(/[=:]/g,function(T){return S[T]})}var Va=/\/+/g;function kt(u,S){return typeof u=="object"&&u!==null&&u.key!=null?Tt(""+u.key):S.toString(36)}function z(u){switch(u.status){case"fulfilled":return u.value;case"rejected":throw u.reason;default:switch(typeof u.status=="string"?u.then(Fe,Fe):(u.status="pending",u.then(function(S){u.status==="pending"&&(u.status="fulfilled",u.value=S)},function(S){u.status==="pending"&&(u.status="rejected",u.reason=S)})),u.status){case"fulfilled":return u.value;case"rejected":throw u.reason}}throw u}function x(u,S,T,U,K){var Q=typeof u;(Q==="undefined"||Q==="boolean")&&(u=null);var ie=!1;if(u===null)ie=!0;else switch(Q){case"bigint":case"string":case"number":ie=!0;break;
vendor: 5,125 bytes, line 2
2case"object":switch(u.$$typeof){case y:case D:ie=!0;break;case q:return ie=u._init,x(ie(u._payload),S,T,U,K)}}if(ie)return K=K(u),ie=U===""?"."+kt(u,0):U,Pe(K)?(T="",ie!=null&&(T=ie.replace(Va,"$&/")+"/"),x(K,S,T,"",function(On){return On})):K!=null&&(Ie(K)&&(K=Aa(K,T+(K.key==null||u&&u.key===K.key?"":(""+K.key).replace(Va,"$&/")+"/")+ie)),S.push(K)),1;ie=0;var Le=U===""?".":U+":";if(Pe(u))for(var be=0;be<u.length;be++)U=u[be],Q=Le+kt(U,be),ie+=x(U,S,T,Q,K);else if(be=we(u),typeof be=="function")for(u=be.call(u),be=0;!(U=u.next()).done;)U=U.value,Q=Le+kt(U,be++),ie+=x(U,S,T,Q,K);else if(Q==="object"){if(typeof u.then=="function")return x(z(u),S,T,U,K);throw S=String(u),Error("Objects are not valid as a React child (found: "+(S==="[object Object]"?"object with keys {"+Object.keys(u).join(", ")+"}":S)+"). If you meant to render a collection of children, use an array instead.")}return ie}function C(u,S,T){if(u==null)return u;var U=[],K=0;return x(u,U,"","",function(Q){return S.call(T,Q,K++)}),U}function ae(u){if(u._status===-1){var S=u._result;S=S(),S.then(function(T){(u._status===0||u._status===-1)&&(u._status=1,u._result=T)},function(T){(u._status===0||u._status===-1)&&(u._status=2,u._result=T)}),u._status===-1&&(u._status=0,u._result=S)}if(u._status===1)return u._result.default;throw u._result}var ue=typeof reportError=="function"?reportError:function(u){if(typeof window=="object"&&typeof window.ErrorEvent=="function"){var S=new window.ErrorEvent("error",{bubbles:!0,cancelable:!0,message:typeof u=="object"&&u!==null&&typeof u.message=="string"?String(u.message):String(u),error:u});if(!window.dispatchEvent(S))return}else if(typeof process=="object"&&typeof process.emit=="function"){process.emit("uncaughtException",u);return}console.error(u)},$e={map:C,forEach:function(u,S,T){C(u,function(){S.apply(this,arguments)},T)},count:function(u){var S=0;return C(u,function(){S++}),S},toArray:function(u){return C(u,function(S){return S})||[]},only:function(u){if(!Ie(u))throw Error("React.Children.only expected to receive a single React element child.");return u}};l.Activity=M,l.Children=$e,l.Component=We,l.Fragment=j,l.Profiler=G,l.PureComponent=Oe,l.StrictMode=p,l.Suspense=R,l.__CLIENT_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE=$,l.__COMPILER_RUNTIME={__proto__:null,c:function(u){return $.H.useMemoCache(u)}},l.cache=function(u){return function(){return u.apply(null,arguments)}},l.cacheSignal=function(){return null},l.cloneElement=function(u,S,T){if(u==null)throw Error("The argument must be a React element, but you passed "+u+".");var U=Je({},u.props),K=u.key;if(S!=null)for(Q in S.key!==void 0&&(K=""+S.key),S)!He.call(S,Q)||Q==="key"||Q==="__self"||Q==="__source"||Q==="ref"&&S.ref===void 0||(U[Q]=S[Q]);var Q=arguments.length-2;if(Q===1)U.children=T;else if(1<Q){for(var ie=Array(Q),Le=0;Le<Q;Le++)ie[Le]=arguments[Le+2];U.children=ie}return xt(u.type,K,U)},l.createContext=function(u){return u={$$typeof:L,_currentValue:u,_currentValue2:u,_threadCount:0,Provider:null,Consumer:null},u.Provider=u,u.Consumer={$$typeof:H,_context:u},u},l.createElement=function(u,S,T){var U,K={},Q=null;if(S!=null)for(U in S.key!==void 0&&(Q=""+S.key),S)He.call(S,U)&&U!=="key"&&U!=="__self"&&U!=="__source"&&(K[U]=S[U]);var ie=arguments.length-2;if(ie===1)K.children=T;else if(1<ie){for(var Le=Array(ie),be=0;be<ie;be++)Le[be]=arguments[be+2];K.children=Le}if(u&&u.defaultProps)for(U in ie=u.defaultProps,ie)K[U]===void 0&&(K[U]=ie[U]);return xt(u,Q,K)},l.createRef=function(){return{current:null}},l.forwardRef=function(u){return{$$typeof:W,render:u}},l.isValidElement=Ie,l.lazy=function(u){return{$$typeof:q,_payload:{_status:-1,_result:u},_init:ae}},l.memo=function(u,S){return{$$typeof:A,type:u,compare:S===void 0?null:S}},l.startTransition=function(u){var S=$.T,T={};$.T=T;try{var U=u(),K=$.S;K!==null&&K(T,U),typeof U=="object"&&U!==null&&typeof U.then=="function"&&U.then(Fe,ue)}catch(Q){ue(Q)}finally{S!==null&&T.types!==null&&(S.types=T.types),$.T=S}},l.unstable_useCacheRefresh=function(){return $.H.useCacheRefresh()},l.use=function(u){return $.H.use(u)},l.useActionState=function(u,S,T){return $.H.useActionState(u,S,T)},l.useCallback=function(u,S){return $.H.useCallback(u,S)},l.useContext=function(u){return $.H.useContext(u)},l.useDebugValue=function(){},l.useDeferredValue=function(u,S){return $.H.useDeferredValue(u,S)},l.useEffect=function(u,S){return $.H.useEffect(u,S)},l.useEffectEvent=function(u){return $.H.useEffectEvent(u)},l.useId=function(){return $.H.useId()},l.useImperativeHandle=function(u,S,T){return $.H.useImperativeHandle(u,S,T)},l.useInsertionEffect=function(u,S){return $.H.useInsertionEffect(u,S)},l.useLayoutEffect=function(u,S){return $.H.useLayoutEffect(u,S)},l.useMemo=function(u,S){return $.H.useMemo(u,S)},l.useOptimistic=function(u,S){return $.H.useOptimistic(u,S)},l.useReducer=function(u,S,T){return $.H.useReducer(u,S,T)},l.useRef=function(u){return $.H.useRef(u)},l.useState=function(u){return $.H.useState(u)},l.useSyncExternalStore=function(u,S,T){return $.H.useSyncExternalStore(u,S,T)},l.useTransition=function(){return $.H.useTransition()}
vendor: 6,344 bytes, line 2
2,l.version="19.2.6"})),ul=Et(((l,y)=>{y.exports=Ff()})),If=Et((l=>{var y=ul();function D(R){var A="https://react.dev/errors/"+R;if(1<arguments.length){A+="?args[]="+encodeURIComponent(arguments[1]);for(var q=2;q<arguments.length;q++)A+="&args[]="+encodeURIComponent(arguments[q])}return"Minified React error #"+R+"; visit "+A+" for the full message or use the non-minified dev environment for full errors and additional helpful warnings."}function j(){}var p={d:{f:j,r:function(){throw Error(D(522))},D:j,C:j,L:j,m:j,X:j,S:j,M:j},p:0,findDOMNode:null},G=Symbol.for("react.portal");function H(R,A,q){var M=3<arguments.length&&arguments[3]!==void 0?arguments[3]:null;return{$$typeof:G,key:M==null?null:""+M,children:R,containerInfo:A,implementation:q}}var L=y.__CLIENT_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE;function W(R,A){if(R==="font")return"";if(typeof A=="string")return A==="use-credentials"?A:""}l.__DOM_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE=p,l.createPortal=function(R,A){var q=2<arguments.length&&arguments[2]!==void 0?arguments[2]:null;if(!A||A.nodeType!==1&&A.nodeType!==9&&A.nodeType!==11)throw Error(D(299));return H(R,A,null,q)},l.flushSync=function(R){var A=L.T,q=p.p;try{if(L.T=null,p.p=2,R)return R()}finally{L.T=A,p.p=q,p.d.f()}},l.preconnect=function(R,A){typeof R=="string"&&(A?(A=A.crossOrigin,A=typeof A=="string"?A==="use-credentials"?A:"":void 0):A=null,p.d.C(R,A))},l.prefetchDNS=function(R){typeof R=="string"&&p.d.D(R)},l.preinit=function(R,A){if(typeof R=="string"&&A&&typeof A.as=="string"){var q=A.as,M=W(q,A.crossOrigin),ge=typeof A.integrity=="string"?A.integrity:void 0,we=typeof A.fetchPriority=="string"?A.fetchPriority:void 0;q==="style"?p.d.S(R,typeof A.precedence=="string"?A.precedence:void 0,{crossOrigin:M,integrity:ge,fetchPriority:we}):q==="script"&&p.d.X(R,{crossOrigin:M,integrity:ge,fetchPriority:we,nonce:typeof A.nonce=="string"?A.nonce:void 0})}},l.preinitModule=function(R,A){if(typeof R=="string")if(typeof A=="object"&&A!==null){if(A.as==null||A.as==="script"){var q=W(A.as,A.crossOrigin);p.d.M(R,{crossOrigin:q,integrity:typeof A.integrity=="string"?A.integrity:void 0,nonce:typeof A.nonce=="string"?A.nonce:void 0})}}else A??p.d.M(R)},l.preload=function(R,A){if(typeof R=="string"&&typeof A=="object"&&A!==null&&typeof A.as=="string"){var q=A.as,M=W(q,A.crossOrigin);p.d.L(R,q,{crossOrigin:M,integrity:typeof A.integrity=="string"?A.integrity:void 0,nonce:typeof A.nonce=="string"?A.nonce:void 0,type:typeof A.type=="string"?A.type:void 0,fetchPriority:typeof A.fetchPriority=="string"?A.fetchPriority:void 0,referrerPolicy:typeof A.referrerPolicy=="string"?A.referrerPolicy:void 0,imageSrcSet:typeof A.imageSrcSet=="string"?A.imageSrcSet:void 0,imageSizes:typeof A.imageSizes=="string"?A.imageSizes:void 0,media:typeof A.media=="string"?A.media:void 0})}},l.preloadModule=function(R,A){if(typeof R=="string")if(A){var q=W(A.as,A.crossOrigin);p.d.m(R,{as:typeof A.as=="string"&&A.as!=="script"?A.as:void 0,crossOrigin:q,integrity:typeof A.integrity=="string"?A.integrity:void 0})}else p.d.m(R)},l.requestFormReset=function(R){p.d.r(R)},l.unstable_batchedUpdates=function(R,A){return R(A)},l.useFormState=function(R,A,q){return L.H.useFormState(R,A,q)},l.useFormStatus=function(){return L.H.useHostTransitionStatus()},l.version="19.2.6"})),$f=Et(((l,y)=>{function D(){if(!(typeof __REACT_DEVTOOLS_GLOBAL_HOOK__>"u"||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!="function"))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(D)}catch(j){console.error(j)}}D(),y.exports=If()})),em=Et((l=>{var y=Pf(),D=ul(),j=$f();function p(e){var t="https://react.dev/errors/"+e;if(1<arguments.length){t+="?args[]="+encodeURIComponent(arguments[1]);for(var a=2;a<arguments.length;a++)t+="&args[]="+encodeURIComponent(arguments[a])}return"Minified React error #"+e+"; visit "+t+" for the full message or use the non-minified dev environment for full errors and additional helpful warnings."}function G(e){return!(!e||e.nodeType!==1&&e.nodeType!==9&&e.nodeType!==11)}function H(e){var t=e,a=e;if(e.alternate)for(;t.return;)t=t.return;else{e=t;do t=e,(t.flags&4098)!==0&&(a=t.return),e=t.return;while(e)}return t.tag===3?a:null}function L(e){if(e.tag===13){var t=e.memoizedState;if(t===null&&(e=e.alternate,e!==null&&(t=e.memoizedState)),t!==null)return t.dehydrated}return null}function W(e){if(e.tag===31){var t=e.memoizedState;if(t===null&&(e=e.alternate,e!==null&&(t=e.memoizedState)),t!==null)return t.dehydrated}return null}function R(e){if(H(e)!==e)throw Error(p(188))}function A(e){var t=e.alternate;if(!t){if(t=H(e),t===null)throw Error(p(188));return t!==e?null:e}for(var a=e,n=t;;){var i=a.return;if(i===null)break;var o=i.alternate;if(o===null){if(n=i.return,n!==null){a=n;continue}break}if(i.child===o.child){for(o=i.child;o;){if(o===a)return R(i),e;if(o===n)return R(i),t;o=o.sibling}throw Error(p(188))}if(a.return!==n.return)a=i,n=o;else{for(var s=!1,r=i.child;r;){if(r===a){s=!0,a=i,n=o;break}if(r===n){s=!0,n=i,a=o;break}r=r.sibling}if(!s){for(r=o.child;r;){if(r===a){s=!0,a=o,n=i;break}if(r===n){s=!0,n=o,a=i;break}r=r.sibling}if(!s)throw Error(p(189))}}if(a.alternate!==n)throw Error(p(190))}if(a.tag!==3)throw Error(p(188));return a.stateNode.current===a?e:t}function q(e){var t=e.tag;if(t===5||t===26||t===27||t===6)return e;for(e=e.child;e!==null;){if(t=q(e),t!==null)return t;e=e.sibling}return null}var M=Object.assign,ge=Symbol.for("react.element"),we=Symbol.for("react.transitional.element"),Ce=Symbol.for("react.portal"),Je=Symbol.for("react.fragment"),Pt=Symbol.for("react.strict_mode"),We=Symbol.for("react.profiler"),Ft=Symbol.for("react.consumer"),Oe=Symbol.for("react.context"),bt=Symbol.for("react.forward_ref"),Pe=Symbol.for("react.suspense"),Fe=Symbol.for("react.suspense_list"),$=Symbol.for("react.memo"),He=Symbol.for("react.lazy"),xt=Symbol.for("react.activity"),Aa=Symbol.for("react.memo_cache_sentinel"),Ie=Symbol.iterator;function Tt(e){return e===null||typeof e!="object"?null:(e=Ie&&e[Ie]||e["@@iterator"],typeof e=="function"?e:null)}var Va=Symbol.for("react.client.reference");function kt(e){if(e==null)return null;if(typeof e=="function")return e.$$typeof===Va?null:e.displayName||e.name||null;if(typeof e=="string")return e;switch(e){case Je:return"Fragment";case We:return"Profiler";case Pt:return"StrictMode";case Pe:return"Suspense";
vendor: 12,789 bytes, lines 2-9
2case Fe:return"SuspenseList";case xt:return"Activity"}if(typeof e=="object")switch(e.$$typeof){case Ce:return"Portal";case Oe:return e.displayName||"Context";case Ft:return(e._context.displayName||"Context")+".Consumer";case bt:var t=e.render;return e=e.displayName,e||(e=t.displayName||t.name||"",e=e!==""?"ForwardRef("+e+")":"ForwardRef"),e;case $:return t=e.displayName||null,t!==null?t:kt(e.type)||"Memo";case He:t=e._payload,e=e._init;try{return kt(e(t))}catch{}}return null}var z=Array.isArray,x=D.__CLIENT_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE,C=j.__DOM_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE,ae={pending:!1,data:null,method:null,action:null},ue=[],$e=-1;function u(e){return{current:e}}function S(e){0>$e||(e.current=ue[$e],ue[$e]=null,$e--)}function T(e,t){$e++,ue[$e]=e.current,e.current=t}var U=u(null),K=u(null),Q=u(null),ie=u(null);function Le(e,t){switch(T(Q,t),T(K,e),T(U,null),t.nodeType){case 9:case 11:e=(e=t.documentElement)&&(e=e.namespaceURI)?Lu(e):0;break;default:if(e=t.tagName,t=t.namespaceURI)t=Lu(t),e=Bu(t,e);else switch(e){case"svg":e=1;break;case"math":e=2;break;default:e=0}}S(U),T(U,e)}function be(){S(U),S(K),S(Q)}function On(e){e.memoizedState!==null&&T(ie,e);var t=U.current,a=Bu(t,e.type);t!==a&&(T(K,e),T(U,a))}function Ai(e){K.current===e&&(S(U),S(K)),ie.current===e&&(S(ie),yi._currentValue=ae)}var Ko,fl;function Da(e){if(Ko===void 0)try{throw Error()}catch(a){var t=a.stack.trim().match(/\n( *(at )?)/);Ko=t&&t[1]||"",fl=-1<a.stack.indexOf(` 3 at`)?" (<anonymous>)":-1<a.stack.indexOf("@")?"@unknown:0:0":""}return` 4`+Ko+e+fl}var Qo=!1;function Zo(e,t){if(!e||Qo)return"";Qo=!0;var a=Error.prepareStackTrace;Error.prepareStackTrace=void 0;try{var n={DetermineComponentFrameRoot:function(){try{if(t){var k=function(){throw Error()};if(Object.defineProperty(k.prototype,"props",{set:function(){throw Error()}}),typeof Reflect=="object"&&Reflect.construct){try{Reflect.construct(k,[])}catch(v){var g=v}Reflect.construct(e,[],k)}else{try{k.call()}catch(v){g=v}e.call(k.prototype)}}else{try{throw Error()}catch(v){g=v}(k=e())&&typeof k.catch=="function"&&k.catch(function(){})}}catch(v){if(v&&g&&typeof v.stack=="string")return[v.stack,g.stack]}return[null,null]}};n.DetermineComponentFrameRoot.displayName="DetermineComponentFrameRoot";var i=Object.getOwnPropertyDescriptor(n.DetermineComponentFrameRoot,"name");i&&i.configurable&&Object.defineProperty(n.DetermineComponentFrameRoot,"name",{value:"DetermineComponentFrameRoot"});var o=n.DetermineComponentFrameRoot(),s=o[0],r=o[1];if(s&&r){var c=s.split(` 5`),m=r.split(` 6`);for(i=n=0;n<c.length&&!c[n].includes("DetermineComponentFrameRoot");)n++;for(;i<m.length&&!m[i].includes("DetermineComponentFrameRoot");)i++;if(n===c.length||i===m.length)for(n=c.length-1,i=m.length-1;1<=n&&0<=i&&c[n]!==m[i];)i--;for(;1<=n&&0<=i;n--,i--)if(c[n]!==m[i]){if(n!==1||i!==1)do if(n--,i--,0>i||c[n]!==m[i]){var w=` 7`+c[n].replace(" at new "," at ");return e.displayName&&w.includes("<anonymous>")&&(w=w.replace("<anonymous>",e.displayName)),w}while(1<=n&&0<=i);break}}}finally{Qo=!1,Error.prepareStackTrace=a}return(a=e?e.displayName||e.name:"")?Da(a):""}function Eh(e,t){switch(e.tag){case 26:case 27:case 5:return Da(e.type);case 16:return Da("Lazy");case 13:return e.child!==t&&t!==null?Da("Suspense Fallback"):Da("Suspense");case 19:return Da("SuspenseList");case 0:case 15:return Zo(e.type,!1);case 11:return Zo(e.type.render,!1);case 1:return Zo(e.type,!0);case 31:return Da("Activity");default:return""}}function ml(e){try{var t="",a=null;do t+=Eh(e,a),a=e,e=e.return;while(e);return t}catch(n){return` 8Error generating stack: `+n.message+` 9`+n.stack}}var Jo=Object.prototype.hasOwnProperty,Wo=y.unstable_scheduleCallback,Po=y.unstable_cancelCallback,_h=y.unstable_shouldYield,Mh=y.unstable_requestPaint,et=y.unstable_now,Rh=y.unstable_getCurrentPriorityLevel,gl=y.unstable_ImmediatePriority,vl=y.unstable_UserBlockingPriority,Di=y.unstable_NormalPriority,Uh=y.unstable_LowPriority,yl=y.unstable_IdlePriority,qh=y.log,Nh=y.unstable_setDisableYieldValue,jn=null,tt=null;function It(e){if(typeof qh=="function"&&Nh(e),tt&&typeof tt.setStrictMode=="function")try{tt.setStrictMode(jn,e)}catch{}}var at=Math.clz32?Math.clz32:Hh,Lh=Math.log,Bh=Math.LN2;function Hh(e){return e>>>=0,e===0?32:31-(Lh(e)/Bh|0)|0}var xi=256,Ti=262144,Ci=4194304;function xa(e){var t=e&42;if(t!==0)return t;switch(e&-e){case 1:return 1;case 2:return 2;case 4:return 4;case 8:return 8;case 16:return 16;case 32:return 32;case 64:return 64;case 128:return 128;case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:return e&261888;case 262144:case 524288:case 1048576:case 2097152:return e&3932160;case 4194304:case 8388608:case 16777216:case 33554432:return e&62914560;case 67108864:return 67108864;case 134217728:return 134217728;case 268435456:return 268435456;case 536870912:return 536870912;case 1073741824:return 0;default:return e}}function zi(e,t,a){var n=e.pendingLanes;if(n===0)return 0;var i=0,o=e.suspendedLanes,s=e.pingedLanes;e=e.warmLanes;var r=n&134217727;return r!==0?(n=r&~o,n!==0?i=xa(n):(s&=r,s!==0?i=xa(s):a||(a=r&~e,a!==0&&(i=xa(a))))):(r=n&~o,r!==0?i=xa(r):s!==0?i=xa(s):a||(a=n&~e,a!==0&&(i=xa(a)))),i===0?0:t!==0&&t!==i&&(t&o)===0&&(o=i&-i,a=t&-t,o>=a||o===32&&(a&4194048)!==0)?t:i}function En(e,t){return(e.pendingLanes&~(e.suspendedLanes&~e.pingedLanes)&t)===0}function Gh(e,t){switch(e){case 1:case 2:case 4:case 8:case 64:return t+250;case 16:case 32:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return t+5e3;case 4194304:case 8388608:case 16777216:case 33554432:return-1;case 67108864:case 134217728:case 268435456:case 536870912:case 1073741824:return-1;default:return-1}}function wl(){var e=Ci;return Ci<<=1,(Ci&62914560)===0&&(Ci=4194304),e}function Fo(e){for(var t=[],a=0;31>a;a++)t.push(e);return t}function _n(e,t){e.pendingLanes|=t,t!==268435456&&(e.suspendedLanes=0,e.pingedLanes=0,e.warmLanes=0)}function Yh(e,t,a,n,i,o){var s=e.pendingLanes;e.pendingLanes=a,e.suspendedLanes=0,e.pingedLanes=0,e.warmLanes=0,e.expiredLanes&=a,e.entangledLanes&=a,e.errorRecoveryDisabledLanes&=a,e.shellSuspendCounter=0;var r=e.entanglements,c=e.expirationTimes,m=e.hiddenUpdates;for(a=s&~a;0<a;){var w=31-at(a),k=1<<w;r[w]=0,c[w]=-1;var g=m[w];if(g!==null)for(m[w]=null,w=0;w<g.length;w++){var v=g[w];v!==null&&(v.lane&=-536870913)}a&=~k}n!==0&&bl(e,n,0),o!==0&&i===0&&e.tag!==0&&(e.suspendedLanes|=o&~(s&~t))}function bl(e,t,a){e.pendingLanes|=t,e.suspendedLanes&=~t;var n=31-at(t);e.entangledLanes|=t,e.entanglements[n]=e.entanglements[n]|1073741824|a&261930}function kl(e,t){var a=e.entangledLanes|=t;for(e=e.entanglements;a;){var n=31-at(a),i=1<<n;i&t|e[n]&t&&(e[n]|=t),a&=~i}}function Sl(e,t){var a=t&-t;return a=(a&42)!==0?1:Io(a),(a&(e.suspendedLanes|t))!==0?0:a}function Io(e){switch(e){case 2:e=1;break;case 8:e=4;break;case 32:e=16;break;case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:case 4194304:case 8388608:case 16777216:case 33554432:e=128;break;case 268435456:e=134217728;break;default:e=0}return e}function $o(e){return e&=-e,2<e?8<e?(e&134217727)!==0?32:268435456:8:2}function Al(){var e=C.p;return e!==0?e:(e=window.event,e===void 0?32:lh(e.type))}function Dl(e,t){var a=C.p;try{return C.p=e,t()}finally{C.p=a}}var $t=Math.random().toString(36).slice(2),Me="__reactFiber$"+$t,Ge="__reactProps$"+$t,Xa="__reactContainer$"+$t,es="__reactEvents$"+$t,Vh="__reactListeners$"+$t,Xh="__reactHandles$"+$t,xl="__reactResources$"+$t,Mn="__reactMarker$"+$t;function ts(e){delete e[Me],delete e[Ge],delete e[es],delete e[Vh],delete e[Xh]}function Ka(e){var t=e[Me];if(t)return t;for(var a=e.parentNode;a;){if(t=a[Xa]||a[Me]){if(a=t.alternate,t.child!==null||a!==null&&a.child!==null)for(e=Qu(e);e!==null;){if(a=e[Me])return a;e=Qu(e)}return t}e=a,a=e.parentNode}return null}function Qa(e){if(e=e[Me]||e[Xa]){var t=e.tag;if(t===5||t===6||t===13||t===31||t===26||t===27||t===3)return e}return null}function Rn(e){var t=e.tag;if(t===5||t===26||t===27||t===6)return e.stateNode;throw Error(p(33))}function Za(e){var t=e[xl];return t||(t=e[xl]={hoistableStyles:new Map,hoistableScripts:new Map}),t}function je(e){e[Mn]=!0}var Tl=new Set,Cl={};function Ta(e,t){Ja(e,t),Ja(e+"Capture",t)}function Ja(e,t){for(Cl[e]=t,e=0;e<t.length;e++)Tl.add(t[e])}var Kh=RegExp("^[:A-Z_a-z\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02FF\\u0370-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD][:A-Z_a-z\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02FF\\u0370-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD\\-.0-9\\u00B7\\u0300-\\u036F\\u203F-\\u2040]*$"),zl={},Ol={};function Qh(e){return Jo.call(Ol,e)?!0:Jo.call(zl,e)?!1:Kh.test(e)?Ol[e]=!0:(zl[e]=!0,!1)}function Oi(e,t,a){if(Qh(t))if(a===null)e.removeAttribute(t);else{switch(typeof a){case"undefined":case"function":case"symbol":e.removeAttribute(t);return;case"boolean":var n=t.toLowerCase().slice(0,5);if(n!=="data-"&&n!=="aria-"){e.removeAttribute(t);return}}e.setAttribute(t,""+a)}}function ji(e,t,a){if(a===null)e.removeAttribute(t);else{switch(typeof a){case"undefined":case"function":case"symbol":case"boolean":e.removeAttribute(t);return}e.setAttribute(t,""+a)}}function _t(e,t,a,n){if(n===null)e.removeAttribute(a);else{switch(typeof n){case"undefined":case"function":case"symbol":case"boolean":e.removeAttribute(a);return}e.setAttributeNS(t,a,""+n)}}function dt(e){switch(typeof e){case"bigint":case"boolean":case"number":case"string":case"undefined":return e;case"object":return e;default:return""}}function jl(e){var t=e.type;return(e=e.nodeName)&&e.toLowerCase()==="input"&&(t==="checkbox"||t==="radio")}function Zh(e,t,a){var n=Object.getOwnPropertyDescriptor(e.constructor.prototype,t);if(!e.hasOwnProperty(t)&&typeof n<"u"&&typeof n.get=="function"&&typeof n.set=="function"){var i=n.get,o=n.set;return Object.defineProperty(e,t,{configurable:!0,get:function(){return i.call(this)},set:function(s){a=""+s,o.call(this,s)}}),Object.defineProperty(e,t,{enumerable:n.enumerable}),{getValue:function(){return a},setValue:function(s){a=""+s},stopTracking:function(){e._valueTracker=null,delete e[t]}}}}function as(e){if(!e._valueTracker){var t=jl(e)?"checked":"value";e._valueTracker=Zh(e,t,""+e[t])}}function El(e){if(!e)return!1;var t=e._valueTracker;if(!t)return!0;var a=t.getValue(),n="";return e&&(n=jl(e)?e.checked?"true":"false":e.value),e=n,e!==a?(t.setValue(e),!0):!1}function Ei(e){if(e=e||(typeof document<"u"?document:void 0),typeof e>"u")return null;try{return e.activeElement||e.body}catch{return e.body}}var Jh=/[\n"\\]/g;function ut(e){return e.replace(Jh,function(t){return"\\"+t.charCodeAt(0).toString(16)+" "})}function ns(e,t,a,n,i,o,s,r){e.name="",s!=null&&typeof s!="function"&&typeof s!="symbol"&&typeof s!="boolean"?e.type=s:e.removeAttribute("type"),t!=null?s==="number"?(t===0&&e.value===""||e.value!=t)&&(e.value=""+dt(t)):e.value!==""+dt(t)&&(e.value=""+dt(t)):s!=="submit"&&s!=="reset"||e.removeAttribute("value"),t!=null?is(e,s,dt(t)):a!=null?is(e,s,dt(a)):n!=null&&e.removeAttribute("value"),i==null&&o!=null&&(e.defaultChecked=!!o),i!=null&&(e.checked=i&&typeof i!="function"&&typeof i!="symbol"),r!=null&&typeof r!="function"&&typeof r!="symbol"&&typeof r!="boolean"?e.name=""+dt(r):e.removeAttribute("name")}function _l(e,t,a,n,i,o,s,r){if(o!=null&&typeof o!="function"&&typeof o!="symbol"&&typeof o!="boolean"&&(e.type=o),t!=null||a!=null){if(!(o!=="submit"&&o!=="reset"||t!=null)){as(e);return}a=a!=null?""+dt(a):"",t=t!=null?""+dt(t):a,r||t===e.value||(e.value=t),e.defaultValue=t}n=n??i,n=typeof n!="function"&&typeof n!="symbol"&&!!n,e.checked=r?e.checked:!!n,e.defaultChecked=!!n,s!=null&&typeof s!="function"&&typeof s!="symbol"&&typeof s!="boolean"&&(e.name=s),as(e)}function is(e,t,a){t==="number"&&Ei(e.ownerDocument)===e||e.defaultValue===""+a||(e.defaultValue=""+a)}function Wa(e,t,a,n){if(e=e.options,t){t={};for(var i=0;i<a.length;i++)t["$"+a[i]]=!0;for(a=0;a<e.length;a++)i=t.hasOwnProperty("$"+e[a].value),e[a].selected!==i&&(e[a].selected=i),i&&n&&(e[a].defaultSelected=!0)}else{for(a=""+dt(a),t=null,i=0;i<e.length;i++){if(e[i].value===a){e[i].selected=!0,n&&(e[i].defaultSelected=!0);return}t!==null||e[i].disabled||(t=e[i])}t!==null&&(t.selected=!0)}}function Ml(e,t,a){if(t!=null&&(t=""+dt(t),t!==e.value&&(e.value=t),a==null)){e.defaultValue!==t&&(e.defaultValue=t);return}e.defaultValue=a!=null?""+dt(a):""}function Rl(e,t,a,n){if(t==null){if(n!=null){if(a!=null)throw Error(p(92));
vendor: 4,330 bytes, line 9
9if(z(n)){if(1<n.length)throw Error(p(93));n=n[0]}a=n}a??="",t=a}a=dt(t),e.defaultValue=a,n=e.textContent,n===a&&n!==""&&n!==null&&(e.value=n),as(e)}function Pa(e,t){if(t){var a=e.firstChild;if(a&&a===e.lastChild&&a.nodeType===3){a.nodeValue=t;return}}e.textContent=t}var Wh=new Set("animationIterationCount aspectRatio borderImageOutset borderImageSlice borderImageWidth boxFlex boxFlexGroup boxOrdinalGroup columnCount columns flex flexGrow flexPositive flexShrink flexNegative flexOrder gridArea gridRow gridRowEnd gridRowSpan gridRowStart gridColumn gridColumnEnd gridColumnSpan gridColumnStart fontWeight lineClamp lineHeight opacity order orphans scale tabSize widows zIndex zoom fillOpacity floodOpacity stopOpacity strokeDasharray strokeDashoffset strokeMiterlimit strokeOpacity strokeWidth MozAnimationIterationCount MozBoxFlex MozBoxFlexGroup MozLineClamp msAnimationIterationCount msFlex msZoom msFlexGrow msFlexNegative msFlexOrder msFlexPositive msFlexShrink msGridColumn msGridColumnSpan msGridRow msGridRowSpan WebkitAnimationIterationCount WebkitBoxFlex WebKitBoxFlexGroup WebkitBoxOrdinalGroup WebkitColumnCount WebkitColumns WebkitFlex WebkitFlexGrow WebkitFlexPositive WebkitFlexShrink WebkitLineClamp".split(" "));function Ul(e,t,a){var n=t.indexOf("--")===0;a==null||typeof a=="boolean"||a===""?n?e.setProperty(t,""):t==="float"?e.cssFloat="":e[t]="":n?e.setProperty(t,a):typeof a!="number"||a===0||Wh.has(t)?t==="float"?e.cssFloat=a:e[t]=(""+a).trim():e[t]=a+"px"}function ql(e,t,a){if(t!=null&&typeof t!="object")throw Error(p(62));if(e=e.style,a!=null){for(var n in a)!a.hasOwnProperty(n)||t!=null&&t.hasOwnProperty(n)||(n.indexOf("--")===0?e.setProperty(n,""):n==="float"?e.cssFloat="":e[n]="");for(var i in t)n=t[i],t.hasOwnProperty(i)&&a[i]!==n&&Ul(e,i,n)}else for(var o in t)t.hasOwnProperty(o)&&Ul(e,o,t[o])}function os(e){if(e.indexOf("-")===-1)return!1;switch(e){case"annotation-xml":case"color-profile":case"font-face":case"font-face-src":case"font-face-uri":case"font-face-format":case"font-face-name":case"missing-glyph":return!1;default:return!0}}var Ph=new Map([["acceptCharset","accept-charset"],["htmlFor","for"],["httpEquiv","http-equiv"],["crossOrigin","crossorigin"],["accentHeight","accent-height"],["alignmentBaseline","alignment-baseline"],["arabicForm","arabic-form"],["baselineShift","baseline-shift"],["capHeight","cap-height"],["clipPath","clip-path"],["clipRule","clip-rule"],["colorInterpolation","color-interpolation"],["colorInterpolationFilters","color-interpolation-filters"],["colorProfile","color-profile"],["colorRendering","color-rendering"],["dominantBaseline","dominant-baseline"],["enableBackground","enable-background"],["fillOpacity","fill-opacity"],["fillRule","fill-rule"],["floodColor","flood-color"],["floodOpacity","flood-opacity"],["fontFamily","font-family"],["fontSize","font-size"],["fontSizeAdjust","font-size-adjust"],["fontStretch","font-stretch"],["fontStyle","font-style"],["fontVariant","font-variant"],["fontWeight","font-weight"],["glyphName","glyph-name"],["glyphOrientationHorizontal","glyph-orientation-horizontal"],["glyphOrientationVertical","glyph-orientation-vertical"],["horizAdvX","horiz-adv-x"],["horizOriginX","horiz-origin-x"],["imageRendering","image-rendering"],["letterSpacing","letter-spacing"],["lightingColor","lighting-color"],["markerEnd","marker-end"],["markerMid","marker-mid"],["markerStart","marker-start"],["overlinePosition","overline-position"],["overlineThickness","overline-thickness"],["paintOrder","paint-order"],["panose-1","panose-1"],["pointerEvents","pointer-events"],["renderingIntent","rendering-intent"],["shapeRendering","shape-rendering"],["stopColor","stop-color"],["stopOpacity","stop-opacity"],["strikethroughPosition","strikethrough-position"],["strikethroughThickness","strikethrough-thickness"],["strokeDasharray","stroke-dasharray"],["strokeDashoffset","stroke-dashoffset"],["strokeLinecap","stroke-linecap"],["strokeLinejoin","stroke-linejoin"],["strokeMiterlimit","stroke-miterlimit"],["strokeOpacity","stroke-opacity"],["strokeWidth","stroke-width"],["textAnchor","text-anchor"],["textDecoration","text-decoration"],["textRendering","text-rendering"],["transformOrigin","transform-origin"],["underlinePosition","underline-position"],["underlineThickness","underline-thickness"],["unicodeBidi","unicode
9-bidi"],["unicodeRange","unicode-range"],["unitsPerEm","units-per-em"],["vAlphabetic","v-alphabetic"],["vHanging","v-hanging"],["vIdeographic","v-ideographic"],["vMathematical","v-mathematical"],["vectorEffect","vector-effect"],["vertAdvY","vert-adv-y"],["vertOriginX","vert-origin-x"],["vertOriginY","vert-origin-y"],["wordSpacing","word-spacing"],["writingMode","writing-mode"],["xmlnsXlink","xmlns:xlink"],["xHeight","x-height"]]),Fh=/^[\u0000-\u001F ]*j[\r\n\t]*a[\r\n\t]*v[\r\n\t]*a[\r\n\t]*s[\r\n\t]*c[\r\n\t]*r[\r\n\t]*i[\r\n\t]*p[\r\n\t]*t[\r\n\t]*:/i;function _i(e){return Fh.test(""+e)?"javascript:throw new Error('React has blocked a javascript: URL as a security precaution.')":e}function Mt(){}var ss=null;function rs(e){return e=e.target||e.srcElement||window,e.correspondingUseElement&&(e=e.correspondingUseElement),e.nodeType===3?e.parentNode:e}var Fa=null,Ia=null;function Nl(e){var t=Qa(e);if(t&&(e=t.stateNode)){var a=e[Ge]||null;e:switch(e=t.stateNode,t.type){case"input":if(ns(e,a.value,a.defaultValue,a.defaultValue,a.checked,a.defaultChecked,a.type,a.name),t=a.name,a.type==="radio"&&t!=null){for(a=e;a.parentNode;)a=a.parentNode;for(a=a.querySelectorAll('input[name="'+ut(""+t)+'"][type="radio"]'),t=0;t<a.length;t++){var n=a[t];if(n!==e&&n.form===e.form){var i=n[Ge]||null;if(!i)throw Error(p(90));ns(n,i.value,i.defaultValue,i.defaultValue,i.checked,i.defaultChecked,i.type,i.name)}}for(t=0;t<a.length;t++)n=a[t],n.form===e.form&&El(n)}break e;case"textarea":Ml(e,a.value,a.defaultValue);break e;case"select":t=a.value,t!=null&&Wa(e,!!a.multiple,t,!1)}}}var ls=!1;function Ll(e,t,a){if(ls)return e(t,a);ls=!0;try{return e(t)}finally{if(ls=!1,(Fa!==null||Ia!==null)&&(bo(),Fa&&(t=Fa,e=Ia,Ia=Fa=null,Nl(t),e)))for(t=0;t<e.length;t++)Nl(e[t])}}function Un(e,t){var a=e.stateNode;if(a===null)return null;var n=a[Ge]||null;if(n===null)return null;a=n[t];e:switch(t){case"onClick":case"onClickCapture":case"onDoubleClick":case"onDoubleClickCapture":case"onMouseDown":case"onMouseDownCapture":case"onMouseMove":case"onMouseMoveCapture":case"onMouseUp":case"onMouseUpCapture":case"onMouseEnter":(n=!n.disabled)||(e=e.type,n=!(e==="button"||e==="input"||e==="select"||e==="textarea")),e=!n;break e;default:e=!1}if(e)return null;if(a&&typeof a!="function")throw Error(p(231,t,typeof a));return a}var Rt=!(typeof window>"u"||typeof window.document>"u"||typeof window.document.createElement>"u"),cs=!1;if(Rt)try{var qn={};Object.defineProperty(qn,"passive",{get:function(){cs=!0}}),window.addEventListener("test",qn,qn),window.removeEventListener("test",qn,qn)}catch{cs=!1}var ea=null,ds=null,Mi=null;function Bl(){if(Mi)return Mi;var e,t=ds,a=t.length,n,i="value"in ea?ea.value:ea.textContent,o=i.length;for(e=0;e<a&&t[e]===i[e];e++);var s=a-e;for(n=1;n<=s&&t[a-n]===i[o-n];n++);return Mi=i.slice(e,1<n?1-n:void 0)}function Ri(e){var t=e.keyCode;return"charCode"in e?(e=e.charCode,e===0&&t===13&&(e=13)):e=t,e===10&&(e=13),32<=e||e===13?e:0}function Ui(){return!0}function Hl(){return!1}function Ye(e){function t(a,n,i,o,s){this._reactName=a,this._targetInst=i,this.type=n,this.nativeEvent=o,this.target=s,this.currentTarget=null;for(var r in e)e.hasOwnProperty(r)&&(a=e[r],this[r]=a?a(o):o[r]);return this.isDefaultPrevented=(o.defaultPrevented!=null?o.defaultPrevented:o.returnValue===!1)?Ui:Hl,this.isPropagationStopped=Hl,this}return M(t.prototype,{preventDefault:function(){this.defaultPrevented=!0;var a=this.nativeEvent;a&&(a.preventDefault?a.preventDefault():typeof a.returnValue!="unknown"&&(a.returnValue=!1),this.isDefaultPrevented=Ui)},stopPropagation:function(){var a=this.nativeEvent;a&&(a.stopPropagation?a.stopPropagation():typeof a.cancelBubble!="unknown"&&(a.cancelBubble=!0),this.isPropagationStopped=Ui)},persist:function(){},isPersistent:Ui}),t}var Ca={eventPhase:0,bubbles:0,cancelable:0,timeStamp:function(e){return e.timeStamp||Date.now()},defaultPrevented:0,isTrusted:0},qi=Ye(Ca),Nn=M({},Ca,{view:0,detail:0}),Ih=Ye(Nn),us,hs,Ln,Ni=M({},Nn,{screenX:0,screenY:0,clientX:0,clientY:0,pageX:0,pageY:0,ctrlKey:0,shiftKey:0,altKey:0,metaKey:0,getModifierState:fs,button:0,buttons:0,relatedTarget:function(e){return e.relatedTarget===void 0?e.fromElement===e.srcElement?e.toElement:e.fromElement:e.relatedTarget},movementX:function(e){return"movementX"in e?e.movementX:(e!==Ln&&(Ln&&e.type==="mousemove"?(us=e.screenX-Ln.screenX,hs=e.screenY-Ln.screenY):hs=us=0,Ln=e),us)},movementY:function(e){return"movementY"in e?e.movementY:hs}}),Gl=Ye(Ni),$h=Ye(M({},Ni,{dataTransfer:0})),ps=Ye(M({},Nn,{relatedTarget:0})),ep=Ye(M({},Ca,{animationName:0,elapsedTime:0,pseudoElement:0})),tp=Ye(M({},Ca,{clipboardData:function(e){return"clipboardData"in e?e.clipboardData:window.clipboardData}})),Yl=Ye(M({},Ca,{data:0})),ap={Esc:"Escape",Spacebar:" ",Left:"ArrowLeft",Up:"ArrowUp",Right:"ArrowRight",Down:"ArrowDown",Del:"Delete",Win:"OS",Menu:"ContextMenu",Apps:"ContextMenu",Scroll:"ScrollLock",MozPrintableKey:"Unidentified"},np={8:"Backspace",9:"Tab",12:"Clear",13:"Enter",16:"Shift",17:"Control",18:"Alt",19:"Pause",20:"CapsLock",27:"Escape",32:" ",33:"PageUp",34:"PageDown",35:"End",36:"Home",37:"ArrowLeft",38:"ArrowUp",39:"ArrowRight",40:"ArrowDown",45:"Insert",46:"Delete",112:"F1",113:"F2",114:"F3",115:"F4",116:"F5",117:"F6",118:"F7",119:"F8",120:"F9",121:"F10",122:"F11",123:"F12",144:"NumLock",145:"ScrollLock",224:"Meta"},ip={Alt:"altKey",Control:"ctrlKey",Meta:"metaKey",Shift:"shiftKey"};function op(e){var t=this.nativeEvent;return t.getModifierState?t.getModifierState(e):(e=ip[e])?!!t[e]:!1}function fs(){return op}var sp=Ye(M({},Nn,{key:function(e){if(e.key){var t=ap[e.key]||e.key;if(t!=="Unidentified")return t}
vendor: 5,139 bytes, line 9
9return e.type==="keypress"?(e=Ri(e),e===13?"Enter":String.fromCharCode(e)):e.type==="keydown"||e.type==="keyup"?np[e.keyCode]||"Unidentified":""},code:0,location:0,ctrlKey:0,shiftKey:0,altKey:0,metaKey:0,repeat:0,locale:0,getModifierState:fs,charCode:function(e){return e.type==="keypress"?Ri(e):0},keyCode:function(e){return e.type==="keydown"||e.type==="keyup"?e.keyCode:0},which:function(e){return e.type==="keypress"?Ri(e):e.type==="keydown"||e.type==="keyup"?e.keyCode:0}})),Vl=Ye(M({},Ni,{pointerId:0,width:0,height:0,pressure:0,tangentialPressure:0,tiltX:0,tiltY:0,twist:0,pointerType:0,isPrimary:0})),rp=Ye(M({},Nn,{touches:0,targetTouches:0,changedTouches:0,altKey:0,metaKey:0,ctrlKey:0,shiftKey:0,getModifierState:fs})),lp=Ye(M({},Ca,{propertyName:0,elapsedTime:0,pseudoElement:0})),cp=Ye(M({},Ni,{deltaX:function(e){return"deltaX"in e?e.deltaX:"wheelDeltaX"in e?-e.wheelDeltaX:0},deltaY:function(e){return"deltaY"in e?e.deltaY:"wheelDeltaY"in e?-e.wheelDeltaY:"wheelDelta"in e?-e.wheelDelta:0},deltaZ:0,deltaMode:0})),dp=Ye(M({},Ca,{newState:0,oldState:0})),up=[9,13,27,32],ms=Rt&&"CompositionEvent"in window,Bn=null;Rt&&"documentMode"in document&&(Bn=document.documentMode);var hp=Rt&&"TextEvent"in window&&!Bn,Xl=Rt&&(!ms||Bn&&8<Bn&&11>=Bn),Kl=" ",Ql=!1;function Zl(e,t){switch(e){case"keyup":return up.indexOf(t.keyCode)!==-1;case"keydown":return t.keyCode!==229;case"keypress":case"mousedown":case"focusout":return!0;default:return!1}}function Jl(e){return e=e.detail,typeof e=="object"&&"data"in e?e.data:null}var $a=!1;function pp(e,t){switch(e){case"compositionend":return Jl(t);case"keypress":return t.which!==32?null:(Ql=!0,Kl);case"textInput":return e=t.data,e===Kl&&Ql?null:e;default:return null}}function fp(e,t){if($a)return e==="compositionend"||!ms&&Zl(e,t)?(e=Bl(),Mi=ds=ea=null,$a=!1,e):null;switch(e){case"paste":return null;case"keypress":if(!(t.ctrlKey||t.altKey||t.metaKey)||t.ctrlKey&&t.altKey){if(t.char&&1<t.char.length)return t.char;if(t.which)return String.fromCharCode(t.which)}return null;case"compositionend":return Xl&&t.locale!=="ko"?null:t.data;default:return null}}var mp={color:!0,date:!0,datetime:!0,"datetime-local":!0,email:!0,month:!0,number:!0,password:!0,range:!0,search:!0,tel:!0,text:!0,time:!0,url:!0,week:!0};function Wl(e){var t=e&&e.nodeName&&e.nodeName.toLowerCase();return t==="input"?!!mp[e.type]:t==="textarea"}function Pl(e,t,a,n){Fa?Ia?Ia.push(n):Ia=[n]:Fa=n,t=Co(t,"onChange"),0<t.length&&(a=new qi("onChange","change",null,a,n),e.push({event:a,listeners:t}))}var Hn=null,Gn=null;function gp(e){_u(e,0)}function Li(e){if(El(Rn(e)))return e}function Fl(e,t){if(e==="change")return t}var Il=!1;if(Rt){var gs;if(Rt){var vs="oninput"in document;if(!vs){var $l=document.createElement("div");$l.setAttribute("oninput","return;"),vs=typeof $l.oninput=="function"}gs=vs}else gs=!1;Il=gs&&(!document.documentMode||9<document.documentMode)}function ec(){Hn&&(Hn.detachEvent("onpropertychange",tc),Gn=Hn=null)}function tc(e){if(e.propertyName==="value"&&Li(Gn)){var t=[];Pl(t,Gn,e,rs(e)),Ll(gp,t)}}function vp(e,t,a){e==="focusin"?(ec(),Hn=t,Gn=a,Hn.attachEvent("onpropertychange",tc)):e==="focusout"&&ec()}function yp(e){if(e==="selectionchange"||e==="keyup"||e==="keydown")return Li(Gn)}function wp(e,t){if(e==="click")return Li(t)}function bp(e,t){if(e==="input"||e==="change")return Li(t)}function kp(e,t){return e===t&&(e!==0||1/e===1/t)||e!==e&&t!==t}var nt=typeof Object.is=="function"?Object.is:kp;function Yn(e,t){if(nt(e,t))return!0;if(typeof e!="object"||e===null||typeof t!="object"||t===null)return!1;var a=Object.keys(e),n=Object.keys(t);if(a.length!==n.length)return!1;for(n=0;n<a.length;n++){var i=a[n];if(!Jo.call(t,i)||!nt(e[i],t[i]))return!1}return!0}function ac(e){for(;e&&e.firstChild;)e=e.firstChild;return e}function nc(e,t){var a=ac(e);e=0;for(var n;a;){if(a.nodeType===3){if(n=e+a.textContent.length,e<=t&&n>=t)return{node:a,offset:t-e};e=n}e:{for(;a;){if(a.nextSibling){a=a.nextSibling;break e}a=a.parentNode}a=void 0}a=ac(a)}}function ic(e,t){return e&&t?e===t?!0:e&&e.nodeType===3?!1:t&&t.nodeType===3?ic(e,t.parentNode):"contains"in e?e.contains(t):e.compareDocumentPosition?!!(e.compareDocumentPosition(t)&16):!1:!1}function oc(e){e=e!=null&&e.ownerDocument!=null&&e.ownerDocument.defaultView!=null?e.ownerDocument.defaultView:window;for(var t=Ei(e.document);t instanceof e.HTMLIFrameElement;){try{var a=typeof t.contentWindow.location.href=="string"}catch{a=!1}if(a)e=t.contentWindow;else break;t=Ei(e.document)}return t}function ys(e){var t=e&&e.nodeName&&e.nodeName.toLowerCase();return t&&(t==="input"&&(e.type==="text"||e.type==="search"||e.type==="tel"||e.type==="url"||e.type==="password")||t==="textarea"||e.contentEditable==="true")}var Sp=Rt&&"documentMode"in document&&11>=document.documentMode,en=null,ws=null,Vn=null,bs=!1;function sc(e,t,a){var n=a.window===a?a.document:a.nodeType===9?a:a.ownerDocument;bs||en==null||en!==Ei(n)||(n=en,"selectionStart"in n&&ys(n)?n={start:n.selectionStart,end:n.selectionEnd}:(n=(n.ownerDocument&&n.ownerDocument.defaultView||window).getSelection(),n={anchorNode:n.anchorNode,anchorOffset:n.anchorOffset,focu
vendor: 13,287 bytes, line 9
9sNode:n.focusNode,focusOffset:n.focusOffset}),Vn&&Yn(Vn,n)||(Vn=n,n=Co(ws,"onSelect"),0<n.length&&(t=new qi("onSelect","select",null,t,a),e.push({event:t,listeners:n}),t.target=en)))}function za(e,t){var a={};return a[e.toLowerCase()]=t.toLowerCase(),a["Webkit"+e]="webkit"+t,a["Moz"+e]="moz"+t,a}var tn={animationend:za("Animation","AnimationEnd"),animationiteration:za("Animation","AnimationIteration"),animationstart:za("Animation","AnimationStart"),transitionrun:za("Transition","TransitionRun"),transitionstart:za("Transition","TransitionStart"),transitioncancel:za("Transition","TransitionCancel"),transitionend:za("Transition","TransitionEnd")},ks={},rc={};Rt&&(rc=document.createElement("div").style,"AnimationEvent"in window||(delete tn.animationend.animation,delete tn.animationiteration.animation,delete tn.animationstart.animation),"TransitionEvent"in window||delete tn.transitionend.transition);function Oa(e){if(ks[e])return ks[e];if(!tn[e])return e;var t=tn[e],a;for(a in t)if(t.hasOwnProperty(a)&&a in rc)return ks[e]=t[a];return e}var lc=Oa("animationend"),cc=Oa("animationiteration"),dc=Oa("animationstart"),Ap=Oa("transitionrun"),Dp=Oa("transitionstart"),xp=Oa("transitioncancel"),uc=Oa("transitionend"),hc=new Map,Ss="abort auxClick beforeToggle cancel canPlay canPlayThrough click close contextMenu copy cut drag dragEnd dragEnter dragExit dragLeave dragOver dragStart drop durationChange emptied encrypted ended error gotPointerCapture input invalid keyDown keyPress keyUp load loadedData loadedMetadata loadStart lostPointerCapture mouseDown mouseMove mouseOut mouseOver mouseUp paste pause play playing pointerCancel pointerDown pointerMove pointerOut pointerOver pointerUp progress rateChange reset resize seeked seeking stalled submit suspend timeUpdate touchCancel touchEnd touchStart volumeChange scroll toggle touchMove waiting wheel".split(" ");Ss.push("scrollEnd");function St(e,t){hc.set(e,t),Ta(t,[e])}var Bi=typeof reportError=="function"?reportError:function(e){if(typeof window=="object"&&typeof window.ErrorEvent=="function"){var t=new window.ErrorEvent("error",{bubbles:!0,cancelable:!0,message:typeof e=="object"&&e!==null&&typeof e.message=="string"?String(e.message):String(e),error:e});if(!window.dispatchEvent(t))return}else if(typeof process=="object"&&typeof process.emit=="function"){process.emit("uncaughtException",e);return}console.error(e)},ht=[],an=0,As=0;function Hi(){for(var e=an,t=As=an=0;t<e;){var a=ht[t];ht[t++]=null;var n=ht[t];ht[t++]=null;var i=ht[t];ht[t++]=null;var o=ht[t];if(ht[t++]=null,n!==null&&i!==null){var s=n.pending;s===null?i.next=i:(i.next=s.next,s.next=i),n.pending=i}o!==0&&pc(a,i,o)}}function Gi(e,t,a,n){ht[an++]=e,ht[an++]=t,ht[an++]=a,ht[an++]=n,As|=n,e.lanes|=n,e=e.alternate,e!==null&&(e.lanes|=n)}function Ds(e,t,a,n){return Gi(e,t,a,n),Yi(e)}function ja(e,t){return Gi(e,null,null,t),Yi(e)}function pc(e,t,a){e.lanes|=a;var n=e.alternate;n!==null&&(n.lanes|=a);for(var i=!1,o=e.return;o!==null;)o.childLanes|=a,n=o.alternate,n!==null&&(n.childLanes|=a),o.tag===22&&(e=o.stateNode,e===null||e._visibility&1||(i=!0)),e=o,o=o.return;return e.tag===3?(o=e.stateNode,i&&t!==null&&(i=31-at(a),e=o.hiddenUpdates,n=e[i],n===null?e[i]=[t]:n.push(t),t.lane=a|536870912),o):null}function Yi(e){if(50<ui)throw ui=0,Mr=null,Error(p(185));for(var t=e.return;t!==null;)e=t,t=e.return;return e.tag===3?e.stateNode:null}var nn={};function Tp(e,t,a,n){this.tag=e,this.key=a,this.sibling=this.child=this.return=this.stateNode=this.type=this.elementType=null,this.index=0,this.refCleanup=this.ref=null,this.pendingProps=t,this.dependencies=this.memoizedState=this.updateQueue=this.memoizedProps=null,this.mode=n,this.subtreeFlags=this.flags=0,this.deletions=null,this.childLanes=this.lanes=0,this.alternate=null}function it(e,t,a,n){return new Tp(e,t,a,n)}function xs(e){return e=e.prototype,!(!e||!e.isReactComponent)}function Ut(e,t){var a=e.alternate;return a===null?(a=it(e.tag,t,e.key,e.mode),a.elementType=e.elementType,a.type=e.type,a.stateNode=e.stateNode,a.alternate=e,e.alternate=a):(a.pendingProps=t,a.type=e.type,a.flags=0,a.subtreeFlags=0,a.deletions=null),a.flags=e.flags&65011712,a.childLanes=e.childLanes,a.lanes=e.lanes,a.child=e.child,a.memoizedProps=e.memoizedProps,a.memoizedState=e.memoizedState,a.updateQueue=e.updateQueue,t=e.dependencies,a.dependencies=t===null?null:{lanes:t.lanes,firstContext:t.firstContext},a.sibling=e.sibling,a.index=e.index,a.ref=e.ref,a.refCleanup=e.refCleanup,a}function fc(e,t){e.flags&=65011714;var a=e.alternate;return a===null?(e.childLanes=0,e.lanes=t,e.child=null,e.subtreeFlags=0,e.memoizedProps=null,e.memoizedState=null,e.updateQueue=null,e.dependencies=null,e.stateNode=null):(e.childLanes=a.childLanes,e.lanes=a.lanes,e.child=a.child,e.subtreeFlags=0,e.deletions=null,e.memoizedProps=a.memoizedProps,e.memoizedState=a.memoizedState,e.updateQueue=a.updateQueue,e.type=a.type,t=a.dependencies,e.dependencies=t===null?null:{lanes:t.lanes,firstContext:t.firstContext}),e}function Vi(e,t,a,n,i,o){var s=0;if(n=e,typeof e=="function")xs(e)&&(s=1);else if(typeof e=="string")s=jf(e,a,U.current)?26:e==="html"||e==="head"||e==="body"?27:5;else e:switch(e){case xt:return e=it(31,a,t,i),e.elementType=xt,e.lanes=o,e;case Je:return Ea(a.children,i,o,t);case Pt:s=8,i|=24;break;case We:return e=it(12,a,t,i|2),e.elementType=We,e.lanes=o,e;case Pe:return e=it(13,a,t,i),e.elementType=Pe,e.lanes=o,e;case Fe:return e=it(19,a,t,i),e.elementType=Fe,e.lanes=o,e;default:if(typeof e=="object"&&e!==null)switch(e.$$typeof){case Oe:s=10;break e;case Ft:s=9;break e;case bt:s=11;break e;case $:s=14;break e;case He:s=16,n=null;break e}s=29,a=Error(p(130,e===null?"null":typeof e,"")),n=null}return t=it(s,a,t,i),t.elementType=e,t.type=n,t.lanes=o,t}function Ea(e,t,a,n){return e=it(7,e,n,t),e.lanes=a,e}function Ts(e,t,a){return e=it(6,e,null,t),e.lanes=a,e}function mc(e){var t=it(18,null,null,0);return t.stateNode=e,t}function Cs(e,t,a){return t=it(4,e.children!==null?e.children:[],e.key,t),t.lanes=a,t.stateNode={containerInfo:e.containerInfo,pendingChildren:null,implementation:e.implementation},t}var gc=new WeakMap;function pt(e,t){if(typeof e=="object"&&e!==null){var a=gc.get(e);return a!==void 0?a:(t={value:e,source:t,stack:ml(t)},gc.set(e,t),t)}return{value:e,source:t,stack:ml(t)}}var on=[],sn=0,Xi=null,Xn=0,ft=[],mt=0,ta=null,Ct=1,zt="";function qt(e,t){on[sn++]=Xn,on[sn++]=Xi,Xi=e,Xn=t}function vc(e,t,a){ft[mt++]=Ct,ft[mt++]=zt,ft[mt++]=ta,ta=e;var n=Ct;e=zt;var i=32-at(n)-1;n&=~(1<<i),a+=1;var o=32-at(t)+i;if(30<o){var s=i-i%5;o=(n&(1<<s)-1).toString(32),n>>=s,i-=s,Ct=1<<32-at(t)+i|a<<i|n,zt=o+e}else Ct=1<<o|a<<i|n,zt=e}function zs(e){e.return!==null&&(qt(e,1),vc(e,1,0))}function Os(e){for(;e===Xi;)Xi=on[--sn],on[sn]=null,Xn=on[--sn],on[sn]=null;for(;e===ta;)ta=ft[--mt],ft[mt]=null,zt=ft[--mt],ft[mt]=null,Ct=ft[--mt],ft[mt]=null}function yc(e,t){ft[mt++]=Ct,ft[mt++]=zt,ft[mt++]=ta,Ct=t.id,zt=t.overflow,ta=e}var Re=null,he=null,I=!1,aa=null,gt=!1,js=Error(p(519));function na(e){throw Kn(pt(Error(p(418,1<arguments.length&&arguments[1]!==void 0&&arguments[1]?"text":"HTML","")),e)),js}function wc(e){var t=e.stateNode,a=e.type,n=e.memoizedProps;switch(t[Me]=e,t[Ge]=n,a){case"dialog":J("cancel",t),J("close",t);break;case"iframe":case"object":case"embed":J("load",t);break;case"video":case"audio":for(a=0;a<pi.length;a++)J(pi[a],t);break;case"source":J("error",t);break;case"img":case"image":case"link":J("error",t),J("load",t);break;case"details":J("toggle",t);break;case"input":J("invalid",t),_l(t,n.value,n.defaultValue,n.checked,n.defaultChecked,n.type,n.name,!0);break;case"select":J("invalid",t);break;case"textarea":J("invalid",t),Rl(t,n.value,n.defaultValue,n.children)}a=n.children,typeof a!="string"&&typeof a!="number"&&typeof a!="bigint"||t.textContent===""+a||n.suppressHydrationWarning===!0||qu(t.textContent,a)?(n.popover!=null&&(J("beforetoggle",t),J("toggle",t)),n.onScroll!=null&&J("scroll",t),n.onScrollEnd!=null&&J("scrollend",t),n.onClick!=null&&(t.onclick=Mt),t=!0):t=!1,t||na(e,!0)}function bc(e){for(Re=e.return;Re;)switch(Re.tag){case 5:case 31:case 13:gt=!1;return;case 27:case 3:gt=!0;return;default:Re=Re.return}}function rn(e){if(e!==Re)return!1;if(!I)return bc(e),I=!0,!1;var t=e.tag,a;if((a=t!==3&&t!==27)&&((a=t===5)&&(a=e.type,a=!(a!=="form"&&a!=="button")||Jr(e.type,e.memoizedProps)),a=!a),a&&he&&na(e),bc(e),t===13){if(e=e.memoizedState,e=e!==null?e.dehydrated:null,!e)throw Error(p(317));he=Ku(e)}else if(t===31){if(e=e.memoizedState,e=e!==null?e.dehydrated:null,!e)throw Error(p(317));he=Ku(e)}else t===27?(t=he,va(e.type)?(e=$r,$r=null,he=e):he=t):he=Re?yt(e.stateNode.nextSibling):null;return!0}function _a(){he=Re=null,I=!1}function Es(){var e=aa;return e!==null&&(Qe===null?Qe=e:Qe.push.apply(Qe,e),aa=null),e}function Kn(e){aa===null?aa=[e]:aa.push(e)}var _s=u(null),Ma=null,Nt=null;function ia(e,t,a){T(_s,t._currentValue),t._currentValue=a}function Lt(e){e._currentValue=_s.current,S(_s)}function Ms(e,t,a){for(;e!==null;){var n=e.alternate;if((e.childLanes&t)!==t?(e.childLanes|=t,n!==null&&(n.childLanes|=t)):n!==null&&(n.childLanes&t)!==t&&(n.childLanes|=t),e===a)break;e=e.return}}function Rs(e,t,a,n){var i=e.child;for(i!==null&&(i.return=e);i!==null;){var o=i.dependencies;if(o!==null){var s=i.child;o=o.firstContext;e:for(;o!==null;){var r=o;o=i;for(var c=0;c<t.length;c++)if(r.context===t[c]){o.lanes|=a,r=o.alternate,r!==null&&(r.lanes|=a),Ms(o.return,a,e),n||(s=null);break e}o=r.next}}else if(i.tag===18){if(s=i.return,s===null)throw Error(p(341));s.lanes|=a,o=s.alternate,o!==null&&(o.lanes|=a),Ms(s,a,e),s=null}else s=i.child;if(s!==null)s.return=i;else for(s=i;s!==null;){if(s===e){s=null;break}if(i=s.sibling,i!==null){i.return=s.return,s=i;break}s=s.return}i=s}}function ln(e,t,a,n){e=null;for(var i=t,o=!1;i!==null;){if(!o){if((i.flags&524288)!==0)o=!0;else if((i.flags&262144)!==0)break}if(i.tag===10){var s=i.alternate;if(s===null)throw Error(p(387));if(s=s.memoizedProps,s!==null){var r=i.type;nt(i.pendingProps.value,s.value)||(e!==null?e.push(r):e=[r])}}else if(i===ie.current){if(s=i.alternate,s===null)throw Error(p(387));s.memoizedState.memoizedState!==i.memoizedState.memoizedState&&(e!==null?e.push(yi):e=[yi])}i=i.return}e!==null&&Rs(t,e,a,n),t.flags|=262144}function Ki(e){for(e=e.firstContext;e!==null;){if(!nt(e.context._currentValue,e.memoizedValue))return!0;e=e.next}return!1}function Ra(e){Ma=e,Nt=null,e=e.dependencies,e!==null&&(e.firstContext=null)}function Ue(e){return kc(Ma,e)}function Qi(e,t){return Ma===null&&Ra(e),kc(e,t)}function kc(e,t){var a=t._currentValue;if(t={context:t,memoizedValue:a,next:null},Nt===null){if(e===null)throw Error(p(308));Nt=t,e.dependencies={lanes:0,firstContext:t},e.flags|=524288}else Nt=Nt.next=t;return a}var Cp=typeof AbortController<"u"?AbortController:function(){var e=[],t=this.signal={aborted:!1,addEventListener:function(a,n){e.push(n)}};this.abort=function(){t.aborted=!0,e.forEach(function(a){return a()})}},zp=y.unstable_scheduleCallback,Op=y.unstable_NormalPriority,Ae={$$typeof:Oe,Consumer:null,Provider:null,_currentValue:null,_currentValue2:null,_threadCount:0};function Us(){return{controller:new Cp,data:new Map,refCount:0}}function Qn(e){e.refCount--,e.refCount===0&&zp(Op,function(){e.controller.abort()})}var Zn=null,qs=0,cn=0,dn=null;function jp(e,t){if(Zn===null){var a=Zn=[];qs=0,cn=Br(),dn={status:"pending",value:void 0,then:function(n){a.push(n)}}}return qs++,t.then(Sc,Sc),t}function Sc(){if(--qs===0&&Zn!==null){dn!==null&&(dn.status="fulfilled");var e=Zn;Zn=null,cn=0,dn=null;for(var t=0;t<e.length;t++)(0,e[t])()}}function Ep(e,t){var a=[],n={status:"pending",value:null,reason:null,then:function(i){a.push(i)}};return e.then(function(){n.status="fulfilled",n.value=t;for(var i=0;i<a.length;i++)(0,a[i])(t)},function(i){for(n.status="rejected",n.reason=i,i=0;i<a.length;i++)(0,a[i])(void 0)}),n}var Ac=x.S;x.S=function(e,t){su=et(),typeof t=="object"&&t!==null&&typeof t.then=="function"&&jp(e,t),Ac!==null&&Ac(e,t)};var Ua=u(null);function Ns(){var e=Ua.current;return e!==null?e:de.pooledCache}function Zi(e,t){t===null?T(Ua,Ua.current):T(Ua,t.pool)}function Dc(){var e=Ns();return e===null?null:{parent:Ae._currentValue,pool:e}}var un=Error(p(460)),Ls=Error(p(474)),Ji=Error(p(542)),Wi={then:function(){}};function xc(e){return e=e.status,e==="fulfilled"||e==="rejected"}function Tc(e,t,a){switch(a=e[a],a===void 0?e.push(t):a!==t&&(t.then(Mt,Mt),t=a),t.status){case"fulfilled":return t.value;case"rejected":throw e=t.reason,zc(e),e;default:if(typeof t.status=="string")t.then(Mt,Mt);else{if(e=de,e!==null&&100<e.shellSuspendCounter)throw Error(p(482));e=t,e.status="pending",e.then(function(n){if(t.status==="pending"){var i=t;i.status="fulfilled",i.value=n}},function(n){if(t.status==="pending"){var i=t;i.status="rejected",i.reason=n}})}switch(t.status){case"fulfilled":return t.value;case"rejected":throw e=t.reason,zc(e),e}throw Na=t,un}}function qa(e){try{var t=e._init;return t(e._payload)}catch(a){throw a!==null&&typeof a=="object"&&typeof a.then=="function"?(Na=a,un):a}}var Na=null;function Cc(){if(Na===null)throw Error(p(459));var e=Na;return Na=null,e}function zc(e){if(e===un||e===Ji)throw Error(p(483))}var hn=null,Jn=0;function Pi(e){var t=Jn;return Jn+=1,hn===null&&(hn=[]),Tc(hn,e,t)}
vendor: 8,395 bytes, line 9
9function Wn(e,t){t=t.props.ref,e.ref=t!==void 0?t:null}function Fi(e,t){throw t.$$typeof===ge?Error(p(525)):(e=Object.prototype.toString.call(t),Error(p(31,e==="[object Object]"?"object with keys {"+Object.keys(t).join(", ")+"}":e)))}function Oc(e){function t(h,d){if(e){var f=h.deletions;f===null?(h.deletions=[d],h.flags|=16):f.push(d)}}function a(h,d){if(!e)return null;for(;d!==null;)t(h,d),d=d.sibling;return null}function n(h){for(var d=new Map;h!==null;)h.key!==null?d.set(h.key,h):d.set(h.index,h),h=h.sibling;return d}function i(h,d){return h=Ut(h,d),h.index=0,h.sibling=null,h}function o(h,d,f){return h.index=f,e?(f=h.alternate,f!==null?(f=f.index,f<d?(h.flags|=67108866,d):f):(h.flags|=67108866,d)):(h.flags|=1048576,d)}function s(h){return e&&h.alternate===null&&(h.flags|=67108866),h}function r(h,d,f,b){return d===null||d.tag!==6?(d=Ts(f,h.mode,b),d.return=h,d):(d=i(d,f),d.return=h,d)}function c(h,d,f,b){var N=f.type;return N===Je?w(h,d,f.props.children,b,f.key):d!==null&&(d.elementType===N||typeof N=="object"&&N!==null&&N.$$typeof===He&&qa(N)===d.type)?(d=i(d,f.props),Wn(d,f),d.return=h,d):(d=Vi(f.type,f.key,f.props,null,h.mode,b),Wn(d,f),d.return=h,d)}function m(h,d,f,b){return d===null||d.tag!==4||d.stateNode.containerInfo!==f.containerInfo||d.stateNode.implementation!==f.implementation?(d=Cs(f,h.mode,b),d.return=h,d):(d=i(d,f.children||[]),d.return=h,d)}function w(h,d,f,b,N){return d===null||d.tag!==7?(d=Ea(f,h.mode,b,N),d.return=h,d):(d=i(d,f),d.return=h,d)}function k(h,d,f){if(typeof d=="string"&&d!==""||typeof d=="number"||typeof d=="bigint")return d=Ts(""+d,h.mode,f),d.return=h,d;if(typeof d=="object"&&d!==null){switch(d.$$typeof){case we:return f=Vi(d.type,d.key,d.props,null,h.mode,f),Wn(f,d),f.return=h,f;case Ce:return d=Cs(d,h.mode,f),d.return=h,d;case He:return d=qa(d),k(h,d,f)}if(z(d)||Tt(d))return d=Ea(d,h.mode,f,null),d.return=h,d;if(typeof d.then=="function")return k(h,Pi(d),f);if(d.$$typeof===Oe)return k(h,Qi(h,d),f);Fi(h,d)}return null}function g(h,d,f,b){var N=d!==null?d.key:null;if(typeof f=="string"&&f!==""||typeof f=="number"||typeof f=="bigint")return N!==null?null:r(h,d,""+f,b);if(typeof f=="object"&&f!==null){switch(f.$$typeof){case we:return f.key===N?c(h,d,f,b):null;case Ce:return f.key===N?m(h,d,f,b):null;case He:return f=qa(f),g(h,d,f,b)}if(z(f)||Tt(f))return N!==null?null:w(h,d,f,b,null);if(typeof f.then=="function")return g(h,d,Pi(f),b);if(f.$$typeof===Oe)return g(h,d,Qi(h,f),b);Fi(h,f)}return null}function v(h,d,f,b,N){if(typeof b=="string"&&b!==""||typeof b=="number"||typeof b=="bigint")return h=h.get(f)||null,r(d,h,""+b,N);if(typeof b=="object"&&b!==null){switch(b.$$typeof){case we:return h=h.get(b.key===null?f:b.key)||null,c(d,h,b,N);case Ce:return h=h.get(b.key===null?f:b.key)||null,m(d,h,b,N);case He:return b=qa(b),v(h,d,f,b,N)}if(z(b)||Tt(b))return h=h.get(f)||null,w(d,h,b,N,null);if(typeof b.then=="function")return v(h,d,f,Pi(b),N);if(b.$$typeof===Oe)return v(h,d,f,Qi(d,b),N);Fi(d,b)}return null}function E(h,d,f,b){for(var N=null,ee=null,_=d,X=d=0,F=null;_!==null&&X<f.length;X++){_.index>X?(F=_,_=null):F=_.sibling;var te=g(h,_,f[X],b);if(te===null){_===null&&(_=F);break}e&&_&&te.alternate===null&&t(h,_),d=o(te,d,X),ee===null?N=te:ee.sibling=te,ee=te,_=F}if(X===f.length)return a(h,_),I&&qt(h,X),N;if(_===null){for(;X<f.length;X++)_=k(h,f[X],b),_!==null&&(d=o(_,d,X),ee===null?N=_:ee.sibling=_,ee=_);return I&&qt(h,X),N}for(_=n(_);X<f.length;X++)F=v(_,h,X,f[X],b),F!==null&&(e&&F.alternate!==null&&_.delete(F.key===null?X:F.key),d=o(F,d,X),ee===null?N=F:ee.sibling=F,ee=F);return e&&_.forEach(function(Sa){return t(h,Sa)}),I&&qt(h,X),N}function B(h,d,f,b){if(f==null)throw Error(p(151));for(var N=null,ee=null,_=d,X=d=0,F=null,te=f.next();_!==null&&!te.done;X++,te=f.next()){_.index>X?(F=_,_=null):F=_.sibling;var Sa=g(h,_,te.value,b);if(Sa===null){_===null&&(_=F);break}e&&_&&Sa.alternate===null&&t(h,_),d=o(Sa,d,X),ee===null?N=Sa:ee.sibling=Sa,ee=Sa,_=F}if(te.done)return a(h,_),I&&qt(h,X),N;if(_===null){for(;!te.done;X++,te=f.next())te=k(h,te.value,b),te!==null&&(d=o(te,d,X),ee===null?N=te:ee.sibling=te,ee=te);return I&&qt(h,X),N}for(_=n(_);!te.done;X++,te=f.next())te=v(_,h,X,te.value,b),te!==null&&(e&&te.alternate!==null&&_.delete(te.key===null?X:te.key),d=o(te,d,X),ee===null?N=te:ee.sibling=te,ee=te);return e&&_.forEach(function(Gf){return t(h,Gf)}),I&&qt(h,X),N}function ce(h,d,f,b){if(typeof f=="object"&&f!==null&&f.type===Je&&f.key===null&&(f=f.props.children),typeof f=="object"&&f!==null){switch(f.$$typeof){case we:e:{for(var N=f.key;d!==null;){if(d.key===N){if(N=f.type,N===Je){if(d.tag===7){a(h,d.sibling),b=i(d,f.props.children),b.return=h,h=b;break e}}else if(d.elementType===N||typeof N=="object"&&N!==null&&N.$$typeof===He&&qa(N)===d.type){a(h,d.sibling),b=i(d,f.props),Wn(b,f),b.return=h,h=b;break e}a(h,d);break}else t(h,d);d=d.sibling}f.type===Je?(b=Ea(f.props.children,h.mode,b,f.key),b.return=h,h=b):(b=Vi(f.type,f.key,f.props,null,h.mode,b),Wn(b,f),b.return=h,h=b)}return s(h);case Ce:e:{for(N=f.key;d!==null;){if(d.key===N)if(d.tag===4&&d.stateNode.containerInfo===f.containerInfo&&d.stateNode.implementation===f.implementation){a(h,d.sibling),b=i(d,f.children||[]),b.return=h,h=b;break e}else{a(h,d);break}else t(h,d);d=d.sibling}b=Cs(f,h.mode,b),b.return=h,h=b}return s(h);case He:return f=qa(f),ce(h,d,f,b)}if(z(f))return E(h,d,f,b);if(Tt(f)){if(N=Tt(f),typeof N!="function")throw Error(p(150));return f=N.call(f),B(h,d,f,b)}if(typeof f.then=="function")return ce(h,d,Pi(f),b);if(f.$$typeof===Oe)return ce(h,d,Qi(h,f),b);Fi(h,f)}return typeof f=="string"&&f!==""||typeof f=="number"||typeof f=="bigint"?(f=""+f,d!==null&&d.tag===6?(a(h,d.sibling),b=i(d,f),b.return=h,h=b):(a(h,d),b=Ts(f,h.mode,b),b.return=h,h=b),s(h)):a(h,d)}return function(h,d,f,b){try{Jn=0;var N=ce(h,d,f,b);return hn=null,N}catch(_){if(_===un||_===Ji)throw _;var ee=it(29,_,null,h.mode);return ee.lanes=b,ee.return=h,ee}}}var La=Oc(!0),jc=Oc(!1),oa=!1;function Bs(e){e.updateQueue={baseState:e.memoizedState,firstBaseUpdate:null,lastBaseUpdate:null,shared:{pending:null,lanes:0,hiddenCallbacks:null},callbacks:null}}function Hs(e,t){e=e.updateQueue,t.updateQueue===e&&(t.updateQueue={baseState:e.baseState,firstBaseUpdate:e.firstBaseUpdate,lastBaseUpdate:e.lastBaseUpdate,shared:e.shared,callbacks:null})}function sa(e){return{lane:e,tag:0,payload:null,callback:null,next:null}}function ra(e,t,a){var n=e.updateQueue;if(n===null)return null;if(n=n.shared,(ne&2)!==0){var i=n.pending;return i===null?t.next=t:(t.next=i.next,i.next=t),n.pending=t,t=Yi(e),pc(e,null,a),t}return Gi(e,n,t,a),Yi(e)}function Pn(e,t,a){if(t=t.updateQueue,t!==null&&(t=t.shared,(a&4194048)!==0)){var n=t.lanes;n&=e.pendingLanes,a|=n,t.lanes=a,kl(e,a)}}function Gs(e,t){var a=e.updateQueue,n=e.alternate;if(n!==null&&(n=n.updateQueue,a===n)){var i=null,o=null;if(a=a.firstBaseUpdate,a!==null){do{var s={lane:a.lane,tag:a.tag,payload:a.payload,callback:null,next:null};o===null?i=o=s:o=o.next=s,a=a.next}while(a!==null);o===null?i=o=t:o=o.next=t}else i=o=t;a={baseState:n.baseState,firstBaseUpdate:i,lastBaseUpdate:o,shared:n.shared,callbacks:n.callbacks},e.updateQueue=a;return}e=a.lastBaseUpdate,e===null?a.firstBaseUpdate=t:e.next=t,a.lastBaseUpdate=t}var Ys=!1;function Fn(){if(Ys){var e=dn;if(e!==null)throw e}}function In(e,t,a,n){Ys=!1;var i=e.updateQueue;oa=!1;var o=i.firstBaseUpdate,s=i.lastBaseUpdate,r=i.shared.pending;if(r!==null){i.shared.pending=null;var c=r,m=c.next;c.next=null,s===null?o=m:s.next=m,s=c;var w=e.alternate;w!==null&&(w=w.updateQueue,r=w.lastBaseUpdate,r!==s&&(r===null?w.firstBaseUpdate=m:r.next=m,w.lastBaseUpdate=c))}if(o!==null){var k=i.baseState;s=0,w=m=c=null,r=o;do{var g=r.lane&-536870913,v=g!==r.lane;if(v?(P&g)===g:(n&g)===g){g!==0&&g===cn&&(Ys=!0),w!==null&&(w=w.next={lane:0,tag:r.tag,payload:r.payload,callback:null,next:null});e:{var E=e,B=r;g=t;var ce=a;switch(B.tag){case 1:if(E=B.payload,typeof E=="function"){k=E.call(ce,k,g);break e}k=E;break e;case 3:E.flags=E.flags&-65537|128;case 0:if(E=B.payload,g=typeof E=="function"?E.call(ce,k,g):E,g==null)break e;k=M({},k,g);break e;case 2:oa=!0}}g=r.callback,g!==null&&(e.flags|=64,v&&(e.flags|=8192),v=i.callbacks,v===null?i.callbacks=[g]:v.push(g))}else v={lane:g,tag:r.tag,payload:r.payload,callback:r.callback,next:null},w===null?(m=w=v,c=k):w=w.next=v,s|=g;if(r=r.next,r===null){if(r=i.shared.pending,r===null)break;
vendor: 8,067 bytes, line 9
9v=r,r=v.next,v.next=null,i.lastBaseUpdate=v,i.shared.pending=null}}while(!0);w===null&&(c=k),i.baseState=c,i.firstBaseUpdate=m,i.lastBaseUpdate=w,o===null&&(i.shared.lanes=0),ha|=s,e.lanes=s,e.memoizedState=k}}function Ec(e,t){if(typeof e!="function")throw Error(p(191,e));e.call(t)}function _c(e,t){var a=e.callbacks;if(a!==null)for(e.callbacks=null,e=0;e<a.length;e++)Ec(a[e],t)}var pn=u(null),Ii=u(0);function Mc(e,t){e=Zt,T(Ii,e),T(pn,t),Zt=e|t.baseLanes}function Vs(){T(Ii,Zt),T(pn,pn.current)}function Xs(){Zt=Ii.current,S(pn),S(Ii)}var ot=u(null),vt=null;function la(e){var t=e.alternate;T(ke,ke.current&1),T(ot,e),vt===null&&(t===null||pn.current!==null||t.memoizedState!==null)&&(vt=e)}function Ks(e){T(ke,ke.current),T(ot,e),vt===null&&(vt=e)}function Rc(e){e.tag===22?(T(ke,ke.current),T(ot,e),vt===null&&(vt=e)):ca(e)}function ca(){T(ke,ke.current),T(ot,ot.current)}function st(e){S(ot),vt===e&&(vt=null),S(ke)}var ke=u(0);function $i(e){for(var t=e;t!==null;){if(t.tag===13){var a=t.memoizedState;if(a!==null&&(a=a.dehydrated,a===null||Fr(a)||Ir(a)))return t}else if(t.tag===19&&(t.memoizedProps.revealOrder==="forwards"||t.memoizedProps.revealOrder==="backwards"||t.memoizedProps.revealOrder==="unstable_legacy-backwards"||t.memoizedProps.revealOrder==="together")){if((t.flags&128)!==0)return t}else if(t.child!==null){t.child.return=t,t=t.child;continue}if(t===e)break;for(;t.sibling===null;){if(t.return===null||t.return===e)return null;t=t.return}t.sibling.return=t.return,t=t.sibling}return null}var Bt=0,V=null,re=null,De=null,eo=!1,fn=!1,Ba=!1,to=0,$n=0,mn=null,_p=0;function ve(){throw Error(p(321))}function Qs(e,t){if(t===null)return!1;for(var a=0;a<t.length&&a<e.length;a++)if(!nt(e[a],t[a]))return!1;return!0}function Zs(e,t,a,n,i,o){return Bt=o,V=t,t.memoizedState=null,t.updateQueue=null,t.lanes=0,x.H=e===null||e.memoizedState===null?vd:lr,Ba=!1,o=a(n,i),Ba=!1,fn&&(o=qc(t,a,n,i)),Uc(e),o}function Uc(e){x.H=ai;var t=re!==null&&re.next!==null;if(Bt=0,De=re=V=null,eo=!1,$n=0,mn=null,t)throw Error(p(300));e===null||xe||(e=e.dependencies,e!==null&&Ki(e)&&(xe=!0))}function qc(e,t,a,n){V=e;var i=0;do{if(fn&&(mn=null),$n=0,fn=!1,25<=i)throw Error(p(301));if(i+=1,De=re=null,e.updateQueue!=null){var o=e.updateQueue;o.lastEffect=null,o.events=null,o.stores=null,o.memoCache!=null&&(o.memoCache.index=0)}x.H=yd,o=t(a,n)}while(fn);return o}function Mp(){var e=x.H,t=e.useState()[0];return t=typeof t.then=="function"?ei(t):t,e=e.useState()[0],(re!==null?re.memoizedState:null)!==e&&(V.flags|=1024),t}function Js(){var e=to!==0;return to=0,e}function Ws(e,t,a){t.updateQueue=e.updateQueue,t.flags&=-2053,e.lanes&=~a}function Ps(e){if(eo){for(e=e.memoizedState;e!==null;){var t=e.queue;t!==null&&(t.pending=null),e=e.next}eo=!1}Bt=0,De=re=V=null,fn=!1,$n=to=0,mn=null}function Be(){var e={memoizedState:null,baseState:null,baseQueue:null,queue:null,next:null};return De===null?V.memoizedState=De=e:De=De.next=e,De}function Se(){if(re===null){var e=V.alternate;e=e!==null?e.memoizedState:null}else e=re.next;var t=De===null?V.memoizedState:De.next;if(t!==null)De=t,re=e;else{if(e===null)throw V.alternate===null?Error(p(467)):Error(p(310));re=e,e={memoizedState:re.memoizedState,baseState:re.baseState,baseQueue:re.baseQueue,queue:re.queue,next:null},De===null?V.memoizedState=De=e:De=De.next=e}return De}function ao(){return{lastEffect:null,events:null,stores:null,memoCache:null}}function ei(e){var t=$n;return $n+=1,mn===null&&(mn=[]),e=Tc(mn,e,t),t=V,(De===null?t.memoizedState:De.next)===null&&(t=t.alternate,x.H=t===null||t.memoizedState===null?vd:lr),e}function no(e){if(e!==null&&typeof e=="object"){if(typeof e.then=="function")return ei(e);if(e.$$typeof===Oe)return Ue(e)}throw Error(p(438,String(e)))}function Fs(e){var t=null,a=V.updateQueue;if(a!==null&&(t=a.memoCache),t==null){var n=V.alternate;n!==null&&(n=n.updateQueue,n!==null&&(n=n.memoCache,n!=null&&(t={data:n.data.map(function(i){return i.slice()}),index:0})))}if(t??={data:[],index:0},a===null&&(a=ao(),V.updateQueue=a),a.memoCache=t,a=t.data[t.index],a===void 0)for(a=t.data[t.index]=Array(e),n=0;n<e;n++)a[n]=Aa;return t.index++,a}function Ht(e,t){return typeof t=="function"?t(e):t}function io(e){return Is(Se(),re,e)}function Is(e,t,a){var n=e.queue;if(n===null)throw Error(p(311));n.lastRenderedReducer=a;var i=e.baseQueue,o=n.pending;if(o!==null){if(i!==null){var s=i.next;i.next=o.next,o.next=s}t.baseQueue=i=o,n.pending=null}if(o=e.baseState,i===null)e.memoizedState=o;else{t=i.next;var r=s=null,c=null,m=t,w=!1;do{var k=m.lane&-536870913;if(k!==m.lane?(P&k)===k:(Bt&k)===k){var g=m.revertLane;if(g===0)c!==null&&(c=c.next={lane:0,revertLane:0,gesture:null,action:m.action,hasEagerState:m.hasEagerState,eagerState:m.eagerState,next:null}),k===cn&&(w=!0);else if((Bt&g)===g){m=m.next,g===cn&&(w=!0);continue}else k={lane:0,revertLane:m.revertLane,gesture:null,action:m.action,hasEagerState:m.hasEagerState,eagerState:m.eagerState,next:null},c===null?(r=c=k,s=o):c=c.next=k,V.lanes|=g,ha|=g;k=m.action,Ba&&a(o,k),o=m.hasEagerState?m.eagerState:a(o,k)}else g={lane:k,revertLane:m.revertLane,gesture:m.gesture,action:m.action,hasEagerState:m.hasEagerState,eagerState:m.eagerState,next:null},c===null?(r=c=g,s=o):c=c.next=g,V.lanes|=k,ha|=k;m=m.next}while(m!==null&&m!==t);if(c===null?s=o:c.next=r,!nt(o,e.memoizedState)&&(xe=!0,w&&(a=dn,a!==null)))throw a;e.memoizedState=o,e.baseState=s,e.baseQueue=c,n.lastRenderedState=o}return i===null&&(n.lanes=0),[e.memoizedState,n.dispatch]}function $s(e){var t=Se(),a=t.queue;if(a===null)throw Error(p(311));a.lastRenderedReducer=e;var n=a.dispatch,i=a.pending,o=t.memoizedState;if(i!==null){a.pending=null;var s=i=i.next;do o=e(o,s.action),s=s.next;while(s!==i);nt(o,t.memoizedState)||(xe=!0),t.memoizedState=o,t.baseQueue===null&&(t.baseState=o),a.lastRenderedState=o}return[o,n]}function Nc(e,t,a){var n=V,i=Se(),o=I;if(o){if(a===void 0)throw Error(p(407));a=a()}else a=t();var s=!nt((re||i).memoizedState,a);if(s&&(i.memoizedState=a,xe=!0),i=i.queue,ar(Hc.bind(null,n,i,e),[e]),i.getSnapshot!==t||s||De!==null&&De.memoizedState.tag&1){if(n.flags|=2048,gn(9,{destroy:void 0},Bc.bind(null,n,i,a,t),null),de===null)throw Error(p(349));o||(Bt&127)!==0||Lc(n,t,a)}return a}function Lc(e,t,a){e.flags|=16384,e={getSnapshot:t,value:a},t=V.updateQueue,t===null?(t=ao(),V.updateQueue=t,t.stores=[e]):(a=t.stores,a===null?t.stores=[e]:a.push(e))}function Bc(e,t,a,n){t.value=a,t.getSnapshot=n,Gc(t)&&Yc(e)}function Hc(e,t,a){return a(function(){Gc(t)&&Yc(e)})}function Gc(e){var t=e.getSnapshot;e=e.value;try{var a=t();return!nt(e,a)}catch{return!0}}function Yc(e){var t=ja(e,2);t!==null&&Ze(t,e,2)}function er(e){var t=Be();if(typeof e=="function"){var a=e;if(e=a(),Ba){It(!0);try{a()}finally{It(!1)}}}return t.memoizedState=t.baseState=e,t.queue={pending:null,lanes:0,dispatch:null,lastRenderedReducer:Ht,lastRenderedState:e},t}function Vc(e,t,a,n){return e.baseState=a,Is(e,re,typeof n=="function"?n:Ht)}function Rp(e,t,a,n,i){if(ro(e))throw Error(p(485));if(e=t.action,e!==null){var o={payload:i,action:e,next:null,isTransition:!0,status:"pending",value:null,reason:null,listeners:[],then:function(s){o.listeners.push(s)}};x.T!==null?a(!0):o.isTransition=!1,n(o),a=t.pending,a===null?(o.next=t.pending=o,Xc(t,o)):(o.next=a.next,t.pending=a.next=o)}}function Xc(e,t){var a=t.action,n=t.payload,i=e.state;if(t.isTransition){var o=x.T,s={};x.T=s;try{var r=a(i,n),c=x.S;c!==null&&c(s,r),Kc(e,t,r)}catch(m){tr(e,t,m)}finally{o!==null&&s.types!==null&&(o.types=s.types),x.T=o}}else try{o=a(i,n),Kc(e,t,o)}catch(m){tr(e,t,m)}}function Kc(e,t,a){a!==null&&typeof a=="object"&&typeof a.then=="function"?a.then(function(n){Qc(e,t,n)},function(n){return tr(e,t,n)}):Qc(e,t,a)}function Qc(e,t,a){t.status="fulfilled",t.value=a,Zc(t),e.state=a,t=e.pending,t!==null&&(a=t.next,a===t?e.pending=null:(a=a.next,t.next=a,Xc(e,a)))}function tr(e,t,a){var n=e.pending;if(e.pending=null,n!==null){n=n.next;do t.status="rejected",t.reason=a,Zc(t),t=t.next;while(t!==n)}e.action=null}function Zc(e){e=e.listeners;for(var t=0;t<e.length;t++)(0,e[t])()}
vendor: 6,631 bytes, line 9
9function Jc(e,t){return t}function Wc(e,t){if(I){var a=de.formState;if(a!==null){e:{var n=V;if(I){if(he){t:{for(var i=he,o=gt;i.nodeType!==8;){if(!o){i=null;break t}if(i=yt(i.nextSibling),i===null){i=null;break t}}o=i.data,i=o==="F!"||o==="F"?i:null}if(i){he=yt(i.nextSibling),n=i.data==="F!";break e}}na(n)}n=!1}n&&(t=a[0])}}return a=Be(),a.memoizedState=a.baseState=t,n={pending:null,lanes:0,dispatch:null,lastRenderedReducer:Jc,lastRenderedState:t},a.queue=n,a=fd.bind(null,V,n),n.dispatch=a,n=er(!1),o=rr.bind(null,V,!1,n.queue),n=Be(),i={state:t,dispatch:null,action:e,pending:null},n.queue=i,a=Rp.bind(null,V,i,o,a),i.dispatch=a,n.memoizedState=e,[t,a,!1]}function Pc(e){return Fc(Se(),re,e)}function Fc(e,t,a){if(t=Is(e,t,Jc)[0],e=io(Ht)[0],typeof t=="object"&&t!==null&&typeof t.then=="function")try{var n=ei(t)}catch(s){throw s===un?Ji:s}else n=t;t=Se();var i=t.queue,o=i.dispatch;return a!==t.memoizedState&&(V.flags|=2048,gn(9,{destroy:void 0},Up.bind(null,i,a),null)),[n,o,e]}function Up(e,t){e.action=t}function Ic(e){var t=Se(),a=re;if(a!==null)return Fc(t,a,e);Se(),t=t.memoizedState,a=Se();var n=a.queue.dispatch;return a.memoizedState=e,[t,n,!1]}function gn(e,t,a,n){return e={tag:e,create:a,deps:n,inst:t,next:null},t=V.updateQueue,t===null&&(t=ao(),V.updateQueue=t),a=t.lastEffect,a===null?t.lastEffect=e.next=e:(n=a.next,a.next=e,e.next=n,t.lastEffect=e),e}function $c(){return Se().memoizedState}function oo(e,t,a,n){var i=Be();V.flags|=e,i.memoizedState=gn(1|t,{destroy:void 0},a,n===void 0?null:n)}function so(e,t,a,n){var i=Se();n=n===void 0?null:n;var o=i.memoizedState.inst;re!==null&&n!==null&&Qs(n,re.memoizedState.deps)?i.memoizedState=gn(t,o,a,n):(V.flags|=e,i.memoizedState=gn(1|t,o,a,n))}function ed(e,t){oo(8390656,8,e,t)}function ar(e,t){so(2048,8,e,t)}function qp(e){V.flags|=4;var t=V.updateQueue;if(t===null)t=ao(),V.updateQueue=t,t.events=[e];else{var a=t.events;a===null?t.events=[e]:a.push(e)}}function td(e){var t=Se().memoizedState;return qp({ref:t,nextImpl:e}),function(){if((ne&2)!==0)throw Error(p(440));return t.impl.apply(void 0,arguments)}}function ad(e,t){return so(4,2,e,t)}function nd(e,t){return so(4,4,e,t)}function id(e,t){if(typeof t=="function"){e=e();var a=t(e);return function(){typeof a=="function"?a():t(null)}}if(t!=null)return e=e(),t.current=e,function(){t.current=null}}function od(e,t,a){a=a!=null?a.concat([e]):null,so(4,4,id.bind(null,t,e),a)}function nr(){}function sd(e,t){var a=Se();t=t===void 0?null:t;var n=a.memoizedState;return t!==null&&Qs(t,n[1])?n[0]:(a.memoizedState=[e,t],e)}function rd(e,t){var a=Se();t=t===void 0?null:t;var n=a.memoizedState;if(t!==null&&Qs(t,n[1]))return n[0];if(n=e(),Ba){It(!0);try{e()}finally{It(!1)}}return a.memoizedState=[n,t],n}function ir(e,t,a){return a===void 0||(Bt&1073741824)!==0&&(P&261930)===0?e.memoizedState=t:(e.memoizedState=a,e=lu(),V.lanes|=e,ha|=e,a)}function ld(e,t,a,n){return nt(a,t)?a:pn.current!==null?(e=ir(e,a,n),nt(e,t)||(xe=!0),e):(Bt&42)===0||(Bt&1073741824)!==0&&(P&261930)===0?(xe=!0,e.memoizedState=a):(e=lu(),V.lanes|=e,ha|=e,t)}function cd(e,t,a,n,i){var o=C.p;C.p=o!==0&&8>o?o:8;var s=x.T,r={};x.T=r,rr(e,!1,t,a);try{var c=i(),m=x.S;m!==null&&m(r,c),c!==null&&typeof c=="object"&&typeof c.then=="function"?ti(e,t,Ep(c,n),ct(e)):ti(e,t,n,ct(e))}catch(w){ti(e,t,{then:function(){},status:"rejected",reason:w},ct())}finally{C.p=o,s!==null&&r.types!==null&&(s.types=r.types),x.T=s}}function Np(){}function or(e,t,a,n){if(e.tag!==5)throw Error(p(476));var i=dd(e).queue;cd(e,i,t,ae,a===null?Np:function(){return ud(e),a(n)})}function dd(e){var t=e.memoizedState;if(t!==null)return t;t={memoizedState:ae,baseState:ae,baseQueue:null,queue:{pending:null,lanes:0,dispatch:null,lastRenderedReducer:Ht,lastRenderedState:ae},next:null};var a={};return t.next={memoizedState:a,baseState:a,baseQueue:null,queue:{pending:null,lanes:0,dispatch:null,lastRenderedReducer:Ht,lastRenderedState:a},next:null},e.memoizedState=t,e=e.alternate,e!==null&&(e.memoizedState=t),t}function ud(e){var t=dd(e);t.next===null&&(t=e.alternate.memoizedState),ti(e,t.next.queue,{},ct())}function sr(){return Ue(yi)}function hd(){return Se().memoizedState}function pd(){return Se().memoizedState}function Lp(e){for(var t=e.return;t!==null;){switch(t.tag){case 24:case 3:var a=ct();e=sa(a);var n=ra(t,e,a);n!==null&&(Ze(n,t,a),Pn(n,t,a)),t={cache:Us()},e.payload=t;return}t=t.return}}function Bp(e,t,a){var n=ct();a={lane:n,revertLane:0,gesture:null,action:a,hasEagerState:!1,eagerState:null,next:null},ro(e)?md(t,a):(a=Ds(e,t,a,n),a!==null&&(Ze(a,e,n),gd(a,t,n)))}function fd(e,t,a){ti(e,t,a,ct())}function ti(e,t,a,n){var i={lane:n,revertLane:0,gesture:null,action:a,hasEagerState:!1,eagerState:null,next:null};if(ro(e))md(t,i);else{var o=e.alternate;if(e.lanes===0&&(o===null||o.lanes===0)&&(o=t.lastRenderedReducer,o!==null))try{var s=t.lastRenderedState,r=o(s,a);if(i.hasEagerState=!0,i.eagerState=r,nt(r,s))return Gi(e,t,i,0),de===null&&Hi(),!1}catch{}if(a=Ds(e,t,i,n),a!==null)return Ze(a,e,n),gd(a,t,n),!0}return!1}function rr(e,t,a,n){if(n={lane:2,revertLane:Br(),gesture:null,action:n,hasEagerState:!1,eagerState:null,next:null},ro(e)){if(t)throw Error(p(479))}else t=Ds(e,a,n,2),t!==null&&Ze(t,e,2)}function ro(e){var t=e.alternate;return e===V||t!==null&&t===V}function md(e,t){fn=eo=!0;var a=e.pending;a===null?t.next=t:(t.next=a.next,a.next=t),e.pending=t}function gd(e,t,a){if((a&4194048)!==0){var n=t.lanes;n&=e.pendingLanes,a|=n,t.lanes=a,kl(e,a)}}var ai={readContext:Ue,use:no,useCallback:ve,useContext:ve,useEffect:ve,useImperativeHandle:ve,useLayoutEffect:ve,useInsertionEffect:ve,useMemo:ve,useReducer:ve,useRef:ve,useState:ve,useDebugValue:ve,useDeferredValue:ve,useTransition:ve,useSyncExternalStore:ve,useId:ve,useHostTransitionStatus:ve,useFormState:ve,useActionState:ve,useOptimistic:ve,useMemoCache:ve,useCacheRefresh:ve};ai.useEffectEvent=ve;var vd={readContext:Ue,use:no,useCallback:function(e,t){return Be().memoizedState=[e,t===void 0?null:t],e},useContext:Ue,useEffect:ed,useImperativeHandle:function(e,t,a){a=a!=null?a.concat([e]):null,oo(4194308,4,id.bind(null,t,e),a)},useLayoutEffect:function(e,t){return oo(4194308,4,e,t)},useInsertionEffect:function(e,t){oo(4,2,e,t)},useMemo:function(e,t){var a=Be();t=t===void 0?null:t;var n=e();if(Ba){It(!0);try{e()}finally{It(!1)}}return a.memoizedState=[n,t],n},useReducer:function(e,t,a){var n=Be();if(a!==void 0){var i=a(t);if(Ba){It(!0);try{a(t)}finally{It(!1)}}}else i=t;return n.memoizedState=n.baseState=i,e={pending:null,lanes:0,dispatch:null,lastRenderedReducer:e,lastRenderedState:i},n.queue=e,e=e.dispatch=Bp.bind(null,V,e),[n.memoizedState,e]}
vendor: 15,736 bytes, line 9
9,useRef:function(e){var t=Be();return e={current:e},t.memoizedState=e},useState:function(e){e=er(e);var t=e.queue,a=fd.bind(null,V,t);return t.dispatch=a,[e.memoizedState,a]},useDebugValue:nr,useDeferredValue:function(e,t){return ir(Be(),e,t)},useTransition:function(){var e=er(!1);return e=cd.bind(null,V,e.queue,!0,!1),Be().memoizedState=e,[!1,e]},useSyncExternalStore:function(e,t,a){var n=V,i=Be();if(I){if(a===void 0)throw Error(p(407));a=a()}else{if(a=t(),de===null)throw Error(p(349));(P&127)!==0||Lc(n,t,a)}i.memoizedState=a;var o={value:a,getSnapshot:t};return i.queue=o,ed(Hc.bind(null,n,o,e),[e]),n.flags|=2048,gn(9,{destroy:void 0},Bc.bind(null,n,o,a,t),null),a},useId:function(){var e=Be(),t=de.identifierPrefix;if(I){var a=zt,n=Ct;a=(n&~(1<<32-at(n)-1)).toString(32)+a,t="_"+t+"R_"+a,a=to++,0<a&&(t+="H"+a.toString(32)),t+="_"}else a=_p++,t="_"+t+"r_"+a.toString(32)+"_";return e.memoizedState=t},useHostTransitionStatus:sr,useFormState:Wc,useActionState:Wc,useOptimistic:function(e){var t=Be();t.memoizedState=t.baseState=e;var a={pending:null,lanes:0,dispatch:null,lastRenderedReducer:null,lastRenderedState:null};return t.queue=a,t=rr.bind(null,V,!0,a),a.dispatch=t,[e,t]},useMemoCache:Fs,useCacheRefresh:function(){return Be().memoizedState=Lp.bind(null,V)},useEffectEvent:function(e){var t=Be(),a={impl:e};return t.memoizedState=a,function(){if((ne&2)!==0)throw Error(p(440));return a.impl.apply(void 0,arguments)}}},lr={readContext:Ue,use:no,useCallback:sd,useContext:Ue,useEffect:ar,useImperativeHandle:od,useInsertionEffect:ad,useLayoutEffect:nd,useMemo:rd,useReducer:io,useRef:$c,useState:function(){return io(Ht)},useDebugValue:nr,useDeferredValue:function(e,t){return ld(Se(),re.memoizedState,e,t)},useTransition:function(){var e=io(Ht)[0],t=Se().memoizedState;return[typeof e=="boolean"?e:ei(e),t]},useSyncExternalStore:Nc,useId:hd,useHostTransitionStatus:sr,useFormState:Pc,useActionState:Pc,useOptimistic:function(e,t){return Vc(Se(),re,e,t)},useMemoCache:Fs,useCacheRefresh:pd};lr.useEffectEvent=td;var yd={readContext:Ue,use:no,useCallback:sd,useContext:Ue,useEffect:ar,useImperativeHandle:od,useInsertionEffect:ad,useLayoutEffect:nd,useMemo:rd,useReducer:$s,useRef:$c,useState:function(){return $s(Ht)},useDebugValue:nr,useDeferredValue:function(e,t){var a=Se();return re===null?ir(a,e,t):ld(a,re.memoizedState,e,t)},useTransition:function(){var e=$s(Ht)[0],t=Se().memoizedState;return[typeof e=="boolean"?e:ei(e),t]},useSyncExternalStore:Nc,useId:hd,useHostTransitionStatus:sr,useFormState:Ic,useActionState:Ic,useOptimistic:function(e,t){var a=Se();return re!==null?Vc(a,re,e,t):(a.baseState=e,[e,a.queue.dispatch])},useMemoCache:Fs,useCacheRefresh:pd};yd.useEffectEvent=td;function cr(e,t,a,n){t=e.memoizedState,a=a(n,t),a=a==null?t:M({},t,a),e.memoizedState=a,e.lanes===0&&(e.updateQueue.baseState=a)}var dr={enqueueSetState:function(e,t,a){e=e._reactInternals;var n=ct(),i=sa(n);i.payload=t,a!=null&&(i.callback=a),t=ra(e,i,n),t!==null&&(Ze(t,e,n),Pn(t,e,n))},enqueueReplaceState:function(e,t,a){e=e._reactInternals;var n=ct(),i=sa(n);i.tag=1,i.payload=t,a!=null&&(i.callback=a),t=ra(e,i,n),t!==null&&(Ze(t,e,n),Pn(t,e,n))},enqueueForceUpdate:function(e,t){e=e._reactInternals;var a=ct(),n=sa(a);n.tag=2,t!=null&&(n.callback=t),t=ra(e,n,a),t!==null&&(Ze(t,e,a),Pn(t,e,a))}};function wd(e,t,a,n,i,o,s){return e=e.stateNode,typeof e.shouldComponentUpdate=="function"?e.shouldComponentUpdate(n,o,s):t.prototype&&t.prototype.isPureReactComponent?!Yn(a,n)||!Yn(i,o):!0}function bd(e,t,a,n){e=t.state,typeof t.componentWillReceiveProps=="function"&&t.componentWillReceiveProps(a,n),typeof t.UNSAFE_componentWillReceiveProps=="function"&&t.UNSAFE_componentWillReceiveProps(a,n),t.state!==e&&dr.enqueueReplaceState(t,t.state,null)}function Ha(e,t){var a=t;if("ref"in t){a={};for(var n in t)n!=="ref"&&(a[n]=t[n])}if(e=e.defaultProps){a===t&&(a=M({},a));for(var i in e)a[i]===void 0&&(a[i]=e[i])}return a}function kd(e){Bi(e)}function Sd(e){console.error(e)}function Ad(e){Bi(e)}function lo(e,t){try{var a=e.onUncaughtError;a(t.value,{componentStack:t.stack})}catch(n){setTimeout(function(){throw n})}}function Dd(e,t,a){try{var n=e.onCaughtError;n(a.value,{componentStack:a.stack,errorBoundary:t.tag===1?t.stateNode:null})}catch(i){setTimeout(function(){throw i})}}function ur(e,t,a){return a=sa(a),a.tag=3,a.payload={element:null},a.callback=function(){lo(e,t)},a}function xd(e){return e=sa(e),e.tag=3,e}function Td(e,t,a,n){var i=a.type.getDerivedStateFromError;if(typeof i=="function"){var o=n.value;e.payload=function(){return i(o)},e.callback=function(){Dd(t,a,n)}}var s=a.stateNode;s!==null&&typeof s.componentDidCatch=="function"&&(e.callback=function(){Dd(t,a,n),typeof i!="function"&&(pa===null?pa=new Set([this]):pa.add(this));var r=n.stack;this.componentDidCatch(n.value,{componentStack:r!==null?r:""})})}function Hp(e,t,a,n,i){if(a.flags|=32768,n!==null&&typeof n=="object"&&typeof n.then=="function"){if(t=a.alternate,t!==null&&ln(t,a,i,!0),a=ot.current,a!==null){switch(a.tag){case 31:case 13:return vt===null?ko():a.alternate===null&&ye===0&&(ye=3),a.flags&=-257,a.flags|=65536,a.lanes=i,n===Wi?a.flags|=16384:(t=a.updateQueue,t===null?a.updateQueue=new Set([n]):t.add(n),qr(e,n,i)),!1;case 22:return a.flags|=65536,n===Wi?a.flags|=16384:(t=a.updateQueue,t===null?(t={transitions:null,markerInstances:null,retryQueue:new Set([n])},a.updateQueue=t):(a=t.retryQueue,a===null?t.retryQueue=new Set([n]):a.add(n)),qr(e,n,i)),!1}throw Error(p(435,a.tag))}return qr(e,n,i),ko(),!1}if(I)return t=ot.current,t!==null?((t.flags&65536)===0&&(t.flags|=256),t.flags|=65536,t.lanes=i,n!==js&&(e=Error(p(422),{cause:n}),Kn(pt(e,a)))):(n!==js&&(t=Error(p(423),{cause:n}),Kn(pt(t,a))),e=e.current.alternate,e.flags|=65536,i&=-i,e.lanes|=i,n=pt(n,a),i=ur(e.stateNode,n,i),Gs(e,i),ye!==4&&(ye=2)),!1;var o=Error(p(520),{cause:n});if(o=pt(o,a),di===null?di=[o]:di.push(o),ye!==4&&(ye=2),t===null)return!0;n=pt(n,a),a=t;do{switch(a.tag){case 3:return a.flags|=65536,e=i&-i,a.lanes|=e,e=ur(a.stateNode,n,e),Gs(a,e),!1;case 1:if(t=a.type,o=a.stateNode,(a.flags&128)===0&&(typeof t.getDerivedStateFromError=="function"||o!==null&&typeof o.componentDidCatch=="function"&&(pa===null||!pa.has(o))))return a.flags|=65536,i&=-i,a.lanes|=i,i=xd(i),Td(i,e,a,n),Gs(a,i),!1}a=a.return}while(a!==null);return!1}var hr=Error(p(461)),xe=!1;function qe(e,t,a,n){t.child=e===null?jc(t,null,a,n):La(t,e.child,a,n)}function Cd(e,t,a,n,i){a=a.render;var o=t.ref;if("ref"in n){var s={};for(var r in n)r!=="ref"&&(s[r]=n[r])}else s=n;return Ra(t),n=Zs(e,t,a,s,o,i),r=Js(),e!==null&&!xe?(Ws(e,t,i),Gt(e,t,i)):(I&&r&&zs(t),t.flags|=1,qe(e,t,n,i),t.child)}function zd(e,t,a,n,i){if(e===null){var o=a.type;return typeof o=="function"&&!xs(o)&&o.defaultProps===void 0&&a.compare===null?(t.tag=15,t.type=o,Od(e,t,o,n,i)):(e=Vi(a.type,null,n,t,t.mode,i),e.ref=t.ref,e.return=t,t.child=e)}if(o=e.child,!br(e,i)){var s=o.memoizedProps;if(a=a.compare,a=a!==null?a:Yn,a(s,n)&&e.ref===t.ref)return Gt(e,t,i)}return t.flags|=1,e=Ut(o,n),e.ref=t.ref,e.return=t,t.child=e}function Od(e,t,a,n,i){if(e!==null){var o=e.memoizedProps;if(Yn(o,n)&&e.ref===t.ref)if(xe=!1,t.pendingProps=n=o,br(e,i))(e.flags&131072)!==0&&(xe=!0);else return t.lanes=e.lanes,Gt(e,t,i)}return pr(e,t,a,n,i)}function jd(e,t,a,n){var i=n.children,o=e!==null?e.memoizedState:null;if(e===null&&t.stateNode===null&&(t.stateNode={_visibility:1,_pendingMarkers:null,_retryCache:null,_transitions:null}),n.mode==="hidden"){if((t.flags&128)!==0){if(o=o!==null?o.baseLanes|a:a,e!==null){for(n=t.child=e.child,i=0;n!==null;)i=i|n.lanes|n.childLanes,n=n.sibling;n=i&~o}else n=0,t.child=null;return Ed(e,t,o,a,n)}if((a&536870912)!==0)t.memoizedState={baseLanes:0,cachePool:null},e!==null&&Zi(t,o!==null?o.cachePool:null),o!==null?Mc(t,o):Vs(),Rc(t);else return n=t.lanes=536870912,Ed(e,t,o!==null?o.baseLanes|a:a,a,n)}else o!==null?(Zi(t,o.cachePool),Mc(t,o),ca(t),t.memoizedState=null):(e!==null&&Zi(t,null),Vs(),ca(t));return qe(e,t,i,a),t.child}function ni(e,t){return e!==null&&e.tag===22||t.stateNode!==null||(t.stateNode={_visibility:1,_pendingMarkers:null,_retryCache:null,_transitions:null}),t.sibling}function Ed(e,t,a,n,i){var o=Ns();return o=o===null?null:{parent:Ae._currentValue,pool:o},t.memoizedState={baseLanes:a,cachePool:o},e!==null&&Zi(t,null),Vs(),Rc(t),e!==null&&ln(e,t,n,!0),t.childLanes=i,null}function co(e,t){return t=ho({mode:t.mode,children:t.children},e.mode),t.ref=e.ref,e.child=t,t.return=e,t}function _d(e,t,a){return La(t,e.child,null,a),e=co(t,t.pendingProps),e.flags|=2,st(t),t.memoizedState=null,e}function Gp(e,t,a){var n=t.pendingProps,i=(t.flags&128)!==0;if(t.flags&=-129,e===null){if(I){if(n.mode==="hidden")return e=co(t,n),t.lanes=536870912,ni(null,e);if(Ks(t),(e=he)?(e=Xu(e,gt),e=e!==null&&e.data==="&"?e:null,e!==null&&(t.memoizedState={dehydrated:e,treeContext:ta!==null?{id:Ct,overflow:zt}:null,retryLane:536870912,hydrationErrors:null},a=mc(e),a.return=t,t.child=a,Re=t,he=null)):e=null,e===null)throw na(t);return t.lanes=536870912,null}return co(t,n)}var o=e.memoizedState;if(o!==null){var s=o.dehydrated;if(Ks(t),i)if(t.flags&256)t.flags&=-257,t=_d(e,t,a);else if(t.memoizedState!==null)t.child=e.child,t.flags|=128,t=null;else throw Error(p(558));else if(xe||ln(e,t,a,!1),i=(a&e.childLanes)!==0,xe||i){if(n=de,n!==null&&(s=Sl(n,a),s!==0&&s!==o.retryLane))throw o.retryLane=s,ja(e,s),Ze(n,e,s),hr;ko(),t=_d(e,t,a)}else e=o.treeContext,he=yt(s.nextSibling),Re=t,I=!0,aa=null,gt=!1,e!==null&&yc(t,e),t=co(t,n),t.flags|=4096;return t}return e=Ut(e.child,{mode:n.mode,children:n.children}),e.ref=t.ref,t.child=e,e.return=t,e}function uo(e,t){var a=t.ref;if(a===null)e!==null&&e.ref!==null&&(t.flags|=4194816);else{if(typeof a!="function"&&typeof a!="object")throw Error(p(284));(e===null||e.ref!==a)&&(t.flags|=4194816)}}function pr(e,t,a,n,i){return Ra(t),a=Zs(e,t,a,n,void 0,i),n=Js(),e!==null&&!xe?(Ws(e,t,i),Gt(e,t,i)):(I&&n&&zs(t),t.flags|=1,qe(e,t,a,i),t.child)}function Md(e,t,a,n,i,o){return Ra(t),t.updateQueue=null,a=qc(t,n,a,i),Uc(e),n=Js(),e!==null&&!xe?(Ws(e,t,o),Gt(e,t,o)):(I&&n&&zs(t),t.flags|=1,qe(e,t,a,o),t.child)}function Rd(e,t,a,n,i){if(Ra(t),t.stateNode===null){var o=nn,s=a.contextType;typeof s=="object"&&s!==null&&(o=Ue(s)),o=new a(n,o),t.memoizedState=o.state!==null&&o.state!==void 0?o.state:null,o.updater=dr,t.stateNode=o,o._reactInternals=t,o=t.stateNode,o.props=n,o.state=t.memoizedState,o.refs={},Bs(t),s=a.contextType,o.context=typeof s=="object"&&s!==null?Ue(s):nn,o.state=t.memoizedState,s=a.getDerivedStateFromProps,typeof s=="function"&&(cr(t,a,s,n),o.state=t.memoizedState),typeof a.getDerivedStateFromProps=="function"||typeof o.getSnapshotBeforeUpdate=="function"||typeof o.UNSAFE_componentWillMount!="function"&&typeof o.componentWillMount!="function"||(s=o.state,typeof o.componentWillMount=="function"&&o.componentWillMount(),typeof o.UNSAFE_componentWillMount=="function"&&o.UNSAFE_componentWillMount(),s!==o.state&&dr.enqueueReplaceState(o,o.state,null),In(t,n,o,i),Fn(),o.state=t.memoizedState),typeof o.componentDidMount=="function"&&(t.flags|=4194308),n=!0}else if(e===null){o=t.stateNode;var r=t.memoizedProps,c=Ha(a,r);o.props=c;var m=o.context,w=a.contextType;s=nn,typeof w=="object"&&w!==null&&(s=Ue(w));var k=a.getDerivedStateFromProps;w=typeof k=="function"||typeof o.getSnapshotBeforeUpdate=="function",r=t.pendingProps!==r,w||typeof o.UNSAFE_componentWillReceiveProps!="function"&&typeof o.componentWillReceiveProps!="function"||(r||m!==s)&&bd(t,o,n,s),oa=!1;var g=t.memoizedState;o.state=g,In(t,n,o,i),Fn(),m=t.memoizedState,r||g!==m||oa?(typeof k=="function"&&(cr(t,a,k,n),m=t.memoizedState),(c=oa||wd(t,a,c,n,g,m,s))?(w||typeof o.UNSAFE_componentWillMount!="function"&&typeof o.componentWillMount!="function"||(typeof o.componentWillMount=="function"&&o.componentWillMount(),typeof o.UNSAFE_componentWillMount=="function"&&o.UNSAFE_componentWillMount()),typeof o.componentDidMount=="function"&&(t.flags|=4194308)):(typeof o.componentDidMount=="function"&&(t.flags|=4194308),t.memoizedProps=n,t.memoizedState=m),o.props=n,o.state=m,o.context=s,n=c):(typeof o.componentDidMount=="function"&&(t.flags|=4194308),n=!1)}else{o=t.stateNode,Hs(e,t),s=t.memoizedProps,w=Ha(a,s),o.props=w,k=t.pendingProps,g=o.context,m=a.contextType,c=nn,typeof m=="object"&&m!==null&&(c=Ue(m)),r=a.getDerivedStateFromProps,(m=typeof r=="function"||typeof o.getSnapshotBeforeUpdate=="function")||typeof o.UNSAFE_componentWillReceiveProps!="function"&&typeof o.componentWillReceiveProps!="function"||(s!==k||g!==c)&&bd(t,o,n,c),oa=!1,g=t.memoizedState,o.state=g,In(t,n,o,i),Fn();var v=t.memoizedState;s!==k||g!==v||oa||e!==null&&e.dependencies!==null&&Ki(e.dependencies)?(typeof r=="function"&&(cr(t,a,r,n),v=t.memoizedState),(w=oa||wd(t,a,w,n,g,v,c)||e!==null&&e.dependencies!==null&&Ki(e.dependencies))?(m||typeof o.UNSAFE_componentWillUpdate!="function"&&typeof o.componentWillUpdate!="function"||(typeof o.componentWillUpdate=="function"&&o.componentWillUpdate(n,v,c),typeof o.UNSAFE_componentWillUpdate=="function"&&o.UNSAFE_componentWillUpdate(n,v,c)),typeof o.componentDidUpdate=="function"&&(t.flags|=4),typeof o.getSnapshotBeforeUpdate=="function"&&(t.flags|=1024)):(typeof o.componentDidUpdate!="function"||s===e.memoizedProps&&g===e.memoizedState||(t.flags|=4),typeof o.getSnapshotBeforeUpdate!="function"||s===e.memoizedProps&&g===e.memoizedState||(t.flags|=1024),t.memoizedProps=n,t.memoizedState=v),o.props=n,o.state=v,o.context=c,n=w):(typeof o.componentDidUpdate!="function"||s===e.memoizedProps&&g===e.memoizedState||(t.flags|=4),typeof o.getSnapshotBeforeUpdate!="function"||s===e.memoizedProps&&g===e.memoizedState||(t.flags|=1024),n=!1)}return o=n,uo(e,t),n=(t.flags&128)!==0,o||n?(o=t.stateNode,a=n&&typeof a.getDerivedStateFromError!="function"?null:o.render(),t.flags|=1,e!==null&&n?(t.child=La(t,e.child,null,i),t.child=La(t,null,a,i)):qe(e,t,a,i),t.memoizedState=o.state,e=t.child):e=Gt(e,t,i),e}function Ud(e,t,a,n){return _a(),t.flags|=256,qe(e,t,a,n),t.child}var fr={dehydrated:null,treeContext:null,retryLane:0,hydrationErrors:null};function mr(e){return{baseLanes:e,cachePool:Dc()}}function gr(e,t,a){return e=e!==null?e.childLanes&~a:0,t&&(e|=lt),e}function qd(e,t,a){var n=t.pendingProps,i=!1,o=(t.flags&128)!==0,s;if((s=o)||(s=e!==null&&e.memoizedState===null?!1:(ke.current&2)!==0),s&&(i=!0,t.flags&=-129),s=(t.flags&32)!==0,t.flags&=-33,e===null){if(I){if(i?la(t):ca(t),(e=he)?(e=Xu(e,gt),e=e!==null&&e.data!=="&"?e:null,e!==null&&(t.memoizedState={dehydrated:e,treeContext:ta!==null?{id:Ct,overflow:zt}:null,retryLane:536870912,hydrationErrors:null},a=mc(e),a.return=t,t.child=a,Re=t,he=null)):e=null,e===null)throw na(t);return Ir(e)?t.lanes=32:t.lanes=536870912,null}var r=n.children;return n=n.fallback,i?(ca(t),i=t.mode,r=ho({mode:"hidden",children:r},i),n=Ea(n,i,a,null),r.return=t,n.return=t,r.sibling=n,t.child=r,n=t.child,n.memoizedState=mr(a),n.childLanes=gr(e,s,a),t.memoizedState=fr,ni(null,n)):(la(t),vr(t,r))}var c=e.memoizedState;if(c!==null&&(r=c.dehydrated,r!==null)){if(o)t.flags&256?(la(t),t.flags&=-257,t=yr(e,t,a)):t.memoizedState!==null?(ca(t),t.child=e.child,t.flags|=128,t=null):(ca(t),r=n.fallback,i=t.mode,n=ho({mode:"visible",children:n.children},i),r=Ea(r,i,a,null),r.flags|=2,n.return=t,r.return=t,n.sibling=r,t.child=n,La(t,e.child,null,a),n=t.child,n.memoizedState=mr(a),n.childLanes=gr(e,s,a),t.memoizedState=fr,t=ni(null,n));else if(la(t),Ir(r)){if(s=r.nextSibling&&r.nextSibling.dataset,s)var m=s.dgst;s=m,n=Error(p(419)),n.stack="",n.digest=s,Kn({value:n,source:null,stack:null}),t=yr(e,t,a)}else if(xe||ln(e,t,a,!1),s=(a&e.childLanes)!==0,xe||s){if(s=de,s!==null&&(n=Sl(s,a),n!==0&&n!==c.retryLane))throw c.retryLane=n,ja(e,n),Ze(s,e,n),hr;
vendor: 6,386 bytes, line 9
9Fr(r)||ko(),t=yr(e,t,a)}else Fr(r)?(t.flags|=192,t.child=e.child,t=null):(e=c.treeContext,he=yt(r.nextSibling),Re=t,I=!0,aa=null,gt=!1,e!==null&&yc(t,e),t=vr(t,n.children),t.flags|=4096);return t}return i?(ca(t),r=n.fallback,i=t.mode,c=e.child,m=c.sibling,n=Ut(c,{mode:"hidden",children:n.children}),n.subtreeFlags=c.subtreeFlags&65011712,m!==null?r=Ut(m,r):(r=Ea(r,i,a,null),r.flags|=2),r.return=t,n.return=t,n.sibling=r,t.child=n,ni(null,n),n=t.child,r=e.child.memoizedState,r===null?r=mr(a):(i=r.cachePool,i!==null?(c=Ae._currentValue,i=i.parent!==c?{parent:c,pool:c}:i):i=Dc(),r={baseLanes:r.baseLanes|a,cachePool:i}),n.memoizedState=r,n.childLanes=gr(e,s,a),t.memoizedState=fr,ni(e.child,n)):(la(t),a=e.child,e=a.sibling,a=Ut(a,{mode:"visible",children:n.children}),a.return=t,a.sibling=null,e!==null&&(s=t.deletions,s===null?(t.deletions=[e],t.flags|=16):s.push(e)),t.child=a,t.memoizedState=null,a)}function vr(e,t){return t=ho({mode:"visible",children:t},e.mode),t.return=e,e.child=t}function ho(e,t){return e=it(22,e,null,t),e.lanes=0,e}function yr(e,t,a){return La(t,e.child,null,a),e=vr(t,t.pendingProps.children),e.flags|=2,t.memoizedState=null,e}function Nd(e,t,a){e.lanes|=t;var n=e.alternate;n!==null&&(n.lanes|=t),Ms(e.return,t,a)}function wr(e,t,a,n,i,o){var s=e.memoizedState;s===null?e.memoizedState={isBackwards:t,rendering:null,renderingStartTime:0,last:n,tail:a,tailMode:i,treeForkCount:o}:(s.isBackwards=t,s.rendering=null,s.renderingStartTime=0,s.last=n,s.tail=a,s.tailMode=i,s.treeForkCount=o)}function Ld(e,t,a){var n=t.pendingProps,i=n.revealOrder,o=n.tail;n=n.children;var s=ke.current,r=(s&2)!==0;if(r?(s=s&1|2,t.flags|=128):s&=1,T(ke,s),qe(e,t,n,a),n=I?Xn:0,!r&&e!==null&&(e.flags&128)!==0)e:for(e=t.child;e!==null;){if(e.tag===13)e.memoizedState!==null&&Nd(e,a,t);else if(e.tag===19)Nd(e,a,t);else if(e.child!==null){e.child.return=e,e=e.child;continue}if(e===t)break e;for(;e.sibling===null;){if(e.return===null||e.return===t)break e;e=e.return}e.sibling.return=e.return,e=e.sibling}switch(i){case"forwards":for(a=t.child,i=null;a!==null;)e=a.alternate,e!==null&&$i(e)===null&&(i=a),a=a.sibling;a=i,a===null?(i=t.child,t.child=null):(i=a.sibling,a.sibling=null),wr(t,!1,i,a,o,n);break;case"backwards":case"unstable_legacy-backwards":for(a=null,i=t.child,t.child=null;i!==null;){if(e=i.alternate,e!==null&&$i(e)===null){t.child=i;break}e=i.sibling,i.sibling=a,a=i,i=e}wr(t,!0,a,null,o,n);break;case"together":wr(t,!1,null,null,void 0,n);break;default:t.memoizedState=null}return t.child}function Gt(e,t,a){if(e!==null&&(t.dependencies=e.dependencies),ha|=t.lanes,(a&t.childLanes)===0)if(e!==null){if(ln(e,t,a,!1),(a&t.childLanes)===0)return null}else return null;if(e!==null&&t.child!==e.child)throw Error(p(153));if(t.child!==null){for(e=t.child,a=Ut(e,e.pendingProps),t.child=a,a.return=t;e.sibling!==null;)e=e.sibling,a=a.sibling=Ut(e,e.pendingProps),a.return=t;a.sibling=null}return t.child}function br(e,t){return(e.lanes&t)!==0?!0:(e=e.dependencies,!!(e!==null&&Ki(e)))}function Yp(e,t,a){switch(t.tag){case 3:Le(t,t.stateNode.containerInfo),ia(t,Ae,e.memoizedState.cache),_a();break;case 27:case 5:On(t);break;case 4:Le(t,t.stateNode.containerInfo);break;case 10:ia(t,t.type,t.memoizedProps.value);break;case 31:if(t.memoizedState!==null)return t.flags|=128,Ks(t),null;break;case 13:var n=t.memoizedState;if(n!==null)return n.dehydrated!==null?(la(t),t.flags|=128,null):(a&t.child.childLanes)!==0?qd(e,t,a):(la(t),e=Gt(e,t,a),e!==null?e.sibling:null);la(t);break;case 19:var i=(e.flags&128)!==0;if(n=(a&t.childLanes)!==0,n||(ln(e,t,a,!1),n=(a&t.childLanes)!==0),i){if(n)return Ld(e,t,a);t.flags|=128}if(i=t.memoizedState,i!==null&&(i.rendering=null,i.tail=null,i.lastEffect=null),T(ke,ke.current),n)break;return null;case 22:return t.lanes=0,jd(e,t,a,t.pendingProps);case 24:ia(t,Ae,e.memoizedState.cache)}return Gt(e,t,a)}function Bd(e,t,a){if(e!==null)if(e.memoizedProps!==t.pendingProps)xe=!0;else{if(!br(e,a)&&(t.flags&128)===0)return xe=!1,Yp(e,t,a);xe=(e.flags&131072)!==0}else xe=!1,I&&(t.flags&1048576)!==0&&vc(t,Xn,t.index);switch(t.lanes=0,t.tag){case 16:e:{var n=t.pendingProps;if(e=qa(t.elementType),t.type=e,typeof e=="function")xs(e)?(n=Ha(e,n),t.tag=1,t=Rd(null,t,e,n,a)):(t.tag=0,t=pr(null,t,e,n,a));else{if(e!=null){var i=e.$$typeof;if(i===bt){t.tag=11,t=Cd(null,t,e,n,a);break e}else if(i===$){t.tag=14,t=zd(null,t,e,n,a);break e}}throw t=kt(e)||e,Error(p(306,t,""))}}return t;case 0:return pr(e,t,t.type,t.pendingProps,a);case 1:return n=t.type,i=Ha(n,t.pendingProps),Rd(e,t,n,i,a);case 3:e:{if(Le(t,t.stateNode.containerInfo),e===null)throw Error(p(387));n=t.pendingProps;var o=t.memoizedState;i=o.element,Hs(e,t),In(t,n,null,a);var s=t.memoizedState;if(n=s.cache,ia(t,Ae,n),n!==o.cache&&Rs(t,[Ae],a,!0),Fn(),n=s.element,o.isDehydrated)if(o={element:n,isDehydrated:!1,cache:s.cache},t.updateQueue.baseState=o,t.memoizedState=o,t.flags&256){t=Ud(e,t,n,a);break e}else if(n!==i){i=pt(Error(p(424)),t),Kn(i),t=Ud(e,t,n,a);break e}else for(e=t.stateNode.containerInfo,e.nodeType===9?e=e.body:e=e.nodeName==="HTML"?e.ownerDocument.body:e,he=yt(e.firstChild),Re=t,I=!0,aa=null,gt=!0,a=jc(t,null,n,a),t.child=a;a;)a.flags=a.flags&-3|4096,a=a.sibling;else{if(_a(),n===i){t=Gt(e,t,a);break e}qe(e,t,n,a)}t=t.child}return t;case 26:return uo(e,t),e===null?(a=Pu(t.type,null,t.pendingProps,null))?t.memoizedState=a:I||(a=t.type,e=t.pendingProps,n=zo(Q.current).createElement(a),n[Me]=t,n[Ge]=e,Ne(n,a,e),je(n),t.stateNode=n):t.memoizedState=Pu(t.type,e.memoizedProps,t.pendingProps,e.memoizedState),null;case 27:return On(t),e===null&&I&&(n=t.stateNode=Zu(t.type,t.pendingProps,Q.current),Re=t,gt=!0,i=he,va(t.type)?($r=i,he=yt(n.firstChild)):he=i),qe(e,t,t.pendingProps.children,a),uo(e,t),e===null&&(t.flags|=4194304),t.child;case 5:return e===null&&I&&((i=n=he)&&(n=vf(n,t.type,t.pendingProps,gt),n!==null?(t.stateNode=n,Re=t,he=yt(n.firstChild),gt=!1,i=!0):i=!1),i||na(t)),On(t),i=t.type,o=t.pendingProps,s=e!==null?e.memoizedProps:null,n=o.children,Jr(i,o)?n=null:s!==null&&Jr(i,s)&&(t.flags|=32),t.memoizedState!==null&&(i=Zs(e,t,Mp,null,null,a),yi._currentValue=i),uo(e,t),qe(e,t,n,a),t.child;case 6:return e===null&&I&&((e=a=he)&&(a=yf(a,t.pendingProps,gt),a!==null?(t.stateNode=a,Re=t,he=null,e=!0):e=!1),e||na(t)),null;case 13:return qd(e,t,a);case 4:return Le(t,t.stateNode.containerInfo),n=t.pendingProps,e===null?t.child=La(t,
vendor: 18,379 bytes, line 9
9null,n,a):qe(e,t,n,a),t.child;case 11:return Cd(e,t,t.type,t.pendingProps,a);case 7:return qe(e,t,t.pendingProps,a),t.child;case 8:return qe(e,t,t.pendingProps.children,a),t.child;case 12:return qe(e,t,t.pendingProps.children,a),t.child;case 10:return n=t.pendingProps,ia(t,t.type,n.value),qe(e,t,n.children,a),t.child;case 9:return i=t.type._context,n=t.pendingProps.children,Ra(t),i=Ue(i),n=n(i),t.flags|=1,qe(e,t,n,a),t.child;case 14:return zd(e,t,t.type,t.pendingProps,a);case 15:return Od(e,t,t.type,t.pendingProps,a);case 19:return Ld(e,t,a);case 31:return Gp(e,t,a);case 22:return jd(e,t,a,t.pendingProps);case 24:return Ra(t),n=Ue(Ae),e===null?(i=Ns(),i===null&&(i=de,o=Us(),i.pooledCache=o,o.refCount++,o!==null&&(i.pooledCacheLanes|=a),i=o),t.memoizedState={parent:n,cache:i},Bs(t),ia(t,Ae,i)):((e.lanes&a)!==0&&(Hs(e,t),In(t,null,null,a),Fn()),i=e.memoizedState,o=t.memoizedState,i.parent!==n?(i={parent:n,cache:n},t.memoizedState=i,t.lanes===0&&(t.memoizedState=t.updateQueue.baseState=i),ia(t,Ae,n)):(n=o.cache,ia(t,Ae,n),n!==i.cache&&Rs(t,[Ae],a,!0))),qe(e,t,t.pendingProps.children,a),t.child;case 29:throw t.pendingProps}throw Error(p(156,t.tag))}function Yt(e){e.flags|=4}function kr(e,t,a,n,i){if((t=(e.mode&32)!==0)&&(t=!1),t){if(e.flags|=16777216,(i&335544128)===i)if(e.stateNode.complete)e.flags|=8192;else if(hu())e.flags|=8192;else throw Na=Wi,Ls}else e.flags&=-16777217}function Hd(e,t){if(t.type!=="stylesheet"||(t.state.loading&4)!==0)e.flags&=-16777217;else if(e.flags|=16777216,!th(t))if(hu())e.flags|=8192;else throw Na=Wi,Ls}function po(e,t){t!==null&&(e.flags|=4),e.flags&16384&&(t=e.tag!==22?wl():536870912,e.lanes|=t,bn|=t)}function ii(e,t){if(!I)switch(e.tailMode){case"hidden":t=e.tail;for(var a=null;t!==null;)t.alternate!==null&&(a=t),t=t.sibling;a===null?e.tail=null:a.sibling=null;break;case"collapsed":a=e.tail;for(var n=null;a!==null;)a.alternate!==null&&(n=a),a=a.sibling;n===null?t||e.tail===null?e.tail=null:e.tail.sibling=null:n.sibling=null}}function pe(e){var t=e.alternate!==null&&e.alternate.child===e.child,a=0,n=0;if(t)for(var i=e.child;i!==null;)a|=i.lanes|i.childLanes,n|=i.subtreeFlags&65011712,n|=i.flags&65011712,i.return=e,i=i.sibling;else for(i=e.child;i!==null;)a|=i.lanes|i.childLanes,n|=i.subtreeFlags,n|=i.flags,i.return=e,i=i.sibling;return e.subtreeFlags|=n,e.childLanes=a,t}function Vp(e,t,a){var n=t.pendingProps;switch(Os(t),t.tag){case 16:case 15:case 0:case 11:case 7:case 8:case 12:case 9:case 14:return pe(t),null;case 1:return pe(t),null;case 3:return a=t.stateNode,n=null,e!==null&&(n=e.memoizedState.cache),t.memoizedState.cache!==n&&(t.flags|=2048),Lt(Ae),be(),a.pendingContext&&(a.context=a.pendingContext,a.pendingContext=null),(e===null||e.child===null)&&(rn(t)?Yt(t):e===null||e.memoizedState.isDehydrated&&(t.flags&256)===0||(t.flags|=1024,Es())),pe(t),null;case 26:var i=t.type,o=t.memoizedState;return e===null?(Yt(t),o!==null?(pe(t),Hd(t,o)):(pe(t),kr(t,i,null,n,a))):o?o!==e.memoizedState?(Yt(t),pe(t),Hd(t,o)):(pe(t),t.flags&=-16777217):(e=e.memoizedProps,e!==n&&Yt(t),pe(t),kr(t,i,e,n,a)),null;case 27:if(Ai(t),a=Q.current,i=t.type,e!==null&&t.stateNode!=null)e.memoizedProps!==n&&Yt(t);else{if(!n){if(t.stateNode===null)throw Error(p(166));return pe(t),null}e=U.current,rn(t)?wc(t,e):(e=Zu(i,n,a),t.stateNode=e,Yt(t))}return pe(t),null;case 5:if(Ai(t),i=t.type,e!==null&&t.stateNode!=null)e.memoizedProps!==n&&Yt(t);else{if(!n){if(t.stateNode===null)throw Error(p(166));return pe(t),null}if(o=U.current,rn(t))wc(t,o);else{var s=zo(Q.current);switch(o){case 1:o=s.createElementNS("http://www.w3.org/2000/svg",i);break;case 2:o=s.createElementNS("http://www.w3.org/1998/Math/MathML",i);break;default:switch(i){case"svg":o=s.createElementNS("http://www.w3.org/2000/svg",i);break;case"math":o=s.createElementNS("http://www.w3.org/1998/Math/MathML",i);break;case"script":o=s.createElement("div"),o.innerHTML="<script><\/script>",o=o.removeChild(o.firstChild);break;case"select":o=typeof n.is=="string"?s.createElement("select",{is:n.is}):s.createElement("select"),n.multiple?o.multiple=!0:n.size&&(o.size=n.size);break;default:o=typeof n.is=="string"?s.createElement(i,{is:n.is}):s.createElement(i)}}o[Me]=t,o[Ge]=n;e:for(s=t.child;s!==null;){if(s.tag===5||s.tag===6)o.appendChild(s.stateNode);else if(s.tag!==4&&s.tag!==27&&s.child!==null){s.child.return=s,s=s.child;continue}if(s===t)break e;for(;s.sibling===null;){if(s.return===null||s.return===t)break e;s=s.return}s.sibling.return=s.return,s=s.sibling}t.stateNode=o;e:switch(Ne(o,i,n),i){case"button":case"input":case"select":case"textarea":n=!!n.autoFocus;break e;case"img":n=!0;break e;default:n=!1}n&&Yt(t)}}return pe(t),kr(t,t.type,e===null?null:e.memoizedProps,t.pendingProps,a),null;case 6:if(e&&t.stateNode!=null)e.memoizedProps!==n&&Yt(t);else{if(typeof n!="string"&&t.stateNode===null)throw Error(p(166));if(e=Q.current,rn(t)){if(e=t.stateNode,a=t.memoizedProps,n=null,i=Re,i!==null)switch(i.tag){case 27:case 5:n=i.memoizedProps}e[Me]=t,e=!!(e.nodeValue===a||n!==null&&n.suppressHydrationWarning===!0||qu(e.nodeValue,a)),e||na(t,!0)}else e=zo(e).createTextNode(n),e[Me]=t,t.stateNode=e}return pe(t),null;case 31:if(a=t.memoizedState,e===null||e.memoizedState!==null){if(n=rn(t),a!==null){if(e===null){if(!n)throw Error(p(318));if(e=t.memoizedState,e=e!==null?e.dehydrated:null,!e)throw Error(p(557));e[Me]=t}else _a(),(t.flags&128)===0&&(t.memoizedState=null),t.flags|=4;pe(t),e=!1}else a=Es(),e!==null&&e.memoizedState!==null&&(e.memoizedState.hydrationErrors=a),e=!0;if(!e)return t.flags&256?(st(t),t):(st(t),null);if((t.flags&128)!==0)throw Error(p(558))}return pe(t),null;case 13:if(n=t.memoizedState,e===null||e.memoizedState!==null&&e.memoizedState.dehydrated!==null){if(i=rn(t),n!==null&&n.dehydrated!==null){if(e===null){if(!i)throw Error(p(318));if(i=t.memoizedState,i=i!==null?i.dehydrated:null,!i)throw Error(p(317));i[Me]=t}else _a(),(t.flags&128)===0&&(t.memoizedState=null),t.flags|=4;pe(t),i=!1}else i=Es(),e!==null&&e.memoizedState!==null&&(e.memoizedState.hydrationErrors=i),i=!0;if(!i)return t.flags&256?(st(t),t):(st(t),null)}return st(t),(t.flags&128)!==0?(t.lanes=a,t):(a=n!==null,e=e!==null&&e.memoizedState!==null,a&&(n=t.child,i=null,n.alternate!==null&&n.alternate.memoizedState!==null&&n.alternate.memoizedState.cachePool!==null&&(i=n.alternate.memoizedState.cachePool.pool),o=null,n.memoizedState!==null&&n.memoizedState.cachePool!==null&&(o=n.memoizedState.cachePool.pool),o!==i&&(n.flags|=2048)),a!==e&&a&&(t.child.flags|=8192),po(t,t.updateQueue),pe(t),null);case 4:return be(),e===null&&Vr(t.stateNode.containerInfo),pe(t),null;case 10:return Lt(t.type),pe(t),null;case 19:if(S(ke),n=t.memoizedState,n===null)return pe(t),null;if(i=(t.flags&128)!==0,o=n.rendering,o===null)if(i)ii(n,!1);else{if(ye!==0||e!==null&&(e.flags&128)!==0)for(e=t.child;e!==null;){if(o=$i(e),o!==null){for(t.flags|=128,ii(n,!1),e=o.updateQueue,t.updateQueue=e,po(t,e),t.subtreeFlags=0,e=a,a=t.child;a!==null;)fc(a,e),a=a.sibling;return T(ke,ke.current&1|2),I&&qt(t,n.treeForkCount),t.child}e=e.sibling}n.tail!==null&&et()>yo&&(t.flags|=128,i=!0,ii(n,!1),t.lanes=4194304)}else{if(!i)if(e=$i(o),e!==null){if(t.flags|=128,i=!0,e=e.updateQueue,t.updateQueue=e,po(t,e),ii(n,!0),n.tail===null&&n.tailMode==="hidden"&&!o.alternate&&!I)return pe(t),null}else 2*et()-n.renderingStartTime>yo&&a!==536870912&&(t.flags|=128,i=!0,ii(n,!1),t.lanes=4194304);n.isBackwards?(o.sibling=t.child,t.child=o):(e=n.last,e!==null?e.sibling=o:t.child=o,n.last=o)}return n.tail!==null?(e=n.tail,n.rendering=e,n.tail=e.sibling,n.renderingStartTime=et(),e.sibling=null,a=ke.current,T(ke,i?a&1|2:a&1),I&&qt(t,n.treeForkCount),e):(pe(t),null);case 22:case 23:return st(t),Xs(),n=t.memoizedState!==null,e!==null?e.memoizedState!==null!==n&&(t.flags|=8192):n&&(t.flags|=8192),n?(a&536870912)!==0&&(t.flags&128)===0&&(pe(t),t.subtreeFlags&6&&(t.flags|=8192)):pe(t),a=t.updateQueue,a!==null&&po(t,a.retryQueue),a=null,e!==null&&e.memoizedState!==null&&e.memoizedState.cachePool!==null&&(a=e.memoizedState.cachePool.pool),n=null,t.memoizedState!==null&&t.memoizedState.cachePool!==null&&(n=t.memoizedState.cachePool.pool),n!==a&&(t.flags|=2048),e!==null&&S(Ua),null;case 24:return a=null,e!==null&&(a=e.memoizedState.cache),t.memoizedState.cache!==a&&(t.flags|=2048),Lt(Ae),pe(t),null;case 25:return null;case 30:return null}throw Error(p(156,t.tag))}function Xp(e,t){switch(Os(t),t.tag){case 1:return e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 3:return Lt(Ae),be(),e=t.flags,(e&65536)!==0&&(e&128)===0?(t.flags=e&-65537|128,t):null;case 26:case 27:case 5:return Ai(t),null;case 31:if(t.memoizedState!==null){if(st(t),t.alternate===null)throw Error(p(340));_a()}return e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 13:if(st(t),e=t.memoizedState,e!==null&&e.dehydrated!==null){if(t.alternate===null)throw Error(p(340));_a()}return e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 19:return S(ke),null;case 4:return be(),null;case 10:return Lt(t.type),null;case 22:case 23:return st(t),Xs(),e!==null&&S(Ua),e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 24:return Lt(Ae),null;case 25:return null;default:return null}}function Gd(e,t){switch(Os(t),t.tag){case 3:Lt(Ae),be();break;case 26:case 27:case 5:Ai(t);break;case 4:be();break;case 31:t.memoizedState!==null&&st(t);break;case 13:st(t);break;case 19:S(ke);break;case 10:Lt(t.type);break;case 22:case 23:st(t),Xs(),e!==null&&S(Ua);break;case 24:Lt(Ae)}}function oi(e,t){try{var a=t.updateQueue,n=a!==null?a.lastEffect:null;if(n!==null){var i=n.next;a=i;do{if((a.tag&e)===e){n=void 0;var o=a.create,s=a.inst;n=o(),s.destroy=n}a=a.next}while(a!==i)}}catch(r){se(t,t.return,r)}}function da(e,t,a){try{var n=t.updateQueue,i=n!==null?n.lastEffect:null;if(i!==null){var o=i.next;n=o;do{if((n.tag&e)===e){var s=n.inst,r=s.destroy;if(r!==void 0){s.destroy=void 0,i=t;var c=a,m=r;try{m()}catch(w){se(i,c,w)}}}n=n.next}while(n!==o)}}catch(w){se(t,t.return,w)}}function Yd(e){var t=e.updateQueue;if(t!==null){var a=e.stateNode;try{_c(t,a)}catch(n){se(e,e.return,n)}}}function Vd(e,t,a){a.props=Ha(e.type,e.memoizedProps),a.state=e.memoizedState;try{a.componentWillUnmount()}catch(n){se(e,t,n)}}function si(e,t){try{var a=e.ref;if(a!==null){switch(e.tag){case 26:case 27:case 5:var n=e.stateNode;break;case 30:n=e.stateNode;break;default:n=e.stateNode}typeof a=="function"?e.refCleanup=a(n):a.current=n}}catch(i){se(e,t,i)}}function Ot(e,t){var a=e.ref,n=e.refCleanup;if(a!==null)if(typeof n=="function")try{n()}catch(i){se(e,t,i)}finally{e.refCleanup=null,e=e.alternate,e!=null&&(e.refCleanup=null)}else if(typeof a=="function")try{a(null)}catch(i){se(e,t,i)}else a.current=null}function Xd(e){var t=e.type,a=e.memoizedProps,n=e.stateNode;try{e:switch(t){case"button":case"input":case"select":case"textarea":a.autoFocus&&n.focus();break e;case"img":a.src?n.src=a.src:a.srcSet&&(n.srcset=a.srcSet)}}catch(i){se(e,e.return,i)}}function Sr(e,t,a){try{var n=e.stateNode;uf(n,e.type,a,t),n[Ge]=t}catch(i){se(e,e.return,i)}}function Kd(e){return e.tag===5||e.tag===3||e.tag===26||e.tag===27&&va(e.type)||e.tag===4}function Ar(e){e:for(;;){for(;e.sibling===null;){if(e.return===null||Kd(e.return))return null;e=e.return}for(e.sibling.return=e.return,e=e.sibling;e.tag!==5&&e.tag!==6&&e.tag!==18;){if(e.tag===27&&va(e.type)||e.flags&2||e.child===null||e.tag===4)continue e;e.child.return=e,e=e.child}if(!(e.flags&2))return e.stateNode}}function Dr(e,t,a){var n=e.tag;if(n===5||n===6)e=e.stateNode,t?(a.nodeType===9?a.body:a.nodeName==="HTML"?a.ownerDocument.body:a).insertBefore(e,t):(t=a.nodeType===9?a.body:a.nodeName==="HTML"?a.ownerDocument.body:a,t.appendChild(e),a=a._reactRootContainer,a!=null||t.onclick!==null||(t.onclick=Mt));else if(n!==4&&(n===27&&va(e.type)&&(a=e.stateNode,t=null),e=e.child,e!==null))for(Dr(e,t,a),e=e.sibling;e!==null;)Dr(e,t,a),e=e.sibling}function fo(e,t,a){var n=e.tag;if(n===5||n===6)e=e.stateNode,t?a.insertBefore(e,t):a.appendChild(e);else if(n!==4&&(n===27&&va(e.type)&&(a=e.stateNode),e=e.child,e!==null))for(fo(e,t,a),e=e.sibling;e!==null;)fo(e,t,a),e=e.sibling}function Qd(e){var t=e.stateNode,a=e.memoizedProps;try{for(var n=e.type,i=t.attributes;i.length;)t.removeAttributeNode(i[0]);Ne(t,n,a),t[Me]=e,t[Ge]=a}catch(o){se(e,e.return,o)}}var Vt=!1,Te=!1,xr=!1,Zd=typeof WeakSet=="function"?WeakSet:Set,Ee=null;function Kp(e,t){if(e=e.containerInfo,Qr=Uo,e=oc(e),ys(e)){if("selectionStart"in e)var a={start:e.selectionStart,end:e.selectionEnd};else e:{a=(a=e.ownerDocument)&&a.defaultView||window;var n=a.getSelection&&a.getSelection();if(n&&n.rangeCount!==0){a=n.anchorNode;var i=n.anchorOffset,o=n.focusNode;n=n.focusOffset;try{a.nodeType,o.nodeType}catch{a=null;break e}var s=0,r=-1,c=-1,m=0,w=0,k=e,g=null;t:for(;;){for(var v;k!==a||i!==0&&k.nodeType!==3||(r=s+i),k!==o||n!==0&&k.nodeType!==3||(c=s+n),k.nodeType===3&&(s+=k.nodeValue.length),(v=k.firstChild)!==null;)g=k,k=v;for(;;){if(k===e)break t;if(g===a&&++m===i&&(r=s),g===o&&++w===n&&(c=s),(v=k.nextSibling)!==null)break;k=g,g=k.parentNode}k=v}a=r===-1||c===-1?null:{start:r,end:c}}else a=null}a=a||{start:0,end:0}}else a=null;for(Zr={focusedElem:e,selectionRange:a},Uo=!1,Ee=t;Ee!==null;)if(t=Ee,e=t.child,(t.subtreeFlags&1028)!==0&&e!==null)e.return=t,Ee=e;else for(;Ee!==null;){switch(t=Ee,o=t.alternate,e=t.flags,t.tag){case 0:if((e&4)!==0&&(e=t.updateQueue,e=e!==null?e.events:null,e!==null))for(a=0;a<e.length;a++)i=e[a],i.ref.impl=i.nextImpl;break;case 11:case 15:break;case 1:if((e&1024)!==0&&o!==null){e=void 0,a=t,i=o.memoizedProps,o=o.memoizedState,n=a.stateNode;try{var E=Ha(a.type,i);e=n.getSnapshotBeforeUpdate(E,o),n.__reactInternalSnapshotBeforeUpdate=e}catch(B){se(a,a.return,B)}}break;case 3:if((e&1024)!==0){if(e=t.stateNode.containerInfo,a=e.nodeType,a===9)Pr(e);else if(a===1)switch(e.nodeName){case"HEAD":case"HTML":case"BODY":Pr(e);break;default:e.textContent=""}}break;case 5:case 26:case 27:case 6:case 4:case 17:break;default:if((e&1024)!==0)throw Error(p(163))}if(e=t.sibling,e!==null){e.return=t.return,Ee=e;break}Ee=t.return}}function Jd(e,t,a){var n=a.flags;switch(a.tag){case 0:case 11:case 15:Kt(e,a),n&4&&oi(5,a);break;case 1:if(Kt(e,a),n&4)if(e=a.stateNode,t===null)try{e.componentDidMount()}catch(s){se(a,a.return,s)}else{var i=Ha(a.type,t.memoizedProps);t=t.memoizedState;try{e.componentDidUpdate(i,t,e.__reactInternalSnapshotBeforeUpdate)}catch(s){se(a,a.return,s)}}n&64&&Yd(a),n&512&&si(a,a.return);break;case 3:if(Kt(e,a),n&64&&(e=a.updateQueue,e!==null)){if(t=null,a.child!==null)switch(a.child.tag){case 27:case 5:t=a.child.stateNode;break;case 1:t=a.child.stateNode}try{_c(e,t)}catch(s){se(a,a.return,s)}}break;case 27:t===null&&n&4&&Qd(a);case 26:case 5:Kt(e,a),t===null&&n&4&&Xd(a),n&512&&si(a,a.return);break;case 12:Kt(e,a);break;case 31:Kt(e,a),n&4&&Fd(e,a);break;case 13:Kt(e,a),n&4&&Id(e,a),n&64&&(e=a.memoizedState,e!==null&&(e=e.dehydrated,e!==null&&(a=ef.bind(null,a),wf(e,a))));break;case 22:if(n=a.memoizedState!==null||Vt,!n){t=t!==null&&t.memoizedState!==null||Te,i=Vt;var o=Te;Vt=n,(Te=t)&&!o?Qt(e,a,(a.subtreeFlags&8772)!==0):Kt(e,a),Vt=i,Te=o}break;case 30:break;default:Kt(e,a)}}function Wd(e){var t=e.alternate;t!==null&&(e.alternate=null,Wd(t)),e.child=null,e.deletions=null,e.sibling=null,e.tag===5&&(t=e.stateNode,t!==null&&ts(t)),e.stateNode=null,e.return=null,e.dependencies=null,e.memoizedProps=null,e.memoizedState=null,e.pendingProps=null,e.stateNode=null,e.updateQueue=null}var fe=null,Ve=!1;function Xt(e,t,a){for(a=a.child;a!==null;)Pd(e,t,a),a=a.sibling}function Pd(e,t,a){if(tt&&typeof tt.onCommitFiberUnmount=="function")try{tt.onCommitFiberUnmount(jn,a)}catch{}switch(a.tag){case 26:Te||Ot(a,t),Xt(e,t,a),a.memoizedState?a.memoizedState.count--:a.stateNode&&(a=a.stateNode,a.parentNode.removeChild(a));break;case 27:Te||Ot(a,t);var n=fe,i=Ve;va(a.type)&&(fe=a.stateNode,Ve=!1),Xt(e,t,a),mi(a.stateNode),fe=n,Ve=i;break;case 5:Te||Ot(a,t);case 6:if(n=fe,i=Ve,fe=null,Xt(e,t,a),fe=n,Ve=i,fe!==null)if(Ve)try{(fe.nodeType===9?fe.body:fe.nodeName==="HTML"?fe.ownerDocument.body:fe).removeChild(a.stateNode)}catch(o){se(a,t,o)}else try{fe.removeChild(a.stateNode)}catch(o){se(a,t,o)}break;case 18:fe!==null&&(Ve?(e=fe,Yu(e.nodeType===9?e.body:e.nodeName==="HTML"?e.ownerDocument.body:e,a.stateNode),zn(e)):Yu(fe,a.stateNode));break;case 4:n=fe,i=Ve,fe=a.stateNode.containerInfo,Ve=!0,Xt(e,t,a),fe=n,Ve=i;break;case 0:case 11:case 14:case 15:da(2,a,t),Te||da(4,a,t),Xt(e,t,a);break;case 1:Te||(Ot(a,t),n=a.stateNode,typeof n.componentWillUnmount=="function"&&Vd(a,t,n)),Xt(e,t,a);break;case 21:Xt(e,t,a);break;case 22:Te=(n=Te)||a.memoizedState!==null,Xt(e,t,a),Te=n;break;default:Xt(e,t,a)}}function Fd(e,t){if(t.memoizedState===null&&(e=t.alternate,e!==null&&(e=e.memoizedState,e!==null))){e=e.dehydrated;try{zn(e)}catch(a){se(t,t.return,a)}}}function Id(e,t){if(t.memoizedState===null&&(e=t.alternate,e!==null&&(e=e.memoizedState,e!==null&&(e=e.dehydrated,e!==null))))try{zn(e)}catch(a){se(t,t.return,a)}}function Qp(e){switch(e.tag){case 31:case 13:case 19:var t=e.stateNode;return t===null&&(t=e.stateNode=new Zd),t;case 22:return e=e.stateNode,t=e._retryCache,t===null&&(t=e._retryCache=new Zd),t;default:throw Error(p(435,e.tag))}}function mo(e,t){var a=Qp(e);t.forEach(function(n){if(!a.has(n)){a.add(n);var i=tf.bind(null,e,n);n.then(i,i)}})}function Xe(e,t){var a=t.deletions;if(a!==null)for(var n=0;n<a.length;n++){var i=a[n],o=e,s=t,r=s;e:for(;r!==null;){switch(r.tag){case 27:if(va(r.type)){fe=r.stateNode,Ve=!1;break e}break;case 5:fe=r.stateNode,Ve=!1;break e;case 3:case 4:fe=r.stateNode.containerInfo,Ve=!0;break e}r=r.return}if(fe===null)throw Error(p(160));Pd(o,s,i),fe=null,Ve=!1,o=i.alternate,o!==null&&(o.return=null),i.return=null}if(t.subtreeFlags&13886)for(t=t.child;t!==null;)$d(t,e),t=t.sibling}var At=null;function $d(e,t){var a=e.alternate,n=e.flags;switch(e.tag){case 0:case 11:case 14:case 15:Xe(t,e),Ke(e),n&4&&(da(3,e,e.return),oi(3,e),da(5,e,e.return));break;case 1:Xe(t,e),Ke(e),n&512&&(Te||a===null||Ot(a,a.return)),n&64&&Vt&&(e=e.updateQueue,e!==null&&(n=e.callbacks,n!==null&&(a=e.shared.hiddenCallbacks,e.shared.hiddenCallbacks=a===null?n:a.concat(n))));break;case 26:var i=At;if(Xe(t,e),Ke(e),n&512&&(Te||a===null||Ot(a,a.return)),n&4){var o=a!==null?a.memoizedState:null;if(n=e.memoizedState,a===null)if(n===null)if(e.stateNode===null){e:{n=e.type,a=e.memoizedProps,i=i.ownerDocument||i;
vendor: 5,401 bytes, line 9
9t:switch(n){case"title":o=i.getElementsByTagName("title")[0],(!o||o[Mn]||o[Me]||o.namespaceURI==="http://www.w3.org/2000/svg"||o.hasAttribute("itemprop"))&&(o=i.createElement(n),i.head.insertBefore(o,i.querySelector("head > title"))),Ne(o,n,a),o[Me]=e,je(o),n=o;break e;case"link":var s=$u("link","href",i).get(n+(a.href||""));if(s){for(var r=0;r<s.length;r++)if(o=s[r],o.getAttribute("href")===(a.href==null||a.href===""?null:a.href)&&o.getAttribute("rel")===(a.rel==null?null:a.rel)&&o.getAttribute("title")===(a.title==null?null:a.title)&&o.getAttribute("crossorigin")===(a.crossOrigin==null?null:a.crossOrigin)){s.splice(r,1);break t}}o=i.createElement(n),Ne(o,n,a),i.head.appendChild(o);break;case"meta":if(s=$u("meta","content",i).get(n+(a.content||""))){for(r=0;r<s.length;r++)if(o=s[r],o.getAttribute("content")===(a.content==null?null:""+a.content)&&o.getAttribute("name")===(a.name==null?null:a.name)&&o.getAttribute("property")===(a.property==null?null:a.property)&&o.getAttribute("http-equiv")===(a.httpEquiv==null?null:a.httpEquiv)&&o.getAttribute("charset")===(a.charSet==null?null:a.charSet)){s.splice(r,1);break t}}o=i.createElement(n),Ne(o,n,a),i.head.appendChild(o);break;default:throw Error(p(468,n))}o[Me]=e,je(o),n=o}e.stateNode=n}else eh(i,e.type,e.stateNode);else e.stateNode=Iu(i,n,e.memoizedProps);else o!==n?(o===null?a.stateNode!==null&&(a=a.stateNode,a.parentNode.removeChild(a)):o.count--,n===null?eh(i,e.type,e.stateNode):Iu(i,n,e.memoizedProps)):n===null&&e.stateNode!==null&&Sr(e,e.memoizedProps,a.memoizedProps)}break;case 27:Xe(t,e),Ke(e),n&512&&(Te||a===null||Ot(a,a.return)),a!==null&&n&4&&Sr(e,e.memoizedProps,a.memoizedProps);break;case 5:if(Xe(t,e),Ke(e),n&512&&(Te||a===null||Ot(a,a.return)),e.flags&32){i=e.stateNode;try{Pa(i,"")}catch(E){se(e,e.return,E)}}n&4&&e.stateNode!=null&&(i=e.memoizedProps,Sr(e,i,a!==null?a.memoizedProps:i)),n&1024&&(xr=!0);break;case 6:if(Xe(t,e),Ke(e),n&4){if(e.stateNode===null)throw Error(p(162));n=e.memoizedProps,a=e.stateNode;try{a.nodeValue=n}catch(E){se(e,e.return,E)}}break;case 3:if(Eo=null,i=At,At=Oo(t.containerInfo),Xe(t,e),At=i,Ke(e),n&4&&a!==null&&a.memoizedState.isDehydrated)try{zn(t.containerInfo)}catch(E){se(e,e.return,E)}xr&&(xr=!1,eu(e));break;case 4:n=At,At=Oo(e.stateNode.containerInfo),Xe(t,e),Ke(e),At=n;break;case 12:Xe(t,e),Ke(e);break;case 31:Xe(t,e),Ke(e),n&4&&(n=e.updateQueue,n!==null&&(e.updateQueue=null,mo(e,n)));break;case 13:Xe(t,e),Ke(e),e.child.flags&8192&&e.memoizedState!==null!=(a!==null&&a.memoizedState!==null)&&(vo=et()),n&4&&(n=e.updateQueue,n!==null&&(e.updateQueue=null,mo(e,n)));break;case 22:i=e.memoizedState!==null;var c=a!==null&&a.memoizedState!==null,m=Vt,w=Te;if(Vt=m||i,Te=w||c,Xe(t,e),Te=w,Vt=m,Ke(e),n&8192)e:for(t=e.stateNode,t._visibility=i?t._visibility&-2:t._visibility|1,i&&(a===null||c||Vt||Te||Ga(e)),a=null,t=e;;){if(t.tag===5||t.tag===26){if(a===null){c=a=t;try{if(o=c.stateNode,i)s=o.style,typeof s.setProperty=="function"?s.setProperty("display","none","important"):s.display="none";else{r=c.stateNode;var k=c.memoizedProps.style,g=k!=null&&k.hasOwnProperty("display")?k.display:null;r.style.display=g==null||typeof g=="boolean"?"":(""+g).trim()}}catch(E){se(c,c.return,E)}}}else if(t.tag===6){if(a===null){c=t;try{c.stateNode.nodeValue=i?"":c.memoizedProps}catch(E){se(c,c.return,E)}}}else if(t.tag===18){if(a===null){c=t;try{var v=c.stateNode;i?Vu(v,!0):Vu(c.stateNode,!1)}catch(E){se(c,c.return,E)}}}else if((t.tag!==22&&t.tag!==23||t.memoizedState===null||t===e)&&t.child!==null){t.child.return=t,t=t.child;continue}if(t===e)break e;for(;t.sibling===null;){if(t.return===null||t.return===e)break e;a===t&&(a=null),t=t.return}a===t&&(a=null),t.sibling.return=t.return,t=t.sibling}n&4&&(n=e.updateQueue,n!==null&&(a=n.retryQueue,a!==null&&(n.retryQueue=null,mo(e,a))));break;case 19:Xe(t,e),Ke(e),n&4&&(n=e.updateQueue,n!==null&&(e.updateQueue=null,mo(e,n)));break;case 30:break;case 21:break;default:Xe(t,e),Ke(e)}}function Ke(e){var t=e.flags;if(t&2){try{for(var a,n=e.return;n!==null;){if(Kd(n)){a=n;break}n=n.return}if(a==null)throw Error(p(160));switch(a.tag){case 27:var i=a.stateNode;fo(e,Ar(e),i);break;case 5:var o=a.stateNode;a.flags&32&&(Pa(o,""),a.flags&=-33),fo(e,Ar(e),o);break;case 3:case 4:var s=a.stateNode.containerInfo;Dr(e,Ar(e),s);break;default:throw Error(p(161))}}catch(r){se(e,e.return,r)}e.flags&=-3}t&4096&&(e.flags&=-4097)}function eu(e){if(e.subtreeFlags&1024)for(e=e.child;e!==null;){var t=e;eu(t),t.tag===5&&t.flags&1024&&t.stateNode.reset(),e=e.sibling}}function Kt(e,t){if(t.subtreeFlags&8772)for(t=t.child;t!==null;)Jd(e,t.alternate,t),t=t.sibling}function Ga(e){for(e=e.child;e!==null;){var t=e;switch(t.tag){case 0:case 11:case 14:case 15:da(4,t,t.return),Ga(t);break;case 1:Ot(t,t.return);var a=t.stateNode;typeof a.componentWillUnmount=="function"&&Vd(t,t.return,a),Ga(t);break;case 27:mi(t.stateNode);case 26:case 5:Ot(t,t.return),Ga(t);break;case 22:t.memoizedState===null&&Ga(t);break;case 30:Ga(t);break;default:Ga(t)}e=e.sibling}}function Qt(e,t,a){for(a=a&&(t.subtreeFlags&8772)!==0,t=t.child;t!==null;){var n=t.alternate,i=e,o=t,s=o.flags;switch(o.tag){case 0:case 11:case 15:Qt(i,o,a),oi(4,o);break;case 1:if(Qt(i,o,a),n=o,i=n.stateNode,typeof i.componentDidMount=="function")try{i.componentDidMount()}catch(m){se(n,n.return,m)}if(n=o,i=n.updateQueue,i!==null){var r=n.stateNode;try{var c=i.shared.hiddenCallbacks;
vendor: 17,836 bytes, line 9
9if(c!==null)for(i.shared.hiddenCallbacks=null,i=0;i<c.length;i++)Ec(c[i],r)}catch(m){se(n,n.return,m)}}a&&s&64&&Yd(o),si(o,o.return);break;case 27:Qd(o);case 26:case 5:Qt(i,o,a),a&&n===null&&s&4&&Xd(o),si(o,o.return);break;case 12:Qt(i,o,a);break;case 31:Qt(i,o,a),a&&s&4&&Fd(i,o);break;case 13:Qt(i,o,a),a&&s&4&&Id(i,o);break;case 22:o.memoizedState===null&&Qt(i,o,a),si(o,o.return);break;case 30:break;default:Qt(i,o,a)}t=t.sibling}}function Tr(e,t){var a=null;e!==null&&e.memoizedState!==null&&e.memoizedState.cachePool!==null&&(a=e.memoizedState.cachePool.pool),e=null,t.memoizedState!==null&&t.memoizedState.cachePool!==null&&(e=t.memoizedState.cachePool.pool),e!==a&&(e!=null&&e.refCount++,a!=null&&Qn(a))}function Cr(e,t){e=null,t.alternate!==null&&(e=t.alternate.memoizedState.cache),t=t.memoizedState.cache,t!==e&&(t.refCount++,e!=null&&Qn(e))}function Dt(e,t,a,n){if(t.subtreeFlags&10256)for(t=t.child;t!==null;)tu(e,t,a,n),t=t.sibling}function tu(e,t,a,n){var i=t.flags;switch(t.tag){case 0:case 11:case 15:Dt(e,t,a,n),i&2048&&oi(9,t);break;case 1:Dt(e,t,a,n);break;case 3:Dt(e,t,a,n),i&2048&&(e=null,t.alternate!==null&&(e=t.alternate.memoizedState.cache),t=t.memoizedState.cache,t!==e&&(t.refCount++,e!=null&&Qn(e)));break;case 12:if(i&2048){Dt(e,t,a,n),e=t.stateNode;try{var o=t.memoizedProps,s=o.id,r=o.onPostCommit;typeof r=="function"&&r(s,t.alternate===null?"mount":"update",e.passiveEffectDuration,-0)}catch(c){se(t,t.return,c)}}else Dt(e,t,a,n);break;case 31:Dt(e,t,a,n);break;case 13:Dt(e,t,a,n);break;case 23:break;case 22:o=t.stateNode,s=t.alternate,t.memoizedState!==null?o._visibility&2?Dt(e,t,a,n):ri(e,t):o._visibility&2?Dt(e,t,a,n):(o._visibility|=2,vn(e,t,a,n,(t.subtreeFlags&10256)!==0||!1)),i&2048&&Tr(s,t);break;case 24:Dt(e,t,a,n),i&2048&&Cr(t.alternate,t);break;default:Dt(e,t,a,n)}}function vn(e,t,a,n,i){for(i=i&&((t.subtreeFlags&10256)!==0||!1),t=t.child;t!==null;){var o=e,s=t,r=a,c=n,m=s.flags;switch(s.tag){case 0:case 11:case 15:vn(o,s,r,c,i),oi(8,s);break;case 23:break;case 22:var w=s.stateNode;s.memoizedState!==null?w._visibility&2?vn(o,s,r,c,i):ri(o,s):(w._visibility|=2,vn(o,s,r,c,i)),i&&m&2048&&Tr(s.alternate,s);break;case 24:vn(o,s,r,c,i),i&&m&2048&&Cr(s.alternate,s);break;default:vn(o,s,r,c,i)}t=t.sibling}}function ri(e,t){if(t.subtreeFlags&10256)for(t=t.child;t!==null;){var a=e,n=t,i=n.flags;switch(n.tag){case 22:ri(a,n),i&2048&&Tr(n.alternate,n);break;case 24:ri(a,n),i&2048&&Cr(n.alternate,n);break;default:ri(a,n)}t=t.sibling}}var li=8192;function yn(e,t,a){if(e.subtreeFlags&li)for(e=e.child;e!==null;)au(e,t,a),e=e.sibling}function au(e,t,a){switch(e.tag){case 26:yn(e,t,a),e.flags&li&&e.memoizedState!==null&&Ef(a,At,e.memoizedState,e.memoizedProps);break;case 5:yn(e,t,a);break;case 3:case 4:var n=At;At=Oo(e.stateNode.containerInfo),yn(e,t,a),At=n;break;case 22:e.memoizedState===null&&(n=e.alternate,n!==null&&n.memoizedState!==null?(n=li,li=16777216,yn(e,t,a),li=n):yn(e,t,a));break;default:yn(e,t,a)}}function nu(e){var t=e.alternate;if(t!==null&&(e=t.child,e!==null)){t.child=null;do t=e.sibling,e.sibling=null,e=t;while(e!==null)}}function ci(e){var t=e.deletions;if((e.flags&16)!==0){if(t!==null)for(var a=0;a<t.length;a++){var n=t[a];Ee=n,ou(n,e)}nu(e)}if(e.subtreeFlags&10256)for(e=e.child;e!==null;)iu(e),e=e.sibling}function iu(e){switch(e.tag){case 0:case 11:case 15:ci(e),e.flags&2048&&da(9,e,e.return);break;case 3:ci(e);break;case 12:ci(e);break;case 22:var t=e.stateNode;e.memoizedState!==null&&t._visibility&2&&(e.return===null||e.return.tag!==13)?(t._visibility&=-3,go(e)):ci(e);break;default:ci(e)}}function go(e){var t=e.deletions;if((e.flags&16)!==0){if(t!==null)for(var a=0;a<t.length;a++){var n=t[a];Ee=n,ou(n,e)}nu(e)}for(e=e.child;e!==null;){switch(t=e,t.tag){case 0:case 11:case 15:da(8,t,t.return),go(t);break;case 22:a=t.stateNode,a._visibility&2&&(a._visibility&=-3,go(t));break;default:go(t)}e=e.sibling}}function ou(e,t){for(;Ee!==null;){var a=Ee;switch(a.tag){case 0:case 11:case 15:da(8,a,t);break;case 23:case 22:if(a.memoizedState!==null&&a.memoizedState.cachePool!==null){var n=a.memoizedState.cachePool.pool;n!=null&&n.refCount++}break;case 24:Qn(a.memoizedState.cache)}if(n=a.child,n!==null)n.return=a,Ee=n;else e:for(a=e;Ee!==null;){n=Ee;var i=n.sibling,o=n.return;if(Wd(n),n===a){Ee=null;break e}if(i!==null){i.return=o,Ee=i;break e}Ee=o}}}var Zp={getCacheForType:function(e){var t=Ue(Ae),a=t.data.get(e);return a===void 0&&(a=e(),t.data.set(e,a)),a},cacheSignal:function(){return Ue(Ae).controller.signal}},Jp=typeof WeakMap=="function"?WeakMap:Map,ne=0,de=null,Z=null,P=0,oe=0,rt=null,ua=!1,wn=!1,zr=!1,Zt=0,ye=0,ha=0,Ya=0,Or=0,lt=0,bn=0,di=null,Qe=null,jr=!1,vo=0,su=0,yo=1/0,wo=null,pa=null,ze=0,fa=null,kn=null,Jt=0,Er=0,_r=null,ru=null,ui=0,Mr=null;function ct(){return(ne&2)!==0&&P!==0?P&-P:x.T!==null?Br():Al()}function lu(){if(lt===0)if((P&536870912)===0||I){var e=Ti;Ti<<=1,(Ti&3932160)===0&&(Ti=262144),lt=e}else lt=536870912;return e=ot.current,e!==null&&(e.flags|=32),lt}function Ze(e,t,a){(e===de&&(oe===2||oe===9)||e.cancelPendingCommit!==null)&&(Sn(e,0),ma(e,P,lt,!1)),_n(e,a),((ne&2)===0||e!==de)&&(e===de&&((ne&2)===0&&(Ya|=a),ye===4&&ma(e,P,lt,!1)),jt(e))}function cu(e,t,a){if((ne&6)!==0)throw Error(p(327));var n=!a&&(t&127)===0&&(t&e.expiredLanes)===0||En(e,t),i=n?Fp(e,t):Ur(e,t,!0),o=n;do{if(i===0){wn&&!n&&ma(e,t,0,!1);break}else{if(a=e.current.alternate,o&&!Wp(a)){i=Ur(e,t,!1),o=!1;continue}if(i===2){if(o=t,e.errorRecoveryDisabledLanes&o)var s=0;else s=e.pendingLanes&-536870913,s=s!==0?s:s&536870912?536870912:0;if(s!==0){t=s;e:{var r=e;i=di;var c=r.current.memoizedState.isDehydrated;if(c&&(Sn(r,s).flags|=256),s=Ur(r,s,!1),s!==2){if(zr&&!c){r.errorRecoveryDisabledLanes|=o,Ya|=o,i=4;break e}o=Qe,Qe=i,o!==null&&(Qe===null?Qe=o:Qe.push.apply(Qe,o))}i=s}if(o=!1,i!==2)continue}}if(i===1){Sn(e,0),ma(e,t,0,!0);break}e:{switch(n=e,o=i,o){case 0:case 1:throw Error(p(345));case 4:if((t&4194048)!==t)break;case 6:ma(n,t,lt,!ua);break e;case 2:Qe=null;break;case 3:case 5:break;default:throw Error(p(329))}if((t&62914560)===t&&(i=vo+300-et(),10<i)){if(ma(n,t,lt,!ua),zi(n,0,!0)!==0)break e;Jt=t,n.timeoutHandle=Hu(du.bind(null,n,a,Qe,wo,jr,t,lt,Ya,bn,ua,o,"Throttled",-0,0),i);break e}du(n,a,Qe,wo,jr,t,lt,Ya,bn,ua,o,null,-0,0)}}break}while(!0);jt(e)}function du(e,t,a,n,i,o,s,r,c,m,w,k,g,v){if(e.timeoutHandle=-1,k=t.subtreeFlags,k&8192||(k&16785408)===16785408){k={stylesheets:null,count:0,imgCount:0,imgBytes:0,suspenseyImages:[],waitingForImages:!0,waitingForViewTransition:!1,unsuspend:Mt},au(t,o,k);var E=(o&62914560)===o?vo-et():(o&4194048)===o?su-et():0;if(E=_f(k,E),E!==null){Jt=o,e.cancelPendingCommit=E(yu.bind(null,e,t,o,a,n,i,s,r,c,w,k,null,g,v)),ma(e,o,s,!m);return}}yu(e,t,o,a,n,i,s,r,c)}function Wp(e){for(var t=e;;){var a=t.tag;if((a===0||a===11||a===15)&&t.flags&16384&&(a=t.updateQueue,a!==null&&(a=a.stores,a!==null)))for(var n=0;n<a.length;n++){var i=a[n],o=i.getSnapshot;i=i.value;try{if(!nt(o(),i))return!1}catch{return!1}}if(a=t.child,t.subtreeFlags&16384&&a!==null)a.return=t,t=a;else{if(t===e)break;for(;t.sibling===null;){if(t.return===null||t.return===e)return!0;t=t.return}t.sibling.return=t.return,t=t.sibling}}return!0}function ma(e,t,a,n){t&=~Or,t&=~Ya,e.suspendedLanes|=t,e.pingedLanes&=~t,n&&(e.warmLanes|=t),n=e.expirationTimes;for(var i=t;0<i;){var o=31-at(i),s=1<<o;n[o]=-1,i&=~s}a!==0&&bl(e,a,t)}function bo(){return(ne&6)===0?(hi(0,!1),!1):!0}function Rr(){if(Z!==null){if(oe===0)var e=Z.return;else e=Z,Nt=Ma=null,Ps(e),hn=null,Jn=0,e=Z;for(;e!==null;)Gd(e.alternate,e),e=e.return;Z=null}}function Sn(e,t){var a=e.timeoutHandle;a!==-1&&(e.timeoutHandle=-1,ff(a)),a=e.cancelPendingCommit,a!==null&&(e.cancelPendingCommit=null,a()),Jt=0,Rr(),de=e,Z=a=Ut(e.current,null),P=t,oe=0,rt=null,ua=!1,wn=En(e,t),zr=!1,bn=lt=Or=Ya=ha=ye=0,Qe=di=null,jr=!1,(t&8)!==0&&(t|=t&32);var n=e.entangledLanes;if(n!==0)for(e=e.entanglements,n&=t;0<n;){var i=31-at(n),o=1<<i;t|=e[i],n&=~o}return Zt=t,Hi(),a}function uu(e,t){V=null,x.H=ai,t===un||t===Ji?(t=Cc(),oe=3):t===Ls?(t=Cc(),oe=4):oe=t===hr?8:t!==null&&typeof t=="object"&&typeof t.then=="function"?6:1,rt=t,Z===null&&(ye=1,lo(e,pt(t,e.current)))}function hu(){var e=ot.current;return e===null?!0:(P&4194048)===P?vt===null:(P&62914560)===P||(P&536870912)!==0?e===vt:!1}function pu(){var e=x.H;return x.H=ai,e===null?ai:e}function fu(){var e=x.A;return x.A=Zp,e}function ko(){ye=4,ua||(P&4194048)!==P&&ot.current!==null||(wn=!0),(ha&134217727)===0&&(Ya&134217727)===0||de===null||ma(de,P,lt,!1)}function Ur(e,t,a){var n=ne;ne|=2;var i=pu(),o=fu();(de!==e||P!==t)&&(wo=null,Sn(e,t)),t=!1;var s=ye;e:do try{if(oe!==0&&Z!==null){var r=Z,c=rt;switch(oe){case 8:Rr(),s=6;break e;case 3:case 2:case 9:case 6:ot.current===null&&(t=!0);var m=oe;if(oe=0,rt=null,An(e,r,c,m),a&&wn){s=0;break e}break;default:m=oe,oe=0,rt=null,An(e,r,c,m)}}Pp(),s=ye;break}catch(w){uu(e,w)}while(!0);return t&&e.shellSuspendCounter++,Nt=Ma=null,ne=n,x.H=i,x.A=o,Z===null&&(de=null,P=0,Hi()),s}function Pp(){for(;Z!==null;)mu(Z)}function Fp(e,t){var a=ne;ne|=2;var n=pu(),i=fu();de!==e||P!==t?(wo=null,yo=et()+500,Sn(e,t)):wn=En(e,t);e:do try{if(oe!==0&&Z!==null){t=Z;var o=rt;t:switch(oe){case 1:oe=0,rt=null,An(e,t,o,1);break;case 2:case 9:if(xc(o)){oe=0,rt=null,gu(t);break}t=function(){oe!==2&&oe!==9||de!==e||(oe=7),jt(e)},o.then(t,t);break e;case 3:oe=7;break e;case 4:oe=5;break e;case 7:xc(o)?(oe=0,rt=null,gu(t)):(oe=0,rt=null,An(e,t,o,7));break;case 5:var s=null;switch(Z.tag){case 26:s=Z.memoizedState;case 5:case 27:var r=Z;if(s?th(s):r.stateNode.complete){oe=0,rt=null;var c=r.sibling;if(c!==null)Z=c;else{var m=r.return;m!==null?(Z=m,So(m)):Z=null}break t}}oe=0,rt=null,An(e,t,o,5);break;case 6:oe=0,rt=null,An(e,t,o,6);break;case 8:Rr(),ye=6;break e;default:throw Error(p(462))}}Ip();break}catch(w){uu(e,w)}while(!0);return Nt=Ma=null,x.H=n,x.A=i,ne=a,Z!==null?0:(de=null,P=0,Hi(),ye)}function Ip(){for(;Z!==null&&!_h();)mu(Z)}function mu(e){var t=Bd(e.alternate,e,Zt);e.memoizedProps=e.pendingProps,t===null?So(e):Z=t}function gu(e){var t=e,a=t.alternate;switch(t.tag){case 15:case 0:t=Md(a,t,t.pendingProps,t.type,void 0,P);break;case 11:t=Md(a,t,t.pendingProps,t.type.render,t.ref,P);break;case 5:Ps(t);default:Gd(a,t),t=Z=fc(t,Zt),t=Bd(a,t,Zt)}e.memoizedProps=e.pendingProps,t===null?So(e):Z=t}function An(e,t,a,n){Nt=Ma=null,Ps(t),hn=null,Jn=0;var i=t.return;try{if(Hp(e,i,t,a,P)){ye=1,lo(e,pt(a,e.current)),Z=null;return}}catch(o){if(i!==null)throw Z=i,o;ye=1,lo(e,pt(a,e.current)),Z=null;return}t.flags&32768?(I||n===1?e=!0:wn||(P&536870912)!==0?e=!1:(ua=e=!0,(n===2||n===9||n===3||n===6)&&(n=ot.current,n!==null&&n.tag===13&&(n.flags|=16384))),vu(t,e)):So(t)}function So(e){var t=e;do{if((t.flags&32768)!==0){vu(t,ua);return}e=t.return;var a=Vp(t.alternate,t,Zt);if(a!==null){Z=a;return}if(t=t.sibling,t!==null){Z=t;return}Z=t=e}while(t!==null);ye===0&&(ye=5)}function vu(e,t){do{var a=Xp(e.alternate,e);if(a!==null){a.flags&=32767,Z=a;return}if(a=e.return,a!==null&&(a.flags|=32768,a.subtreeFlags=0,a.deletions=null),!t&&(e=e.sibling,e!==null)){Z=e;return}Z=e=a}while(e!==null);ye=6,Z=null}function yu(e,t,a,n,i,o,s,r,c){e.cancelPendingCommit=null;do Ao();while(ze!==0);if((ne&6)!==0)throw Error(p(327));if(t!==null){if(t===e.current)throw Error(p(177));if(o=t.lanes|t.childLanes,o|=As,Yh(e,a,o,s,r,c),e===de&&(Z=de=null,P=0),kn=t,fa=e,Jt=a,Er=o,_r=i,ru=n,(t.subtreeFlags&10256)!==0||(t.flags&10256)!==0?(e.callbackNode=null,e.callbackPriority=0,af(Di,function(){return Au(),null})):(e.callbackNode=null,e.callbackPriority=0),n=(t.flags&13878)!==0,(t.subtreeFlags&13878)!==0||n){n=x.T,x.T=null,i=C.p,C.p=2,s=ne,ne|=4;try{Kp(e,t,a)}finally{ne=s,C.p=i,x.T=n}}ze=1,wu(),bu(),ku()}}function wu(){if(ze===1){ze=0;var e=fa,t=kn,a=(t.flags&13878)!==0;if((t.subtreeFlags&13878)!==0||a){a=x.T,x.T=null;var n=C.p;C.p=2;var i=ne;ne|=4;try{$d(t,e);var o=Zr,s=oc(e.containerInfo),r=o.focusedElem,c=o.selectionRange;if(s!==r&&r&&r.ownerDocument&&ic(r.ownerDocument.documentElement,r)){if(c!==null&&ys(r)){var m=c.start,w=c.end;if(w===void 0&&(w=m),"selectionStart"in r)r.selectionStart=m,r.selectionEnd=Math.min(w,r.value.length);else{var k=r.ownerDocument||document,g=k&&k.defaultView||window;if(g.getSelection){var v=g.getSelection(),E=r.textContent.length,B=Math.min(c.start,E),ce=c.end===void 0?B:Math.min(c.end,E);!v.extend&&B>ce&&(s=ce,ce=B,B=s);var h=nc(r,B),d=nc(r,ce);if(h&&d&&(v.rangeCount!==1||v.anchorNode!==h.node||v.anchorOffset!==h.offset||v.focusNode!==d.node||v.focusOffset!==d.offset)){var f=k.createRange();f.setStart(h.node,h.offset),v.removeAllRanges(),B>ce?(v.addRange(f),v.extend(d.node,d.offset)):(f.setEnd(d.node,d.offset),v.addRange(f))}}}}for(k=[],v=r;v=v.parentNode;)v.nodeType===1&&k.push({element:v,left:v.scrollLeft,top:v.scrollTop});for(typeof r.focus=="function"&&r.focus(),r=0;r<k.length;r++){var b=k[r];b.element.scrollLeft=b.left,b.element.scrollTop=b.top}}Uo=!!Qr,Zr=Qr=null}finally{ne=i,C.p=n,x.T=a}}e.current=t,ze=2}}function bu(){if(ze===2){ze=0;var e=fa,t=kn,a=(t.flags&8772)!==0;if((t.subtreeFlags&8772)!==0||a){a=x.T,x.T=null;var n=C.p;C.p=2;var i=ne;ne|=4;try{Jd(e,t.alternate,t)}finally{ne=i,C.p=n,x.T=a}}ze=3}}function ku(){if(ze===4||ze===3){ze=0,Mh();var e=fa,t=kn,a=Jt,n=ru;(t.subtreeFlags&10256)!==0||(t.flags&10256)!==0?ze=5:(ze=0,kn=fa=null,Su(e,e.pendingLanes));var i=e.pendingLanes;if(i===0&&(pa=null),$o(a),t=t.stateNode,tt&&typeof tt.onCommitFiberRoot=="function")try{tt.onCommitFiberRoot(jn,t,void 0,(t.current.flags&128)===128)}catch{}if(n!==null){t=x.T,i=C.p,C.p=2,x.T=null;try{for(var o=e.onRecoverableError,s=0;s<n.length;s++){var r=n[s];o(r.value,{componentStack:r.stack})}}finally{x.T=t,C.p=i}}(Jt&3)!==0&&Ao(),jt(e),i=e.pendingLanes,(a&261930)!==0&&(i&42)!==0?e===Mr?ui++:(ui=0,Mr=e):ui=0,hi(0,!1)}}function Su(e,t){(e.pooledCacheLanes&=t)===0&&(t=e.pooledCache,t!=null&&(e.pooledCache=null,Qn(t)))}function Ao(){return wu(),bu(),ku(),Au()}function Au(){if(ze!==5)return!1;var e=fa,t=Er;Er=0;var a=$o(Jt),n=x.T,i=C.p;try{C.p=32>a?32:a,x.T=null,a=_r,_r=null;var o=fa,s=Jt;if(ze=0,kn=fa=null,Jt=0,(ne&6)!==0)throw Error(p(331));var r=ne;if(ne|=4,iu(o.current),tu(o,o.current,s,a),ne=r,hi(0,!1),tt&&typeof tt.onPostCommitFiberRoot=="function")try{tt.onPostCommitFiberRoot(jn,o)}catch{}return!0}finally{C.p=i,x.T=n,Su(e,t)}}function Du(e,t,a){t=pt(a,t),t=ur(e.stateNode,t,2),e=ra(e,t,2),e!==null&&(_n(e,2),jt(e))}function se(e,t,a){if(e.tag===3)Du(e,e,a);else for(;t!==null;){if(t.tag===3){Du(t,e,a);break}else if(t.tag===1){var n=t.stateNode;if(typeof t.type.getDerivedStateFromError=="function"||typeof n.componentDidCatch=="function"&&(pa===null||!pa.has(n))){e=pt(a,e),a=xd(2),n=ra(t,a,2),n!==null&&(Td(a,n,t,e),_n(n,2),jt(n));break}}t=t.return}}function qr(e,t,a){var n=e.pingCache;if(n===null){n=e.pingCache=new Jp;var i=new Set;n.set(t,i)}else i=n.get(t),i===void 0&&(i=new Set,n.set(t,i));i.has(a)||(zr=!0,i.add(a),e=$p.bind(null,e,t,a),t.then(e,e))}function $p(e,t,a){var n=e.pingCache;n!==null&&n.delete(t),e.pingedLanes|=e.suspendedLanes&a,e.warmLanes&=~a,de===e&&(P&a)===a&&(ye===4||ye===3&&(P&62914560)===P&&300>et()-vo?(ne&2)===0&&Sn(e,0):Or|=a,bn===P&&(bn=0)),jt(e)}function xu(e,t){t===0&&(t=wl()),e=ja(e,t),e!==null&&(_n(e,t),jt(e))}function ef(e){var t=e.memoizedState,a=0;t!==null&&(a=t.retryLane),xu(e,a)}function tf(e,t){var a=0;switch(e.tag){case 31:case 13:var n=e.stateNode,i=e.memoizedState;i!==null&&(a=i.retryLane);break;case 19:n=e.stateNode;break;case 22:n=e.stateNode._retryCache;break;default:throw Error(p(314))}n!==null&&n.delete(t),xu(e,a)}function af(e,t){return Wo(e,t)}var Do=null,Dn=null,Nr=!1,xo=!1,Lr=!1,ga=0;function jt(e){e!==Dn&&e.next===null&&(Dn===null?Do=Dn=e:Dn=Dn.next=e),xo=!0,Nr||(Nr=!0,of())}function hi(e,t){if(!Lr&&xo){Lr=!0;do for(var a=!1,n=Do;n!==null;){if(!t)if(e!==0){var i=n.pendingLanes;if(i===0)var o=0;else{var s=n.suspendedLanes,r=n.pingedLanes;o=(1<<31-at(42|e)+1)-1,o&=i&~(s&~r),o=o&201326741?o&201326741|1:o?o|2:0}o!==0&&(a=!0,Ou(n,o))}else o=P,o=zi(n,n===de?o:0,n.cancelPendingCommit!==null||n.timeoutHandle!==-1),(o&3)===0||En(n,o)||(a=!0,Ou(n,o));n=n.next}while(a);Lr=!1}}function nf(){Tu()}function Tu(){xo=Nr=!1;var e=0;ga!==0&&pf()&&(e=ga);for(var t=et(),a=null,n=Do;n!==null;){var i=n.next,o=Cu(n,t);o===0?(n.next=null,a===null?Do=i:a.next=i,i===null&&(Dn=a)):(a=n,(e!==0||(o&3)!==0)&&(xo=!0)),n=i}ze!==0&&ze!==5||hi(e,!1),ga!==0&&(ga=0)}function Cu(e,t){for(var a=e.suspendedLanes,n=e.pingedLanes,i=e.expirationTimes,o=e.pendingLanes&-62914561;0<o;){var s=31-at(o),r=1<<s,c=i[s];c===-1?((r&a)===0||(r&n)!==0)&&(i[s]=Gh(r,t)):c<=t&&(e.expiredLanes|=r),o&=~r}if(t=de,a=P,a=zi(e,e===t?a:0,e.cancelPendingCommit!==null||e.timeoutHandle!==-1),n=e.callbackNode,a===0||e===t&&(oe===2||oe===9)||e.cancelPendingCommit!==null)return n!==null&&n!==null&&Po(n),e.callbackNode=null,e.callbackPriority=0;if((a&3)===0||En(e,a)){if(t=a&-a,t===e.callbackPriority)return t;switch(n!==null&&Po(n),$o(a)){case 2:case 8:a=vl;break;case 32:a=Di;break;case 268435456:a=yl;break;default:a=Di}return n=zu.bind(null,e),a=Wo(a,n),e.callbackPriority=t,e.callbackNode=a,t}return n!==null&&n!==null&&Po(n),e.callbackPriority=2,e.callbackNode=null,2}function zu(e,t){if(ze!==0&&ze!==5)return e.callbackNode=null,e.callbackPriority=0,null;var a=e.callbackNode;if(Ao()&&e.callbackNode!==a)return null;var n=P;return n=zi(e,e===de?n:0,e.cancelPendingCommit!==null||e.timeoutHandle!==-1),n===0?null:(cu(e,n,t),Cu(e,et()),e.callbackNode!=null&&e.callbackNode===a?zu.bind(null,e):null)}function Ou(e,t){if(Ao())return null;cu(e,t,!0)}function of(){mf(function(){(ne&6)!==0?Wo(gl,nf):Tu()})}function Br(){if(ga===0){var e=cn;e===0&&(e=xi,xi<<=1,(xi&261888)===0&&(xi=256)),ga=e}return ga}function ju(e){return e==null||typeof e=="symbol"||typeof e=="boolean"?null:typeof e=="function"?e:_i(""+e)}function Eu(e,t){var a=t.ownerDocument.createElement("input");
vendor: 11,364 bytes, lines 9-10
9return a.name=t.name,a.value=t.value,e.id&&a.setAttribute("form",e.id),t.parentNode.insertBefore(a,t),e=new FormData(e),a.parentNode.removeChild(a),e}function sf(e,t,a,n,i){if(t==="submit"&&a&&a.stateNode===i){var o=ju((i[Ge]||null).action),s=n.submitter;s&&(t=(t=s[Ge]||null)?ju(t.formAction):s.getAttribute("formAction"),t!==null&&(o=t,s=null));var r=new qi("action","action",null,n,i);e.push({event:r,listeners:[{instance:null,listener:function(){if(n.defaultPrevented){if(ga!==0){var c=s?Eu(i,s):new FormData(i);or(a,{pending:!0,data:c,method:i.method,action:o},null,c)}}else typeof o=="function"&&(r.preventDefault(),c=s?Eu(i,s):new FormData(i),or(a,{pending:!0,data:c,method:i.method,action:o},o,c))},currentTarget:i}]})}}for(var Hr=0;Hr<Ss.length;Hr++){var Gr=Ss[Hr];St(Gr.toLowerCase(),"on"+(Gr[0].toUpperCase()+Gr.slice(1)))}St(lc,"onAnimationEnd"),St(cc,"onAnimationIteration"),St(dc,"onAnimationStart"),St("dblclick","onDoubleClick"),St("focusin","onFocus"),St("focusout","onBlur"),St(Ap,"onTransitionRun"),St(Dp,"onTransitionStart"),St(xp,"onTransitionCancel"),St(uc,"onTransitionEnd"),Ja("onMouseEnter",["mouseout","mouseover"]),Ja("onMouseLeave",["mouseout","mouseover"]),Ja("onPointerEnter",["pointerout","pointerover"]),Ja("onPointerLeave",["pointerout","pointerover"]),Ta("onChange","change click focusin focusout input keydown keyup selectionchange".split(" ")),Ta("onSelect","focusout contextmenu dragend focusin keydown keyup mousedown mouseup selectionchange".split(" ")),Ta("onBeforeInput",["compositionend","keypress","textInput","paste"]),Ta("onCompositionEnd","compositionend focusout keydown keypress keyup mousedown".split(" ")),Ta("onCompositionStart","compositionstart focusout keydown keypress keyup mousedown".split(" ")),Ta("onCompositionUpdate","compositionupdate focusout keydown keypress keyup mousedown".split(" "));var pi="abort canplay canplaythrough durationchange emptied encrypted ended error loadeddata loadedmetadata loadstart pause play playing progress ratechange resize seeked seeking stalled suspend timeupdate volumechange waiting".split(" "),rf=new Set("beforetoggle cancel close invalid load scroll scrollend toggle".split(" ").concat(pi));function _u(e,t){t=(t&4)!==0;for(var a=0;a<e.length;a++){var n=e[a],i=n.event;n=n.listeners;e:{var o=void 0;if(t)for(var s=n.length-1;0<=s;s--){var r=n[s],c=r.instance,m=r.currentTarget;if(r=r.listener,c!==o&&i.isPropagationStopped())break e;o=r,i.currentTarget=m;try{o(i)}catch(w){Bi(w)}i.currentTarget=null,o=c}else for(s=0;s<n.length;s++){if(r=n[s],c=r.instance,m=r.currentTarget,r=r.listener,c!==o&&i.isPropagationStopped())break e;o=r,i.currentTarget=m;try{o(i)}catch(w){Bi(w)}i.currentTarget=null,o=c}}}}function J(e,t){var a=t[es];a===void 0&&(a=t[es]=new Set);var n=e+"__bubble";a.has(n)||(Mu(t,e,2,!1),a.add(n))}function Yr(e,t,a){var n=0;t&&(n|=4),Mu(a,e,n,t)}var To="_reactListening"+Math.random().toString(36).slice(2);function Vr(e){if(!e[To]){e[To]=!0,Tl.forEach(function(a){a!=="selectionchange"&&(rf.has(a)||Yr(a,!1,e),Yr(a,!0,e))});var t=e.nodeType===9?e:e.ownerDocument;t===null||t[To]||(t[To]=!0,Yr("selectionchange",!1,t))}}function Mu(e,t,a,n){switch(lh(t)){case 2:var i=Uf;break;case 8:i=qf;break;default:i=il}a=i.bind(null,t,a,e),i=void 0,!cs||t!=="touchstart"&&t!=="touchmove"&&t!=="wheel"||(i=!0),n?i!==void 0?e.addEventListener(t,a,{capture:!0,passive:i}):e.addEventListener(t,a,!0):i!==void 0?e.addEventListener(t,a,{passive:i}):e.addEventListener(t,a,!1)}function Xr(e,t,a,n,i){var o=n;if((t&1)===0&&(t&2)===0&&n!==null)e:for(;;){if(n===null)return;var s=n.tag;if(s===3||s===4){var r=n.stateNode.containerInfo;if(r===i)break;if(s===4)for(s=n.return;s!==null;){var c=s.tag;if((c===3||c===4)&&s.stateNode.containerInfo===i)return;s=s.return}for(;r!==null;){if(s=Ka(r),s===null)return;if(c=s.tag,c===5||c===6||c===26||c===27){n=o=s;continue e}r=r.parentNode}}n=n.return}Ll(function(){var m=o,w=rs(a),k=[];e:{var g=hc.get(e);if(g!==void 0){var v=qi,E=e;switch(e){case"keypress":if(Ri(a)===0)break e;case"keydown":case"keyup":v=sp;break;case"focusin":E="focus",v=ps;break;case"focusout":E="blur",v=ps;break;case"beforeblur":case"afterblur":v=ps;break;case"click":if(a.button===2)break e;case"auxclick":case"dblclick":case"mousedown":case"mousemove":case"mouseup":case"mouseout":case"mouseover":case"contextmenu":v=Gl;break;case"drag":case"dragend":case"dragenter":case"dragexit":case"dragleave":case"dragover":case"dragstart":case"drop":v=$h;break;case"touchcancel":case"touchend":case"touchmove":case"touchstart":v=rp;break;case lc:case cc:case dc:v=ep;break;case uc:v=lp;break;case"scroll":case"scrollend":v=Ih;break;case"wheel":v=cp;break;case"copy":case"cut":case"paste":v=tp;break;case"gotpointercapture":case"lostpointercapture":case"pointercancel":case"pointerdown":case"pointermove":case"pointerout":case"pointerover":case"pointerup":v=Vl;break;case"toggle":case"beforetoggle":v=dp}var B=(t&4)!==0,ce=!B&&(e==="scroll"||e==="scrollend"),h=B?g!==null?g+"Capture":null:g;B=[];for(var d=m,f;d!==null;){var b=d;if(f=b.stateNode,b=b.tag,b!==5&&b!==26&&b!==27||f===null||h===null||(b=Un(d,h),b!=null&&B.push(fi(d,b,f))),ce)break;d=d.return}0<B.length&&(g=new v(g,E,null,a,w),k.push({event:g,listeners:B}))}}if((t&7)===0){e:{if(g=e==="mouseover"||e==="pointerover",v=e==="mouseout"||e==="pointerout",g&&a!==ss&&(E=a.relatedTarget||a.fromElement)&&(Ka(E)||E[Xa]))break e;if((v||g)&&(g=w.window===w?w:(g=w.ownerDocument)?g.defaultView||g.parentWindow:window,v?(E=a.relatedTarget||a.toElement,v=m,E=E?Ka(E):null,E!==null&&(ce=H(E),B=E.tag,E!==ce||B!==5&&B!==27&&B!==6)&&(E=null)):(v=null,E=m),v!==E)){if(B=Gl,b="onMouseLeave",h="onMouseEnter",d="mouse",(e==="pointerout"||e==="pointerover")&&(B=Vl,b="onPointerLeave",h="onPointerEnter",d="pointer"),ce=v==null?g:Rn(v),f=E==null?g:Rn(E),g=new B(b,d+"leave",v,a,w),g.target=ce,g.relatedTarget=f,b=null,Ka(w)===m&&(B=new B(h,d+"enter",E,a,w),B.target=f,B.relatedTarget=ce,b=B),ce=b,v&&E)t:{for(B=lf,h=v,d=E,f=0,b=h;b;b=B(b))f++;b=0;for(var N=d;N;N=B(N))b++;for(;0<f-b;)h=B(h),f--;for(;0<b-f;)d=B(d),b--;for(;f--;){if(h===d||d!==null&&h===d.alternate){B=h;break t}h=B(h),d=B(d)}B=null}else B=null;v!==null&&Ru(k,g,v,B,!1),E!==null&&ce!==null&&Ru(k,ce,E,B,!0)}}e:{if(g=m?Rn(m):window,v=g.nodeName&&g.nodeName.toLowerCase(),v==="select"||v==="input"&&g.type==="file")var ee=Fl;else if(Wl(g))if(Il)ee=bp;else{ee=yp;var _=vp}else v=g.nodeName,!v||v.toLowerCase()!=="input"||g.type!=="checkbox"&&g.type!=="radio"?m&&os(m.elementType)&&(ee=Fl):ee=wp;if(ee&&(ee=ee(e,m))){Pl(k,ee,a,w);break e}_&&_(e,g,m),e==="focusout"&&m&&g.type==="number"&&m.memoizedProps.value!=null&&is(g,"number",g.value)}switch(_=m?Rn(m):window,e){case"focusin":(Wl(_)||_.contentEditable==="true")&&(en=_,ws=m,Vn=null);break;case"focusout":Vn=ws=en=null;break;case"mousedown":bs=!0;break;case"contextmenu":case"mouseup":case"dragend":bs=!1,sc(k,a,w);break;case"selectionchange":if(Sp)break;case"keydown":case"keyup":sc(k,a,w)}var X;if(ms)e:{switch(e){case"compositionstart":var F="onCompositionStart";break e;case"compositionend":F="onCompositionEnd";break e;case"compositionupdate":F="onCompositionUpdate";break e}F=void 0}else $a?Zl(e,a)&&(F="onCompositionEnd"):e==="keydown"&&a.keyCode===229&&(F="onCompositionStart");F&&(Xl&&a.locale!=="ko"&&($a||F!=="onCompositionStart"?F==="onCompositionEnd"&&$a&&(X=Bl()):(ea=w,ds="value"in ea?ea.value:ea.textContent,$a=!0)),_=Co(m,F),0<_.length&&(F=new Yl(F,e,null,a,w),k.push({event:F,listeners:_}),X?F.data=X:(X=Jl(a),X!==null&&(F.data=X)))),(X=hp?pp(e,a):fp(e,a))&&(F=Co(m,"onBeforeInput"),0<F.length&&(_=new Yl("onBeforeInput","beforeinput",null,a,w),k.push({event:_,listeners:F}),_.data=X)),sf(k,e,m,a,w)}_u(k,t)})}function fi(e,t,a){return{instance:e,listener:t,currentTarget:a}}function Co(e,t){for(var a=t+"Capture",n=[];e!==null;){var i=e,o=i.stateNode;if(i=i.tag,i!==5&&i!==26&&i!==27||o===null||(i=Un(e,a),i!=null&&n.unshift(fi(e,i,o)),i=Un(e,t),i!=null&&n.push(fi(e,i,o))),e.tag===3)return n;e=e.return}return[]}function lf(e){if(e===null)return null;do e=e.return;while(e&&e.tag!==5&&e.tag!==27);return e||null}function Ru(e,t,a,n,i){for(var o=t._reactName,s=[];a!==null&&a!==n;){var r=a,c=r.alternate,m=r.stateNode;if(r=r.tag,c!==null&&c===n)break;r!==5&&r!==26&&r!==27||m===null||(c=m,i?(m=Un(a,o),m!=null&&s.unshift(fi(a,m,c))):i||(m=Un(a,o),m!=null&&s.push(fi(a,m,c)))),a=a.return}s.length!==0&&e.push({event:t,listeners:s})}var cf=/\r\n?/g,df=/\u0000|\uFFFD/g;function Uu(e){return(typeof e=="string"?e:""+e).replace(cf,` 10`).replace(df,"")}function qu(e,t){return t=Uu(t),Uu(e)===t}function le(e,t,a,n,i,o){switch(a){case"children":typeof n=="string"?t==="body"||t==="textarea"&&n===""||Pa(e,n):(typeof n=="number"||typeof n=="bigint")&&t!=="body"&&Pa(e,""+n);break;case"className":ji(e,"class",n);break;case"tabIndex":ji(e,"tabindex",n);break;case"dir":case"role":case"viewBox":case"width":case"height":ji(e,a,n);break;case"style":ql(e,n,o);break;case"data":if(t!=="object"){ji(e,"data",n);break}case"src":case"href":if(n===""&&(t!=="a"||a!=="href")){e.removeAttribute(a);break}if(n==null||typeof n=="function"||typeof n=="symbol"||typeof n=="boolean"){e.removeAttribute(a);break}n=_i(""+n),e.setAttribute(a,n);break;case"action":case"formAction":if(typeof n=="function"){e.setAttribute(a,"javascript:throw new Error('A React form was unexpectedly submitted. If you called form.submit() manually, consider using form.requestSubmit() instead. If you\\'re trying to use event.stopPropagation() in a submit event handler, consider also calling event.preventDefault().')");break}else typeof o=="function"&&(a==="formAction"?(t!=="input"&&le(e,t,"name",i.name,i,null),le(e,t,"formEncType",i.formEncType,i,null),le(e,t,"formMethod",i.formMethod,i,null),le(e,t,"formTarget",i.formTarget,i,null)):(le(e,t,"encType",i.encType,i,null),le(e,t,"method",i.method,i,null),le(e,t,"target",i.target,i,null)));if(n==null||typeof n=="symbol"||typeof n=="boolean"){e.removeAttribute(a);break}n=_i(""+n),e.setAttribute(a,n);break;case"onClick":n!=null&&(e.onclick=Mt);break;case"onScroll":n!=null&&J("scroll",e);break;case"onScrollEnd":n!=null&&J("scrollend",e);break;case"dangerouslySetInnerHTML":if(n!=null){if(typeof n!="object"||!("__html"in n))throw Error(p(61));if(a=n.__html,a!=null){if(i.children!=null)throw Error(p(60));e.innerHTML=a}}break;case"multiple":e.multiple=n&&typeof n!="function"&&typeof n!="symbol";break;case"muted":e.muted=n&&typeof n!="function"&&typeof n!="symbol";break;case"suppressContentEditableWarning":case"suppressHydrationWarning":case"defaultValue":case"defaultChecked":case"innerHTML":case"ref":break;case"autoFocus":break;case"xlinkHref":if(n==null||typeof n=="function"||typeof n=="boolean"||typeof n=="symbol"){e.removeAttribute("xlink:href");break}a=_i(""+n),e.setAttributeNS("http://www.w3.org/1999/xlink","xlink:href",a);break;case"contentEditable":case"spellCheck":case"draggable":case"value":case"autoReverse":case"externalResourcesRequired":case"focusable":case"preserveAlpha":n!=null&&typeof n!="function"&&typeof n!="symbol"?e.setAttribute(a,""+n):e.removeAttribute(a);break;case"inert":case"allowFullScreen":case"async":case"autoPlay":case"controls":case"default":case"defer":case"disabled":case"disablePictureInPicture":case"disableRemotePlayback":case"formNoValidate":case"hidden":case"loop":case"noModule":case"noValidate":case"open":case"playsInl
10ine":case"readOnly":case"required":case"reversed":case"scoped":case"seamless":case"itemScope":n&&typeof n!="function"&&typeof n!="symbol"?e.setAttribute(a,""):e.removeAttribute(a);break;case"capture":case"download":n===!0?e.setAttribute(a,""):n!==!1&&n!=null&&typeof n!="function"&&typeof n!="symbol"?e.setAttribute(a,n):e.removeAttribute(a);break;case"cols":case"rows":case"size":case"span":n!=null&&typeof n!="function"&&typeof n!="symbol"&&!isNaN(n)&&1<=n?e.setAttribute(a,n):e.removeAttribute(a);break;case"rowSpan":case"start":n==null||typeof n=="function"||typeof n=="symbol"||isNaN(n)?e.removeAttribute(a):e.setAttribute(a,n);break;case"popover":J("beforetoggle",e),J("toggle",e),Oi(e,"popover",n);break;case"xlinkActuate":_t(e,"http://www.w3.org/1999/xlink","xlink:actuate",n);break;case"xlinkArcrole":_t(e,"http://www.w3.org/1999/xlink","xlink:arcrole",n);break;case"xlinkRole":_t(e,"http://www.w3.org/1999/xlink","xlink:role",n);break;case"xlinkShow":_t(e,"http://www.w3.org/1999/xlink","xlink:show",n);break;case"xlinkTitle":_t(e,"http://www.w3.org/1999/xlink","xlink:title",n);break;case"xlinkType":_t(e,"http://www.w3.org/1999/xlink","xlink:type",n);break;case"xmlBase":_t(e,"http://www.w3.org/XML/1998/namespace","xml:base",n);break;case"xmlLang":_t(e,"http://www.w3.org/XML/1998/namespace","xml:lang",n);break;case"xmlSpace":_t(e,"http://www.w3.org/XML/1998/namespace","xml:space",n);break;case"is":Oi(e,"is",n);break;case"innerText":case"textContent":break;default:(!(2<a.length)||a[0]!=="o"&&a[0]!=="O"||a[1]!=="n"&&a[1]!=="N")&&(a=Ph.get(a)||a,Oi(e,a,n))}}function Kr(e,t,a,n,i,o){switch(a){case"style":ql(e,n,o);break;case"dangerouslySetInnerHTML":if(n!=null){if(typeof n!="object"||!("__html"in n))throw Error(p(61));if(a=n.__html,a!=null){if(i.children!=null)throw Error(p(60));e.innerHTML=a}}break;case"children":typeof n=="string"?Pa(e,n):(typeof n=="number"||typeof n=="bigint")&&Pa(e,""+n);break;case"onScroll":n!=null&&J("scroll",e);break;case"onScrollEnd":n!=null&&J("scrollend",e);break;case"onClick":n!=null&&(e.onclick=Mt);break;case"suppressContentEditableWarning":case"suppressHydrationWarning":case"innerHTML":case"ref":break;case"innerText":case"textContent":break;default:if(!Cl.hasOwnProperty(a))e:{if(a[0]==="o"&&a[1]==="n"&&(i=a.endsWith("Capture"),t=a.slice(2,i?a.length-7:void 0),o=e[Ge]||null,o=o!=null?o[a]:null,typeof o=="function"&&e.removeEventListener(t,o,i),typeof n=="function")){typeof o!="function"&&o!==null&&(a in e?e[a]=null:e.hasAttribute(a)&&e.removeAttribute(a)),e.addEventListener(t,n,i);break e}a in e?e[a]=n:n===!0?e.setAttribute(a,""):Oi(e,a,n)}}}function Ne(e,t,a){switch(t){case"div":case"span":case"svg":case"path":case"a":case"g":case"p":case"li":break;case"img":J("error",e),J("load",e);var n=!1,i=!1,o;for(o in a)if(a.hasOwnProperty(o)){var s=a[o];if(s!=null)switch(o){case"src":n=!0;break;case"srcSet":i=!0;break;case"children":case"dangerouslySetInnerHTML":throw Error(p(137,t));default:le(e,t,o,s,a,null)}}i&&le(e,t,"srcSet",a.srcSet,a,null),n&&le(e,t,"src",a.src,a,null);return;case"input":J("invalid",e);var r=o=s=i=null,c=null,m=null;for(n in a)if(a.hasOwnProperty(n)){var w=a[n];if(w!=null)switch(n){case"name":i=w;break;case"type":s=w;break;case"checked":c=w;break;case"defaultChecked":m=w;break;case"value":o=w;break;case"defaultValue":r=w;break;case"children":case"dangerouslySetInnerHTML":if(w!=null)throw Error(p(137,t));break;default:le(e,t,n,w,a,null)}}_l(e,o,r,c,m,s,i,!1);return;case"select":J("invalid",e),n=s=o=null;for(i in a)if(a.hasOwnProperty(i)&&(r=a[i],r!=null))switch(i){case"value":o=r;break;case"defaultValue":s=r;break;case"multiple":n=r;default:le(e,t,i,r,a,null)}t=o,a=s,e.multiple=!!n,t!=null?Wa(e,!!n,t,!1):a!=null&&Wa(e,!!n,a,!0);return;case"textarea":J("invalid",e),o=i=n=null;for(s in a)if(a.hasOwnProperty(s)&&(r=a[s],r!=null))switch(s){case"value":n=r;break;case"defaultValue":i=r;break;case"children":o=r;break;case"dangerouslySetInnerHTML":if(r!=null)throw Error(p(91));break;default:le(e,t,s,r,a,null)}Rl(e,n,i,o);return;case"option":for(c in a)a.hasOwnProperty(c)&&(n=a[c],n!=null)&&(c==="selected"?e.selected=n&&typeof n!="function"&&typeof n!="symbol":le(e,t,c,n,a,null));return;case"dialog":J("beforetoggle",e),J("toggle",e),J("cancel",e),J("close",e);break;case"iframe":case"object":J("load",e);break;case"video":case"audio":for(n=0;n<pi.length;n++)J(pi[n],e);break;case"image":J("error",e),J("load",e);break;case"details":J("toggle",e);break;case"embed":case"source":case"link":J("error",e),J("load",e);case"area":case"base":case"br":case"col":case"hr":case"keygen":case"meta":case"param":case"track":case"wbr":case"menuitem":for(m in a)if(a.hasOwnProperty(m)&&(n=a[m],n!=null))switch(m){case"children":case"dangerouslySetInnerHTML":throw Error(p(137,t));default:le(e,t,m,n,a,null)}return;default:if(os(t)){for(w in a)a.hasOwnProperty(w)&&(n=a[w],n!==void 0&&Kr(e,t,w,n,a,void 0));return}}for(r in a)a.hasOwnProperty(r)&&(n=a[r],n!=null&&le(e,t,r,n,a,null))}function uf(e,t,a,n){switch(t){case"div":case"span":case"svg":case"path":case"a":case"g":case"p":case"li":break;case"input":var i=null,o=null,s=null,r=null,c=null,m=null,w=null;for(v in a){var k=a[v];if(a.hasOwnProperty(v)&&k!=null)switch(v){case"checked":break;case"value":break;case"defaultValue":c=k;default:n.hasOwnProperty(v)||le(e,t,v,null,n,k)}}for(var g in n){var v=n[g];
vendor: 5,468 bytes, line 10
10if(k=a[g],n.hasOwnProperty(g)&&(v!=null||k!=null))switch(g){case"type":o=v;break;case"name":i=v;break;case"checked":m=v;break;case"defaultChecked":w=v;break;case"value":s=v;break;case"defaultValue":r=v;break;case"children":case"dangerouslySetInnerHTML":if(v!=null)throw Error(p(137,t));break;default:v!==k&&le(e,t,g,v,n,k)}}ns(e,s,r,c,m,w,o,i);return;case"select":v=s=r=g=null;for(o in a)if(c=a[o],a.hasOwnProperty(o)&&c!=null)switch(o){case"value":break;case"multiple":v=c;default:n.hasOwnProperty(o)||le(e,t,o,null,n,c)}for(i in n)if(o=n[i],c=a[i],n.hasOwnProperty(i)&&(o!=null||c!=null))switch(i){case"value":g=o;break;case"defaultValue":r=o;break;case"multiple":s=o;default:o!==c&&le(e,t,i,o,n,c)}t=r,a=s,n=v,g!=null?Wa(e,!!a,g,!1):!!n!=!!a&&(t!=null?Wa(e,!!a,t,!0):Wa(e,!!a,a?[]:"",!1));return;case"textarea":v=g=null;for(r in a)if(i=a[r],a.hasOwnProperty(r)&&i!=null&&!n.hasOwnProperty(r))switch(r){case"value":break;case"children":break;default:le(e,t,r,null,n,i)}for(s in n)if(i=n[s],o=a[s],n.hasOwnProperty(s)&&(i!=null||o!=null))switch(s){case"value":g=i;break;case"defaultValue":v=i;break;case"children":break;case"dangerouslySetInnerHTML":if(i!=null)throw Error(p(91));break;default:i!==o&&le(e,t,s,i,n,o)}Ml(e,g,v);return;case"option":for(var E in a)g=a[E],a.hasOwnProperty(E)&&g!=null&&!n.hasOwnProperty(E)&&(E==="selected"?e.selected=!1:le(e,t,E,null,n,g));for(c in n)g=n[c],v=a[c],n.hasOwnProperty(c)&&g!==v&&(g!=null||v!=null)&&(c==="selected"?e.selected=g&&typeof g!="function"&&typeof g!="symbol":le(e,t,c,g,n,v));return;case"img":case"link":case"area":case"base":case"br":case"col":case"embed":case"hr":case"keygen":case"meta":case"param":case"source":case"track":case"wbr":case"menuitem":for(var B in a)g=a[B],a.hasOwnProperty(B)&&g!=null&&!n.hasOwnProperty(B)&&le(e,t,B,null,n,g);for(m in n)if(g=n[m],v=a[m],n.hasOwnProperty(m)&&g!==v&&(g!=null||v!=null))switch(m){case"children":case"dangerouslySetInnerHTML":if(g!=null)throw Error(p(137,t));break;default:le(e,t,m,g,n,v)}return;default:if(os(t)){for(var ce in a)g=a[ce],a.hasOwnProperty(ce)&&g!==void 0&&!n.hasOwnProperty(ce)&&Kr(e,t,ce,void 0,n,g);for(w in n)g=n[w],v=a[w],!n.hasOwnProperty(w)||g===v||g===void 0&&v===void 0||Kr(e,t,w,g,n,v);return}}for(var h in a)g=a[h],a.hasOwnProperty(h)&&g!=null&&!n.hasOwnProperty(h)&&le(e,t,h,null,n,g);for(k in n)g=n[k],v=a[k],!n.hasOwnProperty(k)||g===v||g==null&&v==null||le(e,t,k,g,n,v)}function Nu(e){switch(e){case"css":case"script":case"font":case"img":case"image":case"input":case"link":return!0;default:return!1}}function hf(){if(typeof performance.getEntriesByType=="function"){for(var e=0,t=0,a=performance.getEntriesByType("resource"),n=0;n<a.length;n++){var i=a[n],o=i.transferSize,s=i.initiatorType,r=i.duration;if(o&&r&&Nu(s)){for(s=0,r=i.responseEnd,n+=1;n<a.length;n++){var c=a[n],m=c.startTime;if(m>r)break;var w=c.transferSize,k=c.initiatorType;w&&Nu(k)&&(c=c.responseEnd,s+=w*(c<r?1:(r-m)/(c-m)))}if(--n,t+=8*(o+s)/(i.duration/1e3),e++,10<e)break}}if(0<e)return t/e/1e6}return navigator.connection&&(e=navigator.connection.downlink,typeof e=="number")?e:5}var Qr=null,Zr=null;function zo(e){return e.nodeType===9?e:e.ownerDocument}function Lu(e){switch(e){case"http://www.w3.org/2000/svg":return 1;case"http://www.w3.org/1998/Math/MathML":return 2;default:return 0}}function Bu(e,t){if(e===0)switch(t){case"svg":return 1;case"math":return 2;default:return 0}return e===1&&t==="foreignObject"?0:e}function Jr(e,t){return e==="textarea"||e==="noscript"||typeof t.children=="string"||typeof t.children=="number"||typeof t.children=="bigint"||typeof t.dangerouslySetInnerHTML=="object"&&t.dangerouslySetInnerHTML!==null&&t.dangerouslySetInnerHTML.__html!=null}var Wr=null;function pf(){var e=window.event;return e&&e.type==="popstate"?e===Wr?!1:(Wr=e,!0):(Wr=null,!1)}var Hu=typeof setTimeout=="function"?setTimeout:void 0,ff=typeof clearTimeout=="function"?clearTimeout:void 0,Gu=typeof Promise=="function"?Promise:void 0,mf=typeof queueMicrotask=="function"?queueMicrotask:typeof Gu<"u"?function(e){return Gu.resolve(null).then(e).catch(gf)}:Hu;function gf(e){setTimeout(function(){throw e})}function va(e){return e==="head"}function Yu(e,t){var a=t,n=0;do{var i=a.nextSibling;if(e.removeChild(a),i&&i.nodeType===8)if(a=i.data,a==="/$"||a==="/&"){if(n===0){e.removeChild(i),zn(t);return}n--}else if(a==="$"||a==="$?"||a==="$~"||a==="$!"||a==="&")n++;else if(a==="html")mi(e.ownerDocument.documentElement);else if(a==="head"){a=e.ownerDocument.head,mi(a);for(var o=a.firstChild;o;){var s=o.nextSibling,r=o.nodeName;o[Mn]||r==="SCRIPT"||r==="STYLE"||r==="LINK"&&o.rel.toLowerCase()==="stylesheet"||a.removeChild(o),o=s}}else a==="body"&&mi(e.ownerDocument.body);a=i}while(a);zn(t)}function Vu(e,t){var a=e;e=0;do{var n=a.nextSibling;if(a.nodeType===1?t?(a._stashedDisplay=a.style.display,a.style.display="none"):(a.style.display=a._stashedDisplay||"",a.getAttribute("style")===""&&a.removeAttribute("style")):a.nodeType===3&&(t?(a._stashedText=a.nodeValue,a.nodeValue=""):a.nodeValue=a._stashedText||""),n&&n.nodeType===8)if(a=n.data,a==="/$"){if(e===0)break;e--}else a!=="$"&&a!=="$?"&&a!=="$~"&&a!=="$!"||e++;a=n}while(a)}function Pr(e){var t=e.firstChild;for(t&&t.nodeType===10&&(t=t.nextSibling);t;){var a=t;switch(t=t.nextSibling,a.nodeName){case"HTML":case"HEAD":case"BODY":Pr(a),ts(a);continue;case"SCRIPT":case"STYLE":continue;case"LINK":if(a.rel.toLowerCase()==="stylesheet")continue}e.removeChild(a)}}function vf(e,t,a,n){for(;
vendor: 4,507 bytes, line 10
10e.nodeType===1;){var i=a;if(e.nodeName.toLowerCase()!==t.toLowerCase()){if(!n&&(e.nodeName!=="INPUT"||e.type!=="hidden"))break}else if(n){if(!e[Mn])switch(t){case"meta":if(!e.hasAttribute("itemprop"))break;return e;case"link":if(o=e.getAttribute("rel"),o==="stylesheet"&&e.hasAttribute("data-precedence"))break;if(o!==i.rel||e.getAttribute("href")!==(i.href==null||i.href===""?null:i.href)||e.getAttribute("crossorigin")!==(i.crossOrigin==null?null:i.crossOrigin)||e.getAttribute("title")!==(i.title==null?null:i.title))break;return e;case"style":if(e.hasAttribute("data-precedence"))break;return e;case"script":if(o=e.getAttribute("src"),(o!==(i.src==null?null:i.src)||e.getAttribute("type")!==(i.type==null?null:i.type)||e.getAttribute("crossorigin")!==(i.crossOrigin==null?null:i.crossOrigin))&&o&&e.hasAttribute("async")&&!e.hasAttribute("itemprop"))break;return e;default:return e}}else if(t==="input"&&e.type==="hidden"){var o=i.name==null?null:""+i.name;if(i.type==="hidden"&&e.getAttribute("name")===o)return e}else return e;if(e=yt(e.nextSibling),e===null)break}return null}function yf(e,t,a){if(t==="")return null;for(;e.nodeType!==3;)if((e.nodeType!==1||e.nodeName!=="INPUT"||e.type!=="hidden")&&!a||(e=yt(e.nextSibling),e===null))return null;return e}function Xu(e,t){for(;e.nodeType!==8;)if((e.nodeType!==1||e.nodeName!=="INPUT"||e.type!=="hidden")&&!t||(e=yt(e.nextSibling),e===null))return null;return e}function Fr(e){return e.data==="$?"||e.data==="$~"}function Ir(e){return e.data==="$!"||e.data==="$?"&&e.ownerDocument.readyState!=="loading"}function wf(e,t){var a=e.ownerDocument;if(e.data==="$~")e._reactRetry=t;else if(e.data!=="$?"||a.readyState!=="loading")t();else{var n=function(){t(),a.removeEventListener("DOMContentLoaded",n)};a.addEventListener("DOMContentLoaded",n),e._reactRetry=n}}function yt(e){for(;e!=null;e=e.nextSibling){var t=e.nodeType;if(t===1||t===3)break;if(t===8){if(t=e.data,t==="$"||t==="$!"||t==="$?"||t==="$~"||t==="&"||t==="F!"||t==="F")break;if(t==="/$"||t==="/&")return null}}return e}var $r=null;function Ku(e){e=e.nextSibling;for(var t=0;e;){if(e.nodeType===8){var a=e.data;if(a==="/$"||a==="/&"){if(t===0)return yt(e.nextSibling);t--}else a!=="$"&&a!=="$!"&&a!=="$?"&&a!=="$~"&&a!=="&"||t++}e=e.nextSibling}return null}function Qu(e){e=e.previousSibling;for(var t=0;e;){if(e.nodeType===8){var a=e.data;if(a==="$"||a==="$!"||a==="$?"||a==="$~"||a==="&"){if(t===0)return e;t--}else a!=="/$"&&a!=="/&"||t++}e=e.previousSibling}return null}function Zu(e,t,a){switch(t=zo(a),e){case"html":if(e=t.documentElement,!e)throw Error(p(452));return e;case"head":if(e=t.head,!e)throw Error(p(453));return e;case"body":if(e=t.body,!e)throw Error(p(454));return e;default:throw Error(p(451))}}function mi(e){for(var t=e.attributes;t.length;)e.removeAttributeNode(t[0]);ts(e)}var wt=new Map,Ju=new Set;function Oo(e){return typeof e.getRootNode=="function"?e.getRootNode():e.nodeType===9?e:e.ownerDocument}var Wt=C.d;C.d={f:bf,r:kf,D:Sf,C:Af,L:Df,m:xf,X:Cf,S:Tf,M:zf};function bf(){var e=Wt.f(),t=bo();return e||t}function kf(e){var t=Qa(e);t!==null&&t.tag===5&&t.type==="form"?ud(t):Wt.r(e)}var xn=typeof document>"u"?null:document;function Wu(e,t,a){var n=xn;if(n&&typeof t=="string"&&t){var i=ut(t);i='link[rel="'+e+'"][href="'+i+'"]',typeof a=="string"&&(i+='[crossorigin="'+a+'"]'),Ju.has(i)||(Ju.add(i),e={rel:e,crossOrigin:a,href:t},n.querySelector(i)===null&&(t=n.createElement("link"),Ne(t,"link",e),je(t),n.head.appendChild(t)))}}function Sf(e){Wt.D(e),Wu("dns-prefetch",e,null)}function Af(e,t){Wt.C(e,t),Wu("preconnect",e,t)}function Df(e,t,a){Wt.L(e,t,a);var n=xn;if(n&&e&&t){var i='link[rel="preload"][as="'+ut(t)+'"]';t==="image"&&a&&a.imageSrcSet?(i+='[imagesrcset="'+ut(a.imageSrcSet)+'"]',typeof a.imageSizes=="string"&&(i+='[imagesizes="'+ut(a.imageSizes)+'"]')):i+='[href="'+ut(e)+'"]';var o=i;switch(t){case"style":o=Tn(e);break;case"script":o=Cn(e)}wt.has(o)||(e=M({rel:"preload",href:t==="image"&&a&&a.imageSrcSet?void 0:e,as:t},a),wt.set(o,e),n.querySelector(i)!==null||t==="style"&&n.querySelector(gi(o))||t==="script"&&n.querySelector(vi(o))||(t=n.createElement("link"),Ne(t,"link",e),je(t),n.head.appendChild(t)))}}function xf(e,t){Wt.m(e,t);var a=xn;if(a&&e){var n=t&&typeof t.as=="string"?t.as:"script",i='link[rel="modulepreload"][as="'+ut(n)+'"][href="'+ut(e)+'"]',o=i;switch(n){case"audioworklet":case"paintworklet":case"serviceworker":case"sharedworker":case"worker":case"script":o=Cn(e)}if(!wt.has(o)&&(e=M({rel:"modulepreload",href:e}
vendor: 6,156 bytes, line 10
10,t),wt.set(o,e),a.querySelector(i)===null)){switch(n){case"audioworklet":case"paintworklet":case"serviceworker":case"sharedworker":case"worker":case"script":if(a.querySelector(vi(o)))return}n=a.createElement("link"),Ne(n,"link",e),je(n),a.head.appendChild(n)}}}function Tf(e,t,a){Wt.S(e,t,a);var n=xn;if(n&&e){var i=Za(n).hoistableStyles,o=Tn(e);t=t||"default";var s=i.get(o);if(!s){var r={loading:0,preload:null};if(s=n.querySelector(gi(o)))r.loading=5;else{e=M({rel:"stylesheet",href:e,"data-precedence":t},a),(a=wt.get(o))&&el(e,a);var c=s=n.createElement("link");je(c),Ne(c,"link",e),c._p=new Promise(function(m,w){c.onload=m,c.onerror=w}),c.addEventListener("load",function(){r.loading|=1}),c.addEventListener("error",function(){r.loading|=2}),r.loading|=4,jo(s,t,n)}s={type:"stylesheet",instance:s,count:1,state:r},i.set(o,s)}}}function Cf(e,t){Wt.X(e,t);var a=xn;if(a&&e){var n=Za(a).hoistableScripts,i=Cn(e),o=n.get(i);o||(o=a.querySelector(vi(i)),o||(e=M({src:e,async:!0},t),(t=wt.get(i))&&tl(e,t),o=a.createElement("script"),je(o),Ne(o,"link",e),a.head.appendChild(o)),o={type:"script",instance:o,count:1,state:null},n.set(i,o))}}function zf(e,t){Wt.M(e,t);var a=xn;if(a&&e){var n=Za(a).hoistableScripts,i=Cn(e),o=n.get(i);o||(o=a.querySelector(vi(i)),o||(e=M({src:e,async:!0,type:"module"},t),(t=wt.get(i))&&tl(e,t),o=a.createElement("script"),je(o),Ne(o,"link",e),a.head.appendChild(o)),o={type:"script",instance:o,count:1,state:null},n.set(i,o))}}function Pu(e,t,a,n){var i=(i=Q.current)?Oo(i):null;if(!i)throw Error(p(446));switch(e){case"meta":case"title":return null;case"style":return typeof a.precedence=="string"&&typeof a.href=="string"?(t=Tn(a.href),a=Za(i).hoistableStyles,n=a.get(t),n||(n={type:"style",instance:null,count:0,state:null},a.set(t,n)),n):{type:"void",instance:null,count:0,state:null};case"link":if(a.rel==="stylesheet"&&typeof a.href=="string"&&typeof a.precedence=="string"){e=Tn(a.href);var o=Za(i).hoistableStyles,s=o.get(e);if(s||(i=i.ownerDocument||i,s={type:"stylesheet",instance:null,count:0,state:{loading:0,preload:null}},o.set(e,s),(o=i.querySelector(gi(e)))&&!o._p&&(s.instance=o,s.state.loading=5),wt.has(e)||(a={rel:"preload",as:"style",href:a.href,crossOrigin:a.crossOrigin,integrity:a.integrity,media:a.media,hrefLang:a.hrefLang,referrerPolicy:a.referrerPolicy},wt.set(e,a),o||Of(i,e,a,s.state))),t&&n===null)throw Error(p(528,""));return s}if(t&&n!==null)throw Error(p(529,""));return null;case"script":return t=a.async,a=a.src,typeof a=="string"&&t&&typeof t!="function"&&typeof t!="symbol"?(t=Cn(a),a=Za(i).hoistableScripts,n=a.get(t),n||(n={type:"script",instance:null,count:0,state:null},a.set(t,n)),n):{type:"void",instance:null,count:0,state:null};default:throw Error(p(444,e))}}function Tn(e){return'href="'+ut(e)+'"'}function gi(e){return'link[rel="stylesheet"]['+e+"]"}function Fu(e){return M({},e,{"data-precedence":e.precedence,precedence:null})}function Of(e,t,a,n){e.querySelector('link[rel="preload"][as="style"]['+t+"]")?n.loading=1:(t=e.createElement("link"),n.preload=t,t.addEventListener("load",function(){return n.loading|=1}),t.addEventListener("error",function(){return n.loading|=2}),Ne(t,"link",a),je(t),e.head.appendChild(t))}function Cn(e){return'[src="'+ut(e)+'"]'}function vi(e){return"script[async]"+e}function Iu(e,t,a){if(t.count++,t.instance===null)switch(t.type){case"style":var n=e.querySelector('style[data-href~="'+ut(a.href)+'"]');if(n)return t.instance=n,je(n),n;var i=M({},a,{"data-href":a.href,"data-precedence":a.precedence,href:null,precedence:null});return n=(e.ownerDocument||e).createElement("style"),je(n),Ne(n,"style",i),jo(n,a.precedence,e),t.instance=n;case"stylesheet":i=Tn(a.href);var o=e.querySelector(gi(i));if(o)return t.state.loading|=4,t.instance=o,je(o),o;n=Fu(a),(i=wt.get(i))&&el(n,i),o=(e.ownerDocument||e).createElement("link"),je(o);var s=o;return s._p=new Promise(function(r,c){s.onload=r,s.onerror=c}),Ne(o,"link",n),t.state.loading|=4,jo(o,a.precedence,e),t.instance=o;case"script":return o=Cn(a.src),(i=e.querySelector(vi(o)))?(t.instance=i,je(i),i):(n=a,(i=wt.get(o))&&(n=M({},a),tl(n,i)),e=e.ownerDocument||e,i=e.createElement("script"),je(i),Ne(i,"link",n),e.head.appendChild(i),t.instance=i);case"void":return null;default:throw Error(p(443,t.type))}else t.type==="stylesheet"&&(t.state.loading&4)===0&&(n=t.instance,t.state.loading|=4,jo(n,a.precedence,e));return t.instance}function jo(e,t,a){for(var n=a.querySelectorAll('link[rel="stylesheet"][data-precedence],style[data-precedence]'),i=n.length?n[n.length-1]:null,o=i,s=0;s<n.length;s++){var r=n[s];if(r.dataset.precedence===t)o=r;else if(o!==i)break}o?o.parentNode.insertBefore(e,o.nextSibling):(t=a.nodeType===9?a.head:a,t.insertBefore(e,t.firstChild))}function el(e,t){e.crossOrigin??=t.crossOrigin,e.referrerPolicy??=t.referrerPolicy,e.title??=t.title}function tl(e,t){e.crossOrigin??=t.crossOrigin,e.referrerPolicy??=t.referrerPolicy,e.integrity??=t.integrity}var Eo=null;function $u(e,t,a){if(Eo===null){var n=new Map,i=Eo=new Map;i.set(a,n)}else i=Eo,n=i.get(a),n||(n=new Map,i.set(a,n));if(n.has(e))return n;for(n.set(e,null),a=a.getElementsByTagName(e),i=0;i<a.length;i++){var o=a[i];if(!(o[Mn]||o[Me]||e==="link"&&o.getAttribute("rel")==="stylesheet")&&o.namespaceURI!=="http://www.w3.org/2000/svg"){var s=o.getAttribute(t)||"";s=e+s;var r=n.get(s);r?r.push(o):n.set(s,[o])}}return n}function eh(e,t,a){e=e.ownerDocument||e,e.head.insertBefore(a,t==="title"?e.querySelector("head > title"):null)}function jf(e,t,a){if(a===1||t.itemProp!=null)return!1;switch(e){case"meta":case"title":return!0;case"style":if(typeof t.precedence!="string"||typeof t.href!="string"||t.href==="")break;return!0;case"link":if(typeof t.rel!="string"||typeof t.href!="string"||t.href===""||t.onLoad||t.onError)break;return t.rel==="stylesheet"?(e=t.disabled,typeof t.precedence=="string"&&e==null):!0;case"script":if(t.async&&typeof t.async!="function"&&typeof t.async!="symbol"&&!t.onLoad&&!t.onError&&t.src&&typeof t.src=="string")return!0}return!1}function th(e){return!(e.type==="stylesheet"&&(e.state.loading&3)===0)}function Ef(e,t,a,n){if(a.type==="stylesheet"&&(typeof n.media!="str
10ing"||matchMedia(n.media).matches!==!1)&&(a.state.loading&4)===0){if(a.instance===null){var i=Tn(n.href),o=t.querySelector(gi(i));if(o){t=o._p,t!==null&&typeof t=="object"&&typeof t.then=="function"&&(e.count++,e=_o.bind(e),t.then(e,e)),a.state.loading|=4,a.instance=o,je(o);return}o=t.ownerDocument||t,n=Fu(n),(i=wt.get(i))&&el(n,i),o=o.createElement("link"),je(o);var s=o;s._p=new Promise(function(r,c){s.onload=r,s.onerror=c}),Ne(o,"link",n),a.instance=o}e.stylesheets===null&&(e.stylesheets=new Map),e.stylesheets.set(a,t),(t=a.state.preload)&&(a.state.loading&3)===0&&(e.count++,a=_o.bind(e),t.addEventListener("load",a),t.addEventListener("error",a))}}var al=0;function _f(e,t){return e.stylesheets&&e.count===0&&Ro(e,e.stylesheets),0<e.count||0<e.imgCount?function(a){var n=setTimeout(function(){if(e.stylesheets&&Ro(e,e.stylesheets),e.unsuspend){var o=e.unsuspend;e.unsuspend=null,o()}},6e4+t);0<e.imgBytes&&al===0&&(al=62500*hf());var i=setTimeout(function(){if(e.waitingForImages=!1,e.count===0&&(e.stylesheets&&Ro(e,e.stylesheets),e.unsuspend)){var o=e.unsuspend;e.unsuspend=null,o()}},(e.imgBytes>al?50:800)+t);return e.unsuspend=a,function(){e.unsuspend=null,clearTimeout(n),clearTimeout(i)}}:null}function _o(){if(this.count--,this.count===0&&(this.imgCount===0||!this.waitingForImages)){if(this.stylesheets)Ro(this,this.stylesheets);else if(this.unsuspend){var e=this.unsuspend;this.unsuspend=null,e()}}}var Mo=null;function Ro(e,t){e.stylesheets=null,e.unsuspend!==null&&(e.count++,Mo=new Map,t.forEach(Mf,e),Mo=null,_o.call(e))}function Mf(e,t){if(!(t.state.loading&4)){var a=Mo.get(e);if(a)var n=a.get(null);else{a=new Map,Mo.set(e,a);for(var i=e.querySelectorAll("link[data-precedence],style[data-precedence]"),o=0;o<i.length;o++){var s=i[o];(s.nodeName==="LINK"||s.getAttribute("media")!=="not all")&&(a.set(s.dataset.precedence,s),n=s)}n&&a.set(null,n)}i=t.instance,s=i.getAttribute("data-precedence"),o=a.get(s)||n,o===n&&a.set(null,i),a.set(s,i),this.count++,n=_o.bind(this),i.addEventListener("load",n),i.addEventListener("error",n),o?o.parentNode.insertBefore(i,o.nextSibling):(e=e.nodeType===9?e.head:e,e.insertBefore(i,e.firstChild)),t.state.loading|=4}}var yi={$$typeof:Oe,Provider:null,Consumer:null,_currentValue:ae,_currentValue2:ae,_threadCount:0};function Rf(e,t,a,n,i,o,s,r,c){this.tag=1,this.containerInfo=e,this.pingCache=this.current=this.pendingChildren=null,this.timeoutHandle=-1,this.callbackNode=this.next=this.pendingContext=this.context=this.cancelPendingCommit=null,this.callbackPriority=0,this.expirationTimes=Fo(-1),this.entangledLanes=this.shellSuspendCounter=this.errorRecoveryDisabledLanes=this.expiredLanes=this.warmLanes=this.pingedLanes=this.suspendedLanes=this.pendingLanes=0,this.entanglements=Fo(0),this.hiddenUpdates=Fo(null),this.identifierPrefix=n,this.onUncaughtError=i,this.onCaughtError=o,this.onRecoverableError=s,this.pooledCache=null,this.pooledCacheLanes=0,this.formState=c,this.incompleteTransitions=new Map}function ah(e,t,a,n,i,o,s,r,c,m,w,k){return e=new Rf(e,t,a,s,c,m,w,k,r),t=1,o===!0&&(t|=24),o=it(3,null,null,t),e.current=o,o.stateNode=e,t=Us(),t.refCount++,e.pooledCache=t,t.refCount++,o.memoizedState={element:n,isDehydrated:a,cache:t},Bs(o),e}function nh(e){return e?(e=nn,e):nn}function ih(e,t,a,n,i,o){i=nh(i),n.context===null?n.context=i:n.pendingContext=i,n=sa(t),n.payload={element:a},o=o===void 0?null:o,o!==null&&(n.callback=o),a=ra(e,n,t),a!==null&&(Ze(a,e,t),Pn(a,e,t))}function oh(e,t){if(e=e.memoizedState,e!==null&&e.dehydrated!==null){var a=e.retryLane;e.retryLane=a!==0&&a<t?a:t}}function nl(e,t){oh(e,t),(e=e.alternate)&&oh(e,t)}function sh(e){if(e.tag===13||e.tag===31){var t=ja(e,67108864);t!==null&&Ze(t,e,67108864),nl(e,67108864)}}function rh(e){if(e.tag===13||e.tag===31){var t=ct();t=Io(t);var a=ja(e,t);a!==null&&Ze(a,e,t),nl(e,t)}}var Uo=!0;function Uf(e,t,a,n){var i=x.T;x.T=null;var o=C.p;try{C.p=2,il(e,t,a,n)}finally{C.p=o,x.T=i}}function qf(e,t,a,n){var i=x.T;x.T=null;var o=C.p;try{C.p=8,il(e,t,a,n)}finally{C.p=o,x.T=i}}function il(e,t,a,n){if(Uo){var i=ol(n);if(i===null)Xr(e,t,n,qo,a),ch(e,n);else if(Lf(i,e,t,a,n))n.stopPropagation();else if(ch(e,n),t&4&&-1<Nf.indexOf(e)){for(;i!==null;){var o=Qa(i);
vendor: 4,214 bytes, line 10
10if(o!==null)switch(o.tag){case 3:if(o=o.stateNode,o.current.memoizedState.isDehydrated){var s=xa(o.pendingLanes);if(s!==0){var r=o;for(r.pendingLanes|=2,r.entangledLanes|=2;s;){var c=1<<31-at(s);r.entanglements[1]|=c,s&=~c}jt(o),(ne&6)===0&&(yo=et()+500,hi(0,!1))}}break;case 31:case 13:r=ja(o,2),r!==null&&Ze(r,o,2),bo(),nl(o,2)}if(o=ol(n),o===null&&Xr(e,t,n,qo,a),o===i)break;i=o}i!==null&&n.stopPropagation()}else Xr(e,t,n,null,a)}}function ol(e){return e=rs(e),sl(e)}var qo=null;function sl(e){if(qo=null,e=Ka(e),e!==null){var t=H(e);if(t===null)e=null;else{var a=t.tag;if(a===13){if(e=L(t),e!==null)return e;e=null}else if(a===31){if(e=W(t),e!==null)return e;e=null}else if(a===3){if(t.stateNode.current.memoizedState.isDehydrated)return t.tag===3?t.stateNode.containerInfo:null;e=null}else t!==e&&(e=null)}}return qo=e,null}function lh(e){switch(e){case"beforetoggle":case"cancel":case"click":case"close":case"contextmenu":case"copy":case"cut":case"auxclick":case"dblclick":case"dragend":case"dragstart":case"drop":case"focusin":case"focusout":case"input":case"invalid":case"keydown":case"keypress":case"keyup":case"mousedown":case"mouseup":case"paste":case"pause":case"play":case"pointercancel":case"pointerdown":case"pointerup":case"ratechange":case"reset":case"resize":case"seeked":case"submit":case"toggle":case"touchcancel":case"touchend":case"touchstart":case"volumechange":case"change":case"selectionchange":case"textInput":case"compositionstart":case"compositionend":case"compositionupdate":case"beforeblur":case"afterblur":case"beforeinput":case"blur":case"fullscreenchange":case"focus":case"hashchange":case"popstate":case"select":case"selectstart":return 2;case"drag":case"dragenter":case"dragexit":case"dragleave":case"dragover":case"mousemove":case"mouseout":case"mouseover":case"pointermove":case"pointerout":case"pointerover":case"scroll":case"touchmove":case"wheel":case"mouseenter":case"mouseleave":case"pointerenter":case"pointerleave":return 8;case"message":switch(Rh()){case gl:return 2;case vl:return 8;case Di:case Uh:return 32;case yl:return 268435456;default:return 32}default:return 32}}var rl=!1,ya=null,wa=null,ba=null,wi=new Map,bi=new Map,ka=[],Nf="mousedown mouseup touchcancel touchend touchstart auxclick dblclick pointercancel pointerdown pointerup dragend dragstart drop compositionend compositionstart keydown keypress keyup input textInput copy cut paste click change contextmenu reset".split(" ");function ch(e,t){switch(e){case"focusin":case"focusout":ya=null;break;case"dragenter":case"dragleave":wa=null;break;case"mouseover":case"mouseout":ba=null;break;case"pointerover":case"pointerout":wi.delete(t.pointerId);break;case"gotpointercapture":case"lostpointercapture":bi.delete(t.pointerId)}}function ki(e,t,a,n,i,o){return e===null||e.nativeEvent!==o?(e={blockedOn:t,domEventName:a,eventSystemFlags:n,nativeEvent:o,targetContainers:[i]},t!==null&&(t=Qa(t),t!==null&&sh(t)),e):(e.eventSystemFlags|=n,t=e.targetContainers,i!==null&&t.indexOf(i)===-1&&t.push(i),e)}function Lf(e,t,a,n,i){switch(t){case"focusin":return ya=ki(ya,e,t,a,n,i),!0;case"dragenter":return wa=ki(wa,e,t,a,n,i),!0;case"mouseover":return ba=ki(ba,e,t,a,n,i),!0;case"pointerover":var o=i.pointerId;return wi.set(o,ki(wi.get(o)||null,e,t,a,n,i)),!0;case"gotpointercapture":return o=i.pointerId,bi.set(o,ki(bi.get(o)||null,e,t,a,n,i)),!0}return!1}function dh(e){var t=Ka(e.target);if(t!==null){var a=H(t);if(a!==null){if(t=a.tag,t===13){if(t=L(a),t!==null){e.blockedOn=t,Dl(e.priority,function(){rh(a)});return}}else if(t===31){if(t=W(a),t!==null){e.blockedOn=t,Dl(e.priority,function(){rh(a)});return}}else if(t===3&&a.stateNode.current.memoizedState.isDehydrated){e.blockedOn=a.tag===3?a.stateNode.containerInfo:null;return}}}e.blockedOn=null}function No(e){if(e.blockedOn!==null)return!1;for(var t=e.targetContainers;0<t.length;){var a=ol(e.nativeEvent);if(a===null){a=e.nativeEvent;var n=new a.constructor(a.type,a);ss=n,a.target.dispatchEvent(n),ss=null}else return t=Qa(a),t!==null&&sh(t),e.blockedOn=a,!1;t.shift()}return!0}function uh(e,t,a){No(e)&&a.delete(t)}function Bf(){rl=!1,ya!==null&&No(ya)&&(ya=null),wa!==null&&No(wa)&&(wa=null),ba!==null&&No(ba)&&(ba=null),wi.forEach(uh),bi.forEac
vendor: 8,271 bytes, line 10
10h(uh)}function Lo(e,t){e.blockedOn===t&&(e.blockedOn=null,rl||(rl=!0,y.unstable_scheduleCallback(y.unstable_NormalPriority,Bf)))}var Bo=null;function hh(e){Bo!==e&&(Bo=e,y.unstable_scheduleCallback(y.unstable_NormalPriority,function(){Bo===e&&(Bo=null);for(var t=0;t<e.length;t+=3){var a=e[t],n=e[t+1],i=e[t+2];if(typeof n!="function"){if(sl(n||a)===null)continue;break}var o=Qa(a);o!==null&&(e.splice(t,3),t-=3,or(o,{pending:!0,data:i,method:a.method,action:n},n,i))}}))}function zn(e){function t(c){return Lo(c,e)}ya!==null&&Lo(ya,e),wa!==null&&Lo(wa,e),ba!==null&&Lo(ba,e),wi.forEach(t),bi.forEach(t);for(var a=0;a<ka.length;a++){var n=ka[a];n.blockedOn===e&&(n.blockedOn=null)}for(;0<ka.length&&(a=ka[0],a.blockedOn===null);)dh(a),a.blockedOn===null&&ka.shift();if(a=(e.ownerDocument||e).$$reactFormReplay,a!=null)for(n=0;n<a.length;n+=3){var i=a[n],o=a[n+1],s=i[Ge]||null;if(typeof o=="function")s||hh(a);else if(s){var r=null;if(o&&o.hasAttribute("formAction")){if(i=o,s=o[Ge]||null)r=s.formAction;else if(sl(i)!==null)continue}else r=s.action;typeof r=="function"?a[n+1]=r:(a.splice(n,3),n-=3),hh(a)}}}function ph(){function e(o){o.canIntercept&&o.info==="react-transition"&&o.intercept({handler:function(){return new Promise(function(s){return i=s})},focusReset:"manual",scroll:"manual"})}function t(){i!==null&&(i(),i=null),n||setTimeout(a,20)}function a(){if(!n&&!navigation.transition){var o=navigation.currentEntry;o&&o.url!=null&&navigation.navigate(o.url,{state:o.getState(),info:"react-transition",history:"replace"})}}if(typeof navigation=="object"){var n=!1,i=null;return navigation.addEventListener("navigate",e),navigation.addEventListener("navigatesuccess",t),navigation.addEventListener("navigateerror",t),setTimeout(a,100),function(){n=!0,navigation.removeEventListener("navigate",e),navigation.removeEventListener("navigatesuccess",t),navigation.removeEventListener("navigateerror",t),i!==null&&(i(),i=null)}}}function ll(e){this._internalRoot=e}Ho.prototype.render=ll.prototype.render=function(e){var t=this._internalRoot;if(t===null)throw Error(p(409));var a=t.current;ih(a,ct(),e,t,null,null)},Ho.prototype.unmount=ll.prototype.unmount=function(){var e=this._internalRoot;if(e!==null){this._internalRoot=null;var t=e.containerInfo;ih(e.current,2,null,e,null,null),bo(),t[Xa]=null}};function Ho(e){this._internalRoot=e}Ho.prototype.unstable_scheduleHydration=function(e){if(e){var t=Al();e={blockedOn:null,target:e,priority:t};for(var a=0;a<ka.length&&t!==0&&t<ka[a].priority;a++);ka.splice(a,0,e),a===0&&dh(e)}};var fh=D.version;if(fh!=="19.2.6")throw Error(p(527,fh,"19.2.6"));C.findDOMNode=function(e){var t=e._reactInternals;if(t===void 0)throw typeof e.render=="function"?Error(p(188)):(e=Object.keys(e).join(","),Error(p(268,e)));return e=A(t),e=e!==null?q(e):null,e=e===null?null:e.stateNode,e};var Hf={bundleType:0,version:"19.2.6",rendererPackageName:"react-dom",currentDispatcherRef:x,reconcilerVersion:"19.2.6"};if(typeof __REACT_DEVTOOLS_GLOBAL_HOOK__<"u"){var Go=__REACT_DEVTOOLS_GLOBAL_HOOK__;if(!Go.isDisabled&&Go.supportsFiber)try{jn=Go.inject(Hf),tt=Go}catch{}}l.createRoot=function(e,t){if(!G(e))throw Error(p(299));var a=!1,n="",i=kd,o=Sd,s=Ad;return t!=null&&(t.unstable_strictMode===!0&&(a=!0),t.identifierPrefix!==void 0&&(n=t.identifierPrefix),t.onUncaughtError!==void 0&&(i=t.onUncaughtError),t.onCaughtError!==void 0&&(o=t.onCaughtError),t.onRecoverableError!==void 0&&(s=t.onRecoverableError)),t=ah(e,1,!1,null,null,a,n,null,i,o,s,ph),e[Xa]=t.current,Vr(e),new ll(t)},l.hydrateRoot=function(e,t,a){if(!G(e))throw Error(p(299));var n=!1,i="",o=kd,s=Sd,r=Ad,c=null;return a!=null&&(a.unstable_strictMode===!0&&(n=!0),a.identifierPrefix!==void 0&&(i=a.identifierPrefix),a.onUncaughtError!==void 0&&(o=a.onUncaughtError),a.onCaughtError!==void 0&&(s=a.onCaughtError),a.onRecoverableError!==void 0&&(r=a.onRecoverableError),a.formState!==void 0&&(c=a.formState)),t=ah(e,1,!0,t,a??null,n,i,c,o,s,r,ph),t.context=nh(null),a=t.current,n=ct(),n=Io(n),i=sa(n),i.callback=null,ra(a,i,n),a=n,t.current.lanes=a,_n(t,a),jt(t),e[Xa]=t.current,Vr(e),new Ho(t)}})),tm=Et(((l,y)=>{function D(){if(!(typeof __REACT_DEVTOOLS_GLOBAL_HOOK__>"u"||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!="function"))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(D)}catch(j){console.error(j)}}D(),y.exports=em()})),cl=tm(),Dh=[{slug:"viper-maze",name:"Viper Maze",kind:"Game",category:"Smartwatch puzzle game",headingDescriptor:"Maze puzzle game for Apple Watch and Wear OS",tagline:"Plan every turn. Collect every piece of food.",summary:"A calm snake puzzle for Apple Watch and Wear OS with 100 hand-designed levels and a procedural level generator.",keywords:["Apple Watch snake game","Wear OS snake game","smartwatch puzzle game","snake puzzle game","maze game for Apple Watch","Wear OS game","watchOS game","no ads smartwatch game"],platforms:["watchOS","Wear OS"],availability:"Available now",color:"#e98b22",tint:"#f5dfbd",icon:"/apps/viper-maze-icon.webp",artwork:"/apps/viper-maze-wear-2.webp",artworkAlt:"Viper Maze shown on a Wear OS watch with a winding orange viper, rocks, frog, and mouse puzzle pieces",artworkWidth:395,artworkHeight:592,theme:"viper",screenshots:[{src:"/apps/viper-maze-watch-1.webp",alt:"Viper Maze gameplay on Apple Watch with a winding orange viper in a compact grid",width:410,height:502},{src:"/apps/viper-maze-watch-2.webp",alt:"Viper Maze level on Apple Watch with rocks, frogs, and mice",width:410,height:502},{src:"/apps/viper-maze-watch-3.webp",alt:"Viper Maze puzzle layout on Apple Watch",width:410,height:502}],intro:["Viper Maze is a snake puzzle designed specifically for smartwatches. Guide the viper through compact mazes and collect every piece of food by planning the route step by step.","There is no timer and no reflex challenge. Its 100 handcrafted levels increase gradually in difficulty, and the procedural level generator creates new puzzles directly on the watch."],highlights:[{title:"100 handcrafted levels",description:"Every built-in maze is designed for a short, focused puzzle session and steadily increasing difficulty."},{title:"No time pressure",description:"Progress comes from spatial thinking and careful planning rather than fast reactions."},{title:"Generate new levels",description:"A procedural generator adds new puzzles and replayability directly from the watch."}],details:[{label:"Platforms",value:"Apple Watch · Wear OS"},{label:"Levels",value:"100 hand-designed + procedurally generated"},{label:"Privacy",value:"No ads · No tracking"}]},{slug:"sudoku-wear",name:"Sudoku Wear",kind:"Game",category:"Sudoku for smartwatches",headingDescriptor:"Sudoku for Apple Watch",tagline:"Classic Sudoku, right on your wrist.",summary:"A watch-first Sudoku game with 3Ã3, 6Ã6, and 9Ã9 grids, multiple difficulty levels, and small-screen controls.",keywords:["Apple Watch Sudoku","Sudoku for Apple Watch","watchOS Sudoku game","smartwatch Sudoku","9x9 Sudoku Apple Watch","6x6 Sudoku","wrist puzzle game","no data collected game"],platforms:["watchOS"],availability:"Available now",color:"#ff982f",tint:"#f5e4cf",icon:"/apps/sudoku-wear-icon.webp",artwork:"/apps/sudoku-wear-watch-1.webp",artworkAlt:"Sudoku Wear home screen on Apple Watch with New Game and Continue controls",artworkWidth:422,artworkHeight:514,theme:"sudoku",screenshots:[{src:"/apps/sudoku-wear-watch-1.webp",alt:"Sudoku Wear home screen on Apple Watch",width:422,height:514},{src:"/apps/sudoku-wear-watch-2.webp",alt:"Sudoku Wear grid size selection on Apple Watch",width:422,height:514},{src:"/apps/sudoku-wear-watch-3.webp",alt:"Sudoku Wear difficulty selection on Apple Watch",width:422,height:514},{src:"/apps/sudoku-wear-watch-4.webp",alt:"A compact Sudoku Wear puzzle on Apple Watch",width:422,height:514},{src:"/apps/sudoku-wear-watch-5.webp",alt:"A larger Sudoku Wear grid on Apple Watch",width:422,height:514}],intro:["Sudoku Wear brings the classic number puzzle to Apple Watch. Choose a grid size and difficulty, then solve it with controls adapted to a small screen.","The 3Ã3 and 6Ã6 options make quick sessions comfortable, while a full 9Ã9 grid keeps the familiar Sudoku challenge available on your wrist."],highlights:[{title:"Three grid sizes",description:"Choose 3Ã3, 6Ã6, or the classic 9
10Ã9 format depending on the puzzle you want."},{title:"Choose the difficulty",description:"Multiple levels let a quick wrist puzzle stay approachable or become more demanding."},{title:"Watch-first input",description:"Number entry and the overall layout are designed specifically for a small display."}],details:[{label:"Platform",value:"Apple Watch · watchOS"},{label:"Grids",value:"3Ã3 · 6Ã6 · 9Ã9"},{label:"Privacy",value:"No data collected"}]},{slug:"testdock",name:"TestDock",kind:"Developer app",category:"On-device mobile app testing",headingDescriptor:"Mobile app testing tool for iOS and Android",tagline:"Test the app where it actually runs.",summary:"Paste, save, and open deep links on iOS and Android, and run one test scenario free. Pro adds unlimited scenarios, share inputs, and push notifications.",keywords:["mobile app testing tool","iOS testing app","Android testing tool","deep link tester","push notification tester","APNs tester","FCM tester","mobile QA app"],platforms:["iOS","Android"],availability:"Available on iOS and Android",color:"#2f6b4f",tint:"#e8f1ec",icon:"/products/testdock.png",artwork:"/products/screenshots/testdock-1-1-paste.png",artworkAlt:"TestDock on iPhone showing Quick open, recent URLs, and saved links",artworkWidth:1320,artworkHeight:2868,theme:"testdock",screenshots:[{src:"/products/screenshots/testdock-1-1-save-all-links.png",alt:"TestDock Quick open offering Save all for two pasted links",width:1320,height:2868},{src:"/products/screenshots/testdock-1-1-test-step.png",alt:"TestDock scenario run with an Open deep link step",width:1320,height:2868},{src:"/products/screenshots/testdock-1-1-push.png",alt:"TestDock Push tab with payload size check",width:1320,height:2868}],intro:["Paste or type any link and open it in your app, or share one in from Slack, Mail, or Safari. Keep the links you test often in one app profile and open them on your iPhone or Android device, with favorites on the app icon's shortcuts.","Free also includes the sample scenario and one test scenario of your own, with photos and a shareable result. Pro adds unlimited profiles and scenarios, share inputs, push notifications, and app-link checks. Keep delivery results and test evidence together for your next review."],highlights:[{title:"App profiles",description:"Keep current-platform schemes, identifiers, verified-link settings, saved links, share fixtures, push setups, and scenarios attached to the app they belong to."},{title:"Real device tests",description:"Open links, run test scenarios, and, with Pro, send test notifications on iOS and Android where the behavior can actually be observed."},{title:"Local by default",description:"Profiles and logs stay on the device while provider credentials use platform secure storage."}],details:[{label:"Platforms",value:"iOS · Android"},{label:"Focus",value:"Mobile app QA"},{label:"Access",value:"Free: one app profile, unlimited links, and one scenario of your own · Pro: one-time unlock for unlimited profiles and scenarios, push, share inputs, and app-link checks"},{label:"Privacy",value:"Local-first · No account"}]}];function wm(l){return Dh.find(y=>y.slug===l)}var xh=[{slug:"devdock",name:"DevDock",currentVersion:"1.4",category:"Development workspace",headingDescriptor:"Local development workspace for Windows",tagline:"Open your project. Run your commands. Keep development moving.",summary:"Keep your Windows development projects, saved commands, Git workflows, Docker environments, and security checks in one desktop workspace. Add database tools with Pro.",overview:["DevDock keeps local projects in one sidebar and gives each project a focused workspace for its overview, commands, run history, databases, security checks, settings, and tools.","Get back to a recent project from Today, start a saved workflow, and see its output alongside your project. Version 1.4 shows active Claude Code and Codex sessions on the project, adds an Activity Center for running Git work and recent results, and stops every process launched by a managed command."],icon:"/products/devdock.png",screenshot:{src:"/products/screenshots/devdock.png",alt:"DevDock project overview showing project health, daily workflow, and registered folders",width:2560,height:1440},gallery:[{src:"/products/screenshots/devdock.png",alt:"DevDock project overview with health and daily workflow shortcuts",caption:"Open the project overview to check its health and start a saved command.",width:2560,height:1440},{src:"/products/screenshots/devdock-commands.png",alt:"DevDock command workspace showing a detected development command and its output area",caption:"Commands stay attached to the project, working directory, and execution target they belong to.",width:2560,height:1440},{src:"/products/screenshots/devdock.png",alt:"DevDock project overview showing project health, daily workflow, and registered folders",caption:"Each project opens into a practical overview instead of a blank folder or terminal window.",width:2560,height:1440},{src:"/products/screenshots/devdock-1-1-git-commands.jpg",alt:"DevDock guided commit dialog with two changed files selected and a commit message ready",caption:"Git operations remain explicit commands with their repository, arguments, result, and output visible.",width:2560,height:1600},{src:"/products/screenshots/devdock-database.png",alt:"DevDock database connection and schema tools",caption:"Choose the database connection before inspecting its schema. Database tools require Pro.",width:1982,height:1352},{src:"/products/screenshots/devdock-security.png",alt:"DevDock local security audit with findings and severity counts",caption:"Review local audit findings by severity and inspect their file locations.",width:1982,height:1352},{src:"/products/screenshots/devdock-docker.png",alt:"DevDock Docker Compose workspace with engine readiness",caption:"Check Docker engine readiness and the selected Compose environment before running container tasks.",width:1982,height:1352}],color:"#2f7258",tint:"#e6f0ea",status:"Version 1.4 for Windows",platforms:["Windows"],availability:"Available on the Microsoft Store",pricing:"Free for up to three local projects with core commands, Git, Docker, project health checks, and security-audit tools. A one-time Pro purchase unlocks unlimited and multi-folder projects, custom workflows, full history and insights, database tools, SSH transfers, and configuration backup and restore.",privacy:"Local project data, operating-system secret storage, read-only local audits, and no source upload.",features:[{title:"Project workspace",description:"Keep each project's overview, commands, run history, and security checks together. The Database, Files, and Insights & Audit tools require Pro.",details:["A DevDock project represents one repository or folder. With Pro, it can also include a monorepo's subprojects or several separately located folders.","Each registered folder retains its own detection results, task working directories, and shortcuts while contributing to one coherent project overview."],guideSlug:"getting-started"},{title:"AI agent presence",description:"See when Claude Code or
10Codex is actively working in a project before you switch branches, run a build, or edit the same files.",details:["The sidebar project row and the project dashboard show which agent is active and whether it is working, running a command, or waiting. Hover over the label to see the session title or latest prompt.","Claude Code presence is read from recent local session transcripts, including terminal and Claude desktop app sessions, without connecting an account.","Agent presence is included in DevDock Free and reports activity only; it does not control the agent or inspect source changes."],guideSlug:"getting-started"},{title:"Activity center",description:"Keep running Git operations and recent notifications within reach without leaving a progress window over the workspace.",details:["Hide a running Git progress view without stopping the operation, then reopen it from the Activity Center to inspect its current step, elapsed time, and live output.","Recent success, warning, and failure messages remain available in the Activity Center, while completed workflows refresh the project and close cleanly.","If live command events are interrupted, DevDock reconnects and reconciles active executions so a missed finish event does not leave stale running state behind."],guideSlug:"getting-started"},{title:"Daily workflow",description:"Run project commands from the overview or Today. Pro adds custom commands and combined workflows.",details:["With Pro, saved workflows keep servers, workers, watchers, Docker services, and loopback readiness checks in an intentional order.","Today brings pinned workflows and recently opened projects together so returning to work does not depend on shell history."],guideSlug:"commands-and-run-history"},{title:"Project health",description:"See whether configuration, dependencies, Git, Docker, toolchains, or recent command results need attention.",details:["Health remains descriptive: a warning identifies the affected folder, tool, configuration, or recent run without blocking unrelated work.","Detection and runtime health stay separate, so a recognized project can explain that an SDK, executable, engine, or service is unavailable."],guideSlug:"project-health-troubleshooting"},{title:"Registered folders",description:"With Pro, add several repositories or folders to one project as labeled folders, each with its own detection and project shortcuts.",details:["Attach an API, web client, mobile app, infrastructure repository, or documentation folder without moving source code or flattening their boundaries.","Generated commands stay attached to the folder and working directory that produced them."],guideSlug:"multi-folder-projects"},{title:"Command history",description:"Revisit commands with their target, timing, exit state, and retained output. Free shows the 20 newest matching runs per project; Pro shows the complete retained history.",details:["Standard output and error output remain distinguishable. Stopping a managed commandâor quitting DevDockâalso ends the processes it launched, so servers and watchers do not remain behind.","Filter history by command and status to review a failed run beside earlier successful runs instead of reconstructing the command from memory."],guideSlug:"commands-and-run-history"},{title:"Project shortcuts",description:"Open a registered folder in a terminal, Visual Studio Code, or File Explorer from the same workspace.",details:["Shortcuts provide a direct route into a terminal, Visual Studio Code, or File Explorer while repeated operations remain available as explicit, reviewable commands.","Folder identity stays visible when a product includes several repositories with similar task names."],guideSlug:"multi-folder-projects"},{title:"Database tools",description:"With Pro, inspect schemas, look up records, and back up or restore SQLite, MySQL/MariaDB, and PostgreSQL databases. Laravel projects also get migration review and table diagnostics.",details:["Use a detected Laravel project's .env connection, which adds migration review and diagnostics, or create a session-only direct connection. Direct database passwords are not saved to preferences or command history.","Direct MySQL/MariaDB and PostgreSQL connections use the mysql, mysqldump, psql, and pg_dump clients installed on the computer.","Record lookups accept a validated table, an optional exact-value filter, and a result limit of up to 200 rows rather than arbitrary SQL.","Backup imports, database wipes, and seed operations remain explicit consequential actions with confirmation before execution."],guideSlug:"database-tools"},{title:"Project security audit",description:"Run a read-only local scan for exposed secrets, tracked credential files, private keys, escaping symlinks, and dependency lockfile gaps.",details:["The baseline audit works across every registered folder, including projects with no detected language or framework, and does not upload source code.","Findings include severity, rule, file location, and remediation while intentionally withholding matched secret values.","Detected package-manager advisory commands complement the universal scan with current ecosystem vulnerability data."],guideSlug:"security-audits"},{title:"Guided Git workflows",description:"Inspect repository state, switch branches, fetch, pull, commit, and review pu
10sh destinations without losing the project context.",details:["The project overview shows each repository's current branch, changed-file count, and known ahead or behind state, with fetch and branch actions beside it.","When ordinary branch switching is blocked by local edits, DevDock can create one protected stash for tracked, staged, and untracked changes, switch branches, and restore only that stash while leaving older stashes untouched.","Push rechecks the selected remote, shows the current branch and destination, and can guide a required pull with fast-forward, merge, or rebase before continuing the original push."],guideSlug:"commands-and-run-history"}],workflow:[{title:"Add a project",description:"Register a local project folder and give it a clear place in the sidebar."},{title:"Review the workspace",description:"See its folders, health, saved commands, and recent activity from one overview."},{title:"Run a command",description:"Start a saved workflow and follow its output from the project view."},{title:"Return from Today",description:"Open recent work or a pinned daily workflow without hunting for the project again."}],useCases:[{title:"Multi-stack products",description:"With Pro, treat a Laravel API, React frontend, and mobile client as one project without forcing them into one repository."},{title:"Docker-heavy development",description:"See service health, published ports, resource snapshots, and host-versus-container commands without memorizing Compose syntax."},{title:"Context switching",description:"Return to a project from Today with its pinned commands, last-used command inputs, and recent run output. Running processes stop when DevDock quits; Pro saves environments that start them again in order."},{title:"Safer onboarding",description:"Let a new contributor see detected commands, their exact arguments and working directory, and health warnings for missing setup. Teams can commit shared commands in .devdock/technology.json."},{title:"Local database operations",description:"With Pro, inspect application schemas, find a bounded set of records, and create or restore native database backups from the project workspace. Laravel projects also get migration review."},{title:"Pre-release security checks",description:"Review local secret exposure, tracked credential files, escaping symbolic links, lockfile coverage, and ecosystem dependency advisories before shipping."}],faqs:[{question:"Does DevDock replace the terminal?",answer:"No. It provides a repeatable control surface for common project workflows and can still open a registered folder in a terminal, Visual Studio Code, or File Explorer."},{question:"Does project detection run repository code?",answer:"No. Detection reads a bounded set of manifests and marker files. It does not execute package managers, build tools, project scripts, or network requests."},{question:"Can one project contain several repositories?",answer:"Yes, with Pro. Additional labeled folders can represent a frontend, backend, mobile app, or any other separately located repository under one logical project."},{question:"Are secret task values stored with ordinary project data?",answer:"No. Secret custom-task environment values are kept in Windows Credential Manager."},{question:"Which databases does DevDock support?",answer:"Database tools are part of DevDock Pro. They support SQLite, MySQL and MariaDB, and PostgreSQL for direct schema inspection, constrained record lookups, counts, exports, and confirmed restores; direct MySQL/MariaDB and PostgreSQL connections need their command-line clients installed. Detected Laravel projects also receive migration, table, seeding, wipe, and database diagnostic actions."},{question:"Does DevDock save direct database passwords?",answer:"No. Direct connections are session-only, and their passwords are not saved to preferences or command history. MySQL and PostgreSQL connections can require SSL."},{question:"What does the DevDock security audit check?",answer:"The read-only local baseline scan checks registered folders for recognizable provider tokens, possible hardcoded secrets, private keys, tracked credential files, escaping symbolic links, and missing dependency lockfiles."},{question:"Does a clear security audit prove a project is secure?",answer:"No. The audit is a practical local baseline, not a penetration test or guarantee. It should be combined with code review, current package-manager advisory scans, secret rotation procedures, and the security controls appropriate to the application."},{question:"Can DevDock switch branches without discarding local changes?",answer:"Yes. If a normal switch is blocked by tracked, staged, or untracked changes, DevDock can protect those exact changes in a dedicated stash, switch to the selected branch, and restore them. Existing stashes are left untouched, and an interrupted operation exposes a recovery action."}],guides:[{slug:"getting-started",category:"Start here",title:"Getting started with DevDock",description:"Build a dependable DevDock workspace: register a project, verify detection, run commands safely, and create a daily workflow you can return to.",readingTime:"14 min read",sections:[{heading:"Decide what the project represents",paragraphs:["A DevDock project is a workspace for a product, not necessarily a single repository. Before adding anything, decide whether the sidebar entry should represent one codebase or a larger product made from a backend, web client, mobile app, and supporting services.","Choose the folder that gives DevDock the clearest starting point. Nothing is moved or copied: registration stores a reference to the local folder, and removing the project later removes that reference rather than deleting source files."],bullets:["Use the repository root for a conventional single-codebase project.","Use the most central repository first for a split product, then attach the others in Project Settings.","Prefer stable labels such as API, Web, Mobile, or Infrastru
10cture over machine-specific folder names."]},{heading:"Register the first folder",paragraphs:["Choose Add project, select the local folder, and review the proposed name and location. DevDock scans a bounded set of manifests and marker files to prepare the workspace; it does not run package managers, project scripts, or the application during this step.","Save the project when its identity and root folder are correct. The new workspace opens on Overview, where project health, registered folders, recent activity, and useful actions are collected into one place."],bullets:["Keep the generated display name if it is already recognizable in the sidebar.","Correct the folder before saving if a parent directory was selected accidentally.","Add secondary repositories after the first workspace is established."],image:{src:"/products/screenshots/devdock.png",alt:"DevDock project overview with workspace health, daily workflow, and registered folders",caption:"The Overview screen is the control surface for a registered project: health, folders, workflows, and recent activity remain visible together.",width:2560,height:1440}},{heading:"Review detection before relying on it",paragraphs:["Inspect the detected languages, frameworks, package managers, Docker targets, and source-control information. Detection explains what DevDock found and which file supported the result, so you can distinguish a genuine project type from an unrelated manifest in a nested tool folder.","Tool availability is reported separately. A project can be recognized correctly even when an SDK or executable is not installed on the current machine; that condition should appear as a health item, not change the project identity."],bullets:["Confirm that every generated command points at the intended working directory.","Treat warnings as useful setup context rather than automatic project failure.","Rescan after changing manifests, attaching folders, or restructuring a monorepo."]},{heading:"Read the project overview",paragraphs:["Start each work session on Overview. The page answers three practical questions: which folders belong to this product, whether its expected tools and configuration are healthy, and which action is most likely to move the work forward.","Health is intentionally descriptive. A missing executable, unusual Git state, failed recent command, or incomplete configuration remains visible without preventing you from opening folders or running unrelated tasks."],bullets:["Open a registered folder directly in Visual Studio Code, a terminal, or File Explorer.","Use the health summary to decide what needs attention before starting a long-running environment.","Check recent runs when a project was left in an uncertain state."]},{heading:"Run the first generated command",paragraphs:["Open Commands and begin with a bounded task such as a type check, test suite, or status command. The command view keeps the task name, executable, arguments, working directory, and execution target visible before the process starts.","While a command runs, standard output and error output remain distinguishable. Long-running process trees can be stopped from the same view, and completed runs retain enough context to understand what was executed later."],bullets:["Review any confirmation prompt instead of treating it as a generic Continue button.","Use a host target first when you are still validating project detection.","Stop development servers from DevDock so their managed process tree is cleaned up together."],image:{src:"/products/screenshots/devdock-commands.png",alt:"DevDock command screen showing a saved development command and output area",caption:"Commands remain attached to their project, working directory, target, and run output instead of disappearing into terminal history.",width:2560,height:1440}},{heading:"Create a daily workflow",paragraphs:["A daily workflow groups the commands needed to make a project usefulâtypically an application server, asset watcher, worker, or supporting service. Pin an existing command sequence or create a saved environment with a clear name such as Local development.","Order dependent processes deliberately. When a service exposes a local readiness endpoint, use a loopback readiness check
10so DevDock can report when the environment is actually usable rather than merely when the process was spawned."],bullets:["Keep destructive maintenance commands out of an automatic startup sequence.","Use recognizable workflow names that still make sense from Today.","Test start and stop behavior once before depending on the workflow every morning."],image:{src:"/products/screenshots/devdock.png",alt:"DevDock project overview with daily workflow shortcuts",caption:"The project overview keeps daily workflow shortcuts beside project health and folders.",width:2560,height:1440}},{heading:"Return to the project with context intact",paragraphs:["Use Today to reopen a recent project or start a pinned workflow. This is where DevDock replaces the small reconstruction ritual of finding the right repository, remembering which processes matter, and searching shell history for the last useful command.","Keep the workspace accurate as the product evolves. Rename attached folders when their role changes, remove obsolete commands, rescan after structural changes, and use run history as a record of useful outcomes rather than an unlimited log archive."]}]},{slug:"technology-detection",category:"Project setup",title:"Technology detection and repository extensions",description:"Understand DevDock's non-executing detection model, interpret health results, and add safe repository-owned commands with a small manifest.",readingTime:"16 min read",sections:[{heading:"What first-class support means",paragraphs:["DevDock calls a technology first-class only when it can recognize the project without executing repository code, present useful metadata, report the relevant toolchain health, and offer safe standard commands.","A familiar filename alone is not enough. Framework-specific actions are offered only when their invocation and working directory can be derived from repository metadata with predictable behavior."],bullets:["Detection identifies the project type.","Health reports whether the expected local tools and configuration are usable.","Commands translate confirmed metadata into explicit executable and argument lists."]},{heading:"Understand the detection boundary",paragraphs:["Detection reads a bounded collection of known manifests, build files, and marker paths. It never starts the application, invokes a package manager, runs a build tool, evaluates a project script, or makes a network request.","This boundary keeps registration useful even for unfamiliar or partially configured repositories. A missing tool is reported as a separate condition instead of being discovered by executing an arbitrary command."],bullets:["Monorepos can expose several independently detected folders.","Android and iOS remain separate platform adapters even in a shared repository.","Docker and Git appear alongside language and framework results rather than replacing them."]},{heading:"Interpret the workspace result",paragraphs:["Open the project overview after a scan and read the result as an inventory. Registered folders define scope, detected technologies explain what DevDock understands, and health items show which expectations are currently satisfied.","If a result looks wrong, inspect the folder associated with it before changing configuration. An example app, generated directory, or nested tool can contain a valid manifest without representing the product's main runtime."],image:{src:"/products/screenshots/devdock.png",alt:"DevDock project workspace with health and registered folder information",caption:"Detection becomes useful in context: the overview connects each registered folder with its health and available project actions.",width:2560,height:1440}},{heading:"Model monorepos and split products",paragraphs:["For a monorepo, register the repository root and let detected subprojects keep their own working directories. For a product split across repositories, attach each repository as a labeled folder inside one logical DevDock project.","The goal is not to flatten every stack into one command namespace. Preserve clear labels and working directories so a Web test task cannot be confused with an API test task that happens to use a similar name."],bullets:["Use role-based labels rather than repository slugs when that improves clarity.","Keep generated commands scoped to the folder where their manifest was detected.","Rescan after adding or moving a workspace package."]},{heading:"Add a repository-owned manifest",paragraphs:["Create .devdock/technology.json when an internal framework, generator, or repository-specific tool needs direct commands that DevDock cannot infer. The manifest is intentionally declarative: it describes markers, metadata, explicit command arguments, and bounded log locations.","Marker paths must remain below the registered folder. Commands store an executable and argument array instead of an interpolated shell string, which keeps display and execution aligned and avoids relying on shell parsing."],bullets:["Use anyOf when one of several markers proves the technology is present.","Use allOf when several files must exist together.","Give every command a specific working directory and human-readable purpose.","Choose none, normal, destructive, or production confirmation based on real impact.","Declare only bounded log directories that belong to the project."]},{heading:"Verify repository commands",paragraphs:["After adding or changing a manifest, rescan the project and inspect the generated tasks before running them. Check the visible executable, arguments, working directory, and confirmation level against the repository's own documentation.","Start with a read-only or bounded command. The command screen retains output and target context, making it easier to distinguish a detection problem from a toolchain or application failure."],bullets:["Do not use a broad shell command when a direct executable is available.","Keep secret values in protected task inputs rather than the repository manifest.","Remove obsolete tasks when the underlying project workflow changes."],image:{src:"/products/screenshots/devdock-commands.png",alt:"DevDock command workspace with task details and output",caption:"A repository extension should still resolve to a reviewable task with an explicit target, working directory, and output history.",width:2560,height:1440}},{heading:"Know when an adapter is required",paragraphs:["A repository manifest is best for recognition and direct, explicit tasks. Use a compiled DevDock adapter when support requires structured form inputs, custom result parsing, framework-specific metadata, specialized process control, or operating-system integration.","If detection remains stale, confirm the registered folder, check marker spelling and path scope, then rescan. If a task is present but disabled, inspect toolchain health separately; installing a missing executable should not require redefining the technology."]}]},{slug:"docker-workflows",category:"Integrations",title:"Docker and Compose workflows",description:"Connect Compose discovery, runtime health, host-versus-container execution, and safe daily environments into one repeatable DevDock workflow.",readingTime:"15 min read",sections:[{heading:"Prepare the Compose project",paragraphs:["Register the repository folder that owns the Compose configuration. DevDock works best when service definitions, bind-mounted source paths, and the commands that use them all resolve from a stable project root.","Docker support does not require containers to be running during registration. Static discovery and runtime health are separate, so the workspace can explain the intended environment even when Docker Desktop or the engine is stopped."],bullets:["Keep standard Compose files at the repository root when the project allows it.","Attach other repositories separately if the product spans several roots.","Confirm that local bind mounts use paths below a registered folder."]}
10,{heading:"How Compose discovery works",paragraphs:["DevDock recognizes standard Compose filenames, matching override files, Dockerfiles, and Containerfiles. It records services, build contexts, profiles, published ports, declared health checks, mounts, networks, and working directories without starting containers.","The result is an inspectable model, not a guess based on running processes. Runtime status is layered on later so a stopped service can still have valid configuration and a running container can be compared with what the repository declares."]},{heading:"Read Docker health in context",paragraphs:["Use the project overview to distinguish configuration health from runtime health. A missing engine, unavailable Compose integration, stopped service, unhealthy container, or unexpected recent exit should point to a different corrective action.","Review the registered folders and detected project types beside the Docker status. This prevents a healthy container from hiding an unrelated missing SDK, and prevents a stopped optional service from making the whole product appear unusable."],image:{src:"/products/screenshots/devdock.png",alt:"DevDock project overview showing project and health information",caption:"The project overview keeps Docker health beside the rest of the workspace instead of turning container state into a separate dashboard.",width:2560,height:1440}},{heading:"Configure non-standard file sets",paragraphs:["Add .devdock/docker.json when the repository uses custom Compose filenames, a deliberate sequence of Compose files, or explicit environment files. DevDock passes declared files to generated commands in the same order so overrides remain predictable.","Every configured path must be a relative file below the registered folder. This keeps project configuration portable between machines and prevents a repository manifest from silently reaching into unrelated local directories."],bullets:["List the base file before its overrides.","Declare only environment files that are genuinely part of the workflow.","Rescan after changing the configured file set.","Review generated commands before the first start or down action."]},{heading:"Choose host or container execution",paragraphs:["When a bind mount maps a detected project path into a Compose service, compatible tasks can run either on the host or inside that service. Choose the target that matches where dependencies and runtime tools are actually installed.","Selecting a preferred service ranks the expected target first but does not erase other valid choices. This matters in projects where a repository is mounted into a web service, a worker, and a one-off tooling container."],bullets:["Use the host target when the local toolchain owns dependencies and caches.","Use an existing service when the environment is already running and correctly mounted.","Use a disposable compose run --rm target for isolated, finite work.","Keep direct executable and argument arrays as the safe default."],image:{src:"/products/screenshots/devdock-commands.png",alt:"DevDock command workspace for a project command",caption:"The command view makes the selected target and working directory part of the task rather than hidden Compose knowledge.",width:2560,height:1440}},{heading:"Build a repeatable development environment",paragraphs:["Create a saved workflow for the Compose start action and any dependent host processes that must run beside it. Order the steps, give the workflow a recognizable name, and add loopback readiness checks for local services when they provide a stable endpoint.","Run the complete workflow once from the project before pinning it to Today. Verify both the success path and stop behavior so DevDock can clean up managed processes without leaving a partial environment behind."],bullets:["Keep database migrations and destructive maintenance outside automatic startup.","Use readiness checks for usability, not merely process existence.","Pin the workflow only after its targets and stop behavior are verified."],image:{src:"/products/screenshots/devdock.png",alt:"DevDock project overview with daily workflow shortcuts",caption:"The project overview keeps daily workflow shortcuts beside project health and folders.",width:2560,height:1440}},{heading:"Understand safety limits and recovery",paragraphs:["Destructive Compose actions require explicit confirmation. Generated down actions preserve named volumes;
10 DevDock does not turn global prune, arbitrary volume deletion, remote Docker contexts, Swarm, or Kubernetes into casual workspace buttons.","When a workflow fails, inspect the first failing step and its retained output before restarting everything. Confirm the engine is available, the configured file sequence is correct, required profiles are active, and the chosen service actually contains the expected executable."],bullets:["Prefer a targeted restart over a broad cleanup.","Treat volume deletion as a separate, deliberate operation outside the normal daily workflow.","Use run history to review the current failure beside earlier successful runs."]}]},{slug:"database-tools",category:"Database",title:"Database tools, schema inspection, and backups",description:"Use DevDock with SQLite, MySQL/MariaDB, PostgreSQL, and detected Laravel databases for safe lookups, schema review, diagnostics, exports, and confirmed restores.",readingTime:"18 min read",sections:[{heading:"Choose the project or direct connection",paragraphs:["Database tools are part of DevDock Pro. Open Database inside a DevDock project. When DevDock has detected a Laravel application, Project (.env) uses the database configuration already associated with that project and exposes its framework-aware database tasks. This keeps migration and maintenance actions attached to the same folder and run-history model as the rest of the application.","Choose Add database for a direct SQLite, MySQL/MariaDB, or PostgreSQL connection. Direct connections are session-only: DevDock does not save the password to preferences or command history. Test the connection before relying on it, and remove it from the session when the work is complete."],bullets:["Use Project (.env) for a detected Laravel application and its migration-aware tools.","Use a direct connection for an existing SQLite file or a MySQL, MariaDB, or PostgreSQL server.","Select Required SSL for a remote server unless its documented environment requires another mode.","Treat a production database as a separate, explicitly reviewed target."]},{heading:"Understand the supported database engines",paragraphs:["Direct database tools support an existing SQLite file, MySQL or MariaDB through the MySQL command-line clients, and PostgreSQL through its command-line clients. DevDock validates the connection fields, tests the server, and reports the database engine, version, and connection latency when the test succeeds.","SQLite schema inspection and record lookup open the selected file read-only. MySQL and PostgreSQL queries use the database clients available on the computer, pass credentials through process environment variables rather than command arguments, and honor the selected SSL mode."],bullets:["SQLite requires an existing absolute file path.","MySQL and MariaDB operations require the appropriate mysql and mysqldump clients.","PostgreSQL operations require psql and pg_dump.","A successful test proves the selected credentials can reach the database; it does not prove every maintenance permission is available."]},{heading:"Inspect schema before querying",paragraphs:["The schema panel identifies whether its information comes from project files or a live database. For a Laravel project, DevDock reads bounded PHP migration and model files to describe tables, fields, types, primary keys, and recognizable relationships without executing application code.","For a direct connection, DevDock reads live table and column metadata from SQLite, MySQL/MariaDB, or PostgreSQL. Review the source label before treating the schema as authoritative: project files describe intended structure, while the live database describes the structure actually deployed at that connection."],bullets:["Use project-file schema to review intended Laravel structure before connecting.","Use live schema to confirm actual columns, nullability, primary keys, and foreign-key relationships.","Investigate differences with migration status instead of assuming either view is current."]},{heading:"Find records with a constrained lookup",paragraphs:["Find records is deliberately narrower than a general SQL editor. Select a validated table, optionally choose one field and exact value, then request 10, 25, 50, 100, or at most 200 rows. Leave both the filter field and value empty for a bounded sample.","DevDock validates table and column identifiers and encodes filter values instead of interpolating them as executable SQL. The lookup is read-only, but the returned rows can still contain personal or confidential application data; review the selected environment and table before running it or sharing the result."],bullets:["Confirm the connection label and database name first.","Use the smallest useful result limit.","Prefer an exact identifier, email address, or other stable field over broad sampling.","Do not treat the result panel as a safe place to expose production customer data."]},{heading:"Export and restore native backups",paragraphs:["Export backup writes a native backup for the selected engine. SQLite uses its backup API and replaces the destination atomically; MySQL/MariaDB uses mysqldump with transactions, routines, and triggers; PostgreSQL uses pg_dump without restoring ownership or privilege metadata by default.","Import backup changes the destination database and always requires destructive confirmation. DevDock first checks that the selected backup is readable; SQLite additionally validates the database and prevents using the destination file as its own source. Confirm the engine, source file, connection, and overwrite scope before proceeding."],bullets:["Create a fresh export before a risky migration or maintenance operation.","Store the backup outside disposable build and temporary directories.","Verify that the export can be opened by the corresponding database tools.","Never use an import action as an exploratory way to inspect an unfamiliar backup."]},{heading:"Use Laravel diagnostics and maintenance",paragraphs:["Detected Laravel projects receive structured actions for migration status, database overview, slow-table checks, table inspection, export, import, seeding, and wiping when the corresponding project task is available. Results remain connected to the DevDock project and run history.","Pending migrations compare migration files with batches applied to the selected project database. Table diagnostics can show size, counts, indexes, foreign keys, views, and timing information. Seed and wipe actions modify data or structure and require the stronger confirmation level assigned to them."],bullets:["Run migration status before applying framework migrations.","Inspect a table before diagnosing records that depend on its keys.","Keep seed and wipe actions out of automatic daily workflows.","Review the visible executable, arguments, working directory, and target in every confirmation dialog."]},{heading:"Troubleshoot without weakening safety",paragraphs:["If a direct connection fails, check the host, port, database, username, SSL requirement, and local client availability. A server can accept a connection while denying schema access, backups, or restores, so distinguish authentication failure from operation-specific permissions.","If a lookup returns the wrong shape, confirm whether the schema source is project files or the live database, then verify the selected table and exact filter. If an export or import fails, preserve the error and destination path, confirm free disk space and client versions, and retry only after the cause is understood."],bullets:["Do not disable SSL merely to make an unexplained remote connection succeed.","Do not broaden database privileges before identifying the missing operation.","Remove a session connection and recreate it if its target is ambiguous.","Use an engine-native client to verify a backup independently when recovery matters."]}]},{slug:"security-audits",category:"Security",title:"Local project security audits and dependency checks",description:"Run DevDock's read-only local security audit, understand each finding, complement it with ecosystem advisory scanners, and respond without exposing secrets.",readingTime:"17 min read",sections:[{heading:"Run the universal local audit",paragraphs:["Open Security inside a project and choose Run audit. DevDock scans every registered folder, including folders with no recognized language or framework. The baseline scan is read-only, runs on the computer, and does not upload source code or depend on an online advisory service.","The report groups findings by critical, high, medium, and low severity, shows how many files and folders were covered, and records whether the bounded scan reached a limit. Start with critical and high findings, but read the rule, evidence, and remediation before changing a file."],bullets:["Confirm that every expected project folder is registered and available.","Stop the scan if it is no longer relevant; a cancelled or limited scan is marked as truncated.","Run again after remediation to verify that the baseline finding is gone."]},{heading:"Know what the baseline checks",paragraphs:["The audit looks for private-key material; recognizable AWS, GitHub, GitLab, Slack, and live Stripe credential formats; possible literal assignments to password, secret, API-key, access-token, and client-secret variables; and sensitive environment or credential files tracked by Git.","It also reports symbolic links that resolve outside the registered project and dependency manifests without a recognized lockfile. These
10checks are language-independent and focus on common local exposure and reproducibility problems."],bullets:["Critical findings include private-key material and recognizable provider credentials.","High findings include tracked sensitive files and likely hardcoded secret assignments.","Medium findings include escaping symbolic links.","Low findings include missing dependency lockfiles."]},{heading:"Understand the privacy boundary",paragraphs:["A finding includes the rule identifier, severity, category, registered folder, relative path, relevant line when available, explanation, and a suggested fix. Matched secret values are intentionally never returned in the report or shown as evidence.","Generated output and common dependency directories are skipped. Binary, unreadable, oversized, or otherwise unsupported items are counted as skipped rather than silently treated as safe. The scan does not move, edit, revoke, rotate, or upload anything."],bullets:["Do not copy a suspected credential into an issue or support message.","Open the referenced file locally and inspect only the minimum context needed.","Treat skipped and unavailable content as outside the completed audit scope."]},{heading:"Read the audit limits correctly",paragraphs:["The baseline scan is intentionally bounded so it cannot become an uncontrolled repository crawl. A run stops after 25,000 inspected files, 500 findings, 48 directory levels, or 30 seconds. Individual files larger than 1 MB are not read for secret patterns.","DevDock skips common generated and dependency directories such as .git, node_modules, vendor, target, dist, build, .next, virtual environments, Pods, DerivedData, Gradle output, coverage, and similar caches. A clear result means no baseline finding was detected inside the completed scopeânot that the application is vulnerability-free."],bullets:["Check the truncated indicator before relying on coverage.","Resolve large batches of findings, then scan again if the finding limit was reached.","Audit generated artifacts separately when they are part of the shipped product."]},{heading:"Respond to secret findings",paragraphs:["If a real provider token or private key appears in source, assume exposure extends beyond the current file. Revoke or rotate it first, replace the application configuration with a secure reference, remove the value from the working tree, and then address repository history according to the team's incident procedure.","For a possible generic assignment, verify whether the value is real, test data, or a false positive without posting it elsewhere. For a tracked .env or credential file, removing the file from the latest commit is not enough when a real secret has already entered shared history."],bullets:["Revoke or rotate before spending time on cosmetic cleanup.","Search history and release artifacts using an approved internal process.","Add a safe example or template file without real values.","Re-run the audit and the relevant provider or repository checks."]},{heading:"Fix filesystem and dependency findings",paragraphs:["An escaping symbolic link is not automatically malicious, but it expands what tools may reach when they traverse the project. Remove it or verify that every relevant tool treats the target as untrusted.","A missing lockfile weakens reproducibility and reviewability. Generate the lockfile with the package manager chosen by the project, review it, and commit it when that ecosystem expects application dependencies to be locked. Do not add several competing lockfiles merely to silence the check."],bullets:["Confirm the actual symlink target before changing it.","Choose one package manager and keep its lockfile beside the manifest."]},{heading:"Run dependency advisory scanners",paragraphs:["The universal baseline scan does not query vulnerability databases. When DevDock detects npm, pnpm, Yarn, or Composer audit tasks, it lists those package-manager scanners beside the local report so you can run current ecosystem checks through the normal command pipeline.","Advisory scanners may use the network and inherit the behavior of the package manager they invoke. Review their command, working directory, lockfile, registry configuration, and output. A clean package audit does not replace source review, application testing, infrastru
10cture hardening, or a professional security assessment."],bullets:["Run the scanner for each independently managed dependency root.","Review severity, affected version range, exploitability, and available remediation.","Avoid automatic major-version upgrades without application testing.","Record accepted risk and compensating controls in the project's normal security process."]}]},{slug:"commands-and-run-history",category:"Daily use",title:"Commands, workflows, and run history",description:"Create dependable project commands, choose safe execution targets, manage long-running work, and use history to diagnose failed runs.",readingTime:"14 min read",sections:[{heading:"Generated and custom commands",paragraphs:["Generated commands come from detected project metadata and known technology adapters. With Pro, custom commands cover repository-specific work that detection cannot infer, while keeping the same visible executable, arguments, working directory, and safety model.","Use generated tasks when they accurately describe the work. Create a custom task when the command has a stable team purpose that would otherwise live in a personal note or shell-history fragment."],bullets:["Give tasks outcome-based names such as Run API tests or Start web client.","Keep the working directory explicit.","Prefer an executable and argument list over a shell expression."]},{heading:"Review before the first run",paragraphs:["Before running a newly detected or custom command, verify its working directory, execution target, arguments, and confirmation level. This one-time review prevents most cases where the right command runs against the wrong package or service.","A confirmation prompt communicates impact. Normal confirmation is appropriate for consequential but recoverable work; destructive and production levels should be reserved for commands whose effect genuinely deserves a stronger pause."],bullets:["Check whether the command runs on the host or in a container.","Confirm optional environment values before starting.","Never hide a destructive operation inside a harmless-looking workflow name."]},{heading:"Run and stop processes",paragraphs:["The run view keeps output attached to the task and project that produced it. Standard output and error output remain distinct, and the active process state stays visible while you move through the workspace.","When DevDock starts a long-running task, stop it from the run view so the managed process tree is terminated together. Closing an output panel is not the same as stopping the process."],image:{src:"/products/screenshots/devdock-commands.png",alt:"DevDock command screen with a development task and output",caption:"The run view preserves the command, target, state, and output as one inspectable unit.",width:2560,height:1440}},{heading:"Build reusable workflows",paragraphs:["With Pro, a workflow combines commands that belong to one work session. Order servers, workers, watchers, and readiness checks so later steps do not claim success before their dependencies are usable.","Keep workflows focused. A Local development workflow is easier to understand and recover than one sequence that also mutates databases, seeds production-like data, and performs unrelated maintenance."],bullets:["Use readiness URLs only for local loopback services.","Keep destructive steps manual.","Verify stop behavior before pinning a workflow to Today."]},{heading:"Read run history",paragraphs:["History answers what ran, where it ran, when it started, how it ended, and which output accompanied the result. Filter it by command and status to review a failing run beside earlier successful runs instead of reconstructing the command from memory.","Free shows the 20 newest matching runs per project; Pro shows the complete retained history. On both plans, DevDock keeps runs for 30 days and up to 200 runs per project by default; change these limits in Settings. If output matters outside that window, copy the relevant non-secret result into the project's normal issue or documentation workflow."],bullets:["Start with exit status and duration.","Check target and working directory before comparing output.","Look for the first meaningful error rather than the final cascade."]},{heading:"Protect environment values",paragraphs:["Ordinary non-secret values can belong to a saved task. Secret
10custom-task values use operating-system protected storage, while project records keep only the reference needed to retrieve them at execution time.","Avoid printing credentials from the command itself: secure input storage cannot redact arbitrary application output reliably. When sharing run details, review the visible output first."],image:{src:"/products/screenshots/devdock.png",alt:"DevDock project overview with daily workflow shortcuts",caption:"The project overview keeps daily workflow shortcuts beside project health and folders.",width:2560,height:1440}}]},{slug:"multi-folder-projects",category:"Organization",title:"Organize multi-folder and multi-repository projects",description:"With Pro, represent a complete product without forcing its API, web client, mobile app, and infrastructure into one repository.",readingTime:"12 min read",sections:[{heading:"Choose the workspace boundary",paragraphs:["Create one DevDock project for the unit of work you think about and ship together. A small library may map to one repository; a product may include several repositories and supporting folders under one sidebar entry.","The workspace boundary should make daily commands and health easier to understand. If two codebases are released and operated independently, separate DevDock projects may be clearer even when they share an organization."],bullets:["Group folders that contribute to the same product workflow.","Split workspaces when ownership and release cycles are unrelated.","Use a stable product name rather than a temporary initiative name."]},{heading:"Add and label folders",paragraphs:["Multi-folder projects are part of DevDock Pro. Register the most representative folder first, then add related folders in Project Settings. Give each one a role-based label that remains clear in commands, health results, and shortcuts.","Labels do not rename directories on disk. They provide a human layer inside DevDock, so API can remain meaningful even if the actual repository folder is named with an internal code or organization prefix."],bullets:["Use Backend, Web, Mobile, Infrastructure, or Documentation where appropriate.","Avoid duplicate labels.","Confirm each folder path before saving."]},{heading:"Keep detection scoped",paragraphs:["Each attached folder is scanned within its own boundary. Generated commands retain the working directory associated with the manifest that produced them, preventing similar tasks from different repositories from becoming interchangeable.","After adding or moving a folder, rescan and review the results. Removing a folder from the workspace removes its registration and derived context; it does not delete the directory."],image:{src:"/products/screenshots/devdock.png",alt:"DevDock workspace showing registered folders and project overview",caption:"Registered folders give one product a coherent workspace while retaining the boundaries of its individual codebases.",width:2560,height:1440}},{heading:"Name commands for the whole product",paragraphs:["When several folders expose Test, Build, or Start tasks, include the role in the visible task name. API tests and Web tests are immediately understandable from Today and run history; two generic Test entries are not.","Keep cross-folder workflows explicit about order. A workflow can start infrastructure, then the API, then the frontend without pretending those commands share one working directory."],bullets:["Include the component in ambiguous task names.","Keep each task attached to its real folder.","Use workflow steps to express product-level order."]},{heading:"Use project shortcuts",paragraphs:["Folder shortcuts open the selected directory in a terminal, Visual Studio Code, or File Explorer. Use them when work becomes exploratory or one-off instead of turning every terminal action into a permanent DevDock task.","If a shortcut fails, verify that the application is installed and the registered folder is still available. The source folder may have moved since it was registered."],bullets:["Use saved commands for repeated work.","Use shortcuts for ad hoc investigation.","Update the registration when a repository moves."]},{heading:"Restructure without losing clarity",paragraphs:["When a product moves from a monorepo to split repositoriesâor the reverseâupdate one folder at a time and rescan after each change. Review saved commands and workflows for stale working directories before using them again.","Remove obsolete folder registrations only after their useful tasks have been migrated. DevDock does not move source files, so repository restructuring remains an explicit filesystem or version-control operation outside the application."]}]},{slug:"project-health-troubleshooting",category:"Troubleshooting",title:"Project health and troubleshooting",description:"Interpret health warnings, separate setup problems from command failures, and recover a workspace without resorting to broad destructive cleanup.",readingTime:"15 min read",sections:[{heading:"What project health means",paragraphs:["Project health summarizes facts DevDock can verify about registered folders, detected toolchains, Git, Docker, configuration, and recent managed runs. It is a diagnostic surface, not a single pass-or-fail score.","One warning should not imply that every part of the project is unus
10able. Read the affected component and evidence before choosing an action."],bullets:["Configuration describes what DevDock can understand.","Toolchain health describes what is available locally.","Runtime and recent-run health describe current or recent behavior."]},{heading:"Start with scope and evidence",paragraphs:["Open the affected health item and identify its folder, technology, tool, or run. A missing executable for Mobile should not send you debugging the API, and a failed frontend test should not be treated as a Docker engine problem.","Check whether the item is current. If manifests or folder paths changed, rescan before troubleshooting a stale result."],image:{src:"/products/screenshots/devdock.png",alt:"DevDock project overview with workspace health information",caption:"Health stays beside project structure and actions, making it easier to trace a warning to the correct folder or tool.",width:2560,height:1440}},{heading:"Resolve missing tools",paragraphs:["A detected technology can be valid even when its expected executable is unavailable. Confirm whether the tool should run on the host or inside a container, then install or configure it in that actual execution environment.","After changing PATH, SDK selection, or container configuration, restart or rescan as appropriate. Do not change detection markers merely to hide a legitimate missing-tool warning."],bullets:["Verify the selected execution target.","Check version-manager activation for desktop launches.","Confirm the executable is available from the environment DevDock inherits."]},{heading:"Investigate failed commands",paragraphs:["Open the failed run from history and verify the task, working directory, target, exit status, and first meaningful error. Compare it with the last successful run when available.","If the command succeeds in a separate terminal, compare environment values and execution target before assuming DevDock changed the command. Preserve the exact failing context while investigating."],image:{src:"/products/screenshots/devdock-commands.png",alt:"DevDock command screen with command details and output",caption:"Run history keeps the failed command and its context together, reducing guesswork during support and troubleshooting.",width:2560,height:1440}},{heading:"Handle Git warnings",paragraphs:["Git health can surface an unavailable repository, detached or unusual state, and other conditions relevant to returning to work. DevDock presents the state but does not decide how your branch history should be rewritten.","Use the folder shortcut to inspect complex Git situations in your preferred tool. Resolve repository ownership, worktree, merge, or rebase decisions deliberately rather than hiding the warning."]},{heading:"Recover workflows",paragraphs:["When a multi-step workflow fails, start with the first failed or unready step. Stop the managed workflow before retrying so duplicate servers and stale process trees do not create misleading port or readiness failures.","Check readiness URLs, ports, and dependencies separately. A running process that never becomes ready is different from a process that exited immediately."],bullets:["Stop before restart.","Verify the dependency order.","Use loopback readiness checks only for local services.","Review retained output for the first failure."]},{heading:"When to rescan or rebuild the workspace",paragraphs:["Rescan after manifest changes, folder moves, new attached repositories, toolchain changes that affect detection, or repository-extension edits. A rescan refreshes derived project understanding without deleting source files.","If a saved task is obsolete, update or remove that task rather than repeatedly rescanning. If a folder no longer belongs to the product, remove its registration after confirming its useful workflows have been migrated."]}]},{slug:"privacy-secrets-and-data",category:"Privacy & data",title:"Privacy, secrets, and local data",description:"Understand what DevDock reads, what it stores, how secret task values are protected, and what happens when projects or history are removed.",readingTime:"12 min read",sections:[{heading:"The local-first boundary",paragraphs:["DevDock works with local project folders and keeps project records on the computer. It does not require source upload to provide project detection, commands, health, shortcuts, or run history.","Network activity performed by a command belongs to that command and its underlying tool. DevDock's local-first model does not turn an npm install, Docker pull, or application request into an offline operation."],bullets:["Detection itself does not make network requests.","Repository files remain in their original locations.","Commands retain the behavior of the tools they invoke."]},{heading:"What detection reads",paragraphs:["Detection reads a bounded set of manifests, build files, marker paths, and relevant repository metadata. It does not execute package managers, project scripts, build tools, or the application to decide what a folder contains.","Repository extensions are also constrained to marker paths below the registered folder. This makes the detection surface reviewable and keeps registration from becoming an implicit code-execution event."]},{heading:"Project records and source files",paragraphs:["A DevDock project stores the workspace identity, folder references, detected context, saved commands, settings, and managed history needed to restore the experience. Source files remain owned by their existing folders and version-control workflow.","Removing a project from DevDock removes its registration and associated managed records; it does not delete the registered repositories. Files created by commands remain the responsibility of those commands and the project."],image:{src:"/products/screenshots/devdock.png",alt:"DevDock local project workspace",caption:"DevDock organizes references and workflow context around local folders without relocating the source project.",width:2560,height:1440}},{heading:"How secret task values are protected",paragraphs:["Secret values used by custom tasks are stored through Windows Credential Manager. Ordinary project data retains the reference needed to request the value when the task runs rather than storing the secret alongside task metadata.","Protection at rest does not make unsafe command output safe. Avoid commands that echo secrets, and review visible output before sharing logs or screenshots."],bullets:["Use secret inputs only for values that truly require them.","Do not duplicate credentials in task descriptions or notes.","Remove unused secret values when a task is retired."]},{heading:"Run history and retention",paragraphs:["Managed history preserves command identity, timing, status, target context, and retained output according to the application's settings. Its purpose is operational recall and troubleshooting, not permanent archival.","Choose a retention level appropriate for the sensitivity and volume of the project. Clear managed history when it is no longer useful, and move durable non-secret evidence into the product's normal documentation or issue system."],image:{src:"/products/screenshots/devdock-commands.png",alt:"DevDock command workspace and retained output",caption:"History is useful because output remains tied to a known task and projectânot because every terminal byte is kept forever.",width:2560,height:1440}},{heading:"Removing and resetting data safely",paragraphs:["Before removing a project, confirm whether its saved commands, workflow definitions, or run history contain context you still need. Removing the registration does not serve as a source-code deletion or repository cleanup tool.","For troubleshooting, prefer targeted actions: rescan detection, remove an obsolete task, clear managed history, or update a moved folder. A full local-data reset should be a deliberate last resort because it removes the organizational context DevDock was created to preserve."],bullets:["Back up project-owned configuration through the repository's normal version control.","Treat secure-store cleanup separately from deleting ordinary task metadata.","Verify folder paths after mov
10ing or restoring repositories."]}]}]},{slug:"screenshot-studio",name:"Screen Studio Kit",currentVersion:"1.5",category:"Store asset editor",headingDescriptor:"App Store and Google Play screenshot maker for Mac and Windows",tagline:"Design app screenshots that explain what your app does.",summary:"Create a distinctive screenshot set with refined 3D device frames, eight editable background styles, clear copy, and reusable layouts.",overview:["Build a screenshot gallery that shows buyers what your app does. Place screenshots in device frames, write clear headlines, and adjust the composition for each output size. Start with three free templates or unlock all 26 with Pro.","Choose from eight background styles, adjust the colours and intensity, and carry a matching treatment across pages. Edit text on the canvas and compare campaign variants in the same project. Pro adds localization and multi-size batch export."],icon:"/products/screenshot-studio.png",screenshot:{src:"/products/screenshots/screen-studio-1-4-iphone.jpg",alt:"Screen Studio Kit editor showing a fictional Fieldnotes phone composition",width:2880,height:1800},gallery:[{src:"/products/screenshots/screen-studio-1-4-iphone.jpg",alt:"Screen Studio Kit editor showing a fictional Fieldnotes phone composition",caption:"Edit the headline, device frame, background, and screenshot in a reusable composition.",width:2880,height:1800},{src:"/products/screenshots/screen-studio-1-3-campaigns.png",alt:"Screen Studio Kit Campaigns and variants panel",caption:"Create independent campaign treatments with a hypothesis, status, results, notes, and side-by-side first-frame comparisonâwithout duplicating project assets.",width:2880,height:1620},{src:"/products/screenshots/screen-studio-1-3-templates.png",alt:"Screen Studio Kit template library showing reusable layouts",caption:"Start from a built-in responsive template, then keep the editable layers and output-
10aware geometry that make the layout reusable.",width:2880,height:1620},{src:"/products/screenshots/screen-studio-1-3-elements.png",alt:"Screen Studio Kit stickers and widgets library with device compositions",caption:"Add editable device duos, trios, before-and-after layouts, callouts, stickers, ratings, feature pills, and other on-canvas elements.",width:2880,height:1620},{src:"/products/screenshots/screen-studio-1-3-typography.png",alt:"Screen Studio Kit selected headline with direct canvas editing and typography inspector",caption:"Double-click copy to edit it on the canvas, then refine its font, fitting, background, outline, padding, corners, and shadow in the inspector.",width:2880,height:1620},{src:"/products/screenshots/screen-studio-1-4-localisation.jpg",alt:"Screen Studio Kit previewing the localization workspace",caption:"Review translated copy in the screenshot layout before export.",width:2880,height:1800},{src:"/products/screenshots/screen-studio-1-4-export.jpg",alt:"Screen Studio Kit export settings for store screenshots",caption:"Choose the output sizes, languages and filenames for your screenshot export.",width:2880,height:1800},{src:"/products/screenshots/screen-studio-1-4-preview.jpg",alt:"Screen Studio Kit output preview for a screenshot project",caption:"Compare the selected outputs before exporting your artwork.",width:2880,height:1800},{src:"/products/screenshots/screen-studio-1-4-laptop.jpg",alt:"Screen Studio Kit editor with a rotated device frame",caption:"Adjust Turn and Tilt on a device frame while keeping the composition editable.",width:2880,height:1800},{src:"/products/screenshots/screen-studio-1-4-backgrounds.jpg",alt:"Screen Studio Kit 1.4 background gallery beside a laptop composition",caption:"Choose a background look, keep your colours, and adjust its intensity without leaving the editor.",width:2880,height:1800}],color:"#e6643f",tint:"#eee8de",status:"Available on macOS and Windows",platforms:["macOS","Windows"],availability:"Available on the Mac App Store and Microsoft Store",pricing:"Free includes local projects, layer editing, three templates, six elements, asset management, preview, validation, device-frame editing, one size and one language per export, and up to 10 exported full-resolution images per local day. A one-time Pro purchase unlocks unlimited, multi-size and multi-language exports, all 26 built-in templates, custom templates, the complete element library, multiple languages with CSV translation workflows, automated capture recipes (not available in the Mac App Store version), and App Store Connect and Google Play publishing.",privacy:"Project editing and screenshot rendering happen locally. Store purchases and license checks use the platform store. A publishing dry run renders and checks the screenshots without contacting the store; Screen Studio Kit connects to App Store Connect or Google Play only when you confirm the upload.",features:[{title:"One scene, many devices",description:"Adapt a shared layout for iPhone, iPad, Mac, Apple TV, Vision Pro, Watch, Google Play, and Microsoft Store presets, with adjustments for each output size."},{title:"Real layer editing",description:"Arrange app captures, headlines, shapes and device frames on one canvas. Change their size, position and order, group related elements, and undo edits as you refine the design."},{title:"Campaign variants",description:"Duplicate a treatment without duplicating project assets, record
10its hypothesis, status, result, and notes, compare first frames, and keep preview, preflight, export, and store sync tied to the active treatment.",details:["Treatments move through draft, testing, winner, and archived states while preserving independent pages.","The active treatment is explicit before an export or store publishing dry run, avoiding accidental use of an outdated campaign."],guideSlug:"first-project"},{title:"Responsive templates",description:"Start from 26 built-in layouts, including editorial, product, comparison, and multi-device treatments. Three are included in Free; Pro unlocks all 26. Every generated layer stays editable and responsive.",details:["With Pro, save a working page as a custom project template for the next release.","Templates adapt to the selected output size instead of producing a flattened mockup."],guideSlug:"first-project"},{title:"Inline copy and rich typography",description:"Double-click text on the canvas to edit it in place, import custom fonts, and refine text backgrounds, opacity, padding, corners, outlines, and shadows without leaving the composition.",details:["Auto-fit can shrink text for each output size and language, down to a minimum size you set.","Apply a matching layer style across pages when a treatment needs consistent typography."],guideSlug:"responsive-localization"},{title:"Focal crops and feature callouts",description:"Choose the important region of a screenshot or image with focal-point controls, then create linked crop variants or zoomed feature callouts without editing the source capture outside the project.",details:["The crop position is part of the scene and is reproduced by the native renderer.","Callouts remain editable layers with their own shape (circle or rounded rectangle), crop, border, shadow, and placement."],guideSlug:"assets-capture-and-frames"},{title:"Background systems",description:"Choose from eight editable looks: Aurora, Halo, Fold, Contour, Prism, Orbit, Paper, and Terraces. Change the palette, use brand colours, adjust intensity, flip the look, and apply it across pages.",details:["Switching looks keeps custom colours. Match text contrast updates the text colour on the current page, and Apply background to all pages gives every page the same background.","Solid, gradient and custom-image backgrounds remain available, including panoramic images across ordered pages."],guideSlug:"first-project"},{title:"Multi-device compositions",description:"Add reusable device duo, trio, and before-and-after compositions, then replace captures or restyle their frames without flattening the scene.",details:["Device compositions are built from normal editable frame layers rather than a fixed promotional image.","They work beside stickers, widgets, callouts, text, and the same responsive output rules as every other layer."],guideSlug:"first-project"},{title:"Three-dimensional device frames",description:"Show your app in refined phone, tablet, watch, laptop, desktop and TV frames. Adjust the finish, Turn and Tilt, then export the composition with its lighting and perspective.",details:["Turn and Tilt remain editable layer properties, with controls to reset the selected frame or every frame in the project.","Studio angle presets, fit-to-canvas and matching-frame appearance controls help keep a whole screenshot set consistent.","Preview, desktop export and the bundled CLI use the same 3D frame renderer. CLI automation requires Pro, the matching installed app and a graphical session with WebGL."],guideSlug:"assets-capture-and-frames"},{title:"Stickers and widgets",description:"Add 20 decorative stickers and 9 reusable widgets for ratings, reviews, metrics, awards, feature callouts, store badges, download counts, and privacy messages.",details:["Every sticker is an editable scene layer with its own style, colors, size, position, rotation, and opacity.","Widget copy, ratings, colors, corner radius, shadow, and optional transparent card backgrounds remain editable in the inspector. Six elements are included in Free; Pro unlocks the complete library."],guideSlug:"first-project"},{title:"Localization built in",description:"With Pro, add languages, manage translated copy and language-specific assets, exchange translation CSV files, and validate the selected sizes and languages before batch export."},{title:"Deterministic native export",description:"Export finished screenshots as PNG or JPEG with organised filenames and export history. Preview and validate the selected output first; Pro adds batch export across sizes and languages."},{title:"Capture recipes",description:"With Pro, save a recipe with the device, app, and a deep link and wait time (100 to 15,000 ms) for each screen, then import each capture into the project. The Mac App Store version cannot launch simulators or devices, so it imports existing captures instead."},{title:"Reviewed publishing",description:"With Pro, review an App Store Connect or Google Play publishing dry run, then confirm the screenshot upload. Microsoft Store screenshots and the App Store event card are exported for you to upload yourself."}],workflow:[{title:"Create a treatment",description:"Choose store platforms and output presets, then begin from a blank page, an editable template, or a named campaign variant."},{title:"Compose in context",description:"Edit copy on the canvas, place focal crops and callouts, refine typography, backgrounds, stickers, and reusable device compositions."},{title:"Adapt deliberately",description:"Localize text, compare campaign treatments, and add per-size geometry or visibility overrides only where the shared composition needs them."},{title:"Validate and export",description:"Run preflight, render the active treatment as a deterministic batch, and review the recorded output summary before publishing."}],useCases:[{title:"Indie app launches",description:"Build a polished, repeatable store listing without maintaining separate design files for every size and language."},{title:"Localized releases",description:"Keep translated text tied to the layout and catch missing or overflowing variants before the release deadline."},{title:"Cross-store products",description:"Use one project for Apple, Google Play, and Microsoft Store output while respecting each target's format rules."},{title:"Frequent UI updates",description:"Replace a shared asset or recapture a screen, then regenerate every affected output from the same source project."}],faqs:[{question:"Which stores and device families are supported?",answer:"The preset catalog covers Apple device families, Google Play outputs, and Microsoft Store targets, including target-specific dimensions and format rules."},{question:"Can one layout serve several screenshot sizes?",answer:"Yes. Geometry is normalized to the active canvas, and specific output sizes can override position, dimensions, or visibility when a shared layout needs adjustment."},{question:"Can I compare different App Store screenshot treatments?",answer:"Yes. Campaign variants duplicate the current treatment while keeping the project assets shared. Each variant records a name, hypothesis, status, result, and n
10otes; the active variant is then used for preview, preflight, export, and publishing dry runs."},{question:"Can I edit text, fonts, and image crops without flattening the design?",answer:"Yes. Text can be edited directly on the canvas, styled with backgrounds, outlines, padding, corners, and shadows, and set in an imported custom font. Screenshot and image layers retain focal-point crop controls and can produce linked crop variants or feature callouts."},{question:"Do three-dimensional frames export as they appear on the canvas?",answer:"Preview, desktop export and the bundled CLI use the same 3D frame renderer. CLI automation requires Pro, the matching installed app and a graphical session with WebGL. Review the artwork for each intended store before uploading."},{question:"Does Screen Studio Kit upload automatically?",answer:"No. Publishing remains locked until the current project fingerprint passes a dry run, and replacing a store screenshot group requires explicit confirmation."},{question:"Where are projects and imported images stored?",answer:"Project state is stored locally, while imported assets are copied into an application-managed project directory by default."},{question:"When does Screen Studio Kit connect to a store?",answer:"Editing, validation, and rendering run locally. Store publishing connects directly to App Store Connect or Google Play using your configured credentials and sends the screenshot assets you approve. In-app purchases use the platform store."}],guides:[{slug:"first-project",category:"Start here",title:"Create your first screenshot project",description:"Set up target stores, organize assets, create pages, and build a reusable composition that survives the next release.",readingTime:"3 min read",sections:[{heading:"Choose your screenshot sizes",paragraphs:["Choose the stores and device families your app supports. Start with one output size and one useful app screen so you can develop the message and composition together.","Add the other required sizes when the first design is ready to review. Presets set the output dimensions and format rules, while you decide which pages belong in the release."],bullets:["Start with the stores you will actually publish to.","Choose one representative size for initial composition.","Start with the sizes you need for the first release."]},{heading:"Create the project",paragraphs:["Choose the target stores and presets, then name the project for the app and release stream it represents. The project keeps pages, managed assets, languages, target selection, and output settings together.","Imported assets are copied into the managed project directory by default, so the composition does not silently depend on a temporary Downloads path."]},{heading:"Build the first page",paragraphs:["A page combines one background with an ordered list of screenshot, image, text, shape, group, and device-frame layers. Start with the application capture and its single strongest message before adding decoration.","Name the page for its product claim, not its position. A name such as Fast capture remains useful when the page order changes; Screenshot 2 does not."],bullets:["Keep shared logos and decorative assets in the project library.","Use groups for elements that should move together.","Use a device frame only when it improves recognition."],image:{src:"/products/screenshots/screen-studio-1-4-iphone.jpg",alt:"Screen Studio Kit editing a Fieldnotes phone screenshot composition",caption:"Write the headline and arrange the device frame and background beside the app capture.",width:2880,height:1800}},{heading:"Adapt the layout to another size",paragraphs:["The layout adapts as the canvas size changes. Preview the other selected outputs and check the headline, device frame and visible app content in each shape.","If a particular size needs a different arrangement, use a size-specific position, dimension or visibility adjustment. Keep shared changes in the main composition so the next update remains easy to review."],bullets:["Align important content to stable guides.","Avoid tiny fixed offsets that only look correct at one size.","Preview the largest and smallest selected outputs before continuing."]}
10,{heading:"Choose a background that supports the message",paragraphs:["Open the page Background panel and try Aurora, Halo, Fold, Contour, Prism, Orbit, Paper or Terraces. Choose a palette or select Use brand colours, then lower the intensity if detail competes with the headline.","Switching the look preserves custom colours. Use Flip look to move its emphasis and Match text contrast to update the text colour on the current page. Choose Apply background to all pages when the complete set needs the same treatment."],image:{src:"/products/screenshots/screen-studio-1-4-backgrounds.jpg",alt:"Eight editable background looks in Screen Studio Kit 1.4",caption:"Choose the background, palette and intensity beside the actual composition.",width:2880,height:1800}},{heading:"Duplicate and vary intentionally",paragraphs:["Duplicate a strong page when the layout remains useful but the message or capture changes. Keep common brand treatment consistent, then make the minimum content changes needed for the next product claim.","Do not duplicate entire pages merely to handle a language or output size. Languages and per-size overrides exist specifically to prevent that maintenance problem."],image:{src:"/products/screenshots/screenshot-studio-golfsmart-preview.jpg",alt:"Screen Studio Kit previewing the full GolfSmart output matrix",caption:"Preview exposes how the shared compositions resolve across iPhone, Android, and the Play Store feature graphic.",width:2880,height:1840}},{heading:"Keep the project for your next release",paragraphs:["Your edits autosave locally, and recovery snapshots help restore interrupted work. Keep the editable project as well as the exported images so you can return to its captures, headlines and design choices.","Use the portable project workflow when moving the design to another computer or handing it to someone else. That preserves the source project instead of asking them to reconstruct it from finished images."],bullets:["Resolve a recovery prompt before making new edits.","Keep project-owned source assets with the project.","Export final output separately from the editable project."]}]},{slug:"responsive-localization",category:"Design system",title:"Responsive layouts and localization",description:"Adapt one screenshot system across aspect ratios and languages without turning every output into an unrelated page.",readingTime:"2 min read",sections:[{heading:"Start with one shared composition",paragraphs:["Design the first screenshot at a representative output size. Get the message, frame and background working together before reviewing the other selected formats.","Keep the elements shared where the design still works. Add size-specific adjustments when a different shape needs more room for text or a different device position."]},{heading:"Test the extremes",paragraphs:["Preview the widest, narrowest, largest, and smallest selected outputs early. Look for changes in line wrapping, device-frame balance, safe-area pressure, and the amount of application UI still visible.","Fix shared problems in the base composition. Use an override only when solving the shared design would make other targets worse."],image:{src:"/products/screenshots/screenshot-studio-golfsmart-preview.jpg",alt:"Screen Studio Kit output matrix with portrait and landscape store assets",caption:"Output preview makes phone and feature-graphic differences visible before the export matrix is rendered.",width:2880,height:1840}},{heading:"Add targeted size overrides",paragraphs:["Per-size overrides can change position, dimensions, or visibility for an output that genuinely needs different treatment. Document the purpose through clear layer and page naming.","Avoid recreating the full scene in overrides. If most layers diverge, consider whether that device family needs a deliberately separate page design."],bullets:["Move text away from an unavoidable safe area.","Hide decoration that crowds a compact output.","Adjust a device frame when the screenshot becomes unreadable."]},{heading:"Set up languages",paragraphs:["With Pro, add only the languages planned for the release and identify the source language. Text layers store language variants against stable page and layer identities.","Keep product names, legal marks, and translatable claims in separate layers when they follow different localization rules."]},{heading:"Exchange translations through CSV",paragraphs:["Export translation CSV after page and text-layer names are stable. Translators can work with the copy while the project preserves the identifiers needed to return each value to the correct layer.","On import, review unknown, missing, or duplicate identifiers rather than assuming row order is meaningful."],bullets:["Do not rename text layers during an active handoff.","Preserve Unicode content without spreadsheet-side substitutions.","Review the longest variants at the smallest output."]},{heading:"Check every size and language",paragraphs:["Preflight checks missing translations, layer bounds, assets, page counts, output resolution, and store-specific format rules across the selected sizes and languages.","Resolve the report before rendering final assets. A clean representative preview does not prove that every language-size combination is complete."],image:{src:"/products/screenshots/screenshot-studio-golfsmart-validation.jpg",alt:"Screen Studio Kit preflight listing warnings for the GolfSmart screenshot set, with no errors",caption:"Validation checks the complete real release matrix instead of relying on manual spot checks.",width:2880,height:1840}}]},{slug:"export-and-publishing",category:"Release",title:"Exporting and publishing store screenshots",description:"Check your screenshots before export, review the finished files, and publish approved screenshots to a store with Pro.",readingTime:"2 min read",sections:[{heading:"Cho
10ose the outputs for this release",paragraphs:["Select the stores, device sizes, languages, page order and file format you intend to deliver. Review those choices before exporting so the folder contains the screenshot set you need.","Microsoft Store targets require PNG; other presets enforce their own dimensions and accepted formats."]},{heading:"Run preflight",paragraphs:["Preflight checks the selected matrix for missing assets and translations, unsafe bounds, invalid page counts, output dimensions, and target-format rules.","Treat errors as blockers. Review warnings in context and record why an intentional exception is acceptable before producing the final folder."],image:{src:"/products/screenshots/screenshot-studio-golfsmart-validation.jpg",alt:"Screen Studio Kit preflight listing warnings for the GolfSmart screenshot set, with no errors",caption:"Preflight evaluates the actual release matrix before rendering or store access begins.",width:2880,height:1840}},{heading:"Export the screenshot set",paragraphs:["Choose the destination folder and naming pattern, then export the selected pages. Free exports one size and one language per export within its daily image allowance. Pro produces selected sizes and languages in one batch.","Watch the progress and review the export summary. If you change the source artwork during the process, cancel and export the updated selection so the delivered files belong to the same version."],bullets:["Write to a clean release destination.","Use collision-safe filenames.","Keep the recorded summary with the reviewed output."]},{heading:"Inspect the release folder",paragraphs:["Open every file from every device family and language, then verify ordering and file counts against the matrix. Check actual pixels rather than trusting filenames alone.","If a problem is found, fix the project and render a fresh batch. Avoid hand-editing generated output because that breaks repeatability."],image:{src:"/products/screenshots/screenshot-studio-golfsmart-export.jpg",alt:"Screen Studio Kit export set to write 122 GolfSmart files across iPhone, iPad, and Google Play sizes in English and Norwegian",caption:"The reviewed matrix records exactly which stores, languages, files, and naming rules will be rendered.",width:2880,height:1840}},{heading:"Prepare store connections",paragraphs:["App Store Connect uses an issuer ID, key ID, app resource ID, and local p8 key. Google Play uses a package name and local service-account JSON.","Credential contents remain local and are not copied into ordinary project data. Confirm the store application identity before authorizing a dry run."],bullets:["Use credentials scoped to the intended app and action.","Keep key files outside shared project exports.","Remove obsolete store connections."]},{heading:"Dry run, confirm, and publish",paragraphs:["A dry run renders and checks the planned upload without contacting the store. Its approval is bound to a fingerprint of project state, selected languages and sizes, connection, and upload engine.","Any relevant change invalidates that approval. A confirmed upload replaces the intended screenshot group only while the fingerprint still matches, preventing a review of one release from authorizing another."]}]},{slug:"assets-capture-and-frames",category:"Assets",title:"Assets, captures, and device frames",description:"Manage source images, replace captures safely, use platform-aware frames, and keep the project portable.",readingTime:"2 min read",sections:[{heading:"Organise your app captures",paragraphs:["Import captures, logos, backgrounds, and decorative images into the project library so the composition does not depend on temporary external paths.","Give reusable assets recognizable names and remove genuine duplicates before a project becomes difficult to audit."],bullets:["Keep source-resolution captures.","Avoid lossy re-exports before composition.","Separate brand assets from application captures."]},{heading:"Replace captures without rebuilding",paragraphs:["When application UI changes, replace the shared managed asset used by a screenshot layer. Every page and output that references it updates together.","Preview affected outputs before export; a new capture may shift important UI even when its pixel dimensions are unchanged."],image:{src:"/products/screenshots/screenshot-studio-golfsmart-assets.jpg",alt:"Screen Studio Kit library of English and Norwegian GolfSmart captures",caption:"Managed platform and language assets let a release update propagate through the existing composition.",width:2880,height:1840}}
10,{heading:"Choose frames deliberately",paragraphs:["Device frames improve recognition when the hardware silhouette is part of the message. They reduce the usable area, so omit them when the application UI itself should dominate.","Use platform-aware frames that match the intended device family and review them at every selected output ratio."]},{heading:"Turn and tilt a frame in 3D",paragraphs:["Select a device-frame layer and use Turn and Tilt to change its perspective. Both angles are constrained to -60° through 60°, update the canvas live, and remain serialized with the scene for native export.","Use depth to establish hierarchy, not to hide important interface content. Reset one frame or every frame when the composition works better flat, and review App Store preflight guidance before submitting rotated custom iPhone artwork."],image:{src:"/products/screenshots/screen-studio-1-4-laptop.jpg",alt:"Screen Studio Kit 1.4 editing a laptop composition",caption:"Device finishes, angles and screen content remain editable in the composition.",width:2880,height:1800}},{heading:"Create capture recipes",paragraphs:["With Pro, a capture recipe records a simulator or Android device target, the app, and for each screen a deep link and a wait of 100 to 15,000 ms before the capture. Choose a wait long enough for the screen to settle. The Mac App Store version cannot launch simulators or devices; import existing captures there instead.","Recipes should produce consistent application state, not conceal nondeterministic setup. Keep test data and authentication outside the exported artwork project when they are sensitive."]},{heading:"Diagnose missing and stale assets",paragraphs:["Preflight identifies missing managed files and incomplete outputs. If an image appears stale, confirm which asset identity the layer references before importing another copy.","Restore the expected managed file or deliberately relink the layer. Avoid repairing the rendered output only."],image:{src:"/products/screenshots/screenshot-studio-golfsmart-assets.jpg",alt:"Screen Studio Kit asset library with source-resolution store captures",caption:"Every source capture reports its language, platform, dimensions, and placement count.",width:2880,height:1840}},{heading:"Move the project",paragraphs:["Use the portable project workflow when moving work between machines. Verify that managed assets, fonts, target presets, and language content are present after import.","Store credentials and machine-specific simulator configuration remain separate from portable design content."]}]},{slug:"recovery-privacy-and-troubleshooting",category:"Troubleshooting",title:"Recovery, privacy, and troubleshooting",description:"Recover interrupted edits, diagnose validation or export problems, and understand which project data stays local.",readingTime:"2 min read",sections:[{heading:"Recover interrupted edits",paragraphs:["After an interruption, review the recovery snapshot before continuing. It represents unsaved editor state that may be newer than the last committed project save.","Choose the state deliberately; creating new edits first can make the recovery decision harder to understand."]},{heading:"Resolve validation failures",paragraphs:["Start with the affected store, size, language, page, and layer. Fix missing content or bounds in the project, then rerun the complete selected matrix.","Do not suppress a matrix-wide problem by deselecting a required target."],image:{src:"/products/screenshots/screenshot-studio-golfsmart-validation.jpg",alt:"Screen Studio Kit preflight listing warnings for the GolfSmart screenshot set, with no errors",caption:"Validation identifies the affected output and asset, then confirms when the source project is ready.",width:2880,height:1840}},{heading:"Diagnose export mismatches",paragraphs:["Confirm that the export used the current project state and intended matrix. Compare the recorded batch summary with the files on disk.","If a render differs from the editor, isolate the affected layer type, font, output size, and override before rerunning a smaller diagnostic batch."],bullets:["Check font availability.","Check per-size overrides.","Check image color and transparency.","Check that the previous batch was not reused."]},{heading:"Handle publishing safely",paragraphs:["A failed dry run should be resolved before upload. A changed project invalidates the reviewed fingerprint and requires another dry run.","Never work around a fingerprint mismatch by restoring old rendered files into a new release folder."]}
10,{heading:"Understand local data",paragraphs:["Everything runs locally on your device, including projects, managed assets, editor state, validation, and rendering. Screen Studio Kit does not use AI or language models, and it does not share your data with anyone. Store connections use local credential files and are not embedded into portable project data.","Publishing is the explicit operation that sends only the approved screenshots directly to the store you choose. Ordinary editing and export do not upload the project or its assets."]},{heading:"Prepare useful support information",paragraphs:["When a problem remains, record the product version, operating system, affected preset, language, page, layer type, and the exact validation or export message.","Share a minimal non-sensitive project when possible. Remove store credentials and unrelated proprietary captures before providing diagnostic material."]}]}]},{slug:"diffanything",name:"Diff Anything",currentVersion:"1.6",category:"Comparison and merge tool",headingDescriptor:"File and folder comparison for Mac and Windows",tagline:"Find the changes that matter in your code, files, and folders.",summary:"Compare code, spreadsheets, documents, images, archives, and folders in one desktop app. Review exact differences, resolve text conflicts, and keep compared files on your computer.",overview:["Spot meaningful code changes with Smart Diff across 117 editor languages. Switch to Line Diff whenever you want an exact line-by-line review. Both views keep syntax highlighting and editing close at hand.","Excel, OpenDocument, and Apple Numbers workbooks compare stored cell values across formats in a sheet-aware grid, and a CSV or TSV export can be checked against a sheet of the workbook it came from. CSV files compare by row and column. JSON, YAML, and XML compare semantic paths, matching list items by id, text includes an interactive three-way merge workspace, PDFs switch between rendered-page visual comparison and extracted text, and images offer overlay, swipe, blink, heatmap, and changed-pixel views.","Folder comparison provides two-pane tree and table layouts, global search and filtering, progressive loading, semantic nested-file comparison, moved-file detection, and ignore patterns. Archive mode compares normalized paths and streamed SHA-256 hashes across ZIP/ZIP64/ZIPX, 7z, RAR, TAR families, and standalone compressed streams, including encrypted and supported multipart sets. Pro turns reviewed folder changes into explicit create, update, delete, and move plans with stale-result protection, progress, cancellation, metadata preservation, durable recovery, rollback, and one-click undo.","Keep repeat comparisons ready with Pro: save profiles and rules, return to recent work, and preserve your review state. Bring comparisons into scripts and everyday source control with the CLI, a Git difftool or diff driver, and a CI check that can fail only on breaking API schema changes.","Read every result your way. A Blue and yellow difference palette keeps added and removed content distinct for people with red-green color blindness, and the accessible workspace lists each difference in words, with its location and both values, so you can review and apply changes from the keyboard."],icon:"/products/diff-anything.png",screenshot:{src:"/products/screenshots/diff-anything-smart-diff-1-5.png",alt:"Diff Anything 1.5 Smart Diff comparing two TypeScript files with normal syntax highlighting, exact token changes, and the conventional Line Diff option beside it",width:3320,height:2380},gallery:[{src:"/products/screenshots/diff-anything-three-way-merge-1-4.jpg",alt:"Diff Anything three-way merge workspace showing Ours and Theirs against Base with an unresolved conflict",caption:"Compare each side with Base, focus changed lines, navigate conflicts, and edit the merged result in one workspace.",width:2560,height:1600},{src:"/products/screenshots/diff-anything-image-heatmap-1-3.png",alt:"Diff Anything image heatmap with changed-pixel, similarity, dimension, alignment, and threshold measurements",caption:"Use heatmap, changed pixels, overlay, swipe, or blink while exact visual measurements stay visible.",width:2560,height:1834},{src:"/products/screenshots/diff-anything-pdf-visual-1-3.png",alt:"Diff Anything PDF Visual diff with rendered-page highlights and a visual match percentage",caption:"Visual diff compares rendered pages, highlights changed areas, and reports a per-page visual match percentage.",width:2560,height:1834},{src:"/products/screenshots/diff-anything-folders.png",alt:"Diff Anything folder comparison showing added, removed, and changed paths across two release folders",caption:"Filter the folder result by path or status, then open a changed file for closer review.",width:2560,height:1500},{src:"/products/screenshots/diff-anything-json-1-3.png",alt:"Diff Anything comparing two JSON files, with user records matched by id and a changed role value selected",caption:"Semantic mode lists changed paths and values. Here a Compare by id rule matches user records, so a reordered list shows only the real changes.",width:2560,height:1834},{src:"/products/screenshots/diff-anything-welcome-1-3.png",alt:"Diff Anything welcome screen with private local comparison sources",caption:"Start with files, folders, or pasted content; the comparison stays on the device.",width:2560,height:1834},{src:"/products/screenshots/diff-anything-smart-diff-1-5.png",alt:"Diff Anything 1.5 Smart Diff comparing two TypeScript files with token-level changes and normal syntax highlighting",caption:"Smart Diff aligns meaningful syntax tokens across reflowed code; switch to Line Diff whenever exact line movement is the question.",width:3320,height:2380},{src:"/products/screenshots/diff-anything-spreadsheets-1-3.png",alt:"Diff Anything 1.3 comparing XLSX and ODS workbooks with highlighted cell changes",caption:"Compare stored values across spreadsheet formats in a sheet-aware grid without converting either workbook first.",width:1072,height:768},{src:"/products/screenshots/diff-anything-pdf-text-1-3.png",alt:"Diff Anything PDF Extracted text view with side-by-side wording changes",caption:"Switch to Extracted text when wording matters more than rendered page appearance.",width:2560,height:1834},{src:"/products/screenshots/diff-anything-csv-1-3.png",alt:"Diff Anything CSV comparison with row and cell changes highlighted",caption:"Review CSV rows and cell values in a purpose-built table with keyed-row options.",width:2560,height:1834},{src:"/products/screenshots/diff-anything-archive-compare-1-4.jpg",alt:"Diff Anything archive comparison with ZIP entry paths, sizes, statuses, extraction actions, and a differences sidebar",caption:"Compare archive contents by normalized path and streamed content hash, then open changed text pairs or extract an entry explicitly.",width:2560,height:1600}],color:"#1e9e98",tint:"#e4f5f3",status:"Available on macOS and Windows",platforms:["macOS","Windows"],availability:"Available on the Mac App Store and Microsoft Store",pricing:"Free desktop use lets you try every comparison engine for files up to 5 MiB per side and 10 new comparison sessions per local day; collection previews show the first 100 items and PDF previews show the first 3 pages. The free CLI supports text and JSON. A one-time Pro purchase removes the preview and session limits and unlocks larger sources within technical limits, saved profiles and history, report export, three-way merge, folder synchronization, batch manifests, trusted preprocessors, and every CLI mode.",privacy:"No accounts, cloud comparison service, analytics, or telemetry.",features:[{title:"Language-aware code comparison",description:"Switch between Smart Diff and the conventional Line Diff while keeping normal syntax highlighting, exact source text, editing, moved blocks, wrapping, and compact context visible. Detection uses filenames, extensions, shebangs, and pasted content.",details:["Smart Diff uses language-family-aware token alignment across all 117 non-plain-text editor languages. It ignores safe layout-only edits in brace and expression languages, preserves significant indentation and statement newlines, and treats strings and comments according to the selected language. It is not an AST comparison and does not claim compiler-level semantic equivalence.","Code is detected from filenames, extensions, shebangs, and pasted content. Shared extensions are disambiguated from content, and framework files can highlight embedded implementation languages instead of falling back to plain text.","The maintained editor catalog includes 18 additional languages in 1.5: Ada, Assembly, COBOL, Crystal, CUDA, D, Elm, Erlang, Fortran, GLSL, Haskell, Haxe, HLSL, LaTeX, LLVM IR, OCaml, Raku, and WebAssembly text.","The CLI provides a Unicode-safe highlighted terminal view with automatic or forced colour, an explicit language override, and configurable context around each hunk."],guideSlug:"comparison-modes"},{title:"Semantic structured diffs",description:"Compare JSON, YAML, XML, CSV, OpenAPI, and JSON Schema by parsed keys, paths, rows, values, and compatibility rather than line position alone. JSON and YAML lists of records are matched by an id, _id, uuid, or key field automatically, numbers compare by value, and XML elements are matched by a key attribute such as id or name, with readable XPath locations. API mode also provides explicitly limited contract review for GraphQL types and SQL CREATE TABLE definitions."},{title:"Cross-format spreadsheet comparison",description:"Compare stored cell values by sheet and coordinate across Excel (XLS, XLA, XLT, XLSX, XLSM, XLTX, XLTM, XLAM, and XLSB), OpenDocument (ODS and OTS), and Apple Numbers workbooksâeven when the two formats differ. Open a CSV or TSV file beside a workbook to check an export against the sheet it came from: the first sheet is used by default, and Compare with sheet picks another. The sheet-aware grid links changed cells to the Differences pane and virtualizes populated rows and columns. Formulas, formatting, charts, macros, and workbook layout are not compared."},{title:"Text editing and merge",description:"Use side-by-side or inline text views and apply selected changes. Pro adds a three-way workspace for Base, Ours, and Theirs with focused Ours-against-Base and Theirs-against-Base diffs, conflict navigation, bulk Ours or Theirs choices, reset, automatic merging of independent lines and of edits to separate words of the same line, ordered conflict choices, and an editable merged result."},{title:"Folder and archive review",description:"Compare folders in t
10wo-pane tree or table layouts with global search, filtering, progressive loading, semantic nested-file comparison, moved-file detection, ignore patterns, and direct opening of nested pairs. Archive mode compares normalized paths, types, sizes, link targets, and streamed SHA-256 hashes across ZIP/ZIP64/ZIPX and ZIP-based packages, 7z, RAR, TAR variants, Gzip, Bzip2, XZ, and Zstandard. It supports encrypted ZIP, 7z, and RAR archives plus multipart numbered 7z and common RAR volume sets, with separate in-memory passwords for each side, cancellation, and expansion safety limits; open changed text entries or extract them explicitly. Pro folder synchronization applies reviewed create, update, delete, and move plans transactionally with stale-result protection, progress, cancellation, metadata preservation, durable recovery, restart-safe rollback, and one-click undo.",details:["Content-signature detection recognizes renamed containers and ZIP or RAR self-extracting archives; container timestamps, member order, compression level, and other packaging metadata do not create false content differences.","Split ZIP, ACE, ARJ, CAB, ISO/disk images, and filesystem images remain in binary mode; explicit archive mode reports that the format is unsupported."],guideSlug:"archive-comparison"},{title:"Visual image comparison",description:"Inspect images with thresholds, overlay, swipe, blink, heatmap, changed-pixel masks, true-pixel zoom, dimension alignment, and detailed error metrics."},{title:"Connected PDF review",description:"Review rendered PDF pages, move between them, zoom the originals, or switch to extracted text. Visual diff compares page pixels, highlights changed regions, and reports a per-page visual-match percentage; selecting a wording difference keeps Extracted text active. Free shows the first 3 rendered page previews; Pro removes that preview cap."},{title:"Environment and HTTP comparison",description:"Compare .env keys with values masked, flag malformed or duplicate variables, and compare raw or JSON-shaped HTTP responses by HTTP version, status code, and reason phrase, case-insensitive headers, and semantic JSON bodies."},{title:"Document and binary inspection",description:"Compare PDF pages visually or by extracted text, extract comparable text from Word (DOCX, DOCM, DOTX, DOTM), PowerPoint (PPTX and related formats), OpenDocument text and presentations (ODT, ODP), and RTF, or inspect binary format, size, image dimensions, colour-profile label, SHA-256 hash, and supported image previews. Document differences are described in words by page, clause, slide, or cell."},{title:"Repeatable review rules",description:"JSON and YAML share the same semantic rules: ignored paths, keyed or unordered arrays, case behavior, and numeric tolerances. Pro saves them in profiles with reviewed states, notes, and live watch."},{title:"Reports and trusted preprocessors",description:"Pro exports self-contained HTML, JSON, or Markdown review reports, unified diffs for text, and changed-row CSV for CSV comparisons. It can also run an explicitly confirmed local executable directlyâwithout a shellâon two text sources before comparison.",details:["Local transform runs a program installed on the computer, such as jq, xmllint, or Black. The app does not include these programs. The Mac App Store version runs in Apple's App Sandbox, which limits it to files and folders you choose in the app, so Local transform is described for the Microsoft Store version on Windows."]},{title:"CLI, Git, and CI",description:"The free CLI compares text and JSON with terminal, summary, or JSON output. Pro unlocks every documented mode and YAML/JSON batches that emit summary, JSON, JUnit, or SARIF, and --fail-
10on breaking fails an API schema check only on breaking or unclassified changes. Both tiers support colour, language, context, opt-in difference exit codes, Git difftool integration, and a Git diff driver assigned to file types in .gitattributes.",details:["The Microsoft Store version on Windows provides the diff-anything.exe command. The Mac App Store version runs in Apple's App Sandbox, which limits it to files and folders you choose in the app, so command-line, Git, and CI use is described for Windows."]},{title:"Local review workspace",description:"Start each new comparison with the collapsible Differences pane visible, then work across in-memory tabs with search and filters, reviewed or ignored states, notes, a command palette, cancellable comparisons, diagnostics, density controls, and display scaling. Pro adds saved profiles and local history snapshots."},{title:"Difference colors for color blindness",description:"Settings â Difference colors switches added and removed content from red and green to Blue and yellow, which stay easy to tell apart with red-green color blindness. The palette applies in light and dark themes across the text and code editor, three-way merge, structured trees, tables, folders, and documents. It is included in the free plan."},{title:"Accessible workspace",description:"Press Command-Shift-A on a Mac or Control-Shift-A on Windows to turn a comparison into one ordered page: the sources, a summary, and every difference in words with its location, the change, and the original and updated values. Step through differences, search them, mark them reviewed or ignored, add notes, and apply supported changes from the keyboard. On a Mac it opens automatically when VoiceOver is running. It is included in the free plan; three-way merge is not part of it."}],workflow:[{title:"Choose sources",description:"Open files or folders, paste content, or use Pro to load a saved profile with known options."},{title:"Select a mode",description:"Use automatic detection or explicitly choose text, structured, cross-format spreadsheet, folder, archive, document, image, binary, or API comparison. In code comparisons, switch between Smart Diff and conventional Line Diff without changing sources."},{title:"Review and resolve",description:"Navigate stable differences, apply supported changes, resolve three-way conflicts, or approve a folder synchronization plan without losing source context."},{title:"Save or automate",description:"Use Pro to export a report or retain a profile, invoke the CLI, or wire the comparison into Git and CI."}],useCases:[{title:"Configuration review",description:"Compare JSON, YAML, XML, and environment files as data. JSON and YAML rules can ignore expected paths or array order, records with an id field are paired automatically, XML elements are paired by a key attribute and can ignore child order under chosen elements, and .env values stay masked with an option to compare variable presence only."},{title:"Spreadsheet handoff and migration",description:"Compare stored cell values when a workbook moves between Excel, OpenDocument, and Apple Numbers formats without converting either file first, or check a CSV export against the sheet it was exported from."},{title:"API regression checks",description:"Label likely breaking OpenAPI or JSON Schema changes with rule codes and see the breaking count in the result. With Pro on Windows, run the same comparison in CI: identical schemas pass, and --fail-
10on breaking fails the job only on breaking or unclassified changes, with rule codes in JUnit and SARIF. The rules are heuristic, so a passing check still calls for contract review."},{title:"Release artifact inspection",description:"Compare a trusted release baseline with a candidate folder or supported archive. Filter added, removed, changed, and moved paths, open nested file changes in focused views, and optionally correct a folder through a reviewed synchronization plan."},{title:"Private data comparison",description:"Inspect sensitive local files without uploading their content to a browser service or creating an account."}],faqs:[{question:"Do compared files leave the computer?",answer:"No. Comparison is local. The application has no account, cloud comparison service, analytics, or telemetry."},{question:"How does automatic mode choose a comparison?",answer:"Compatible spreadsheet formats can use the shared stored-value comparison even when their extensions differ, matching structured formats use their semantic engine, two folders use folder comparison, and other compatible inputs fall back to text. You can always choose a concrete mode."},{question:"Can I compare different spreadsheet formats?",answer:"Yes. Diff Anything compares stored cell values by sheet and coordinate across Excel, OpenDocument, and Apple Numbers workbooks in any pairing. A CSV or TSV file opened beside a workbook is compared by cell values with one sheet, the first by default; choose another under Compare with sheet. Values are compared as stored text, so 20 and 20.0 count as different. Formulas, formatting, charts, macros, and workbook layout are not compared."},{question:"Can Diff Anything be used from Git or CI?",answer:"Yes, with the Microsoft Store version on Windows. The CLI supports difference exit codes, machine-readable output, Git difftool configuration, and a Git diff driver for file types you assign in .gitattributes. The free CLI compares text and JSON; Pro adds every other CLI mode, batch manifests with JSON, JUnit, or SARIF output, and --fail-
10on breaking for API schema checks."},{question:"How does three-way merge handle conflicts?",answer:"Choose a common Base for Ours and Theirs. Focused source diffs show what each side changed from Base, and independent line edits, or edits to separate words of the same line, combine automatically. When both sides change the same words, the result is a conflict; a value is never assembled from parts of each side. Overlapping edits offer Ours, Theirs, Ours then Theirs, Theirs then Ours, and Base choices, with conflict navigation, bulk side choices, and reset. The result remains editable and cannot become the current right source while conflict markers remain; saving that modified source is a separate action."},{question:"Can folder synchronization be undone?",answer:"Yes. Diff Anything previews create, update, delete, and move actions, rejects stale plans, applies the reviewed selection transactionally with progress and cancellation, preserves supported metadata, uses durable recovery journals and restart-safe rollback, and offers one-click undo after a successful synchronization."},{question:"Which archives can Diff Anything compare?",answer:"ZIP/ZIP64 and ZIPX, ZIP-based packages, 7z, RAR 1.3 through 7, TAR and compressed TAR variants, plus standalone Gzip, Bzip2, XZ, and Zstandard streams. Encrypted ZIP, 7z, and RAR archives are supported, as are numbered 7z and common RAR volume sets. Split ZIP, ACE, ARJ, CAB, ISO/disk images, and filesystem images are not archive-mode inputs."},{question:"Which changes can be applied directly?",answer:"Selected text, JSON, YAML, XML, environment-file, HTTP-response, and API-schema differences can be applied in either direction. JSON and HTTP targets are edited in place, so their comments, trailing commas, indentation, and layout are kept. YAML and XML targets are rewritten from their parsed data after a confirmation, which drops comments and custom layout. A JSON API schema keeps its layout; a YAML schema is rewritten after a confirmation."},{question:"Can I change the red and green difference colors?",answer:"Yes. In Settings â Difference colors, choose Blue and yellow. Added and removed content then stay easy to tell apart with red-green color blindness, in light and dark themes. The setting is part of the free plan."},{question:"Can I review a comparison without the side-by-side view?",answer:"Yes. The accessible workspace (Command-Shift-A on a Mac, Control-Shift-A on Windows) lists every difference in words with its location and both values, and lets you review, ignore, and apply changes from the keyboard. On a Mac it opens automatically when VoiceOver is running."}],guides:[{slug:"comparison-modes",category:"Start here",title:"Choose the right comparison mode",description:"Choose sources, understand automatic detection, and select the engine that answers the question you are actually asking.",readingTime:"13 min read",sections:[{heading:"Start with the review question",paragraphs:["Choose a mode based on what must remain meaningful. Plain text is correct when formatting and exact lines matter; a semantic mode is better when keys, values, rows, types, or compatibility matter more than source layout.","The same two files can support different questions. A JSON text diff explains formatting changes, while semantic JSON explains changed paths and typed values. Spreadsheet comparison answers whether stored cell values match across workbook formats; it does not compare formulas or presentation."],bullets:["Use text for source formatting and prose.","Use structured modes for data meaning.","Use spreadsheet comparison for stored values across Excel, OpenDocument, and Apple Numbers workbooks.","Use folder mode for directory trees and archive mode for container contents.","Use image mode for rendered visual output."]},{heading:"Choose and load sources",paragraphs:["Open files or folders, paste content, or load a saved profile. Confirm left and right orientation before applying any change or copy action.","Source loading reports unreadable input rather than silently comparing empty content. Pasted input has no filename, so an explicit mode may be clearer."],image:{src:"/products/screenshots/diff-anything-welcome-1-3.png",alt:"Diff Anything source selection screen",caption:"The start screen keeps source choice explicit and local before a comparison mode is selected.",width:2560,height:1834}},{heading:"How automatic mode resolves",paragraphs:["Auto examines both detected formats. Compatible spreadsheet formats can share the stored-value comparison even when their extensions differ, matching structured formats take priority, two folders resolve to folder mode, and other compatible content falls back to text.","Choose an explicit mode when an extension is misleading, content is pasted, or the review needs a specific semantic interpretation."]},{heading:"Read text and structured results",paragraphs:["Text results retain normalized sources, line changes, navigation targets, totals, and the ignore settings needed to reproduce the comparison.","Structured results exp
10ose a stable path, change type, typed values, severity, and human-readable explanation for each difference."],bullets:["Use keyed arrays when identity comes from a field.","Use unordered arrays when member order has no meaning.","Apply numeric tolerance only to paths where small variation is expected."],image:{src:"/products/screenshots/diff-anything-json-1-3.png",alt:"Diff Anything semantic JSON comparison with selected path values and differences sidebar",caption:"Semantic comparison explains changed paths and values while keeping the source context available.",width:2560,height:1834}},{heading:"Compare spreadsheets across formats",paragraphs:["Open any two XLS/XLA, XLSX/XLSM/XLAM, XLSB, ODS, or Apple Numbers workbooks. The two extensions do not need to match: sheets and cell coordinates provide the common model. A CSV or TSV file opened beside a workbook is compared by cell values with one sheet of it, the first by default; Compare with sheet picks another, and a note names the sheet used.","Use the sheet selector and aligned grids to inspect stored values, then select a changed cell to connect it with the Differences pane. Populated rows and columns are virtualized for large ranges."],bullets:["Stored cell values are compared.","Formulas, formatting, charts, macros, and workbook layout are not compared.","Use the original spreadsheet applications when those excluded properties matter."]},{heading:"Choose Smart Diff or Line Diff for code",paragraphs:["For source code, Diff Anything detects the language from an explicit override, recognized filename or extension, content markers, and shebangs. Pasted or extensionless code can still receive highlighting when the content provides a conservative signal.","Smart Diff aligns language-aware tokens and can suppress safe layout-only edits while preserving indentation-sensitive blocks, statement newlines, strings, comments, and exact token changes. It is available for all 117 non-plain-text editor languages. Line Diff remains beside it for conventional, lossless line-by-line review, editing, and apply operations; neither view claims an abstract-syntax-tree comparison."],bullets:["Switch views without reloading either source.","Override the detected language when a file is intentionally unusual.","Use moved-block detection and compact context to follow structural edits.","Keep wrapping enabled when generated code or data contains long lines."],image:{src:"/products/screenshots/diff-anything-smart-diff-1-5.png",alt:"Diff Anything 1.5 Smart Diff with TypeScript syntax highlighting and a visible Line Diff switch",caption:"Smart Diff and Line Diff remain visible together, with normal code highlighting and exact apply controls in both views.",width:3320,height:2380}},{heading:"Navigate and review",paragraphs:["Use next and previous difference navigation, filtering, and the review list to move through a stable result set. Mark review state or add notes without altering the source material.","When selected application is supported, confirm direction before applying a change and keep unresolved differences visible."]},{heading:"Resolve a three-way merge",paragraphs:["For text sources with a shared starting point, open the Pro merge workspace and choose the common Base while the current left and right sources become Ours and Theirs. The workspace compares each side against Base and can focus the source views on changed lines.","Independent line changes combine automatically, as do edits to separate words of the same line, with at least one unchanged word between them. Any other same-line change is a conflict, so the merge never invents a value from parts of both sides. For competing edits, navigate each conflict and choose Ours, Theirs, Ours then Theirs, Theirs then Ours, or Base; bulk side choices and Reset make larger reviews reversible. The merged result remains editable and cannot be used while unresolved conflict markers remain."],bullets:["Confirm that Base is the true common ancestor.","Review automatically combined edits as well as explicit conflicts.","Resolve every remaining marker before using the merged result."]},{heading:"Recover from input problems",paragraphs:["Parser errors include concise context and technical detail; JSON failures include line and column. Some engines can return partial results with warnings, while unreadable sources never become valid active inputs.","Fix the source or choose the correct explicit mode rather than weakening the comparison until malformed data a
10ppears valid."]}]},{slug:"folder-and-image-comparison",relatedProblemSlugs:["compare-folders-windows","compare-folders-mac","compare-images","compare-spreadsheets-different-formats"],category:"Specialist modes",title:"Compare folders, spreadsheets, documents, and images",description:"Review cross-format spreadsheet values, release trees, documents, and visual assets with purpose-built navigation, safety checks, and rollback.",readingTime:"14 min read",sections:[{heading:"Prepare folder sources",paragraphs:["Choose two directory roots that represent the same logical artifact, such as previous and candidate release folders. Confirm orientation before enabling copy actions.","Apply built-in ignore presets or focused custom patterns so generated caches do not overwhelm meaningful changes."]},{heading:"Compare large trees",paragraphs:["Folder comparison walks both sources recursively and progressively loads the result into two-pane tree or table layouts. Global search, status filters, and ignore patterns keep added, removed, changed, unchanged, and moved paths manageable.","Open a nested pair directly for content-level review. Structured files can use their semantic comparison, while moved-file detection distinguishes relocation from an unrelated delete and create."],image:{src:"/products/screenshots/diff-anything-folders.png",alt:"Diff Anything folder comparison showing added, removed, and changed paths across two release folders",caption:"Filter the folder result by path or status, then open a changed file for closer review.",width:2560,height:1500}},{heading:"Synchronize with a plan and an undo path",paragraphs:["A Pro synchronization starts from selected relative paths and can apply create, update, delete, and move actions left-to-right or right-to-left. Nested-selection pruning avoids duplicating work, and stale-result protection refuses a plan when the source state no longer matches the reviewed comparison.","Progress and cancellation keep long operations visible. Supported metadata is preserved, completed work is recorded in a durable recovery journal, failures use restart-safe rollback, and one-click undo remains available after success."],bullets:["Verify left and right orientation.","Review every create, update, delete, and move action.","Keep both roots available until the result is verified."]},{heading:"Compare spreadsheets and documents",paragraphs:["Spreadsheet comparison aligns stored values by sheet and coordinate across Excel, OpenDocument, and Apple Numbers workbooks, including mixed-format pairs, and can compare a CSV or TSV export with one sheet of a workbook. It does not compare formulas, formatting, charts, macros, or workbook layout. Word, PowerPoint, OpenDocument text and presentation, and RTF review remains extracted-text based, with each difference described by page, clause, slide, or cell.","For PDFs, choose Visual diff to raster-compare each rendered page, highlight changed areas, and read its visual-match percentage. Choose Extracted text for wording; selecting a difference keeps that view active. Visual identity does not prove equal metadata, tagging, accessibility, or hidden content, and extracted text does not prove equal layout."],image:{src:"/products/screenshots/diff-anything-spreadsheets-1-3.png",alt:"Diff Anything 1.3 comparing XLSX and ODS workbooks in a sheet-aware grid",caption:"Spreadsheet comparison aligns stored values by sheet and coordinate even when the two workbook formats differ.",width:1072,height:768}},{heading:"Use visual image tools",paragraphs:["Image mode aligns both inputs on a shared transparent canvas and provides side-by-side, overlay, swipe, blink, heatmap, and changed-pixel views. Real-pixel zoom, a transparency grid, and a threshold make small raster and alpha changes easier to inspect.","The summary reports changed pixels, similarity, mean and root-mean-square error, maximum channel change, and the bounds of the changed area. Dimension changes stay part of the pixel analysis instead of disabling it."],image:{src:"/products/screenshots/diff-anything-image-heatmap-1-3.png",alt:"Diff Anything image heatmap with changed-pixel, similarity, dimension, alignment, and threshold measurements",caption:"Heatmap exp
10oses the changed area while exact dimensions, threshold, similarity, and changed-pixel measurements remain visible.",width:2560,height:1834}}]},{slug:"archive-comparison",category:"Specialist modes",title:"Compare ZIP, 7z, RAR, TAR, and compressed archives",description:"Understand content-based archive comparison, encrypted and multipart inputs, supported codecs, streaming behavior, extraction, and safety boundaries in Diff Anything.",readingTime:"12 min read",sections:[{heading:"Compare contents instead of packaging noise",paragraphs:["Archive mode walks both containers and compares normalized paths, entry types, sizes, SHA-256 content hashes, and link targets. Archive timestamps, compression levels, member order, and container metadata do not create false differences.","Added, removed, and changed entries remain visible in the same two-sided review model as folder comparison. A changed nested text pair can open directly in a deeper comparison, while extraction is an explicit action."],image:{src:"/products/screenshots/diff-anything-archive-compare-1-4.jpg",alt:"Diff Anything comparing two ZIP archives by entry path and content",caption:"The archive table keeps both paths, sizes, statuses, extraction actions, and the review sidebar visible together.",width:2560,height:1600}},{heading:"Know the supported containers",paragraphs:["Diff Anything supports ZIP and ZIP64, including ZIPX and ZIP-based packages such as JAR, WAR, EAR, APK, AAB, IPA, EPUB, VSIX, NuGet, XPI, Python wheels, CBZ, and OpenDocument files. It also supports 7z, RAR 1.3 through RAR 7, TAR, compressed TAR variants, and standalone Gzip, Bzip2, XZ, and Zstandard streams.","Supported multipart inputs include numbered .7z.001 volume sets, RAR .partNN.rar sets, and legacy .rar/.r00/.s00 sets. Solid 7z and RAR archives and ZIP or RAR self-extracting archives are supported."],bullets:["TAR.GZ and TGZ","TAR.BZ2, TBZ, and TBZ2","TAR.XZ and TXZ","TAR.ZST and TZST"]},{heading:"Detect renamed containers and compression codecs",paragraphs:["Detection uses bounded content signatures as well as filenames, so a supported renamed container can still route to archive mode. ZIP and RAR self-extracting archives are recognized from their embedded signatures.","ZIP readers support Deflate, Deflate64, Bzip2, LZMA, XZ, and Zstandard methods. The 7z reader supports LZMA and LZMA2, PPMd, Bzip2, Deflate, Brotli, LZ4, and Zstandard codecs."],bullets:["A filename alone does not override an incompatible signature.","Unsupported containers stay available for binary comparison.","Explicit archive mode reports a supported-format error instead of invoking an external unpacker."]},{heading:"Use separate passwords without persisting them",paragraphs:["Encrypted ZIP entries support ZipCrypto and WinZip AES, encrypted 7z supports AES-256, and RAR supports encrypted member data and encrypted headers. The two sides may use different passwords.","The desktop asks only when a password is needed or rejected. An accepted password stays in memory for the current source pair and is not written to settings, profiles, history, diagnostics, or comparison exports. TAR and standalone compression streams do not define encryption; use an encrypted ZIP, 7z, or RAR container when encryption is required."]},{heading:"Stream large archives and extraction",paragraphs:["Archive inputs are not rejected by the ordinary text-file size setting. Opening reads only a bounded signature prefix, while comparison hashes decompressed data incrementally instead of loading a full archive or member set into frontend memory.","Extraction streams to a temporary file and atomically moves the completed result into place. Opening an entry as text is capped at 128 MiB; a larger member can still be extracted. Cancellation is checked between members and during streaming hash work."],bullets:["Duplicate member names produce a warning; the final occurrence is used deterministically.","The comparison never unpacks the archive into its source directory.","Left and right sources remain unchanged unless an entry is explicitly extracted elsewhere."]},{heading:"Understand the safety ceilings and exclusions",paragraphs:["Archive mode rejects pathological expansion before it can consume unbounded resources. Its ceilings are one million members, 500 GiB for one expanded member, 10 TiB of total expanded content, and 32 KiB member names.","Split ZIP, ACE, ARJ, CAB, ISO or other disk images, and filesystem images are not archive-mode inputs. They remain available to binary comparison, where Diff Anything can report identity and metadata without inspecting their internal filesystems."],bullets:["1,000,000 members per archive","500 GiB per expanded member","10 TiB total expanded content","32 KiB member names","128 MiB when opening an entry as text"]}]},{slug:"cli-and-git",category:"Automation",title:"Use Diff Anything from the CLI, Git, and CI",description:"Run repeatable comparisons, read highlighted terminal output, interpret exit codes, integrate with Git, and publish machine-readable CI results.",readingTime:"13 min read",sections:[{heading:"Find the installed executable",paragraphs:["The desktop binary uses --cli for command-line operation so an ordinary launch remains graphical. A Microsoft Store installation declares the diff-anything.exe execution alias; Windows users can run it when that alias is enabled in App execution aliases.","The Mac App Store version runs in Apple's App Sandbox, which limits it to files and folders you choose in the app. This guide therefore covers command-line, Git, and CI use with the Windows version."],bullets:["Windows: diff-anything.exe --cli left.json right.json","Check the installed version: diff-anything.exe --cli --version"]},{heading:"Enter explicit CLI mode",paragraphs:["Provide two source paths and optionally choose --mode auto|text|json|yaml|xml|csv|env|http|api|folder|archive|document|binary, --format summary|terminal|json, and --exit-code. Saved desktop profiles are not CLI options.","An interactive terminal defaults to the highlighted terminal view; redirected output defaults to the concise summary. Use --color auto|always|never, --language for an explicit highlighting language, and --context to control unchanged lines around terminal hunks.","CLI document mode compares extracted content; the rendered-page PDF Visual diff is a desktop feature. For automated layout checks, render corresponding PDF pages to equal-size images, compare each pair with Pro binary mode, and read its image metrics from JSON.","Free CLI use is limited to text and JSON, files up to 5 MiB per side, and 10 new comparison sessions per local calendar day. Specialist modes and all batch manifests require Pro."],bullets:["Terminal: diff-anything --cli --format terminal --color auto left.ts right.ts","JSON: diff-anything --cli --format json --mode json left.json right.json","Rendered page image: diff-anything --cli --mode binary --format json reference.png candidate.png","Use absolute or workflow-stable paths in automation."]},{heading:"Interpret exit codes",paragraphs:["For a single comparison, add --exit-code when automation needs differences to affect the process result. Without it, a valid single comparison returns zero even when changes are found.","For an API schema check, use --mode api --fail-
10on breaking instead: identical or equivalent schemas pass, non-breaking changes are allowed, and the process returns 1 only for breaking changes or changes the rules could not classify.","Batch mode returns zero when every case passes its failOn check, one when a case fails it or could not be compared, and two when the batch cannot be invoked or its manifest cannot be read or parsed."],bullets:["Single with --exit-code: 0 clean, 1 differences, 2 invalid invocation, unreadable input, or comparison failure.","Single with --mode api --fail-on breaking: 1 only for breaking or unclassified API changes.","Batch: 0 every case passes, 1 a case fails its failOn check or could not be compared, 2 manifest or invocation failure."]},{heading:"Choose output for the consumer",paragraphs:["The terminal format gives a person a Unicode-safe, syntax-highlighted diff with line numbers and compact hunks. The concise summary suits ordinary logs, while JSON preserves structured results for another tool.","Batch workflows accept YAML or JSON manifests and can emit summary, JSON, JUnit, or SARIF. JUnit fits test-report surfaces; SARIF fits code-scanning and static-analysis surfaces that understand the standard. Keep diagnostic messages separate from machine-readable output so parsers receive valid documents."]},{heading:"Configure Git difftool",paragraphs:["Register Diff Anything as a Git diff tool and pass Git's LOCAL and REMOTE paths into explicit CLI mode. Do not add --exit-code to the difftool command: Git expects the tool to process a changed pair successfully.","Git creates temporary files for some comparisons, so review or edit through the workflow supported by the selected mode rather than assuming a temporary source should be retained."],bullets:["git config --global diff.tool diff-anything",`git config --global difftool.diff-anything.cmd 'diff-anything.exe --cli "$LOCAL" "$REMOTE"'`]},{heading:"Use Diff Anything for git diff",paragraphs:["To have git diff itself use Diff Anything, define it as a diff driver and assign it to file types in the repository's .gitattributes file. Git runs the driver only for the files assigned to it, names them by their repository paths, and shows mode changes and renames the way its own diff does.","git diff uses the driver for the assigned files; git log -p and git show use it with --ext-diff. Leave --exit-code out of a diff driver, because Git stops at the first changed file when a driver exits with a non-zero status. On the free plan, a file the plan does not cover is listed as not compared and git diff continues with the rest."],bullets:["git config --global diff.diff-anything.command 'diff-anything --cli --format terminal --color auto'",".gitattributes: *.json diff=diff-anything",".gitattributes: *.yaml diff=diff-anything","diff-anything --cli --integration-help prints this configuration"]},{heading:"Run batch manifests",paragraphs:["A Pro batch manifest can be a YAML or JSON object with a comparisons array, or a top-level array of comparisons. Each item supports name, left, right, an optional mode, failOn (any or breaking), and warningsAsDifferences; desktop profile rules are not batch-manifest fields, and a misspelt key is reported as an error.","Use --format junit or --format sarif for established review surfaces, or --format json for the detailed result. Write the report with --output FILE, which writes UTF-8; in Windows PowerShell 5.1, redirecting with > writes UTF-16, which many CI tools reject. For API cases with failOn: breaking, JUnit lists the breaking changes with their rule codes and SARIF reports each finding under its rule code."],bullets:['Manifest item: { "name": "API schema", "left": "baseline/openapi.json", "right": "build/openapi.json", "mode": "api", "failOn": "breaking" }',"JUnit file: diff-anything --cli --batch comparisons.json --format junit --output report.xml","SARIF file: diff-anything --cli --batch comparisons.json --format sarif --output report.sarif"],image:{src:"/products/screenshots/diff-anything-welcome-1-3.png",alt:"Diff Anything private local comparison start screen",caption:"Desktop, CLI, Git, and CI use the same local comparison model; the automation surface changes, not the privacy boundary.",width:2560,height:1834}},{heading:"Debug automation failures",paragraphs:["Reproduce the exact paths, mode, format, and exit-code option locally. Check whether the process can read both sources and whether the shell can create any redirected output file.","CLI comparisons use their built-in default options; they do not load desktop profiles. When results differ by machine, inspect source bytes, line endings, paths, and app version before changing expectations."]}]},{slug:"profiles-rules-and-reports",category:"Repeatable review",title:"Profiles, rules, review state, and reports",description:"Turn a useful one-off comparison into a repeatable review with explicit ignore rules, notes, and exportable evidence.",readingTime:"12 min read",sections:[{heading:"Save a profile",paragraphs:["Save a profile after the source pattern, mode, and comparison options are understood. Name it for the review purpose rather than the two temporary filenames.","A profile should make a comparison reproducible without hiding the rules that influence its result."]},{heading:"Use ignore rules carefully",paragraphs:["Ignore whitespace, case, paths, keys, or ordering only when the distinction has no meaning for this review. Broad rules can make a clean result misleading.","Prefer narrow path-specific rules and document why they exist."],bullets:["Mask secret values rather than discarding their surrounding structure.","Use keyed arrays when identity is stable.","Keep numeric tolerances scoped."]},{heading:"Review semantic differences",paragraphs:["Filter and navigate the stable difference set, then mark items reviewed or attach notes as decisions are made. Review state explains progress without altering either source.","Recompute after source changes and confirm whether prior review state still maps to the same stable paths."],image:{src:"/products/screenshots/diff-anything-json-1-3.png",alt:"Diff Anything semantic differences sidebar and selected JSON path",caption:"Stable paths, filters, and review state turn a raw result into a deliberate inspection workflow.",width:2560,height:1834}}
10,{heading:"Apply supported changes",paragraphs:["Text, JSON, YAML, XML, environment-file, HTTP-response, and API-schema modes can apply selected changes in either direction. Confirm source orientation and inspect the destination before saving.","YAML, XML, HTTP, and API-schema application asks for explicit confirmation because the target is validated and rewritten in a canonical format; comments and cosmetic formatting may change."]},{heading:"Export a report",paragraphs:["Choose a report format for its reader: human review, test dashboard, security surface, or another application. Include the profile and relevant settings needed to reproduce the result.","Review reports for sensitive paths or values before sharing them outside the local environment."]},{heading:"Use live watch deliberately",paragraphs:["Live watch is useful when sources change during development, but a moving result is not a release record. Pause or rerun against stable artifacts before approving a final comparison.","If watch produces noise, narrow the folder scope and ignore generated paths rather than hiding meaningful changes globally."],image:{src:"/products/screenshots/diff-anything-folders.png",alt:"Diff Anything folder comparison showing two source paths with path and status filters",caption:"Profiles and focused rules keep large repeatable comparisons understandable as sources change.",width:2560,height:1500}}]},{slug:"privacy-safety-and-troubleshooting",category:"Troubleshooting",title:"Privacy, safety, and troubleshooting",description:"Understand the local comparison boundary, recover from input and copy problems, and prepare useful diagnostics without exposing sensitive sources.",readingTime:"12 min read",sections:[{heading:"What stays local",paragraphs:["Compared files and pasted content remain on the computer. Diff Anything has no account, cloud comparison service, analytics, or telemetry.","Exporting a report or invoking an external workflow is an explicit user action. Review generated reports before sharing them."]},{heading:"Handle sensitive values",paragraphs:["Use masking rules for known secret paths while preserving enough structure to compare meaning. Do not paste a sensitive report into a support request merely because the original files stayed local.","Create a minimal synthetic reproduction when possible."]},{heading:"Resolve parser and mode errors",paragraphs:["Confirm both sources are readable and genuinely match the selected mode. Use reported line and column context for structured parse failures.","If Auto chooses an unhelpful fallback, select the intended explicit mode rather than renaming files to manipulate detection."],image:{src:"/products/screenshots/diff-anything-welcome-1-3.png",alt:"Diff Anything source selection",caption:"Most comparison problems begin with source scope, readability, or mode; verify those before changing review rules.",width:2560,height:1834}},{heading:"Recover folder synchronization",paragraphs:["Review the completed synchronization banner and verify the destination before starting another operation. Use one-click undo promptly when the reviewed plan produced the wrong result.","The operation records durable recovery information and uses restart-safe rollback after incomplete work. Undo after success is a separate recovery path, not a substitute for checking direction and every create, update, delete, and move action before confirmation."],bullets:["Confirm direction.","Review create, update, delete, and move actions.","Keep both roots available until verification is complete."]},{heading:"Explain unexpected results",paragraphs:["Record the application version, source types, selected mode, active profile, relevant ignore rules, and the smallest non-sensitive example that reproduces the issue.","For image results, include dimensions and threshold; for structured data, include the stable path and typed values; for folders, include the relevant relative paths."],image:{src:"/products/screenshots/diff-anything-json-1-3.png",alt:"Diff Anything structured comparison result with selected path and typed values",caption:"Useful diagnostics identify the mode, path, settings, and result without requiring an entire private source file.",width:2560,height:1834}},{heading:"Reset only what is necessary",paragraphs:["Remove an invali
10d profile, stale recent item, or obsolete snapshot before considering a broader local-data reset. Source files remain separate from application history and profiles.","A troubleshooting reset should not become a file-deletion workflow. Back up any review configuration you expect to reuse."]}]}]},{slug:"testdock",name:"TestDock",currentVersion:"1.1",category:"On-device mobile app testing",headingDescriptor:"Mobile app testing tool for iOS and Android",tagline:"Check your mobile appâs links and test flows on a real device.",summary:"Open deep links on iOS and Android: paste or type any URL, save link templates, and run one test scenario free. TestDock Pro adds unlimited scenarios, share inputs, push testing, and app-link checks.",overview:["Keep your mobile appâs test links together and open them on the device where your app runs. Paste or type any URL to open it right away, share a link in from Slack, Mail, or Safari, and save the routes you check often so the next test starts with the right input.","Free includes one app profile, unlimited saved links, and the sample scenario plus one scenario of your own. With Pro, add unlimited profiles and scenarios, check AASA and assetlinks configuration, send test notifications through Expo Push, FCM, or, on iPhone, APNs, and test share inputs. Delivery results and scenario evidence stay on the device for your next review."],icon:"/products/testdock.png",screenshot:{src:"/products/screenshots/testdock-1-1-paste.png",alt:"TestDock on iPhone showing Quick open, recent URLs, and saved links on the Links tab",width:1320,height:2868},gallery:[{src:"/products/screenshots/testdock-1-1-paste.png",alt:"TestDock Links tab with Quick open, the Paste button, recent URLs, and saved links",caption:"Paste or type any URL and open it, reopen one of the last five URLs, or open a saved link from the same tab.",width:1320,height:2868},{src:"/products/screenshots/testdock-1-1-link-values.png",alt:"TestDock saved link screen with the Final URL and a value field",caption:"A saved link fills its {{variables}} from defaults or the values you type, and shows the exact URL before it opens.",width:1320,height:2868},{src:"/products/screenshots/testdock-1-1-push.png",alt:"TestDock Push tab with a provider setup, target, template, and payload size check",caption:"Pair a provider setup, a saved device token, and a reusable payload, then check the payload before sending.",width:1320,height:2868},{src:"/products/screenshots/testdock-1-1-test-step.png",alt:"TestDock scenario run showing an Open deep link step with its expected result",caption:"Run a scenario one step at a time, open the link a step names, and mark the step Pass, Fail, or Skip with notes and photos.",width:1320,height:2868}],color:"#2f6b4f",tint:"#e8f1ec",status:"Available on iOS and Android",platforms:["iOS","Android"],availability:"Available on the App Store and Google Play",pricing:"Free includes one app profile with unlimited saved links, Quick open, Paste, sharing links in, home-screen shortcuts, and the sample scenario plus one scenario of your own. A one-time Pro purchase unlocks unlimited profiles and scenarios, share fixtures, push testing, association inspection, links created from an apple-app-site-association file on iPhone, and profile or scenario import and export.",privacy:"Profiles and logs stay on the device, provider credentials use platform secure storage, and exports omit secrets.",features:[{title:"Persistent app profiles",description:"Create a current-platform profile for each app with its custom schemes, platform identifier, verified-link settings, and reusable tests. TestDock reopens the last profile you used and adds the custom scheme of any link that opens successfully."},{title:"Deep-link workbench",description:"Paste or type any URL and open it without saving it first, save every link from a pasted list at once, or share a link in from another app. Save parameterized custom schemes and web links with defaults, tags, favorites, open history, and home-screen shortcuts. Pro adds AASA and assetlinks inspection, and on iPhone creates saved links from the paths in an AASA file."},{title:"Reusable share inputs",description:"With Pro, save text, URL, and local-file fixtures per app profile and open them in the operating system's share sheet."},{title:"Per-app push setups",description:"With Pro, save Expo Push, Firebase Cloud Messaging, and, on iOS, APNs provider setups and device push targets for each app profile. Device tokens, optional Expo access tokens, APNs signing credentials, and Firebase service-account JSON stay in operating-system secure storage."},{title:"Push diagnostics and logs",description:"With Pro, check payload size and provider rules before sending, keep a local delivery log, and turn common provider errors into actionable guidance."},{title:"Repeatable manual scenarios",description:"Run ordered manual steps with pass, fail, or skip outcomes, notes, photo and screenshot evidence, and shareable results. Copy a test link into a ticket to start the scenario on a phone with its values filled in. Free includes the sample scenario and one scenario of your own; Pro makes scenarios unlimited."},{title:"Portable non-secret profiles",description:"With Pro, export and import versioned profiles between devices on the same platform. Deep links and scenarios from an iOS export are not imported on Android, and Android ones are not imported on iOS; APNs setups and targets are skipped on Android. Credentials, device tokens, and delivery logs stay on the device, and imported push setups remain disabled until restored."}],workflow:[{title:"Create an app profile",description:"Record the app name, current-platform identifier, URL schemes, and verified-link settings that define the installed target."},{title:"Save reusable tests",description:"Add deep links and scenarios to that app profile, plus, with Pro, share fixtures, push setups, and notification templates."},{title:"Exercise the installed app",description:"Open a pasted URL or a saved link through the operating system, open share sheets, send a validated provider push, and run observable scenario steps on the device."},{title:"Keep useful evidence",description:"Share completed scenario results and review pu
10sh logs, or, with Pro, export a non-secret profile package when another device on the same platform needs the same setup."}],useCases:[{title:"Deep-link QA",description:"Exercise parameterized custom schemes, universal links, and Android app links without rebuilding each URL by hand, and open a link someone sent you by pasting it or sharing it into TestDock."},{title:"Share and file-entry testing",description:"Reuse the exact text, URL, or file inputs an app is expected to accept through the operating system's share sheet."},{title:"Push delivery testing",description:"Send alert and background-data payloads directly through Expo Push, APNs, or FCM with per-app target setup."},{title:"Release smoke tests",description:"Run the same short, ordered mobile workflow and preserve the observed pass, fail, skip, note, and screenshot evidence. A test link in a ticket starts the right scenario on the phone."},{title:"Multi-app device labs",description:"With Pro, keep unrelated schemes, domains, push tokens, payloads, and test histories in a separate app profile for each app on one testing device. Free includes one app profile."}],faqs:[{question:"What is included in the free version?",answer:"One app profile with unlimited saved links, Quick open, Paste, sharing links in from other apps, and home-screen shortcuts, plus the sample scenario and one scenario of your own that you can create, run, attach photos to, and share results from. A one-time Pro purchase adds unlimited profiles and scenarios, push testing, share-input fixtures, association file checks, and import and export."},{question:"Can a ticket start a test run on the phone?",answer:"Yes. Copy test link on a scenario produces a testdock://run link. Opening it on a phone that has TestDock and a sce
10nario with the same name shows that scenario and starts a run after one tap. The link can carry run values, for example orderId=1234. Some issue trackers only make http and https links clickable."},{question:"Does TestDock switch the environment of the app under test?",answer:"No. An external app controls its own configuration. TestDock models the app identity and stores the links, push setups, payloads, and scenarios you can actually exercise from the device."},{question:"Does TestDock require an account or backend?",answer:"No. It has no TestDock account, synchronization service, analytics, advertising, or collaboration backend."},{question:"Can it tell which app handled a universal link?",answer:"No. It records whether the operating system accepted the open request and helps inspect association files, but the app-side destination remains an observable test result."},{question:"Can it tell which app handled a shared file or URL?",answer:"No. TestDock opens the operating system's share sheet. It cannot inspect the receiving app or determine whether that app processed the input correctly."},{question:"Are push credentials included in profile exports?",answer:"No. Provider credentials, device push tokens, and push logs remain local. Imported push setups are disabled until you restore the credentials and device tokens on the destination device."},{question:"Which APNs or FCM credentials does TestDock use?",answer:"For APNs, which is available on iOS, paste one JSON object containing key_id, team_id, and private_key from your .p8 signing key. For FCM v1, paste Firebase service-account JSON. TestDock stores those credentials in operating-system secure storage. It creates short-lived APNs and Google authorization tokens in memory and reuses them until shortly before they expire: about 50 minutes for APNs and the expiry Google returns for FCM."}],guides:[{slug:"first-project",category:"Start here",title:"Set up your first TestDock app profile",description:"Create a persistent profile for an installed mobile app and record the schemes and platform metadata its tests depend on.",readingTime:"8 min read",sections:[{heading:"Choose the app boundary",paragraphs:["Create one profile for each mobile app identity you test. A profile is the durable home for that app's deep links, share fixtures, push setups, notification templates, scenarios, and local history.","Separate unrelated apps even when the same team owns them so schemes, tokens, and evidence never become ambiguous."]},{heading:"Add the app identity",paragraphs:["Give the profile a recognizable name. TestDock scopes it to the platform currently running: add the iOS bundle identifier and associated-domain settings on iOS, or the Android package name and App Link settings on Android.","The profile describes the external app; it cannot change that app's build configuration or runtime environment."]},{heading:"Record every custom scheme",paragraphs:["Add each URL scheme the installed app supports. Multiple schemes belong in the same profile when they route into the same app, such as a current scheme plus a compatibility alias.","Keep the scheme value exact and omit punctuation that is not part of the scheme itself. When a link with a new custom scheme opens successfully, TestDock adds that scheme to the profile for you."]},{heading:"Find your way around a profile",paragraphs:["Each profile has four tabs: Links, Tests, Share, and Push. Links holds Quick open and your saved links, Tests holds scenarios, and Share and Push are part of TestDock Pro.","TestDock reopens the last profile you used on the Links tab. Start with the parts the app exposes and add the rest when the app is ready to test."],image:{src:"/products/screenshots/testdock-1-1-paste.png",alt:"TestDock Links tab with Quick open and saved links",caption:"The Links tab opens first: Quick open at the top, saved links below, and the Tests, Share, and Push tabs at the bottom.",width:1320,height:2868}}]},{slug:"deep-links-and-http",category:"Deep links",title:"Test deep links and app associations",description:"Save reusable custom schemes and web links, resolve their parameters, open them on device, and inspect association files.",readingTime:"10 min read",sections:[{heading:"Open a link without saving it",paragraphs:["Quick open at the top of the Links tab takes any URL you type or paste and opens it straight away. The last five URLs you opened are listed with whether they opened or failed, and each has a button to save it as a link.","When the clipboard holds text, a Paste button appears; on iPhone it is the system paste button, so there is no Allow Paste prompt. TestDock finds the link in the copied text and opens it. If the text contains two or more links, Save all saves them at once, skips links already saved, and names the new ones for you. You can also share text or a link from Slack, Mail, Safari, or another app into TestDock: the first link arrives in Quick open of your current profile, so create a profile first."],bullets:["Long-press the TestDock icon for Quick open and up to three links: favorites first, then the most recently opened."]},{heading:"Create a reusable link",paragraphs:["Save a custom-scheme URL, universal link, or Android app link with a descriptive name. Add parameter defaults, tags, and a favorite state when they make repeated testing faster.","Keep several routes in the same app profile so searches and recent history stay scoped to the target app."]},{heading:"Review before opening",paragraphs:["Resolve required parameters and inspect the final URL before handing it to the operating system. TestDock records the accepted or rejected open request without claiming that a particular app or screen handled it.","When visual routing matters, record the observed destination in a manual scenario."]},{heading:"Verify app-link configuration",paragraphs:["With Pro, use the association inspector for the exact host under test: choose one of the profile's domains or type the host. It checks that the AASA or assetlinks file is reachable over HTTPS, served as JSON without a redirect, and correctly structured; comparing the app IDs, package name, and signing fingerprints in the file with your build is a manual check.","On iPhone, after inspecting an apple-app-site-association file, TestDock lists the paths the file declares for the profile's app. Select the ones you want and save them as links; wildcards in a path become values you fill in. An assetlinks.json file declares no paths, so this is not offered on Android.","A valid association file is necessary configuration evidence, not proof that the installed build routed one specific URL correctly."]},{heading:"Use history deliberately",paragraphs:["Recent opens make it easy to repeat a route and compare app behavior after a build change. Keep notes and parameters free of credentials because deep links can appear in o
10perating-system and application logs.","Favorite stable release routes so they stay at the top of the list and on the home-screen shortcuts, and remove obsolete links."],image:{src:"/products/screenshots/testdock-1-1-link-values.png",alt:"TestDock saved link screen with the Final URL and a value field",caption:"A saved link shows the exact URL it will open, with the values you typed highlighted.",width:1320,height:2868}}]},{slug:"secure-manual-scenarios",category:"Push and scenarios",title:"Test push delivery and repeatable app flows",description:"Configure provider-specific push targets, reuse payload templates, and combine delivery checks with observable manual scenarios.",readingTime:"12 min read",sections:[{heading:"Create a provider setup and a push target",paragraphs:["Open Providers and save a provider setup for the selected app profile. Expo Push and Firebase / FCM are available on iOS and Android; APNs is available on iOS. An APNs setup needs the app's topic and gateway, and an FCM setup needs the Firebase project ID, which TestDock can read from the service-account JSON.","Then open Targets and save the target app's device push token as a push target. Targets are separate from provider setups, so one setup can send to several saved devices.","Credentials and tokens remain scoped to the profile in operating-system secure storage. For APNs, paste one JSON object containing key_id, team_id, and private_key; FCM v1 accepts Firebase service-account JSON, and an Expo access token is optional. TestDock creates the short-lived APNs provider JWT or Google OAuth access token in memory and reuses it until shortly before it expires."]},{heading:"Build a reusable payload",paragraphs:["Save alert or background-data templates with title, body, custom data, sound, badge, priority, time to live, and collapse identifier. On Android, a template can also set a notification channel ID; on iOS, a notification category ID.","Use focused templates for behavior the app implements, such as opening a conversation, refreshing background data, or exercising a notification action."]},{heading:"Validate, send, and inspect",paragraphs:["Choose an active provider setup, a saved push target, and a payload template. Before sending, TestDock measures the provider payload and checks provider-specific rules, such as the APNs topic, FCM reserved data keys, and the 4,096-byte payload limit.","The log records the payload, the provider response, and a shortened token hint instead of the full device token, and translates common rejection codes into practical next steps. Provider acceptance still does not prove device delivery or target-app handling."],image:{src:"/products/screenshots/testdock-1-1-push.png",alt:"TestDock Push tab with a provider setup, target, template, and payload size check",caption:"Push setups, reusable templates, direct sends, and delivery logs remain attached to the app profile that owns them.",width:1320,height:2868}},{heading:"Turn behavior into a scenario",paragraphs:["Write ordered steps with an observable expected result and mark each pass, fail, or skip during the run. Add concise notes and screenshot evidence where the status alone is not enough.","Completed runs remain immutable; start a new run when testing a fix so the earlier result is preserved.","Copy test link on a scenario gives you a testdock://run link to paste into a ticket. Opening it on a phone with TestDock and the matching scenario shows the scenario and starts a run after one tap, and the link can carry run values such as orderId=1234. Some trackers only make http and https links clickable.","TestDock Free includes the sample scenario and one scenario of your own, with runs, photos, and shared results. Pro makes scenarios unlimited."],bullets:["Keep one primary outcome per scenario.","State what pass looks like.","Avoid credentials in notes and screenshots.","Share only reviewed result exports."]}]},{slug:"projects-exports-and-qr",category:"Portability",title:"Export and import app profiles",description:"Move reusable non-secret app definitions to another device on the same platform while understanding omitted credentials, logs, and destination setup.",readingTime:"8 min read",sections:[{heading:"Use the versioned profile package",paragraphs:["The current profile export carries app identity, app-link configuration, deep links, text and URL share-fixture content, file-fixture metadata, scenarios, notification templates, and non-secret push-setup metadata in a versioned JSON package.","It is intended for reproducible setup, not for backing up credentials, push logs, run history, or scenario evidence files."]},{heading:"Import on the same platform",paragraphs:["A package contains the deep links, scenarios, and push setups that apply to the platform it was exported on. Import it on a device running the same operating system: deep links and scenarios from an iOS export are not imported on Android, and Android ones are not imported on iOS.","APNs setups and targets are available only on iOS, so an Android import skips them."]},{heading:"Understand what stays behind",paragraphs:["Provider credentials, sensitive target-token values, secure-store references, push delivery logs, and share-fixture file contents are deliberately omitted. Imported file fixtures retain their name and type metadata but require the local file to be selected again.","Removing secrets and files from the package prevents an import file from becoming a portable credential or document store."]},{heading:"Import and restore locally",paragraphs:["Review the incoming profile, then import it on the destination device. Imported push setups remain disabled until you add the provider credential again, and imported push targets need their device token before they can be used.","Open representative deep links and review profile identifiers before relying on imported scenarios."],image:{src:"/products/screenshots/testdock-profile-list.png",alt:"TestDock app profile list with import action",caption:"Profiles are durable and portable, while credentials and logs remain intentionally device-local.",width:1206,height:2622}},{heading:"Retire stale data",paragraphs:["Archive or remove profiles that no longer represent an installed app or active test target. Delete transfer packages once they are no longer needed, because app identifiers, routes, and test names may
10still be sensitive.","Deleting an export does not delete the local profile, and deleting a profile should also remove its associated secure values after confirmation."]}]},{slug:"privacy-safety-and-troubleshooting",category:"Troubleshooting",title:"Privacy, safety, and troubleshooting",description:"Understand TestDock's on-device boundary and diagnose deep-link, push, scenario, and profile-import problems without exposing secrets.",readingTime:"10 min read",sections:[{heading:"Understand the on-device model",paragraphs:["App profiles, links, share fixtures, templates, scenarios, and push logs remain on the device. TestDock has no application account, sync service, analytics, advertising, or collaboration backend.","Network access occurs only for an explicit action such as fetching association data or sending a provider push. Share testing only opens the operating system's share sheet and cannot observe the receiving app."]},{heading:"Protect provider credentials",paragraphs:["Target-app push tokens, optional Expo access tokens, APNs signing credentials, and Firebase service-account JSON use platform secure storage and are excluded from profile exports. Do not paste them into link parameters, notes, scenario evidence, or support reports.","TestDock creates short-lived APNs provider JWTs and Google OAuth access tokens in memory and reuses them until shortly before they expire; those generated tokens are not saved or exported."]},{heading:"Troubleshoot deep links",paragraphs:["Confirm the selected app profile, exact URL, parameter values, installed app build, platform identifiers, and associated-domain configuration. Separate operating-system acceptance from the destination actually rendered by the app.","For web links, inspect the exact host's AASA or assetlinks response and account for platform caching after deployment or entitlement changes."],image:{src:"/products/screenshots/testdock-1-1-link-values.png",alt:"TestDock saved link screen with the Final URL and a value field",caption:"Useful diagnostics begin with the app profile, final URL, platform metadata, and operating-system result.",width:1320,height:2868}},{heading:"Troubleshoot push delivery",paragraphs:["Separate credential rejection, invalid target token, malformed payload, provider acceptance, device delivery, and app handling. They are distinct stages with different fixes.","Use the logged provider response and the target app's on-device behavior together; neither alone proves the entire path succeeded."]},{heading:"Prepare a safe support report",paragraphs:["Record the TestDock version, device and operating-system version, selected provider or link type, visible error, and the smallest reproducible non-secret profile definition.","Never share secure-store values. Review ordinary notes and screenshots manually because free-form evidence can contain sensitive information even when structured profile exports omit secrets."]}]}]}];function am(l){return xh.find(y=>y.slug===l)}function bm(l,y){return am(l)?.guides.find(D=>D.slug===y)}var Th=[{slug:"diff-anything-1-6",title:"Diff Anything 1.6: check CSV exports and catch breaking API changes",description:"Compare a CSV export with the workbook it came from, fail a CI job only on breaking API schema changes, use the same rules for YAML as for JSON, and read every difference in blue and yellow or as a written list.",publishedAt:"2026-10-01",displayDate:"1 October 2026",readingTime:"6 min read",image:{src:"/products/screenshots/diff-anything-video-compare-excel-files-mac.jpg",alt:"Diff Anything comparing two versions of a budget workbook on a Mac, with the changed cells highlighted and listed by cell address",width:1920,height:1080}},{slug:"testdock-1-1",title:"Stop emailing yourself deep links: test them on your phone with TestDock",description:"TestDock keeps your app's deep links, push notifications, and manual tests on the phone you test with. Version 1.1 makes it faster to get a link in: paste it, share it from any app, or start a test straight from a bug ticket.",publishedAt:"2026-09-29",displayDate:"29 September 2026",readingTime:"6 min read",image:{src:"/products/testdock-1-1-og.png",alt:"TestDock: deep link and push testing, on device",width:1024,height:500}},{slug:"devdock-1-4",title:"DevDock 1.4: see what is running, from Claude Code to Git",description:"See when Claude Code is active in a project, follow Git work from the new Activity center, hide progress without stopping the operation, and stop every process a command started.",publishedAt:"2026-09-25",displayDate:"25 September 2026",readingTime:"6 min read",image:{src:"/products/screenshots/devdock.png",alt:"DevDock 1.4 project overview with project health, daily workflow, and registered folders",width:2560,height:1440}},{slug:"screen-studio-kit-1-4",title:"Screen Studio Kit 1.4: 3D device frames and new screenshot backgrounds",description:"Create app marketing screenshots with editable 3D device frames and eight new background styles. See finished examples, the editor, and the export workflow.",publishedAt:"2026-09-16",displayDate:"16 September 2026",readingTime:"7 min read",image:{src:"/products/screenshots/screen-studio-1-4-artwork-iphone.png",alt:"Fieldnotes fictional app in an iPhone frame, exported from Screen Studio Kit 1.4",width:2880,height:1800}}
10,{slug:"diff-anything-1-5",title:"Diff Anything 1.5: understand code changes faster across 117 languages",description:"Cut through formatting noise with Smart Diff, switch to Line Diff whenever you need the literal patch, and review code with syntax highlighting and exact source text intact.",publishedAt:"2026-09-09",displayDate:"9 September 2026",readingTime:"5 min read",image:{src:"/products/screenshots/diff-anything-smart-diff-1-5.png",alt:"Diff Anything 1.5 comparing TypeScript with Smart Diff, syntax highlighting, token-level changes, and the Line Diff option visible",width:3320,height:2380}},{slug:"devdock-1-3",title:"DevDock 1.3: safer Git from branch switch to push",description:"Protect local changes while switching branches, review remote state and push destinations, handle pull-before-push recovery, and find project commands faster.",publishedAt:"2026-09-04",displayDate:"4 September 2026",readingTime:"7 min read",image:{src:"/products/screenshots/devdock.png",alt:"DevDock 1.3 project overview showing project health, a daily workflow, registered folders, and Git-aware project context",width:2560,height:1440}},{slug:"diff-anything-1-4",title:"Diff Anything 1.4: compare encrypted and multipart archives",description:"Compare ZIP/ZIP64/ZIPX, 7z, RAR, TAR families, and compressed streams locally, with passwords, multipart support, streaming, explicit limits, and a redesigned three-way merge workspace.",publishedAt:"2026-09-01",displayDate:"1 September 2026",readingTime:"8 min read",image:{src:"/products/screenshots/diff-anything-archive-compare-1-4.jpg",alt:"Diff Anything comparing two ZIP archives with changed, removed, and added entries",width:2560,height:1600}},{slug:"screen-studio-kit-1-3",title:"Screen Studio Kit 1.3: make the whole screenshot campaign editable",description:"Build and compare campaign variants, start faster with 20 templates, edit text in place, control focal crops, import fonts, and carry a considered treatment from canvas to exportâall locally.",publishedAt:"2026-08-31",displayDate:"31 August 2026",readingTime:"7 min read",image:{src:"/products/screenshots/screen-studio-1-3-editor.png",alt:"Screen Studio Kit 1.3 editing a localized GolfSmart screenshot in the real project workspace",width:1280,height:720}},{slug:"diff-anything-1-3",title:"Diff Anything 1.3: compare spreadsheets across formats",description:"Compare stored spreadsheet values across Excel, OpenDocument, and Apple Numbers files, then review folders with better navigation, moved-file detection, and safer synchronization.",publishedAt:"2026-08-26",displayDate:"26 August 2026",readingTime:"8 min read",image:{src:"/products/screenshots/diff-anything-spreadsheets-1-3.png",alt:"Diff Anything 1.3 comparing an XLSX workbook with an ODS workbook in a sheet-aware grid",width:1072,height:768}},{slug:"app-store-screenshots-five-languages-cost",title:"The true cost of creating app-store screenshots for five languages",description:"The expensive part is not designing one screenshot. It is adapting, checking, exporting, and rebuilding the full store matrix every time the app changes.",publishedAt:"2026-08-22",displayDate:"22 August 2026",readingTime:"9 min read",image:{src:"/products/screenshots/screenshot-studio-golfsmart-preview.jpg",alt:"Screen Studio Kit previewing a store screenshot matrix across iPhone, iPad, Android phone, tablets, and a feature graphic",width:2880,height:1840}},{slug:"devdock-for-vibe-coders",title:"DevDock for vibe coders: 10 ways to stay in control",description:"You can let AI write the code without letting the project become a black box. Here are ten practical ways DevDock helps vibe coders run, inspect, and protect local projects.",publishedAt:"2026-08-19",displayDate:"19 August 2026",readingTime:"10 min read",image:{src:"/products/screenshots/devdock.png",alt:"DevDock project overview showing project health, a daily workflow, and the registered project folder",width:2560,height:1440}},{slug:"diff-anything-1-2",title:"Diff Anything 1.2: sharper comparisons, safer previews, one engine everywhere",description:"Diff Anything 1.2 opens every desktop comparison engine to Free previews, improves semantic and visual accuracy, and keeps desktop, CLI, and batch behavior al
10igned.",publishedAt:"2026-08-18",displayDate:"18 August 2026",readingTime:"8 min read",image:{src:"/products/screenshots/diff-anything.png",alt:"Diff Anything 1.2 showing a semantic JSON comparison with changed paths and values",width:1280,height:720}},{slug:"screen-studio-kit-1-2",title:"Screen Studio Kit 1.2: turn device frames in 3D",description:"Screen Studio Kit 1.2 adds editable Turn and Tilt controls, live hardware depth on the canvas, and matching perspective in native full-resolution export.",publishedAt:"2026-08-16",displayDate:"16 August 2026",readingTime:"5 min read",image:{src:"/products/screenshots/screen-studio-1-2-store-artwork.webp",alt:"Screen Studio Kit 1.2 App Store artwork showing a rotated phone frame and live three-dimensional controls",width:2880,height:1800}},{slug:"diff-anything-for-law-firms",title:"Contract comparison for law firms: never approve an unchecked version",description:"Compare two contracts, surface changed clauses, dates, amounts, and wording, and keep confidential documents on the computer.",publishedAt:"2026-08-15",displayDate:"15 August 2026",readingTime:"6 min read",image:{src:"/products/screenshots/diff-anything-pdf-visual-1-3.png",alt:"Diff Anything PDF Visual diff showing highlighted rendered-page changes",width:2560,height:1834}},{slug:"diff-anything-1-1",title:"Diff Anything 1.1: merge, image diff, PDF review, and folder sync",description:"Diff Anything 1.1 adds three-way merge, visual image-diff views and metrics, connected PDF page and text review, and reversible folder synchronizationâall locally.",publishedAt:"2026-08-15",displayDate:"15 August 2026",readingTime:"7 min read",image:{src:"/products/screenshots/diff-anything-three-way-merge-1-4.jpg",alt:"Current Diff Anything three-way merge workspace with Ours and Theirs compared against Base",width:2560,height:1600}},{slug:"devdock-1-1",title:"DevDock 1.1: run a project command from anywhere",description:"DevDock 1.1 adds a system-wide â§âK command launcher, a menu-bar companion, repository-defined framework commands, structured run-time inputs, and deeper Git tools.",publishedAt:"2026-08-13",displayDate:"13 August 2026",readingTime:"7 min read",image:{src:"/products/screenshots/devdock-1-1-command-palette.jpg",alt:"DevDock command palette filtered to application, project, navigation, folder, and command actions",width:1228,height:768}},{slug:"screen-studio-kit-1-1",title:"Screen Studio Kit 1.1: editable stickers and widgets for store artwork",description:"A look at the new editable element library in Screen Studio Kit 1.1, including ratings, reviews, proof points, badges, and decorative stickers.",publishedAt:"2026-08-12",displayDate:"12 August 2026",readingTime:"5 min read",image:{src:"/products/screenshots/screen-studio-1-1-stickers-widgets.webp",alt:"Screen Studio Kit 1.1 App Store artwork showing editable stickers and widgets",width:2880,height:1800}},{slug:"two-free-browser-tools-for-app-releases",title:"Two small browser tools for less surprising app releases",description:"Why I built a store screenshot validator and an OpenAPI breaking-change checker, what they check, and where their limits are.",publishedAt:"2026-08-11",displayDate:"11 August 2026",readingTime:"6 min read",image:{src:"/tools/screenshots/store-screenshot-validator.webp",alt:"Store Screenshot Validator showing a checked iPhone App Store screenshot set",width:1600,height:1e3}}];function km(l){return Th.find(y=>y.slug===l)}var hl=Th;function nm(){return Math.max(1,Math.ceil(hl.length/8))}function Sm(l){if(!Number.isInteger(l)||l<1||l>nm())return[];const y=(l-1)*8;return hl.slice(y,y+8)}var Vo=Jf(ul(),1),im=[{slug:"beyond-compare-alternative",productSlug:"diffanything",title:"Beyond Compare alternative for Windows and Mac â Diff Anything",heading:"A Beyond Compare alternative for spreadsheets, archives, and structured files",description:"Compare Diff Anything with Beyond Compare. See where each tool fits, then try Diff Anything free on Windows or Mac for folders, spreadsheets, archives, JSON, and code.",primaryKeyword:"Beyond Compare alternative",dateModified:"2026-09-28",preferredStore:"microsoftStore",showContents:!0,proofHeading:"Compare folder trees and open the files that changed.",problem:"Beyond Compare is the tool many people already know for comparing files and folders. If most of your comparisons involve spreadsheets in different formats, archives, JSON or YAML configuration, or code that was reformatted, you may want a tool built around those files.",solution:"Diff Anything picks the comparison that fits the files you open. It compares folders with moved-file detection, spreadsheet values across Excel, OpenDocument, and Apple Numbers, archive contents instead of packaging, and structured data by meaning instead of line order. It runs locally on Windows and Mac, and the free version lets you try every comparison type.",screenshotIndex:2,screenshot:{src:"/products/screenshots/diff-anything-folders.png",alt:"Diff Anything showing two folder trees with changed paths, status filters, and file sizes",width:2560,height:1500},screenshotCaption:"Folder comparison with status filters and nested file review. Screenshot shows the shared desktop interface.",stepsHeading:"Try it on a comparison you already do.",steps:["Install Diff Anything from the Microsoft Store or the Mac App Store.","Choose the original file or folder on the left and the updated version on the right.","Review the result in the view Diff Anything picked for those files, then open any changed file for detail."],sections:[{heading:"Where Diff Anything is different",paragraphs:["Diff Anything is built around the kinds of files that line-by-line text comparison handles poorly:"],bullets:["Spreadsheets: compare stored cell values across XLSX, OpenDocument, and Apple Numbers workbooks without converting either file first.","Archives: compare ZIP, 7z, RAR, TAR, and compressed archives by their extracted content, including encrypted and multipart archives, instead of by packaging metadata.","Structured data: compare JSON, YAML, XML, CSV, and environment files by their parsed content, so reordered keys do n
10ot show up as changes.","Code: switch between Smart Diff and Line Diff across 117 editor languages. Smart Diff connects changes through reformatting and reflow while keeping the exact source text.","Documents and images: compare Office documents and PDFs, and review image changes with overlays and pixel heatmaps."]},{heading:"How the two tools compare",paragraphs:["Both tools compare files and folders and are sold as a one-time purchase. The main differences are the platforms, where the files can come from, and which file types each tool treats specially."],table:{caption:"Diff Anything and Beyond Compare at a glance",headings:["Topic","Diff Anything","Beyond Compare"],rows:[["Platforms","Windows 10 version 1809 or later, Windows 11, and macOS 13 Ventura or later","Windows, macOS, and Linux"],["Where to get it","Microsoft Store or Mac App Store","Scooter Software website"],["Price","Free version, plus a one-time Pro purchase priced in your local store currency","Standard $35 per user, Pro $70 per user, one-time purchase; free evaluation available"],["Where files come from","Files and folders on your computer","Local files, plus SFTP, FTP over SSL, WebDAV, Dropbox, OneDrive, Amazon S3, and Subversion in Pro"],["Merging","Three-way text merge from Base, Ours, and Theirs in Pro","Two- and three-way merging for text files and folders in Pro"]]}},{heading:"When Beyond Compare is the better choice",paragraphs:["Choose Beyond Compare if you work on Linux, if you compare files directly on remote servers or cloud storage, or if you need three-way folder merges or Windows registry comparison. Diff Anything does not cover those tasks.","Choose Diff Anything if your comparisons are mostly local files and folders, and you often deal with spreadsheets in different formats, archives, structured configuration, or reformatted code."]},{heading:"What you can do in Free and Pro",paragraphs:["Free lets you try every comparison type with files up to 5 MiB per side and 10 new comparison sessions per local day. Folder and archive previews show the first 100 items, and PDF previews show the first 3 pages.","A one-time Pro purchase removes those limits and unlocks larger sources within technical limits. Pro also adds folder synchronization, report export, three-way merge, and saved comparison profiles and history."]}],resource:{eyebrow:"Compare folders",title:"See how folder comparison works",description:"Read the Windows folder comparison guide: choosing the two folders, reading missing, changed, and moved results, and checking content rather than names and dates.",href:"/compare-folders-windows",label:"Read the Windows folder guide"},faqHeading:"Questions about switching from Beyond Compare",faqs:[{question:"Is Diff Anything free?",answer:"Diff Anything has a free version that lets you try every comparison type, with files up to 5 MiB per side and 10 new comparison sessions per local day. A one-time Pro purchase removes those limits."},{question:"Does Diff Anything run on Linux?",answer:"No. Diff Anything runs on Windows 10 version 1809 or later, Windows 11, and macOS 13 Ventura or later. Beyond Compare also runs on Linux."},{question:"Can Diff Anything compare files on an FTP server or in cloud storage?",answer:"Not directly. Diff Anything compares files and folders on your computer. Download or sync the files to a local folder first."},{question:"Can I compare Excel files with Diff Anything?",answer:"Yes. Diff Anything compares stored cell values across Excel, OpenDocument, and Apple Numbers workbooks, including an XLSX file against an ODS or Numbers file."},{question:"Does Diff Anything upload my files?",answer:"No. Comparisons run locally in the desktop app. You choose files and folders on your computer; nothing needs to be uploaded to a website."},{question:"Does Diff Anything do three-way merges?",answer:"Diff Anything Pro resolves overlapping text edits from Base, Ours, and Theirs in a three-way merge workspace. It does not merge folders three ways."}],sources:[{label:"Beyond Compare editions and pricing",href:"https://www.scootersoftware.com/shop"},{label:"Beyond Compare Standard and Pro features",href:"https://www.scootersoftware.com/kb/editions"}],relatedSlugs:["compare-folders-windows","compare-excel-files-without-uploading","diff-json-files"]}],mh={caption:"Folder comparison results, with the original on the left",headings:["Result","What it tells you"],rows:[["Right only","The path exists only in the right folder. If the right side is your newer copy, this is an addition."],["Left only","The path exists only in the left folder. It is missing from the right side; that does not mean it should automatically be deleted."],["Changed","The paired files differ under your selected content, size, or timestamp settings. Open the pair to inspect the change."],["Moved","Matching file content was found at another relative path. Review the old and new locations together."],["Conflict","The same relative path has different entry types, such as a file on one side and a folder on the other."],["Identical","The entries match under the active comparison rules. With semantic comparison enabled, this can mean equivalent structured content rather than
10identical bytes."],["Unverified","Content was not verified, for example because of the selected size settings, a read error, or a file changing during the scan. Resolve the cause before treating it as a match."],["Contains changes","A folder contains differences further down the tree. Expand it to review the individual entries."]]},gh={heading:"Check content, not just names and dates",paragraphs:["Two files can have the same name and size and still contain different data. A newer modification date also does not tell you what changed. Choose the checks that answer your question in Folder options: Compare file sizes, Compare small-file content, Compare hashes, and Ignore timestamps.","For a byte-level check of the included files, enable Compare hashes and turn off Semantic structured files. For a configuration review, leave semantic comparison enabled: supported JSON, YAML, XML, CSV, and environment files can compare by their parsed content within the maximum content size. For example, reordered JSON object keys need not count as a meaningful change.","Identical means a match under those settings. It does not certify files excluded by your patterns, hidden-file setting, or preview limit. Review warnings and Unverified entries before concluding that two folders match."]},vh={heading:"What is included in Free and Pro?",paragraphs:["Free lets you try folder comparison with a preview of the first 100 collection items and 10 new comparison sessions per local day. Free file comparisons are limited to 5 MiB per side, and nested folder content checks are also subject to the Free content-size limit. A preview is useful for evaluating the workflow; it is not a complete review of a larger folder tree.","A one-time Pro purchase removes the collection-preview and daily-session limits and unlocks larger sources within technical limits. Pro also adds folder synchronization, report export, and saved comparison profiles and history. Start with a small, representative pair of folders to see whether the review fits your work."]},yh={heading:"Synchronize selected changes with Pro",paragraphs:["Comparing folders reads the sources; it does not automatically make either side match the other. If you decide to update a folder, select the intended entries, choose left-to-right or right-to-left, and review the synchronization preview. Check every create, update, delete, and move before applying the plan.","Diff Anything checks for stale results, shows progress, supports cancellation, and offers one-click undo after a successful synchronization. Recovery information also supports rollback after interrupted work. Keep both folder roots available and verify the destination after the operation. For important files, retain a separate backup."]},wh=["To compare two files instead of two folders, choose File on each side, or drop both files onto the window. With Auto selected, Diff Anything picks the comparison from the file type.","Text and code open as a side-by-side diff with the changed lines and words highlighted. Excel and other spreadsheet workbooks are compared cell by cell. PDF and Word documents are compared by their extracted text, and images can be reviewed with an overlay. You can also open any Changed file straight from a folder comparison, which starts the same file comparison for that pair."],bh={src:"/products/screenshots/diff-anything-folders.png",alt:"Diff Anything showing two folder trees with changed paths, status filters, and file sizes",width:2560,height:1500},om=[{slug:"compare-folders-mac",productSlug:"diffanything",title:"Compare two folders on Mac: find missing and changed files",heading:"Compare two folders on Mac and see what changed",description:"Compare two folders on a Mac with a visual folder diff. Find missing, changed, and moved files in every subfolder, then open any pair to compare the two files.",primaryKeyword:"compare folders on Mac",dateModified:"2026-09-30",preferredStore:"macAppStore",showContents:!0,proofHeading:"See both folder trees and the files that differ.",problem:"You have a working folder and a backup, or two versions of a client delivery. Looking at them side by side in Finder still leaves the hard part: checking every subfolder, spotting a missing file, and deciding whether a renamed file actually changed.",solution:"Diff Anything compares two folder roots on your Mac and lists the differences by relative path. Use the tree to keep the folder structure in view, or the table to scan the results. Search for a path, filter by status, and open a paired file for a closer content comparison.",screenshotIndex:2,screenshot:bh,screenshotCaption:"The folder view keeps both roots, changed paths, and review controls together. Screenshot shows the shared desktop interface.",video:{
10youtubeId:"AP-UGF7JxOw",title:"How to Compare Two Folders on Mac (and See Exactly What Changed)",description:"Compare two folders on your Mac and see which files were added, removed, changed, or moved. Then open any changed file to see exactly what's different.",uploadDate:"2026-09-29T20:10:00+00:00",duration:"PT1M49S",durationLabel:"1:49",poster:{src:"/products/screenshots/diff-anything-video-compare-folders-mac.jpg",alt:"Diff Anything comparing two versions of a project folder on a Mac, with changed, added, removed, and moved files marked",width:1920,height:1080},caption:"A two-minute walkthrough: compare two versions of a project folder, read the results, and open a changed file.",chapters:[{name:"The problem",start:0,end:21},{name:"Choose the two folders",start:21,end:37},{name:"Read the results",start:37,end:59},{name:"Moved files",start:59,end:69},{name:"Filter the list",start:69,end:82},{name:"See what changed inside a file",start:82,end:91},{name:"Free and Pro",start:91,end:109}]},stepsHeading:"Start with the folders you need to check.",steps:["Choose the original folder on the left and the copy or newer version on the right.","Review Folder options, then use the tree, table, search, and status filters to find differences.","Open changed file pairs to understand the content. Synchronization is a separate Pro action."],sections:[{heading:"The short answer: comparing two folders on a Mac",paragraphs:["Finder has no command that shows the differences between two folders. You can open them side by side, but you check names, dates, and sizes yourself, one subfolder at a time.",`macOS includes a command-line folder diff. In Terminal, diff -rq "Folder A" "Folder B" compares the two folders and every subfolder, then lists the files that differ and the files that exist on only one side. It prints plain text and does not show what changed inside a file. FileMerge, which comes with Apple's free Xcode, can compare two folders in a window.`,"For a visual comparison that also finds moved files, filters the results, and opens each changed file, use a folder comparison app. The steps below use Diff Anything."]},{heading:"How to compare two folders on a Mac",paragraphs:["Open Diff Anything and select the two folders as the left and right sources. Use the trusted original on the left and the version you want to check on the right. Choose matching levels: compare the project folder with its counterpart, rather than a project folder with the parent that contains it.","Keep Recursive enabled in Folder options to include subfolders. Before reading the results, check Hidden files and Ignore patterns so the scope matches your task. Switch between tree and table layouts, search for a filename or path, and use the status filters to narrow the review.","Open a paired file from the results when a Changed label needs an explanation. The nested comparison lets you inspect the file content rather than guessing from its date or size. You can finish the review here without copying or synchronizing anything."]},{heading:"Read the folder comparison results",paragraphs:["The labels describe the relationship between the left and right folders. They do not decide which copy is correct. With a backup on the right, for example, Left only identifies something to investigate before relying on that backup."],table:mh},gh,{heading:"Compare two files on a Mac",paragraphs:[...wh,"The built-in alternative is Terminal: diff file1.txt file2.txt prints the lines that differ between two text files."]},{heading:"Mac settings worth checking before you compare",paragraphs:["Dot-prefixed files and folders are excluded when Hidden files is off. Turn it on if configuration such as .env belongs in the review, then check Ignore patterns separately. Enabling hidden files does not override an explicit ignore rule.","For a source-code comparison, excluding DerivedData, Pods, or other generated directories can make the result easier to read. For a delivery or backup check, those exclusions may hide something you intended to verify. Remove any rule that excludes part of your actual deliverable.","Diff Anything exposes Case-sensitive paths, Follow symlinks, and Compare link targets as
10separate choices. Decide whether differently capitalized paths should match and whether you want to compare a symbolic link itself or the content it points to. Set these deliberately when reviewing folders copied between systems."]},{heading:"Use it for backups, handoffs, and project copies",paragraphs:["Pick the question before choosing the comparison rules. These three reviews need different kinds of attention:"],bullets:["Check a copied backup: compare the original with the accessible backup folder, include the files you need to preserve, and use hashes when you need a content check. Investigate missing and unverified entries.","Review a client handoff: put the previously delivered folder on the left and the revised delivery on the right. Inspect added assets, changed documents, and moved files before sending it.","Compare two project copies: include relevant hidden configuration, exclude only intentional build noise, and open changed structured files to see the values that differ."]},vh,yh],resource:{eyebrow:"Go deeper",title:"Compare the files inside your folders",description:"Continue with the guide to folder review, images, spreadsheets, and documents when you need to investigate a changed file.",href:"/projects/diffanything/guides/folder-and-image-comparison",label:"Read the file comparison guide"},faqHeading:"Questions about comparing folders on Mac",faqs:[{question:"Is there a built-in way to compare two folders on a Mac?",answer:"Finder cannot compare folders. In Terminal, diff -rq followed by the two folder paths lists the files that differ and the files found on only one side, as plain text. FileMerge, included with Xcode, compares folders in a window. Diff Anything adds moved-file detection, filters, and a content comparison for each changed file."},{question:"Can I compare folders on a Mac without using Terminal?",answer:"Yes. Diff Anything provides a desktop folder comparison with tree and table views, path search, status filters, and nested file review. Select the two folders in the app to begin."},{question:"Can I use the free version to compare folders?",answer:"Yes. Free previews the first 100 collection items and allows 10 new comparison sessions per local day. File comparisons are limited to 5 MiB per side. Pro removes the preview and daily-session limits and adds synchronization and report export."},{question:"Does it compare subfolders and hidden files?",answer:"Recursive comparison includes subfolders. Enable Hidden files to include dot-prefixed entries, and review Ignore patterns too: an ignored path remains excluded even when hidden files are enabled."},{question:"Can I compare a folder on an external drive?",answer:"Yes, when the drive is mounted and both folders can be selected and read by the app. Keep the drive connected during the comparison and any later synchronization. Review read errors before treating the result as complete."},{question:"Will comparing folders change either copy?",answer:"No. Running a comparison reads the folders. Copying or synchronizing files is a separate action; Pro synchronization previews the chosen changes and direction before you apply them."},{question:"Which macOS versions are supported?",answer:"Diff Anything requires macOS 13 Ventura or later. Install it from the Mac App Store."},{question:"Can it find a file that was renamed or moved?",answer:"Detect moved files matches file content at different relative paths. Review both locations in the result. A file that was also edited may appear as separate additions and removals instead of a matching move."}],relatedSlugs:["compare-folders-windows","beyond-compare-alternative","compare-word-documents-locally","compare-images"]},{slug:"compare-folders-windows",productSlug:"diffanything",title:"Compare two folders on Windows 10 and 11: find what changed",heading:"Compare two folders on Windows and see what changed",description:"Compare two folders (directories) on Windows 10 and 11 with a visual folder diff. Find missing, changed, and moved files in every subfolder, then open any pair to compare the two files.",primaryKeyword:"compare folders on Windows",dateModified:"2026-10-01",preferredStore:"microsoftStore",showContents:!0,proofHeading:"Find the changed paths before opening individual files.",problem:"Two File Explorer windows leave you checking names, dates, and sizes one directory at a time. A copied project can look complete while a nested configuration file differs or a required asset is missing. The larger the folder tree, the easier it is to miss something.",solution:"Diff Anything compares the folder trees and brings the differences into one desktop view. Start with missing or changed paths, use search and status filters to focus the list, and open paired files to inspect their content. Moved-file detection helps explain files that changed location.",screenshotIndex:2,screenshot:bh,screenshotCaption:"Search and status filters narrow the folder results before you open a file pair. Screenshot shows the shared desktop interface.",video:{
10youtubeId:"iyVBuEB2I8E",title:"How to Compare Two Folders on Windows (and See Exactly What Changed)",description:"Compare two folders on Windows and see which files were added, removed, changed, or moved. Then open any changed file to see exactly what changed inside it: cell by cell in a spreadsheet, line by line in a Word document.",uploadDate:"2026-10-01T13:28:00+00:00",duration:"PT1M49S",durationLabel:"1:49",poster:{src:"/products/screenshots/diff-anything-video-compare-folders-windows.jpg",alt:"Diff Anything on Windows comparing two versions of a project folder, with changed, added, removed, and moved files marked",width:1920,height:1080},caption:"A two-minute walkthrough on Windows: compare two versions of a project folder, read the results, and open a changed file.",chapters:[{name:"The problem",start:0,end:21},{name:"Compare two folders",start:21,end:44},{name:"Read the result",start:44,end:63},{name:"Open a changed file",start:63,end:87},{name:"Find a moved file",start:87,end:109}]},stepsHeading:"Get from two folders to a useful answer.",steps:["Select the baseline folder on the left and the candidate or copied folder on the right.","Include subfolders, check ignore rules, and review missing, changed, moved, or unverified entries.","Inspect the changed file pairs. Use Pro synchronization only when you want to apply reviewed changes."],sections:[{heading:"The short answer: comparing two folders in Windows 10 and 11",paragraphs:["Windows has no built-in window that shows the differences between two folders. File Explorer can show two folders side by side, but you compare names, dates, and sizes yourself, one directory at a time.",'Two built-in commands can list differences without installing anything. In Command Prompt, robocopy "C:\\Folder A" "C:\\Folder B" /L /E /NJH /NJS /NP /NDL lists the files that are new or different in the first folder. /L means list only, so nothing is copied, and /E includes subfolders. Robocopy compares sizes and dates, not contents. In PowerShell, Compare-Object (Get-ChildItem "C:\\Folder A" -Recurse -File) (Get-ChildItem "C:\\Folder B" -Recurse -File) -Property Name, Length lists the files whose name or size differs.',"For a visual folder diff that checks content, finds moved files, and opens each changed file, use a folder comparison app. The steps below use Diff Anything."]},{heading:"How to compare two folders on Windows",paragraphs:["Open Diff Anything and select a folder (directory) for each side of the comparison. Place the known baseline on the left and the folder you want to check on the right. For example, compare the previous release output with the candidate release output, using the same directory level on each side.","Open Folder options and keep Recursive enabled to include subfolders. Review the ignore list before trusting the result: if the task is to check a release package, a rule that hides its build output defeats the purpose of the comparison.","Use the tree layout to follow the directory structure or the table layout to scan paths. Search for a specific file and filter the results by status. Open a changed pair to see the content difference before deciding which version to keep."]},{heading:"Understand missing, changed, and moved files",paragraphs:["Read each status relative to your chosen baseline. If the candidate is on the right, Right only is an addition and Left only is something absent from the candidate. Neither status is an instruction to copy or delete the file."],table:mh},gh,{heading:"Compare two files on Windows",paragraphs:[...wh,"The built-in alternative is Command Prompt: fc file1.txt file2.txt prints the lines that differ between two text files, and fc /b compares two files byte by byte."]},{heading:"Set up a useful Windows folder comparison",paragraphs:["Choose equivalent roots. Comparing a release directory against a parent containing several releases makes normal nesting look like missing files. If nearly everything appears on only one side, check the selected roots before changing your filters.","Review Ignore patterns for generated directories such as node_modules, dist, build, or target. Excluding these can help when comparing source projects, but keep them visible if they are the output you need to verify. Use Include only these patterns when the question concerns a specific part of the tree.","Check Case-sensitive paths when folders have crossed operating systems: decide whether README.md and readme.md should pair up. Hidden files includes dot-prefixed paths; review that setting and the ignore rules when configuration files belong in the comparison. If files are actively being written, wait for the copy or build to finish and rerun the comparison."]},{heading:"Check a copied folder, release, or configuration",paragraphs:["A folder diff is most useful when the result answers a specific question:"],bullets:["Did the copy include everything? Compare the original and destination folders, look for Left only entries, and enable content hashing for the included files. Matching names and sizes alone do not prove a complete copy.","What changed in the release? Compare two equivalent output directories. Review added and removed assets as well as changed files; remove ignore rules that hide the output under review.","Which configuration values changed? Include the relevant JSON, YAML, XML, CSV, or environment files and use semantic comparison within the content-size limit. Open a changed pair for the detailed result."]},vh,yh],resource:{eyebrow:"Review a release",title:"Check the exact files you plan to deliver",description:"Use the release-artifact guide to compare a trusted baseline with a candidate folder or supported archive and inspect the important changes.",href:"/projects/diffanything/use-cases/release-artifact-inspection",label:"Read the release comparison guide"},faqHeading:"Questions about comparing folders on Windows",faqs:[{question:"Does Windows have a built-in tool to compare two folders?",answer:"Not a visual one. File Explorer cannot compare folders. From the command line, robocopy with the /L switch lists the files that differ by size or date without copying anything, and PowerShell's Compare-Object can compare two file listings. Diff Anything shows the differences in a window, checks content, detects moved files, and opens each changed file."},{question:"How do I compare two folders in Windows 11?",answer:"Open Diff Anything, click Folder on each side, and pick the two folders. The result lists the files that exist on only one side, changed, or moved, including files in subfolders. The steps are the same on Windows 10."},{question:"Can I compare two folders without PowerShell or a command line?",answer:"Yes. Diff Anything provides a de
10sktop interface for choosing two folder roots, reviewing their recursive differences, and opening changed file pairs. You can use tree or table layouts and filter by path or status."},{question:"Is folder comparison available in Free?",answer:"Yes. Free previews the first 100 collection items and allows 10 new comparison sessions per local day. File comparisons are limited to 5 MiB per side. Pro removes the preview and daily-session limits and adds synchronization and report export."},{question:"Does matching file size mean that the contents are identical?",answer:"No. Different contents can have the same size. Enable Compare hashes for a content check. Turn off Semantic structured files when you want byte-level equality rather than equivalent parsed values, and review any Unverified entries."},{question:"Why are some files or subfolders missing from the result?",answer:"Check Recursive, Hidden files, Ignore patterns, Include only these patterns, search, and status filters. Identical entries are hidden unless requested. Free also limits the collection preview to the first 100 items. Review scan warnings for unreadable paths."},{question:"Can I synchronize the folders after comparing them?",answer:"Yes, with Pro. Select entries, choose the direction, and review the create, update, delete, and move operations before applying them. Synchronization supports cancellation and recovery, with one-click undo after a successful operation."},{question:"Does it work on Windows 10?",answer:"Yes. Diff Anything runs on Windows 10 version 1809 or later and on Windows 11. Install it from the Microsoft Store."},{question:"Does comparing folders upload my files?",answer:"Folder comparison runs locally in the desktop app. You select folders on your computer; the comparison does not require uploading their contents to a website."}],relatedSlugs:["compare-folders-mac","beyond-compare-alternative","diff-json-files","compare-excel-files-without-uploading"]}],Ch=[{slug:"organize-ai-generated-windows-project",productSlug:"devdock",title:"Organize an AI-generated Windows project â DevDock",heading:"Turn an AI-generated project into a workflow you can resume",description:"Audit the folders, commands, runtimes, health, and recent evidence around an AI-generated Windows project, then keep the working path in DevDock.",primaryKeyword:"organize an AI-generated Windows project",dateModified:"2026-08-27",problem:"Generated code can arrive faster than the project context needed to operate it. The source may run once, but its real boundary, startup order, runtime targets, database context, and last known result are still scattered across a chat, terminal history, and several folders.",solution:"Treat the generated code as a normal local software project. DevDock registers the existing folders, keeps recurring commands with their working directories and host-or-container targets, and retains project health and run evidence so returning to the work does not depend on reconstructing the original prompt session.",screenshotIndex:2,screenshotCaption:"DevDock keeps the local folders, recurring commands, health, and recent activity around one Windows project.",steps:["Run the free checklist against the current local project.","Register the folders that form the real product boundary.","Save the verified commands, targets, and return path in DevDock."],detailsLabel:"Project recovery",stepsHeading:"Move the useful context out of the chat and into the project.",resource:{eyebrow:"Free local diagnostic",title:"Find the missing workflow context first",description:"The browser checklist adapts to multi-folder, Docker, and database projects. It creates a local readiness report without uploading the answers.",href:"/tools/windows-project-workflow-checklist",label:"Run the Windows project checklist"},sections:[{heading:"Inventory the project that actually exists",paragraphs:["Begin with the filesystem and manifests, not the prompt that produced them. Identify the primary folder, related repositories, package or solution files, environment templates, Compose configuration, migrations, and the commands that have actually run.","AI-generated code does not need a special project category. It needs an explicit boundary that shows which local folders are operated and released together."],bullets:["Keep repositories in their existing locations.","Give related folders role-based names.","Separate generated suggestions from commands you have verified."]},{heading:"Make every recurring command reviewable",paragraphs:["A command without its working directory and runtime target is
10incomplete. Record the executable, arguments, folder, and whether it runs on the Windows host or inside a container before turning it into a reusable task.","If several processes form one environment, capture their dependency order and readiness checks. Do not treat one successful launch as proof that the path will remain repeatable after a reboot or dependency change."],bullets:["Keep secrets out of visible arguments.","Start dependencies before consumers.","Use bounded checks before long-running processes."]},{heading:"Keep evidence from the last real run",paragraphs:["Record Git, toolchain, Docker, database, and recent-run state separately. Detecting a framework does not prove that its executable, engine, service, or connection is currently available.","When something fails, retain the exact task, directory, target, exit state, and output. That evidence is more useful than asking a new chat session to guess what changed."]}],faqs:[{question:"Does DevDock generate the project or rewrite its code?",answer:"This workflow does not depend on DevDock generating code. DevDock organizes and operates the existing local project by keeping its folders, tasks, health, shortcuts, and run history together."},{question:"Can the project contain more than one repository?",answer:"Yes. One DevDock project can represent one repository, a monorepo, or several separately located folders. Multi-folder projects are a Pro feature."},{question:"Does the checklist or project detection upload source code?",answer:"No. The checklist runs in the browser tab and project detection works against registered local folders. Neither workflow requires uploading the source."}]},{slug:"manage-development-projects-windows",productSlug:"devdock",title:"Manage development projects on Windows â DevDock",heading:"Keep every development project ready to run",description:"Organize local repositories, commands, health checks, and recent work in one Windows development workspace, with database tools in Pro.",primaryKeyword:"manage development projects on Windows",dateModified:"2026-08-25",problem:"A project is more than a folder. Its useful commands, runtime targets, database context, and last known state usually end up scattered across terminals, notes, and bookmarks.",solution:"DevDock gives each local project a persistent workspace. Register a repositoryâor, with Pro, a monorepo's subprojects or several related foldersâand return to the same commands, health information, shortcuts, and run history later.",screenshotIndex:2,screenshotCaption:"A DevDock project keeps its folders, daily workflow, health, and recent activity together.",steps:["Register the local project folder.","Review detected tools, folders, and health.","Pin the commands you use to return to work."],detailsLabel:"Project re-entry",stepsHeading:"Turn a folder into a repeatable return path.",sections:[{heading:"Define the real project boundary",paragraphs:["Start with the unit of work you think about and ship together. That may be one repository, a monorepo, or several separately located folders; projects with more than one folder require Pro. Give related folders role-based labels so similar commands remain distinguishable.","Do not move or flatten repositories just to create an overview. The useful boundary is the one that preserves each folder's real working directory while keeping the product workflow understandable."],bullets:["Use one project for folders that contribute to the same product workflow.","Split independently owned or released codebases.","Name folder roles such as Backend, Web, Mobile, or Infrastructure."]},{heading:"Capture the path back to useful work",paragraphs:["Record the recurring servers, workers, watchers, tests, and setup tasks with their exact working directories and execution targets. Put dependent steps into an intentional order instead of relying on terminal history.","A return path is useful only when it remains reviewable. Keep executable, arguments, working directory, and host-or-container target visible before a command starts."],bullets:["Prefer bounded commands for the first readiness check.","Keep folder-specific tasks attached to their folder.","Review consequential commands before execution."]},{heading:"Separate detected context from current health",paragraphs:["Recognizing a framework or manifest does not prove that its SDK, executable, Docker engine, or dependent service is currently available. Review configuration, toolchain, Git, Docker, and recent-run evidence separately.","When a command fails, preserve the exact task, directory, target, exit state, and output. Run history keeps that record, so you can review the failure beside earlier runs instead of reconstructing it from memory."]}],faqs:[{question:"Does DevDock move or copy project folders?",answer:"No. DevDock keeps references and workflow context around existing local folders; the repositories remain in their original filesystem locations."},{question:"Can one DevDock project contain several repositories?",answer:"Yes. A project can represent one repository, a monorepo, or several separately located folders. Multi-folder projects are a Pro feature."},{question:"Does project detection upload source code?",answer:"No. Detection works against registered local folders and does not require source upload."}]},{slug:"run-development-commands-windows",productSlug:"devdock",title:"Run development commands on Windows â DevDock",heading:"Run recurring development commands with context",description:"Save and run development commands on Windows with their project, working directory, target, output, timing, and history attached.",primaryKeyword:"run development commands on Windows",dateModified:"2026-08-25",problem:"Recurring servers, workers, tests, and setup commands disappear into shell history. When one fails, it is easy to lose the working directory, target, or last successful output that would explain why.",solution:"DevDock turns recurring commands into visible project tasks. Each run retains its folder, working directory, execution target, timing, exit state, and output so useful workflows remain repeatable.",screenshotIndex:1,screenshotCaption:"Saved commands remain attached to their project and keep their run output visible.",steps:["Save the executable, arguments, and working directory.","Choose the host or container target.","Run it and revisit the retained result later."],detailsLabel:"Repeatable commands",stepsHeading:"Make the next run understandable before it starts.",sections:[{heading:"Record more than the command text",paragraphs:["The same executable can behave differently from another folder or execution environment. Save the executable, arguments, working directory, and host-or-container target together so the task has enough context to be reviewed later.","Use clear names when several repositories exp
10ose similar Test, Build, or Start commands. A role-specific name keeps the task understandable from the project overview and history."],bullets:["Keep secrets out of visible arguments.","Make working directories explicit.","Use confirmation levels that match the command's impact."]},{heading:"Treat multi-process work as an ordered workflow",paragraphs:["A local environment may need infrastructure, an API, a frontend, and one or more workers. Express that dependency order intentionally and add readiness checks where a process needs time before the next step can begin.","Host and container commands should remain visibly different. A workflow can coordinate them without pretending they share the same filesystem or environment."],bullets:["Start dependencies before consumers.","Use loopback readiness checks for local services.","Stop long-running work deliberately."]},{heading:"Use retained output as diagnostic evidence",paragraphs:["When a run fails, begin with its exit state, duration, target, working directory, and first meaningful error. Compare it with the last successful execution before changing the command or environment.","Run history is operational recall, not permanent archival. Move durable, non-secret evidence into the project's normal issue or documentation workflow when it must outlive the configured retention window."]}],faqs:[{question:"Can DevDock run commands inside Docker containers?",answer:"Yes. Saved tasks can use an explicit host or container execution target when the project workflow requires it."},{question:"Does DevDock retain command output?",answer:"Managed run history keeps task context, timing, status, target, and retained output according to the application's settings."},{question:"Should destructive commands be launched without review?",answer:"No. Consequential, destructive, production, shell, and other sensitive operations should remain explicit and use the appropriate review or confirmation path."}]},{slug:"manage-docker-compose-windows",productSlug:"devdock",title:"Manage Docker Compose projects on Windows â DevDock",heading:"See Docker Compose in the context of the project",description:"Review Compose services, ports, health, and host-versus-container commands from a local Windows development workspace.",primaryKeyword:"manage Docker Compose on Windows",problem:"Compose commands can start the environment, but they do not provide one durable view of the repository, service health, published ports, and the tasks that run on the host or inside a container.",solution:"DevDock reads the projectâs Compose configuration and brings service state, health, ports, and explicit execution targets into the same workspace as the rest of the project.",screenshotIndex:0,screenshot:{src:"/products/screenshots/devdock-docker.png",alt:"DevDock Docker Compose workspace showing environment actions and a detected Dockerfile image",width:1982,height:1352},screenshotCaption:"The Docker Compose workspace exposes environment actions, service targets, and Dockerfile image tools for the selected project.",steps:["Register the project containing the Compose file.","Review detected services and runtime health.","Run saved host or container tasks explicitly."]},{slug:"inspect-local-databases-windows",productSlug:"devdock",title:"Inspect local databases on Windows â DevDock",heading:"Inspect the database without leaving the project workspace",description:"With DevDock Pro, inspect SQLite, MySQL, MariaDB, and PostgreSQL schemas and records in a bounded, project-aware Windows database tool.",primaryKeyword:"inspect local databases on Windows",problem:"Checking one local table should not require a separate heavyweight database workspace or an unrestricted query pasted from memory, especially when several projects use different engines.",solution:"DevDock Pro provides schema inspection, validated record lookups, counts, and explicit backup operations for supported local databases. Laravel projects that use their .env connection also get migration review and diagnostics. Direct MySQL, MariaDB, and PostgreSQL connections use the command-line clients installed on the computer.",screenshotIndex:0,screenshot:{src:"/products/screenshots/devdock-database.png",alt:"DevDock database tools showing a session-only MySQL connection form",width:1982,height:1352},screenshotCaption:"Database operations live inside the same project workspace as its folders and health checks.",steps:["Use a detected connection or create a session-only one.","Choose a schema, table, or bounded lookup.","Review results without uploading project data."]},{slug:"scan-source-code-for-secrets-windows",productSlug:"devdock",title:"Scan source code for secrets on Windows â DevDock",heading:"Check local source code for exposed secrets",description:"Run a read-only local scan for tokens, private keys, credential files, escaping symlinks, and lockfile gaps on Windows.",primaryKeyword:"scan source code for secrets on Windows",problem:"A credential can slip into a repository long before a formal security review. Uploading the source to an unknown scanning service creates another risk for private code.",solution:"DevDock runs its baseline audit locally and read-only across registered folders. Findings identify the rule and file location while withholding the matched secret value.",screenshotIndex:0,screenshot:{src:"/products/screenshots/devdock-security.png",alt:"Completed DevDock local security audit showing severity counts and redacted source findings",width:1982,height:1352},screenshotCaption:"The completed local audit groups findings by severity without displaying matched secret values.",steps:["Register the folders that belong to the product.","Run the local read-only security audit.","Review each finding without exposing matched values."]},{slug:"manage-multiple-repositories-windows",productSlug:"devdock",title:"Manage multiple repositories on Windows â DevDock",heading:"Treat several repositories as one product",description:"With DevDock Pro, group frontend, backend, mobile, infrastru
10cture, or documentation repositories in one local Windows project workspace.",primaryKeyword:"manage multiple repositories on Windows",problem:"Products split across several repositories lose their shared context when every folder, command, and health check is handled as a separate workspace.",solution:"With Pro, a DevDock project can contain several labeled folders without moving or flattening them. Detection, tasks, and shortcuts stay scoped to each folder while contributing to one product overview.",screenshotIndex:2,screenshotCaption:"One DevDock overview can represent a product assembled from several local folders.",steps:["Create a project from the primary repository.","Attach and label the related local folders.","Use folder-scoped commands from one overview."]},{slug:"app-store-screenshot-sizes",productSlug:"screenshot-studio",title:"App Store screenshot sizes and validation â Screen Studio Kit",heading:"Prepare the App Store screenshot sizes your app actually needs",description:"Use a sourced table of current App Store screenshot sizes for every Apple device family, download the data as JSON or CSV, and validate iPhone, iPad, and Mac files locally.",primaryKeyword:"App Store screenshot sizes",dateModified:"2026-09-06",problem:"App Store Connect accepts several device slots and exact pixel dimensions. Exporting every historical size wastes work, while choosing an unsupported size, transparent image, or incomplete set can block the upload.",solution:"Start with the device families the app supports, validate the exact files locally, and use Screen Studio Kit to keep those outputs connected to one editable composition. Apple can scale a highest-resolution required screenshot to smaller device sizes when the interface is the same; Media Manager remains available when a size or localization needs custom artwork.",screenshotIndex:1,screenshot:{src:"/tools/screenshots/store-screenshot-validator.webp",alt:"Store Screenshot Validator checking current Apple App Store screenshot dimensions locally",width:1600,height:1e3},screenshotCaption:"The free validator checks the chosen iPhone, iPad, or Mac slot before the files reach App Store Connect.",steps:["Choose the iPhone, iPad, and Mac families the app actually supports.","Validate the finished files against their exact App Store Connect slots.","Build and export the approved size-and-language matrix in Screen Studio Kit."],detailsLabel:"Apple requirements",stepsHeading:"Validate the release set before opening App Store Connect.",specificationDataset:"apple-screenshot-specifications",resource:{eyebrow:"Free local validator",title:"Check the actual files, not just the design preset",description:"Drop screenshots into the browser tool to inspect pixel dimensions, format, transparency, and set count. Images stay in the current tab.",href:"/tools/store-screenshot-validator",label:"Open the screenshot validator"},sources:[{label:"Apple screenshot specifications",href:"https://developer.apple.com/help/app-store-connect/reference/app-information/screenshot-specifications/"},{label:"Apple: upload app previews and screenshots",href:"https://developer.apple.com/help/app-store-connect/manage-app-information/upload-app-previews-and-screenshots/"}],sections:[{heading:"Start with the supported device families",paragraphs:["Appleâs current reference covers iPhone, iPad, Mac, Apple TV, Apple Vision Pro, and Apple Watch. The table above keeps every documented slot and accepted pixel size together instead of reducing the requirement to one phone and tablet preset.","The downloadable JSON and CSV contain the same dimensions, orientation labels, conditional requirements, and scaling notes. Use them in a release checklist or internal validation script, and re-check the source date before treating them as permanent."],bullets:["Use JPEG, JPG, or PNG.","Provide from one to ten screenshots for a selected Apple slot.","Do not use transparency or an alpha channel."]},{heading:"Use scaling only when the interface is genuinely the same",paragraphs:["Apple says a highest-resolution required screenshot can scale down to smaller device sizes when the interface is the same across those sizes and localizations. This reduces duplicate work, but it is not permission to show the wrong interface or let important copy crop badly.","Use Media Manager when a device family or language needs custom artwork. Review the longest localized headline at the narrowest selected output before relying on a shared composition."]},{heading:"Validate the exported files as a set",paragraphs:["A correct canvas preset does not prove that the exported file still has the right dimensions, encoding, transparency, and count. Validate the finished images, then inspect the complete language-and-size matrix for omissions.","Screen Studio Kit keeps captures, copy, frames, and backgrounds editable across output presets. Its preflight can flag missing translations or assets and likely overflow before deterministic PNG or JPEG batch export."],bullets:["Check the files after export.","Review every selected language and size.","Keep one editable source project for future updates."]}],faqs:[{question:"Do I need to export every historical iPhone and iPad size?",answer:"Not necessarily. Start with the device families the app supports and Appleâs current highest-resolution required slots. App Store Connect can scale down when the interface is the same; use Media Manager when a size needs custom artwork."},{question:"Can App Store screenshots contain transparency?",answer:"No. Appleâs screenshot specifications accept JPEG or PNG screenshots without transparency."},{question:"Does the browser validator upload my screenshots?",answer:"No. It reads the selected images in the current browser tab and does not upload them to martingruner.com."}]},{slug:"create-app-store-screenshots",productSlug:"screenshot-studio",title:"Create App Store screenshots â Screen Studio Kit",heading:"Create a complete App Store screenshot set",description:"Compose editable App Store screenshots with device frames, responsive sizes, localization, validation, and deterministic export.",primaryKeyword:"create App Store screenshots",problem:"App Store artwork often becomes a pile of flattened files: one for every device size, language, and screen. A small copy or UI change then turns into repetitive redesign work.",solution:"Screen Studio Kit keeps captures, headlines, shapes, backgrounds, and device frames as editable layers in one reusable project that adapts across Apple output presets.",screenshotIndex:0,screenshotCaption:"A real store screenshot remains editable as layers, copy, captures, and device treatment.",steps:["Choose the Apple device presets you need.","Compose the capture and message once.","Validate and export the complete screenshot set."]},{slug:"create-google-play-screenshots",productSlug:"screenshot-studio",title:"Create Google Play screenshots â Screen Studio Kit",heading:"Build Google Play screenshots from one layout system",description:"Create Google Play phone, tablet, and feature graphic assets with shared layouts, localized copy, validation, and batch export.",primaryKeyword:"create Google Play screenshots",problem:"Phone, tablet, and feature-graphic artwork use different shapes, but rebuilding every image separately makes the store listing hard to update and easy to leave inconsistent.",solution:"Screen Studio Kit maps one normalized composition across Google Play targets and lets you add a focused override only when a specific size genuinely needs it.",screenshotIndex:1,screenshotCaption:"The preview matrix shows Android ph
10one, tablet, and feature-graphic outputs together.",steps:["Select Google Play output presets.","Reuse the composition across target sizes.","Review the matrix and export the approved batch."]},{slug:"resize-app-store-screenshots",productSlug:"screenshot-studio",title:"Resize App Store screenshots â Screen Studio Kit",heading:"Resize the composition, not a flattened image",description:"Fit your app screenshots to required store sizes with reusable layouts, responsive previews, and adjustments for each size.",primaryKeyword:"resize App Store screenshots",problem:"Stretching a finished screenshot to another aspect ratio distorts the design or pushes important text and interface details out of balance.",solution:"Screen Studio Kit reflows the editable scene across selected presets. Normalized geometry handles ordinary changes, while per-size position, dimension, and visibility overrides handle real exceptions.",screenshotIndex:1,screenshotCaption:"A single project can be reviewed across phone, tablet, and store-specific aspect ratios.",steps:["Select every required output size.","Preview the widest and narrowest results.","Add only the overrides each outlier needs."]},{slug:"localize-app-store-screenshots",productSlug:"screenshot-studio",title:"Localize App Store screenshots â Screen Studio Kit",heading:"Localize screenshot copy without duplicating the design",description:"Keep translated store copy and language-specific app captures connected to one responsive screenshot project.",primaryKeyword:"localize App Store screenshots",dateModified:"2026-08-25",problem:"Duplicating every screenshot for every language makes design corrections drift and hides missing translations until the final export folder is reviewed.",solution:"Screen Studio Kit stores language variants against shared text and asset layers. CSV exchange supports translation handoff, and validation checks the complete language-and-size matrix.",screenshotIndex:2,screenshotCaption:"Switching language updates both the marketing copy and the localized application capture.",steps:["Add the release languages to the project.","Translate text and assign locale-specific captures.","Validate every language and size before export."],detailsLabel:"Localization workflow",stepsHeading:"Translate the content without duplicating the design.",sections:[{heading:"Keep stable layers underneath every language",paragraphs:["Build the shared composition first, then attach language variants to stable text and asset layers. Product names, legal marks, and translatable claims should remain separate when they follow different rules.","A locale can replace both the marketing message and the underlying app capture without forking the whole page. Shared layout corrections then remain shared."],bullets:["Name pages and text layers before translation begins.","Add only languages planned for the release.","Review the longest copy at the smallest selected output."]},{heading:"Use CSV as a controlled hand-off",paragraphs:["Export translation CSV after page and layer identities are stable. Translators can edit the copy while the project retains the identifiers needed to return each value to the correct layer.","On import, review missing, duplicate, or unknown identifiers. Row order should not be treated as identity, and text layers should not be renamed during an active hand-off."]},{heading:"Validate the complete language-and-size matrix",paragraphs:["A correct source-language preview does not prove that every translated output is complete. Preflight checks missing translations and assets, unsafe bounds, counts, output resolution, and store-specific format rules across the selected matrix.","Resolve errors before batch export, then inspect the release folder as a complete deliverable rather than a collection of individually plausible images."]}],faqs:[{question:"Do I need to duplicate a page for every language?",answer:"No. Screen Studio Kit keeps language variants against shared text and asset layers so the underlying composition can remain reusable."},{question:"Can translators work in a spreadsheet?",answer:"Yes. Translation CSV export and import supports hand-off while stable page and layer identifiers map values back to the project."},{question:"Does one preview prove the whole localized set is ready?",answer:"No. Validate the complete selected language-and-size matrix because missing copy, assets, or layout problems can be specific to one output."}]},{slug:"add-device-frames-to-screenshots",productSlug:"screenshot-studio",title:"Add device frames to app screenshots â Screen Studio Kit",heading:"Put app captures in editable device frames",description:"Add platform-aware phone, tablet, watch, and desktop frames to app-store screenshots without flattening the composition.",primaryKeyword:"add device frames to app screenshots",problem:"A baked-in phone mockup looks finished until the capture, frame, crop, or output size changes. Then the complete image has to be recreated.",solution:"Screen Studio Kit treats device frames as editable scene layers alongside captures, text, images, shapes, and groups. Version 1.2 adds live Turn and Tilt controls, so perspective remains adjustable across outputs and is reproduced by native export.",screenshotIndex:0,screenshotCaption:"Platform-aware device treatment stays part of the editable store composition.",steps:["Import the source-resolution app capture.","Add the matching platform-aware frame.","Adjust and preview it across selected outputs."]},{slug:"batch-export-app-store-screenshots",productSlug:"screenshot-studio",title:"Batch export App Store screenshots â Screen Studio Kit",heading:"Export every approved store screenshot in one batch",description:"Validate and batch export store screenshots across device sizes, platforms, and languages with a recorded output summary.",primaryKeyword:"batch export App Store screenshots",problem:"Manual exports make it easy to miss one language, use stale artwork, overwrite a file, or deliver an incomplete set of required sizes.",solution:"Screen Studio Kit validates the selected release matrix first, then renders collision-safe PNG or JPEG output with progress, cancellation, and an export summary.",screenshotIndex:6,screenshotCaption:"One reviewed batch can render the complete store, device, and language matrix.",steps:["Freeze the stores, sizes, languages, and page order.","Resolve the preflight report.","
10Export and inspect the recorded release batch."]},{slug:"compare-excel-files-without-uploading",productSlug:"diffanything",title:"Compare two Excel files without uploading them â Diff Anything",heading:"Compare two Excel files without uploading them",description:"Compare stored cell values in Excel workbooks locally by sheet and coordinate, while keeping both files on your Mac or Windows computer.",primaryKeyword:"compare Excel files without uploading",dateModified:"2026-10-01",problem:"Financial exports, customer lists, research data, and internal reports may be inappropriate for a browser upload. A line diff is also a poor fit for workbook containers because it cannot present stored values as sheets, rows, columns, and cells.",solution:"Diff Anything extracts supported spreadsheets on the computer, aligns populated cells by sheet and coordinate, and connects changed cells to a Differences pane. It compares stored cell values; formulas, formatting, charts, macros, and workbook layout remain outside the result.",screenshotIndex:0,screenshot:{src:"/products/screenshots/diff-anything-spreadsheets-1-3.png",alt:"Diff Anything comparing two local spreadsheets in a sheet-aware grid",width:1072,height:768},screenshotCaption:"A sheet-aware grid keeps changed stored values and their cell coordinates visible without a file upload.",video:{youtubeId:"nZ7HvfipKrI",title:"How to Compare Two Excel Files on Mac (and See Every Changed Cell)",description:"Compare two versions of an Excel workbook on your Mac and see exactly which cells changed, on every sheet.",uploadDate:"2026-09-30T15:40:00+00:00",duration:"PT1M32S",durationLabel:"1:32",poster:{src:"/products/screenshots/diff-anything-video-compare-excel-files-mac.jpg",alt:"Diff Anything comparing two versions of a budget workbook on a Mac, with the six changed cells highlighted and listed by cell address",width:1920,height:1080},caption:"A 90-second walkthrough on a Mac: open two versions of a budget workbook, see every changed cell, and go through the changes one by one.",chapters:[{name:"The problem",start:0,end:21},{name:"Choose the two files",start:21,end:32},{name:"Every changed cell",start:32,end:44},{name:"Jump to a change",start:44,end:52},{name:"More than one sheet",start:52,end:63},{name:"Mark changes as reviewed",start:63,end:69},{name:"Other spreadsheet formats",start:69,end:92}]},steps:["Open the two local Excel workbooks.","Choose the sheet and inspect aligned cell coordinates.","Review changed stored values and verify excluded workbook properties separately."],detailsLabel:"Private spreadsheet review",stepsHeading:"Answer the data question without sending the workbooks away.",sections:[{heading:"Define what the comparison can prove",paragraphs:["This workflow answers whether stored cell values differ by sheet and coordinate. It does not compare formulas, formatting, charts, macros, workbook layout, print settings, or editing behavior.","A clean value comparison is useful evidence for a data handoff, but it does not prove that two workbook files are otherwise identical."],bullets:["Use the grid for stored values.","Review formulas separately when calculation logic matters.","Review formatting and workbook features in their native editor."]},{heading:"Keep the workbook structure visible",paragraphs:["Choose a sheet, then review aligned rows and columns with familiar cell coordinates. Selecting a changed cell connects the grid position to the Differences pane instead of reducing the workbook to archive internals.","Diff Anything supports Excel (XLS, XLSX, XLSM, XLSB, and their templates), OpenDocument (ODS), and Apple Numbers workbooks, including mixed-format pairs when a handoff crosses spreadsheet applications. You can also open a CSV or TSV export beside the workbook to check it against the sheet it came from."]},{heading:"Keep the files on the computer",paragraphs:["Spreadsheet extraction and comparison run locally on macOS and Windows. Diff Anything has no account, cloud comparison service, analytics, or telemetry.","Signed store builds may separately contact the Mac App Store or Microsoft Store for product, purchase, and entitlement checks. The workbooks and comparison content are not included in those requests."]}
10],faqs:[{question:"Are the Excel files uploaded for comparison?",answer:"No. The selected workbooks are extracted and compared on the computer; Diff Anything does not send their content to a cloud comparison service."},{question:"Does it compare formulas and formatting?",answer:"No. Spreadsheet mode compares stored cell values. Formulas, formatting, charts, macros, workbook layout, and print settings are not compared."},{question:"Can I compare Excel with ODS or Apple Numbers?",answer:"Yes. Supported spreadsheet formats can be paired across formats, including XLSX with ODS or Apple Numbers."}]},{slug:"compare-word-documents-locally",productSlug:"diffanything",title:"Compare two Word documents locally â Diff Anything",heading:"Compare Word document revisions by extracted text",description:"Compare two Word revisions locally using extracted body, header, footer, footnote, and endnote text, without uploading the documents.",primaryKeyword:"compare Word documents locally",dateModified:"2026-10-01",problem:"A DOCX file is a packaged document rather than plain text, and private contracts, drafts, or internal reports may not belong in an online comparison service. At the same time, a text extraction cannot answer visual questions about layout and styling.",solution:"Diff Anything extracts text from the Word body, headers, footers, footnotes, and endnotes on the computer, compares the resulting wording, and names each change by its numbered clause or paragraph. The boundary stays explicit: layout, styling, comments, and tracked-change state must be reviewed in Word or another document editor.",screenshotIndex:0,screenshot:{src:"/products/screenshots/diff-anything-welcome-1-3.png",alt:"Diff Anything local comparison start screen for selecting document revisions",width:2560,height:1834},screenshotCaption:"Choose both document revisions inside the local desktop comparison workspace.",steps:["Open the baseline and revised DOCX files.","Review changes in the extracted body, header, and footer text.","Inspect formatting, comments, and tracked changes separately when they matter."],detailsLabel:"Document boundary",stepsHeading:"Use extracted text for wording, then review what extraction cannot prove.",sections:[{heading:"Choose revisions in a clear direction",paragraphs:["Open the earlier document as the baseline and the proposed revision as the candidate. Keeping that direction stable makes additions and removals understandable during the review.","Use meaningful filenames or preserved document copies so the wording result remains connected to the actual revision history outside the comparison tool."]},{heading:"Review the text that can be extracted",paragraphs:["Word comparison reads DOCX, DOCM, DOTX, and DOTM files: the main document body, headers, footers, footnotes, and endnotes. Each difference is shown with the words that were added, removed, or replaced. This is useful for wording changes that would be hard to scan across two long documents.","The result is not a layout comparison. A moved text box, style change, altered comment, tracked-change state, or pagination difference may require a separate review in the document editor."]},{heading:"Keep private revisions local",paragraphs:["The document files and extracted text are processed on the Mac or Windows computer running Diff Anything. The app has no account, cloud comparison service, analytics, or telemetry.","An exported result can still contain private wording. Review any report before deliberately sharing it outside the local environment."]}],faqs:[{question:"Does DOCX comparison include headers and footers?",answer:"Yes. Diff Anything extracts text from the main document body, headers, footers, footnotes, and endnotes."},{question:"Does it compare formatting, comments, or Track Changes?",answer:"No. Document comparison uses extracted text; layout and styling are not compared. Review comments, tracked-change state, and other document-editor metadata separately."},{question:"Are the Word documents uploaded?",answer:"No. The selected documents are extracted and compared locally on the computer."}]},{slug:"openapi-breaking-changes-explained",productSlug:"diffanything",title:"OpenAPI breaking changes explained â local checker and guide",heading:"Understand what an OpenAPI change could break",description:"Learn how to review baseline and candidate OpenAPI contracts, run a free local compatibility check, and continue the detailed review in Diff Anything.",primaryKeyword:"OpenAPI breaking changes explained",dateModified:"2026-08-27",problem:"A source diff can overemphasize reordered YAML while a removed operation, newly required parameter, narrowed enum, or response schema change is buried elsewhere in the contract. Compatibility also depen
10ds on which document is the existing baseline.",solution:"Compare the contract from the perspective of an existing consumer. The free browser checker classifies likely breaking, review-needed, and compatible changes locally; Diff Anything provides the focused desktop workflow for recurring OpenAPI and JSON Schema comparisons.",screenshotIndex:0,screenshot:{src:"/tools/screenshots/openapi-breaking-change-checker.webp",alt:"OpenAPI Breaking Change Checker showing a local consumer compatibility report",width:1600,height:1e3},screenshotCaption:"The separate browser tool turns two pasted or opened contracts into a local compatibility-oriented report.",steps:["Use the existing consumer contract as the baseline.","Open or paste the candidate contract into the local checker.","Review likely breaks first, then verify context-dependent behavior and clients."],detailsLabel:"Compatibility review",stepsHeading:"Read the change in the direction consumers experience it.",resource:{eyebrow:"Free local checker",title:"Run the contract check without leaving this site",description:"The focused tool accepts Swagger 2.0 and OpenAPI 3.0/3.1 JSON or YAML, keeps the specifications in the browser tab, and exports Markdown or JSON reports.",href:"/tools/openapi-breaking-change-checker",label:"Open the breaking-change checker"},sections:[{heading:"Put the existing contract on the baseline side",paragraphs:["The baseline describes what current consumers already depend on. The candidate is the proposed replacement. Reversing them reverses the meaning of removal, addition, narrowing, and new requirements.","Keep both source versions available. A rule classification helps prioritize review; it does not decide whether a product-specific behavior is acceptable."]},{heading:"Review breaking and ambiguous changes separately",paragraphs:["Removed paths, operations, parameters, properties, or enum values can break a consumer. Newly required input and narrower accepted types also deserve immediate attention. Additions are often compatible, while type, schema, security, and response changes can require context-dependent review.","Start with the reported breaking group, then inspect review-needed findings against actual clients and implementation behavior. A clean report cannot prove compatibility beyond the contracts and rules the checker examined."],bullets:["Breaking: a consumer capability or accepted value is removed or newly required.","Review needed: the impact depends on use, semantics, or implementation.","Compatible: the parsed contract change appears additive for existing consumers."]},{heading:"Know the browser checkerâs limits",paragraphs:["The free checker accepts Swagger 2.0 and OpenAPI 3.0/3.1 in JSON or YAML. It resolves internal references, but it does not fetch external references; it reports a warning when they remain outside the comparison.","Schema traversal uses a depth limit of eight. The output is a heuristic compatibility report, so important releases still need client tests and human review of runtime behavior, undocumented expectations, and semantic meaning."]}],faqs:[{question:"Does the free checker upload the API specifications?",answer:"No. Parsing and comparison run in the current browser tab; the specifications are not uploaded to martingruner.com."},{question:"Which specification versions does it accept?",answer:"The browser checker accepts Swagger 2.0 and OpenAPI 3.0 or 3.1 descriptions in JSON or YAML."},{question:"Does a clean report prove the release is safe?",answer:"No. The report is heuristic and limited to the parsed contracts and implemented rules. External references, deep schemas, runtime behavior, client assumptions, and semantic meaning can still require testing and human review."}]},{slug:"diff-json-files",productSlug:"diffanything",title:"Diff JSON files locally on Mac and Windows â Diff Anything",heading:"Compare JSON by structure, not line position",description:"Diff two JSON files locally with semantic paths, typed values, array rules, ignored keys, numeric tolerance, and review state.",primaryKeyword:"diff JSON files",dateModified:"2026-09-09",problem:"Formatting, property order, and large nested objects can bury the JSON changes that matter when a line-based diff treats the document as plain text.",solution:"Diff Anything parses both files and reports stable paths, change types, and typed values. You can add keyed or unordered array rules, ignore expected paths, and apply supported changes in either direction.",screenshotIndex:4,screenshotCaption:"Semantic JSON comparison explains changed paths and values beside the original sources.",steps:["Open the two JSON files.","Choose semantic JSON comparison.","Review, filter, and resolve changed paths."],detailsLabel:"Semantic comparison",stepsHeading:"Cho
10ose the meaning of the comparison before reading the result.",sections:[{heading:"Decide whether formatting is part of the question",paragraphs:["Use a text diff when indentation, whitespace, or exact source lines matter. Use semantic JSON when the review is about keys, paths, typed values, and array membership instead of how the document was serialized.","The same pair can support both questions. Choosing semantic mode does not claim that formatting is irrelevant; it deliberately excludes formatting from that result."],bullets:["Use stable paths to identify nested changes.","Keep typed values visible.","Return to text mode when source formatting matters."]},{heading:"State array and tolerance rules explicitly",paragraphs:["Array order may carry meaning, or identity may come from a key inside each item. Choose keyed or unordered behavior only where the data model supports it, and apply numeric tolerance only to paths where small variation is expected.","Ignored paths should describe known noise, not hide unexplained differences. Save the rules needed to reproduce a recurring comparison."],bullets:["Use keyed arrays when a field identifies each item.","Use unordered arrays only when order is irrelevant.","Keep ignored paths narrow and reviewable."]},{heading:"Resolve paths while retaining the source context",paragraphs:["A structured result should expose the stable path, change type, typed values, severity, and a readable explanation. Keep the original sources available so an individual result can be interpreted in context.","Apply supported changes deliberately in either direction. A semantic diff explains what changed; it does not decide which side is correct."]}],faqs:[{question:"Does semantic JSON comparison ignore formatting?",answer:"Yes. Semantic mode parses the documents and focuses on paths and typed values. Use text mode when whitespace, indentation, or exact line movement is part of the review."},{question:"Can arrays be matched by an identity field?",answer:"Yes. Keyed-array rules can align items by a chosen field, while unordered rules are available when member order genuinely has no meaning."},{question:"Are the JSON files uploaded?",answer:"No. Diff Anything compares selected files and pasted content on the computer rather than sending them to a cloud comparison service."}]},{slug:"compare-openapi-specifications-locally",productSlug:"diffanything",title:"Compare OpenAPI specifications locally â Diff Anything",heading:"Review API compatibility, not YAML movement",description:"Compare OpenAPI and JSON Schema locally, flag likely breaking changes, and keep API contracts off an online comparison service.",primaryKeyword:"compare OpenAPI specifications locally",dateModified:"2026-10-01",problem:"A line diff can make reordered YAML or JSON look important while hiding the contract changes that can break an existing API consumer: removed operations, narrower schemas, changed parameters, or new requirements.",solution:"Diff Anything parses OpenAPI and JSON Schema as contracts, labels likely breaking changes with heuristic rule codes, and shows a breaking-change verdict and count. With Pro on Windows, the CLI and batch manifests run the same comparison in CI and can fail the job only on breaking or unclassified changes.",screenshotIndex:0,screenshotCaption:"Structured comparison keeps compatibility findings connected to the original contract sources.",steps:["Open the baseline and candidate contracts.","Let Auto choose API Schema mode, or select it.","Review the flagged changes first, then check the rest of the result."],detailsLabel:"Contract review",stepsHeading:"Compare the contract that clients depend on.",sections:[{heading:"Name the baseline and candidate correctly",paragraphs:["The baseline is the contract existing consumers already use; the candidate is the proposed replacement. That direction matters because removing an operation or narrowing an accepted value has a different compatibility effect from adding one.","Keep the source versions available during review. A rule match is evidence for a release decision, not a substitute for understanding the affected consumer workflow."]},{heading:"Separate likely breaks from context-dependent changes",paragraphs:["Review removed or newly required contract elements first, then examine changes whose effect depends on consumer behavior or runtime semantics. Compatible additions still deserve review when undocumented behavior or custom validation exists.","The comparison describes the contract it can parse. Runtime behavior, server implementation, and undocumented expectations remain outside that evidence."],bullets:["Start with removed paths, operations, parameters, properties, and enum values.","Review new requirements and narrower types.","Treat semantic behavior as a human review boundary."]},{heading:"Fail a CI job only on breaking changes",paragraphs:["With Pro on Windows, run diff-anything --cli --mode api --fail-
10on breaking, or set failOn: breaking for a case in a batch manifest. Identical or equivalent schemas pass, non-breaking changes are allowed, and the job fails on breaking changes and on changes the rules could not classify. JUnit and SARIF output list each finding with its rule code, such as API001 for a removed operation.","The rules are heuristic: $ref is compared as written rather than resolved, request and response schemas are treated alike, and some breaking changes are not classified, such as a removed components entry, a renamed or relocated parameter, or added additionalProperties: false. Treat a passing check as a first gate, not proof of compatibility, and keep the same baseline direction locally and in CI."]}],faqs:[{question:"Is an OpenAPI diff the same as a text diff?",answer:"No. Contract comparison focuses on parsed operations, parameters, schemas, and compatibility-oriented changes rather than source line movement alone."},{question:"Can the result be used in CI?",answer:"Yes. With Pro on Windows, --fail-on breaking or a batch case with failOn: breaking fails the job only on breaking or unclassified changes, and identical schemas pass. Batch manifests emit JSON, JUnit, or SARIF with each finding's rule code. The rules are heuristic, so contract review is still needed."},{question:"Does the comparison prove runtime compatibility?",answer:"No. Runtime behavior, custom validation, undocumented expectations, and semantic meaning still require human review and testing."}]},...om,...im,{slug:"compare-two-csv-files",productSlug:"diffanything",title:"Compare two CSV files by row and column â Diff Anything",heading:"Compare CSV rows by identity, not position",description:"Compare two CSV files locally with header-aware columns, keyed row matching, ignored columns, case and whitespace options, cell-level changes, and reports.",primaryKeyword:"compare two CSV files",dateModified:"2026-09-09",problem:"One inserted or reordered row can make a line diff report the rest of a CSV as changed even when most records are identical.",solution:"Diff Anything can match CSV rows by chosen key columns and report cell-level changes by column. Saved delimiter, header, ignored-column, case, whitespace, filter, and paging options keep recurring comparisons focused.",screenshotIndex:1,screenshot:{src:"/products/screenshots/diff-anything-csv-1-3.png",alt:"Diff Anything comparing two CSV files with row and cell-level differences",width:2560,height:1834},screenshotCaption:"Keyed rows keep reordered records aligned while cell-level changes remain visible.",steps:["Open the two CSV files.","Choose the column that identifies each row.","Review added, removed, and changed cells."]},{slug:"compare-spreadsheets-different-formats",productSlug:"diffanything",title:"Compare spreadsheets in different formats â Diff Anything",heading:"Compare Excel, ODS, and Numbers workbooks without converting first",description:"Compare stored cell values across different spreadsheet formats locally, including XLSX with ODS or Apple Numbers.",primaryKeyword:"compare spreadsheets in different formats",dateModified:"2026-10-01",problem:"A workbook can move between Excel, LibreOffice, and Apple Numbers during a handoff or migration. Converting both files to one format adds another transformation and a line diff exposes container noise instead of answering whether the stored data changed.",solution:"Diff Anything normalizes sheets and populated cell coordinates across XLS/XLA, XLSX/XLSM/XLAM, XLSB, ODS, and Apple Numbers workbooks. The two formats can differ. A sheet-aware grid connects changed cells with the Differences pane while the files remain on the computer.",screenshotIndex:0,screenshot:{src:"/products/screenshots/diff-anything-spreadsheets-1-3.png",alt:"Diff Anything 1.3 comparing an XLSX workbook with an ODS workbook in a sheet-aware grid",width:1072,height:768},screenshotCaption:"Compare stored values directly across formats; this real XLSX â ODS result keeps changed cells and their coordinates visible.",steps:["Open any two supported workbooks.","Choose a sheet and inspect the aligned values.","Select changed cells and verify excluded workbook properties separately when they matter."],detailsLabel:"Cross-format comparison",stepsHeading:"Compare the data without inventing a conversion step.",sections:[{heading:"Use any supp
10orted format pair",paragraphs:["Compare Excel (XLS, XLSX, XLSM, XLSB, and their templates), OpenDocument (ODS), and Apple Numbers workbooks in any pairing, such as XLSX against ODS or Numbers against XLSX. A CSV or TSV export can be compared with one sheet of a workbook too: the first sheet by default, or the one you choose under Compare with sheet.","Sheets and cell coordinates provide the shared model, so unrelated workbook container structures do not become the result."]},{heading:"Review stored values in context",paragraphs:["Choose a sheet and scan two aligned grids with row numbers and column letters. Selecting a changed cell connects its coordinate to the Differences pane.","Populated rows and columns are virtualized to keep large ranges navigable."]},{heading:"Keep the comparison boundary explicit",paragraphs:["Diff Anything compares stored cell values. It does not compare formulas, formatting, charts, macros, or workbook layout.","A clean value comparison is useful evidence for a data handoff, but it does not prove that calculation logic, styling, automation, print setup, or editing behavior survived the format change."]}],faqs:[{question:"Can I compare an XLSX file directly with ODS or Apple Numbers?",answer:"Yes. Diff Anything supports mixed-format workbook pairs and compares their stored values by sheet and cell coordinate."},{question:"Can I compare a CSV export with the original workbook?",answer:"Yes. Open the CSV or TSV file on one side and the workbook on the other, and they are compared by cell values in PDF / Office mode. The first sheet is used by default; choose another under Compare with sheet. Values are compared as stored text, so 20 and 20.0 or two spellings of the same date count as different."},{question:"Does a clean result mean the workbooks are identical?",answer:"No. It means the compared stored cell values are equivalent under this mode. Formulas, formatting, charts, macros, and workbook layout are not compared."},{question:"Is spreadsheet comparison private?",answer:"Yes. The files are extracted and compared locally; Diff Anything has no account, cloud comparison service, analytics, or telemetry."}]},{slug:"compare-images",productSlug:"diffanything",title:"Compare two images pixel by pixel â Diff Anything",heading:"See exactly where two images differ",description:"Find changes between two images on Mac or Windows. Use overlays, heatmaps, pixel masks, and zoom to inspect the differences in Diff Anything.",primaryKeyword:"compare images",dateModified:"2026-09-09",problem:"Small rendering shifts, color changes, and alignment differences can be difficult to spot by placing two images in separate windows.",solution:"Diff Anything provides side-by-side, overlay, swipe, blink, heatmap, and changed-pixel views. It aligns different dimensions on a shared canvas and reports similarity, error measurements, channel change, and the bounds of the changed area.",screenshotIndex:0,screenshot:{src:"/products/screenshots/diff-anything-image-heatmap-1-3.png",alt:"Diff Anything image heatmap showing changed pixels, similarity, dimensions, alignment, and threshold",width:2560,height:1834},screenshotCaption:"Heatmap makes the changed region visible while exact pixel, similarity, dimension, and error measurements stay beside it.",steps:["Open the two local images.","Choose the visual mode that exposes the suspected change.","Adjust zoom or threshold and inspect the reported changed region and metrics."]},{slug:"compare-pdfs",productSlug:"diffanything",title:"Compare two PDF files locally â Diff Anything",heading:"Compare PDFs visually or by extracted text",description:"Compare two PDFs locally as rendered pages with a visual-match percentage or as extracted text, without uploading either document.",primaryKeyword:"compare PDFs",dateModified:"2026-10-02",problem:"Reading two long PDFs side by side makes wording and layout changes easy to miss. Extracted text can also be incomplete or nonsensical in poorly tagged PDFs, while an online comparison may be inappropriate for private documents.",solution:"Diff Anything separates the two questions. Visual diff raster-compares rendered pages, highlights changed regi
10ons, and reports a per-page visual-match percentage. Extracted text focuses on wording and stays active while you navigate its differences. Neither view is presented as proof of semantic or visual identity beyond what it measures.",screenshotIndex:0,screenshot:{src:"/products/screenshots/diff-anything-pdf-visual-1-3.png",alt:"Diff Anything PDF Visual diff with highlighted rendered-page changes and a visual match percentage",width:2560,height:1834},screenshotCaption:"Visual diff highlights rendered-page changes and reports a per-page match percentage; Extracted text remains a separate wording view.",video:{youtubeId:"t_Nn65Ob6fI",title:"How to Compare Two PDF Files on Mac (and Find Every Change in a Contract)",description:"Compare two versions of a PDF contract on your Mac and see every change: the edited numbers, the removed sentence, and the clause that was added.",uploadDate:"2026-10-02T13:20:00+00:00",duration:"PT1M59S",durationLabel:"1:59",poster:{src:"/products/screenshots/diff-anything-video-compare-pdf-files-mac.jpg",alt:"Diff Anything comparing two versions of a services agreement on a Mac, with page 1 side by side and five changes listed",width:1920,height:1080},caption:"A two-minute walkthrough on a Mac: compare the contract you sent with the one that came back, see each change on its page, and go through them one by one.",chapters:[{name:"The problem",start:0,end:21},{name:"Choose the two PDFs",start:21,end:33},{name:"See every change",start:33,end:52},{name:"Jump to a change",start:52,end:77},{name:"Read the changed wording",start:77,end:88},{name:"Mark changes as reviewed",start:88,end:95},{name:"Word documents",start:95,end:119}]},steps:["Open the two PDF files.","Choose Visual diff for rendered layout or Extracted text for wording.","Review changed regions or wording differences in the selected view and inspect the original documents for properties that view cannot prove."],detailsLabel:"Two review modes",stepsHeading:"Choose the evidence that answers the revision question.",sections:[{heading:"Use Visual diff for rendered pages",paragraphs:["Visual diff rasterizes the pages, highlights changed regions, and reports a per-page visual-match percentage. It can expose layout, image, chart, stamp, and signature-mark appearance changes that extracted text may miss.","The result describes rendered pixels. It does not validate a digital signature, prove document authenticity, or explain the semantic meaning of a visual change."],bullets:["Review changed regions page by page.","Use true visual evidence for scans and artwork.","Treat signature appearance and cryptographic validity as different questions."]},{heading:"Use Extracted text for wording",paragraphs:["Extracted text keeps wording changes navigable across the document without reducing them to page pixels. This is useful when the question is whether clauses, labels, or paragraphs changed.","A PDF may have incomplete or unusual text encoding. Scanned pages without extractable text require OCR, and Diff Anything does not perform OCR, so Visual diff is the appropriate built-in evidence for those pages."]},{heading:"Keep the review local and the conclusion narrow",paragraphs:["Both PDF files are opened and compared on the Mac or Windows computer. Diff Anything has no account, cloud comparison service, analytics, or telemetry.","Use both modes when wording and presentation matter, then inspect the original documents for metadata, attachments, forms, digital-signature validity, or other properties that neither view claims to prove."]}],faqs:[{question:"Which mode should I use for scanned PDFs?",answer:"Use Visual diff to compare the rendered pages. Diff Anything does not perform OCR, so a scanned page without extractable text cannot produce a useful wording comparison."},{question:"Does Visual diff validate digital signatures?",answer:"No. It can reveal a changed rendered signature mark or surrounding page region, but it does not validate cryptographic signatures or document authenticity."},{question:"Are the PDFs uploaded?",answer:"No. The selected PDFs are rendered, extracted, and compared locally on the computer."}]},{slug:"risks-of-online-diff-tools",productSlug:"diffanything",title:"Why online diff tools can expose private data â compare locally",heading:"Your diff should not require giving someone else the files",description:"Online diff tools must receive the content they compare. Learn what that expandsâretention, logs, backups, access, and subprocessorsâand how local comparison avoids the upload.",primaryKeyword:"risks of online diff tools",dateModified:"2026-09-09",problem:"An online diff service must receive the content submitted for comparison. If its retention, request logging, backups, access controls, jurisdiction, or subprocessors are not clear, you cannot independently verify where additional copies may exist or how long they remain. Source code, environment files, logs, customer exports, and unreleased documents can contain secrets or private context that was never meant to leave the computer.",solution:"Diff Anything performs comparisons locally on macOS and Windows and the comparison engine works without an internet connection. Compared files and pasted content are not sent to a cloud comparison service, and the app has no account, analytics, or telemetry. Store builds may separately contact the platform store for product, purchase, and entitlement checksânot to process comparison content.",screenshotIndex:0,screenshot:{src:"/products/screenshots/diff-anything-welcome-1-3.png",alt:"Diff Anything local comparison start screen stating private by default and on-device processing",width:2560,height:1834},screenshotCaption:"Choose files, folders, or pasted content inside a desktop workspace built around on-device processing.",steps:["Identify whether the sources contain secrets, personal data, unreleased work, or private paths.","Keep both sources on the computer and compare them in Diff Anything.","Review any exported report before deliberately sharing it outside the local environment."],sections:[{heading:"An online comparison creates another copy and another trust boundary",paragraphs:["A browser-based comparison cannot process content it never receives. Even when a page says that it does not save files, the submitted text or document still crosses the network and is handled by infrastru
10cture outside your computer.","That matters because diffs often contain more than the line you intended to inspect: nearby source code, environment names, internal URLs, customer records, contract wording, filenames, and unreleased product details can all travel with the comparison."],bullets:["Transmission to the provider","Temporary processing and request logs","Backups, observability systems, and support access","Hosting providers and other subprocessors"]},{heading:"HTTPS protects the trip, not the destination",paragraphs:["Transport encryption is important, but it only protects content while it moves between the browser and the service. The service still has to process the readable input after it arrives.","An online diff tool may be operated safely, but you cannot know that from the upload page or a privacy promise alone. Unless its server-side operation is independently verifiable, you cannot see whether submitted content enters request logs, monitoring systems, backups, staff-accessible tools, or a subprocessor. Using the service therefore means trusting claims you cannot confirm from the interface."]},{heading:"Local comparison removes the upload from the workflow",paragraphs:["Diff Anything reads and compares the selected sources on the Mac or Windows computer running the app. The comparison engine works offline and has no account, cloud comparison service, analytics, or telemetry, so comparison content is not sent to a Diff Anything server.","Local processing is not permission to share carelessly: exported reports can still contain sensitive material. Review an export before sending it, and prefer a synthetic reproduction when asking someone else for help."]},{heading:"The store connection has a narrow, separate purpose",paragraphs:["Signed store builds may contact the Mac App Store or Microsoft Store for product information, purchases, and entitlement checks. Those requests establish access to paid features; they do not send the files, pasted text, folders, images, or documents being compared.","That distinction keeps the privacy claim exact: the app is not necessarily offline at every moment, but the comparison itself is local and has no cloud processing dependency."]}],faqs:[{question:"Are all online diff tools unsafe?",answer:"Not necessarily. An online diff tool may handle submitted data responsibly, but you cannot know that from its interface or privacy promise alone. Once you upload content, you must trust that the provider's actual server code, logs, backups, staff access, and subprocessors match its claims. Diff Anything removes that uncertainty from the comparison itself: the engine runs on your computer, works offline, and does not send the compared content to a Diff Anything server."},{question:"Does HTTPS make an online diff private?",answer:"HTTPS encrypts content in transit. It does not prevent the destination service from reading the submitted content or determine its logging, retention, backup, access, or subprocessor practices."},{question:"Does Diff Anything upload files for comparison?",answer:"No. Files, folders, pasted text, images, and documents are compared on the computer. Diff Anything has no account, cloud comparison service, analytics, or telemetry."},{question:"Does Diff Anything ever use the network?",answer:"Signed store builds may contact the platform store for product, purchase, and entitlement checks. Comparison content is not included in those requests."}]}];function sm(l){return Ch.find(y=>y.slug===l)}function Am(l){return Ch.filter(y=>y.productSlug===l)}function zh(){if(typeof window>"u")return"/";const l=window.__APP_BASE_PATH__??"/";return l.endsWith("/")?l:`${l}/`}function pl(l){return!l.startsWith("/")||l.startsWith("//")?l:`${zh()}${l.slice(1)}`.replace(/\/+/g,"/")}function Si(){const l=zh(),y=window.location.pathname,D=`/${y.startsWith(l)?y.slice(l.length):y.replace(/^\//,"")}`.replace(/\/+/g,"/").replace(/\/index\.html$/,"/");return D.length>1?D.replace(/\/$/,""):D}function Xo(l,y=new WeakSet){if(!(!l||typeof l!="object"||y.has(l))){y.add(l);for(const[D,j]of Object.entries(l))typeof j=="string"&&/^\/(?:apps|products|tools)\//.test(j)?l[D]=pl(j):j&&typeof j=="object"&&Xo(j,y)}}
10var rm=Et((l=>{var y=Symbol.for("react.transitional.element"),D=Symbol.for("react.fragment");function j(p,G,H){var L=null;if(H!==void 0&&(L=""+H),G.key!==void 0&&(L=""+G.key),"key"in G){H={};for(var W in G)W!=="key"&&(H[W]=G[W])}else H=G;return G=H.ref,{$$typeof:y,type:p,key:L,ref:G!==void 0?G:null,props:H}}l.Fragment=D,l.jsx=j,l.jsxs=j})),lm=Et(((l,y)=>{y.exports=rm()})),O=lm();function me({href:l,...y}){return(0,O.jsx)("a",{...y,href:pl(l)})}function cm(){return(0,O.jsxs)("footer",{className:"site-footer",children:[(0,O.jsxs)("nav",{className:"shell footer-guides","aria-label":"Popular guides",children:[(0,O.jsx)("span",{children:"Popular guides"}),(0,O.jsx)(me,{href:"/compare-folders-windows",children:"Compare folders on Windows"}),(0,O.jsx)(me,{href:"/compare-folders-mac",children:"Compare folders on Mac"}),(0,O.jsx)(me,{href:"/app-store-screenshot-sizes",children:"App Store screenshot sizes"}),(0,O.jsx)(me,{href:"/manage-docker-compose-windows",children:"Manage Docker Compose on Windows"})]}),(0,O.jsxs)("div",{className:"shell footer-base",children:[(0,O.jsxs)("span",{children:["© ",new Date().getFullYear()," Martin Grüner"]}),(0,O.jsxs)("nav",{"aria-label":"Footer navigation",children:[(0,O.jsx)(me,{href:"/projects",children:"Productivity"}),(0,O.jsx)(me,{href:"/apps",children:"Apps & games"}),(0,O.jsx)(me,{href:"/tools",children:"Tools"}),(0,O.jsx)(me,{href:"/guides",children:"Guides"}),(0,O.jsx)(me,{href:"/blog",children:"Blog"}),(0,O.jsx)(me,{href:"/about",children:"About"})]})]})]})}function dm(){const l=(0,Vo.useRef)(null),y=()=>l.current?.removeAttribute("open");return(0,O.jsx)("header",{className:"site-header",children:(0,O.jsxs)("div",{className:"shell header-inner",children:[(0,O.jsx)(me,{className:"site-mark",href:"/","aria-label":"martingruner.com home",children:(0,O.jsx)("span",{children:"martingruner.com"})}),(0,O.jsxs)("nav",{className:"desktop-nav","aria-label":"Primary navigation",children:[(0,O.jsx)(me,{href:"/projects",children:"Productivity"}),(0,O.jsx)(me,{href:"/apps",children:"Apps & games"}),(0,O.jsx)(me,{href:"/tools",children:"Tools"}),(0,O.jsx)(me,{href:"/guides",children:"Guides"}),(0,O.jsx)(me,{href:"/blog",children:"Blog"}),(0,O.jsx)(me,{href:"/about",children:"About"})]}),(0,O.jsxs)("details",{className:"mobile-nav",ref:l,onKeyDown:D=>{D.key==="Escape"&&(y(),l.current?.querySelector("summary")?.focus())},children:[(0,O.jsxs)("summary",{"aria-label":"Toggle navigation",children:[(0,O.jsx)("span",{children:"Menu"}),(0,O.jsxs)("i",{"aria-hidden":"true",children:[(0,O.jsx)("b",{}),(0,O.jsx)("b",{})]})]}),(0,O.jsxs)("nav",{"aria-label":"Mobile navigation",onClick:y,children:[(0,O.jsxs)(me,{href:"/",children:[(0,O.jsxs)("span",{children:["Home",(0,O.jsx)("em",{children:"Selected work and software"})]}),(0,O.jsx)("b",{"aria-hidden":"true",children:"â"})]}),(0,O.jsxs)(me,{href:"/projects",children:[(0,O.jsxs)("span",{children:["Productivity",(0,O.jsx)("em",{children:"Desktop tools for focused work"})]}),(0,O.jsx)("b",{"aria-hidden":"true",children:"â"})]}),(0,O.jsxs)(me,{href:"/apps",children:[(0,O.jsxs)("span",{children:["Apps & games",(0,O.jsx)("em",{children:"Games and mobile software"})]}),(0,O.jsx)("b",{"aria-hidden":"true",children:"â"})]}),(0,O.jsxs)(me,{href:"/tools",children:[(0,O.jsxs)("span",{children:["Browser tools",(0,O.jsx)("em",{children:"Free checks for app releases"})]}),(0,O.jsx)("b",{"aria-hidden":"true",children:"â"})]}),(0,O.jsxs)(me,{href:"/guides",children:[(0,O.jsxs)("span",{children:["Guides",(0,O.jsx)("em",{children:"Setup, workflows, and troubleshooting"})]}),(0,O.jsx)("b",{"aria-hidden":"true",children:"â"})]}),(0,O.jsxs)(me,{href:"/blog",children:[(0,O.jsxs)("span",{children:["Blog",(0,O.jsx)("em",{children:"Articles on software, tools, and craft"})]}),(0,O.jsx)("b",{"aria-hidden":"true",children:"â"})]}),(0,O.jsxs)(me,{href:"/about",children:[(0,O.jsxs)("span",{children:["About",(0,O.jsx)("em",{children:"A little about the person behind them"})]}),(0,O.jsx)("b",{"aria-hidden":"true",children:"â"})]})]})]})]})})}function um({page:l}){return(0,O.jsxs)(O.Fragment,{children:[(0,O.jsx)("a",{className:"skip-link",href:"#main-content",children:"Skip to content"}),(0,O.jsx)(dm,{}),(0,O.jsx)("div",{id:"main-content",children:l}),(0,O.jsx)(cm,{})]})}var hm="modulepreload",pm=function(l,y){return new URL(l,y).href},kh={},Y=function(y,D,j){let p=Promise.resolve();if(D&&D.length>0){let R=function(A){return Promise.all(A.map(q=>Promise.resolve(q).then(M=>({status:"fulfilled",value:M}),M=>({status:"rejected",reason:M}))))};const H=document.getElementsByTagName("link"),L=document.querySelector("meta[property=csp-nonce]"),W=L?.nonce||L?.getAttribute("nonce");p=R(D.map(A=>{if(A=pm(A,j),A in kh)return;kh[A]=!0;const q=A.endsWith(".css"),M=q?'[rel="stylesheet"]':"";if(j)for(let we=H.length-1;we>=0;we--){const Ce=H[we];if(Ce.href===A&&(!q||Ce.rel==="stylesheet"))return}else if(document.querySelector(`link[href="${A}"]${M}`))return;const ge=document.createElement("link");if(ge.rel=q?"stylesheet":hm,q||(ge.as="script"),ge.crossOrigin="",ge.href=A,W&&ge.setAttribute("nonce",W),document.head.appendChild(ge),q)return new Promise((we,Ce)=>
10{ge.addEventListener("load",we),ge.addEventListener("error",()=>Ce(new Error(`Unable to preload CSS for ${A}`)))})}))}function G(H){const L=new Event("vite:preloadError",{cancelable:!0});if(L.payload=H,window.dispatchEvent(L),!L.defaultPrevented)throw H}return p.then(H=>{for(const L of H||[])L.status==="rejected"&&G(L.reason);return y().catch(G)})};function fm(l){if(l==="/")return{load:()=>Y(()=>import("./page-BbATUUq_2.js"),__vite__mapDeps([0,1,2,3,4,5,6]),import.meta.url)};if(l==="/projects")return{load:()=>Y(()=>import("./page-D3tzLdRT2.js"),__vite__mapDeps([7,2,3,4]),import.meta.url)};if(l==="/apps")return{load:()=>Y(()=>import("./page-rOHKpkQp.js"),__vite__mapDeps([8,1,2,3,4,5]),import.meta.url)};if(l==="/guides")return{load:()=>Y(()=>import("./page-BWazwq462.js"),__vite__mapDeps([9,5,4,6,10]),import.meta.url)};if(l==="/tools")return{load:()=>Y(()=>import("./page-GgpmDQvt.js"),__vite__mapDeps([11,5,6]),import.meta.url)};if(l==="/tools/store-screenshot-validator")return{load:()=>Y(()=>import("./page-DN7HECEk.js"),__vite__mapDeps([12,13,5,4,14]),import.meta.url)};if(l==="/tools/openapi-breaking-change-checker")return{load:()=>Y(()=>import("./page-aMT2ivW6.js"),__vite__mapDeps([15,13,5]),import.meta.url)};if(l==="/tools/windows-project-workflow-checklist")return{load:()=>Y(()=>import("./page-BQaQc-1T.js"),__vite__mapDeps([16,5]),import.meta.url)};if(l==="/blog/diff-anything-1-6")return{load:()=>Y(()=>import("./page-D5CMou42.js"),__vite__mapDeps([17,18,3,5,4,19]),import.meta.url)};if(l==="/blog/testdock-1-1")return{load:()=>Y(()=>import("./page-DqtENlFm.js"),__vite__mapDeps([20,18,3,5,4,19]),import.meta.url)};if(l==="/blog/devdock-1-4")return{load:()=>Y(()=>import("./page-5JNJwDZJ.js"),__vite__mapDeps([21,18,3,5,4,19]),import.meta.url)};if(l==="/blog/screen-studio-kit-1-4")return{load:()=>Y(()=>import("./page-B_jFKV15.js"),__vite__mapDeps([22,18,3,5,4,19,23]),import.meta.url)};if(l==="/projects/screenshot-studio/gallery")return{load:()=>Y(()=>import("./page-D1iOvcOf2.js"),__vite__mapDeps([24,5,4,19,3,25,23]),import.meta.url)};if(l==="/blog")return{load:()=>Y(()=>import("./page-PtiCR39N.js"),__vite__mapDeps([26,27,5,4]),import.meta.url)};const y=l.match(/^\/blog\/page\/(\d+)$/);if(y)return{load:()=>Y(()=>import("./page-DWRU8cHK.js"),__vite__mapDeps([28,27,5,4,29]),import.meta.url),params:{page:y[1]}};if(l==="/blog/diff-anything-1-5")return{load:()=>Y(()=>import("./page-DCAhkQVV.js"),__vite__mapDeps([30,18,3,5,4,19]),import.meta.url)};if(l==="/blog/devdock-1-3")return{load:()=>Y(()=>import("./page-B8MQI2G5.js"),__vite__mapDeps([31,18,3,5,4]),import.meta.url)};if(l==="/blog/diff-anything-1-4")return{load:()=>Y(()=>import("./page-Dc2C4Gen.js"),__vite__mapDeps([32,18,3,5,4]),import.meta.url)};if(l==="/blog/screen-studio-kit-1-3")return{load:()=>Y(()=>import("./page-gD6pY-UC.js"),__vite__mapDeps([33,18,3,5,4]),import.meta.url)};if(l==="/blog/diff-anything-1-3")return{load:()=>Y(()=>import("./page-D-0KNlbH.js"),__vite__mapDeps([34,18,3,5,4]),import.meta.url)};if(l==="/blog/app-store-screenshots-five-languages-cost")return{load:()=>Y(()=>import("./page-DWDhwi5m.js"),__vite__mapDeps([35,18,3,5,4,19]),import.meta.url)};if(l==="/blog/devdock-for-vibe-coders")return{load:()=>Y(()=>import("./page-DGY_ojyu.js"),__vite__mapDeps([36,18,3,5,4]),import.meta.url)};if(l==="/blog/diff-anything-1-2")return{load:()=>Y(()=>import("./page-DZ_PwzVU.js"),__vite__mapDeps([37,18,3,5,4]),import.meta.url)};if(l==="/blog/diff-anything-for-law-firms")return{load:()=>Y(()=>import("./page-re5DLdnK.js"),__vite__mapDeps([38,18,3,5,4,19]),import.meta.url)};if(l==="/blog/diff-anything-1-1")return{load:()=>Y(()=>import("./page-BsZc9abh.js"),__vite__mapDeps([39,18,3,5,4]),import.meta.url)};if(l==="/blog/screen-studio-kit-1-2")return{load:()=>Y(()=>import("./page-C2AUgZQe.js"),__vite__mapDeps([40,18,3,5,4]),import.meta.url)};if(l==="/blog/screen-studio-kit-1-1")return{load:()=>Y(()=>import("./page-CdY0NgXd.js"),__vite__mapDeps([41,18,3,5,4]),import.meta.url)};if(l==="/blog/two-free-browser-tools-for-app-releases")return{load:()=>Y(()=>import("./page-CFdmvn1-.js"),__vite__mapDeps([42,18,3,5,4]),import.meta.url)};if(l==="/blog/devdock-1-1")return{load:()=>Y(()=>import("./page-CsJU0bxx.js"),__vite__mapDeps([43,18,3,5,4]),import.meta.url)};if(l==="/about")return{load:()=>Y(()=>import("./page-EhYnvULF.js"),__vite__mapDeps([44,5,4]),import.meta.url)};
10const D=l.split("/").filter(Boolean).map(decodeURIComponent);if(D.length===1&&sm(D[0]))return{load:()=>Y(()=>import("./problem-page-B4VKKm67.js"),__vite__mapDeps([45,5,2,3,4,19,14,29]),import.meta.url),params:{problem:D[0]}};if(D[0]==="apps"&&D.length===2)return{load:()=>Y(()=>import("./page-B5H19AH2.js"),__vite__mapDeps([46,5,2,3,47,19,4,29]),import.meta.url),params:{slug:D[1]}};if(D[0]!=="projects"||!D[1])return null;const j={slug:D[1]};return D.length===2?{load:()=>Y(()=>import("./page-D7ey4yfX2.js"),__vite__mapDeps([48,5,2,3,49,4,19,25,50,51,10,29]),import.meta.url),params:j}:D.length===3&&D[2]==="manual"?{load:()=>Y(()=>import("./page-DvGHw14l.js"),__vite__mapDeps([52,5,47,19,3,49,4,53,2,54,50,29]),import.meta.url),params:j}:D.length===3&&D[2]==="capabilities"?{load:()=>Y(()=>import("./page-zyxVXkCa2.js"),__vite__mapDeps([55,5,47,19,3,49,4,53,2,54,50,51,10,29]),import.meta.url),params:j}:D.length===4&&D[2]==="capabilities"?{load:()=>Y(()=>import("./page-DhiwkSSM2.js"),__vite__mapDeps([56,5,2,3,47,19,49,4,54,50,51,57,29]),import.meta.url),params:{...j,feature:D[3]}}:D.length===3&&D[2]==="use-cases"?{load:()=>Y(()=>import("./page-Ceyh7fzM.js"),__vite__mapDeps([58,5,47,19,3,49,4,53,2,54,50,51,57,29]),import.meta.url),params:j}:D.length===4&&D[2]==="use-cases"?{load:()=>Y(()=>import("./page-BkKatb1b2.js"),__vite__mapDeps([59,5,2,3,47,19,49,4,54,50,51,57,29]),import.meta.url),params:{...j,useCase:D[3]}}:D.length===3&&D[2]==="tools"?{load:()=>Y(()=>import("./page-Dl-TWnG02.js"),__vite__mapDeps([60,5,47,19,3,49,4,53,2,54,50,10,29]),import.meta.url),params:j}:D.length===4&&D[2]==="tools"?{load:()=>Y(()=>import("./page-CF8Ztc5C2.js"),__vite__mapDeps([61,5,2,3,47,19,49,4,54,51,10,29]),import.meta.url),params:{...j,tool:D[3]}}:D.length===4&&D[2]==="guides"?{load:()=>Y(()=>import("./page-DgnOfE-y2.js"),__vite__mapDeps([62,5,47,19,3,4,54,50,57,51,29]),import.meta.url),params:{...j,guide:D[3]}}:null}function mm(l){const y=l?.title;return typeof y=="string"?y:typeof y?.absolute=="string"?y.absolute:typeof y?.default=="string"?y.default:"Martin Grüner â Independent software, apps & games"}var gm="https://martingruner.com";function Yo(l,y){const D=l instanceof URL?l.href:typeof l=="string"?l:y;return new URL(D,gm).href}function _e(l,y,D){let j=document.querySelector(`meta[${l}="${y}"]`);if(D===void 0||D===""){j?.remove();return}j||(j=document.createElement("meta"),j.setAttribute(l,y),document.head.append(j)),j.content=String(D)}function Sh(l){const y=(Array.isArray(l)?l:l?[l]:[])[0];return typeof y=="string"||y instanceof URL?{url:y}:y&&typeof y=="object"?y:{url:"/og.webp",width:1200,height:630,alt:"Independent software, apps, and games by Martin Grüner"}}function vm(l,y){document.title=mm(l);const D=typeof l?.description=="string"?l.description:void 0;_e("name","description",D),_e("name","keywords",Array.isArray(l?.keywords)?l.keywords.filter(ge=>typeof ge=="string").join(", "):typeof l?.keywords=="string"?l.keywords:void 0);const j=l?.robots;_e("name","robots",j&&typeof j=="object"?`${j.index===!1?"noindex":"index"}, ${j.follow===!1?"nofollow":"follow"}`:typeof j=="string"?j:void 0);const p=l?.alternates?.canonical,G=Yo(p,y);let H=document.querySelector('link[rel="canonical"]');H||(H=document.createElement("link"),H.rel="canonical",document.head.append(H)),H.href=G;const L=l?.openGraph??{},W=Sh(L.images),R=typeof L.title=="string"?L.title:document.title,A=typeof L.description=="string"?L.description:D;_e("property","og:type",typeof L.type=="string"?L.type:"website"),_e("property","og:site_name",typeof L.siteName=="string"?L.siteName:"martingruner.com"),_e("property","og:title",R),_e("property","og:description",A),_e("property","og:url",Yo(L.url,G)),_e("property","og:image",Yo(W.url,"/og.webp")),_e("property","og:image:width",W.width),_e("property","og:image:height",W.height),_e("property","og:image:alt",W.alt),_e("property","article:published_time",L.publishedTime),_e("property","article:modified_time",L.modifiedTime);const q=l?.twitter??{},M=Sh(q.images??L.images);_e("name","twitter:card",typeof q.card=="string"?q.card:"summary_large_image"),_e("name","twitter:title",typeof q.title=="string"?q.title:R),_e("name","twitter:description",typeof q.description=="str
10ing"?q.description:A),_e("name","twitter:image",Yo(M.url,W.url??"/og.webp"))}async function Oh(l){const y=fm(l);if(!y)return(await Y(async()=>{const{default:p}=await import("./not-found-Ddz6EBKZ.js");return{default:p}},[],import.meta.url)).default();const D=await y.load(),j={params:Promise.resolve(y.params??{})};return vm(D.generateMetadata?await D.generateMetadata(j):D.metadata,l),await D.default(j)}function dl({initialPage:l}){const[y,D]=(0,Vo.useState)(l??null);return(0,Vo.useEffect)(()=>{let j=!0,p=Si();async function G(){try{const L=await Oh(Si());j&&(D(L),p=Si())}catch(L){if(L instanceof Error&&L.name==="RedirectError"&&"location"in L){window.history.replaceState({},"",pl(String(L.location))),await G();return}const W=(await Y(async()=>{const{default:R}=await import("./not-found-Ddz6EBKZ.js");return{default:R}},[],import.meta.url)).default;j&&D((0,O.jsx)(W,{}))}}const H=()=>{Si()!==p&&G()};return l===void 0&&G(),window.addEventListener("popstate",H),window.addEventListener("app:navigate",H),()=>{j=!1,window.removeEventListener("popstate",H),window.removeEventListener("app:navigate",H)}},[l]),(0,Vo.useLayoutEffect)(()=>{if(!(!y||!window.location.hash))try{document.getElementById(decodeURIComponent(window.location.hash.slice(1)))?.scrollIntoView({behavior:"instant"})}catch{}},[y]),(0,O.jsx)(um,{page:y})}Xo(Dh);Xo(xh);Xo(hl);var jh=document.getElementById("root");if(!jh)throw new Error("React root element is missing");async function ym(l){try{const y=await Oh(Si());l.hasChildNodes()?(0,cl.hydrateRoot)(l,(0,O.jsx)(dl,{initialPage:y})):(0,cl.createRoot)(l).render((0,O.jsx)(dl,{initialPage:y}))}catch{(0,cl.createRoot)(l).render((0,O.jsx)(dl,{}))}}ym(jh);export{ul as _,sm as a,nm as c,hl as d,bm as f,wm as g,Dh as h,pl as i,km as l,xh as m,lm as n,Am as o,am as p,zh as r,Ch as s,me as t,Sm as u,Jf as v};
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.