1"use strict";(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[2872],{1792:(e,t,r)=>{r.d(t,{AI:()=>p,BJ:()=>d,CJ:()=>n,MA:()=>o,NP:()=>f,Ul:()=>m,Xb:()=>i,Xv:()=>l,aF:()=>h,d3:()=>u,iH:()=>a,jH:()=>c,r8:()=>s}),r(41463);let a="/extn",n="/help",s="/privacy",o="/partners",i="utmax-dismiss-extension-promo",l="utmax-extension-promo-last-shown-at",d=216e5,c="utmax-live-sync-last-shown-at",u=36e5,m="https://chromewebstore.google.com/detail/utmax/fdbaildkfgcbljnijofhbkgfdihnbico",x="utmax_session_start_time",f=6e5;function h(){try{let e=sessionStorage.getItem(x);e||(e=Date.now().toString(),sessionStorage.setItem(x,e));let t=parseInt(e,10);return isNaN(t)?f:Math.max(0,Date.now()-t)}catch{return f}}function p(){return h()>=f}},28674:(e,t,r)=>{r.d(t,{Z:()=>i});var a=r(12115),n=r(73321),s=r(48164),o=r(47753);function i(e){let t=(0,n.usePathname)(),r=e?.enabled!==!1,i=e?.allowEmbed===!0,[l,d]=(0,a.useState)("idle"),[c,u]=(0,a.useState)(null),[m,x]=(0,a.useState)(!1);(0,a.useEffect)(()=>{if(!r||t.startsWith("/embed")&&!i)return void d("idle");let e=!1;async function a(){d("checking");for(let t=0;t<5;t++){if(e)return;let r=await (0,s.pingExtension)(1200);if(e)return;if(r.reachable){x(!0);let e=r.version?.trim()||null;u(e),d((0,o.uq)(e??void 0)?"ok":"outdated");return}t<4&&await new Promise(e=>window.setTimeout(e,250))}x(!1),u(null),d("missing")}a();let n=(0,s.subscribeExtensionReady)(()=>{x(!0),a()});function l(){a()}window.addEventListener("focus",l);let c=window.setTimeout(()=>{e||a()},3e4);return()=>{e=!0,n(),window.removeEventListener("focus",l),window.clearTimeout(c)}},[i,r,t]);let f=m||"ok"===l||"outdated"===l;return{status:l,extensionVersion:c,latestVersion:o.FF,hasExtension:f,isOutdated:"outdated"===l,isMissing:"missing"===l&&!f}}},31408:(e,t,r)=>{r.d(t,{AdvancedViewProvider:()=>i,H:()=>l});var a=r(95155),n=r(12115);let s="utmax-advanced-view",o=(0,n.createContext)({advancedView:!0,setAdvancedView:()=>void 0});function i({children:e}){let[t,r]=(0,n.useState)(!1);(0,n.useEffect)(()=>{try{r("true"===localStorage.getItem(s))}catch{}},[]);let l=(0,n.useMemo)(()=>({advancedView:t,setAdvancedView(e){r(e);try{localStorage.setItem(s,String(e))}catch{}}}),[t]);return(0,a.jsx)(o.Provider,{value:l,children:e})}function l(){return(0,n.useContext)(o)}},33261:(e,t,r)=>{r.d(t,{E:()=>f});var a=r(95155),n=r(12115),s=r(47650),o=r(73321),i=r(11012),l=r(32061),d=r(9005),c=r(28674),u=r(1792),m=r(47753),x=r(96395);function f({compact:e}){let t=(0,o.usePathname)(),{extensionVersion:r,latestVersion:h,hasExtension:p,isOutdated:b,isMissing:g,status:y}=(0,c.Z)({allowEmbed:!0===e}
1),[w,v]=(0,n.useState)(!1),[k,j]=(0,n.useState)(!1),[M,N]=(0,n.useState)(!1),[A,E]=(0,n.useState)(!1),[S,C]=(0,n.useState)(!1),[P,_]=(0,n.useState)(!1),[D,T]=(0,n.useState)(null);(0,n.useEffect)(()=>{if((0,u.AI)())return void C(!0);let e=setTimeout(()=>{C(!0)},Math.max(100,u.NP-(0,u.aF)()));return()=>clearTimeout(e)},[]),(0,n.useEffect)(()=>{let e=document.createElement("div");return e.setAttribute("data-extension-promo-portal",""),document.body.appendChild(e),T(e),_(!0),()=>{e.remove(),T(null)}},[]),(0,n.useEffect)(()=>{try{v("1"===localStorage.getItem(u.Xb)||"1"===sessionStorage.getItem(u.Xb));let e=Number(localStorage.getItem(u.Xv));j(Number.isFinite(e)&&e>0&&Date.now()-e<u.BJ)}catch{}N(!0),E((0,x.i_)())},[]),(0,n.useLayoutEffect)(()=>{function e(){E(!0),v(!0);try{sessionStorage.setItem(u.Xb,"1")}catch{}}function t(){E(!1)}return window.addEventListener(x.l0,e),window.addEventListener(x.EQ,t),()=>{window.removeEventListener(x.l0,e),window.removeEventListener(x.EQ,t)}},[]);let I=g&&!e&&M&&!w&&!k&&!A&&!(0,x.i_)()&&S&&t!==u.iH;function L(){v(!0);try{localStorage.setItem(u.Xb,"1"),sessionStorage.setItem(u.Xb,"1")}catch{}}if((0,n.useEffect)(()=>{if(!I)return;try{sessionStorage.setItem(u.Xb,"1"),localStorage.setItem(u.Xv,Date.now().toString())}catch{}let e=document.body.style.overflow;return document.body.style.overflow="hidden",()=>{document.body.style.overflow=e}},[I]),"checking"===y||"idle"===y||"ok"===y||p&&!b||t===u.iH)return null;let R=r?(0,m.o9)(r):"unknown",O=(0,m.o9)(h),X={href:u.Ul,target:"_blank",rel:"noopener noreferrer"};return b?e?(0,a.jsxs)("div",{className:"border border-slate-300 px-2 py-1.5 text-xs text-slate-900 dark:border-slate-600 dark:text-slate-100",children:["Extension ",R," is outdated (need ",O,")."," ",(0,a.jsx)("a",{...X,className:"font-semibold underline",children:"Update"})]}):(0,a.jsxs)("div",{role:"alert",className:"mb-6 flex gap-3 rounded-xl border border-amber-400 bg-amber-50 px-4 py-3 text-sm text-amber-950 dark:border-amber-600 dark:bg-amber-950/40 dark:text-amber-100",children:[(0,a.jsx)(i.A,{className:"mt-0.5 h-5 w-5 shrink-0 text-amber-600 dark:text-amber-400"}),(0,a.jsxs)("div",{children:[(0,a.jsx)("p",{className:"font-semibold",children:"Extension update required"}),(0,a.jsxs)("p",{className:"mt-1 text-amber-900 dark:text-amber-200",children:["Your browser extension is ",R,", but this app needs ",O," ","or newer. Sync and the overlay may not work until you update."]}),(0,a.jsxs)("p",{className:"mt-2 text-amber-900 dark:text-amber-200",children:[(0,a.jsx)("a",{...X,className:"font-semibold text-max-primary underline hover:opacity-90",children:"Download the latest extension"}),", then reload it on your browser's extensions page, then refresh this tab."]})]})]}):I&&P&&D?(0,s.createPortal)((0,a.jsx)("div",{role:"dialog","aria-modal":"true","aria-labelledby":"extension-promo-title",className:"fixed inset-0 z-[1000] flex flex-col bg-slate-950/70 backdrop-blur-sm",children:(0,a.jsxs)("div",{className:"flex min-h-0 flex-1 flex-col bg-white text-slate-900 dark:bg-slate-950 dark:text-white sm:m-4 sm:rounded-2xl sm:border sm:border-slate-200 sm:shadow-2xl dark:sm:border-slate-700",children:[(0,a.jsxs)("div",{className:"flex items-center justify-between gap-3 border-b border-slate-200 px-5 py-4 dark:border-slate-800",children:[(0,a.jsxs)("div",{className:"flex items-center gap-2.5",children:[(0,a.jsx)(l.A,{className:"h-6 w-6 shrink-0 text-max-primary"}),(0,a.jsx)("h2",{id:"extension-promo-title",className:"text-lg font-bold tracking-tight",children:"Want the browser extension?"})]}),(0,a.jsx)("button",{type:"button",onClick:L,title:"Dismiss","aria-label":"Dismiss extension message",className:"rounded-lg p-2 text-slate-500 hover:bg-slate-100 hover:text-slate-900 dark:text-slate-400 dark:hover:bg-slate-800 dark:hover:text-white",children:(0,a.jsx)(d.A,{className:"h-5 w-5"})})]}),(0,a.jsxs)("div",{className:"flex flex-1 flex-col justify-center gap-6 overflow-y-auto px-5 py-8 sm:px-10 sm:py-12",children:[(0,a.jsx)("p",{className:"max-w-2xl text-base leading-relaxed text-slate-600 dark:text-slate-300",children:"It's optional for planning here, but it makes registration much easier on the official registration site:"}),(0,a.jsxs)("ul",{className:"max-w-2xl list-disc space-y-3 pl-6 text-base leading-relaxed text-slate-700 dark:text-slate-200",children:[(0,a.jsxs)("li",{children:["Open Planning & Reg Time in a floating panel on"," ",(0,a.jsx)("code",{className:"rounded bg-slate-100 px-1.5 py-0.5 text-sm dark:bg-slate-800",children:"registrar.utexas.edu"})," ","and"," ",(0,a.jsx)("code",{className:"rounded bg-slate-100 px-1.5 py-0.5 text-sm dark:bg-slate-800",children:"utdirect.utexas.edu"})," ","pages"]}),(0,a.jsx)("li",{children:"Keep your schedules and registration picks in sync between this site and the registration portal"}),(0,a.jsx)("li",{children:"Jump back to your plans without leaving the registration page"})]}),(0,a.jsxs)("div",{className:"flex flex-wrap items-center gap-3 pt-2",children:[(0,a.jsx)("a",{...X,className:"inline-flex items-center justify-center rounded-lg bg-max-primary px-5 py-2.5 text-sm font-bold text-white shadow-sm transition hover:opacity-90",children:"Install the extension"}),(0,a.jsx)("button",{type:"button",onClick:L,className:"rounded-lg px-4 py-2.5 text-sm font-semibold text-slate-600 hover:bg-slate-100 dar
1k:text-slate-300 dark:hover:bg-slate-800",children:"Not now"})]})]})]})}),D):null}},47753:(e,t,r)=>{r.d(t,{FF:()=>n,hl:()=>a,o9:()=>i,uq:()=>o});let a="2.9.0",n="2.9.0";function s(e){let t=e.trim().replace(/^v/i,"").match(/^(\d+)\.(\d+)\.(\d+)/);return t?[Number(t[1]),Number(t[2]),Number(t[3])]:null}function o(e){return!!e?.trim()&&function(e,t){let r=s(e)??[0,0,0],a=s(t)??[0,0,0];for(let e=0;e<3;e++)if(r[e]!==a[e])return r[e]-a[e];return 0}(e,"1.0.0")>=0}function i(e){let t=e.trim().replace(/^v/i,"");return t?`v${t}`:"unknown"}},48723:(e,t,r)=>{r.d(t,{A:()=>u});var a=r(95155),n=r(12115),s=r(12363),o=r(64577),i=r(9005),l=r(45911),d=r(29722),c=r(56290);function u({value:e,onChange:t,options:r,placeholder:m="Select...",className:x="",disabled:f=!1,multiple:h=!1}){let[p,b]=(0,n.useState)(!1),g=(0,n.useRef)(null),y=(0,n.useRef)(null),w=Array.isArray(e)?e:e?[e]:[],v=r.filter(e=>""!==e.value&&w.includes(e.value));return(0,n.useEffect)(()=>{function e(e){g.current&&e.target instanceof Node&&!g.current.contains(e.target)&&b(!1)}return p&&document.addEventListener("mousedown",e),()=>{document.removeEventListener("mousedown",e)}},[p]),(0,n.useEffect)(()=>{let e=y.current;e&&(p?l.os.fromTo(e,{height:0,opacity:0},{height:"auto",opacity:1,duration:.25,ease:"power2.out"}):l.os.to(e,{height:0,opacity:0,duration:.15,ease:"power2.in"}))},[p]),(0,a.jsxs)("div",{ref:g,className:(0,d.A)("relative w-full",x),children:[(0,a.jsxs)("button",{type:"button",disabled:f,onClick:()=>b(!p),className:"flex w-full items-center justify-between rounded-none border border-slate-200 bg-white px-2.5 py-1.5 text-xs text-slate-900 transition-colors focus:border-max-primary focus:outline-none focus:ring-2 focus:ring-max-primary/25 dark:border-slate-700 dark:bg-slate-800 dark:text-white h-full min-h-[34px]",children:[(0,a.jsx)("span",{className:(0,d.A)("truncate text-left",0===w.length&&!e&&"opacity-60"),children:function(){if(!h){let t=r.find(t=>t.value===e);return t?t.label:m}if(0===v.length){let e=r.find(e=>""===e.value);return e?e.label:m}return 1===v.length?v[0].label:(0,a.jsxs)("span",{className:"flex items-center gap-1.5 truncate",children:[(0,a.jsx)("span",{className:"rounded bg-max-primary/15 px-1.5 py-0.5 text-[11px] font-bold text-max-primary",children:v.length}),(0,a.jsx)("span",{className:"truncate",children:v.map(e=>e.label).join(", ")})]})}()}),(0,a.jsx)(c.$,{icon:s.A,className:(0,d.A)("ml-2 h-3.5 w-3.5 shrink-0 opacity-50 transition-transform duration-300",p&&"rotate-180")})]}),(0,a.jsxs)("div",{ref:y,className:"absolute left-0 top-[calc(100%+4px)] z-[500] overflow-hidden rounded-none border border-gray-200 bg-white shadow-xl dark:border-gray-700 dark:bg-gray-800 min-w-full w-max max-w-[18rem]",style:{height:0,opacity:0,pointerEvents:p?"auto":"none"},children:[(0,a.jsx)("ul",{className:"max-h-56 overflow-y-auto py-1 scrollbar-none",children:r.map(e=>{let r=""===e.value?0===w.length:w.includes(e.value);return(0,a.jsx)("li",{children:(0,a.jsxs)("button",{type:"button",className:(0,d.A)("flex w-full items-center justify-between gap-3 px-3 py-1.5 text-left text-xs transition-colors hover:bg-slate-100 dark:hover:bg-slate-700",r?"font-semibold text-max-primary dark:text-max-accent bg-max-primary/5 dark:bg-max-primary/15":"text-slate-900 dark:text-white"),onClick:()=>(function(e){if(!h){t(e),b(!1);return}""===e?t([]):t(w.includes(e)?w.filter(t=>t!==e):[...w,e])})(e.value),children:[(0,a.jsxs)("div",{className:"flex items-center gap-2 truncate",children:[h&&""!==e.value&&(0,a.jsx)("span",{className:(0,d.A)("flex h-3.5 w-3.5 shrink-0 items-center justify-center rounded-sm border transition-colors",r?"border-max-primary bg-max-primary text-white":"border-slate-300 bg-white dark:border-slate-600 dark:bg-slate-800"),children:r&&(0,a.jsx)(c.$,{icon:o.A,className:"h-3 w-3 stroke-[3]"})}),(0,a.jsx)("span",{className:"truncate",children:e.label})]}),!h&&r&&(0,a.jsx)(c.$,{icon:o.A,className:"h-3.5 w-3.5 shrink-0 text-max-primary"})]})},e.value||"__any")})}),h&&w.length>0&&(0,a.jsxs)("div",{className:"border-t border-slate-200 px-2 py-1 dark:border-slate-700 bg-slate-50 dark:bg-slate-800/50 flex items-center justify-between",children:[(0,a.jsxs)("span",{className:"text-[10px] font-semibold text-slate-500 dark:text-slate-400",children:[w.length," selected"]}),(0,a.jsxs)("button",{type:"button",onClick:()=>t([]),className:"text-[10px] font-bold text-max-primary hover:underline flex items-center gap-0.5",children:[(0,a.jsx)(c.$,{icon:i.A,className:"h-3 w-3"}),"Reset"]})]})]})]})}},56290:(e,t,r)=>{r.d(t,{$:()=>o});var a=r(95155),n=r(12115),s=r(45911);function o({icon:e,...t}){let r=(0,n.useRef)(null);return(0,n.useEffect)(()=>{let e=r.current;if(!e)return;s.os.set(e,{transformOrigin:"center center"});let t=()=>{s.os.to(e,{scale:1.15,rotation:5,duration:.3,ease:"back.out(1.7)"})},a=()=>{s.os.to(e,{scale:1,rotation:0,duration:.3,ease:"power2.out"})},n=()=>{s.os.to(e,{scale:.9,duration:.1,ease:"power1.inOut"})},o=()=>{s.os.to(e,{scale:1.15,duration:.2,ease:"back.out(1.7)"})};return e.addEventListener("mouseenter",t),e.addEventListener("mouseleave",a),e.addEventListener("mousedown",n),e.addEventListener("mouseup",o),()=>{s.os.killTweensOf(e),e.removeEventListener("mouseenter",t),e.removeEventListener("mouseleave",a),e.removeEventListener("mousedown",n),e.removeEventListener("mouseup",o)}},[]),(0,a.jsx)(e,{ref:r,...t})}},63187:(e,t,r)=>{r.d(t,{K:()=>n});var a=r(95155);function n({as:e,children:t,...r}){return(0,a.jsx)(e??"div",{suppressHydrationWarning:!0,...r,children:t})}},71899:(e,t,r)=>{r.d(t,{g:()=>s});var a=r(12115),n=r(45911);function s(e,t,r,s){let[o,i]=(0,a.useState)(e),l=(0,a.useRef)(s);(0,a.useEffect)(()=>{l.current=s},[s]);let d=(0,a.useRef)(null);return(0,a.useEffect)(()=>(d.current=n.os.context(()=>{}),()=>d.current?.revert()),[]),(0,a.useEffect)(()=>{d.current&&(e?(i(!0),requestAnimationFrame(()=>{t.current&&r.current&&d.current.add(()=>{n.os.fromTo(t.current,{opacity:0}
1,{opacity:1,duration:.2,ease:"power2.out"}),n.os.fromTo(r.current,{opacity:0,scale:.9,y:20},{opacity:1,scale:1,y:0,duration:.4,ease:"back.out(1.2)"})})})):o&&t.current&&r.current?d.current.add(()=>{n.os.to(r.current,{opacity:0,scale:.95,y:-10,duration:.5,ease:"power3.inOut"}),n.os.to(t.current,{opacity:0,duration:.5,ease:"power3.inOut",delay:.05,onComplete:()=>{i(!1),l.current?.()}})}):o&&(i(!1),l.current?.()))},[e,o,t,r]),o}},96395:(e,t,r)=>{r.d(t,{EQ:()=>o,I5:()=>f,TJ:()=>u,bs:()=>d,i_:()=>l,ky:()=>m,l0:()=>n,tI:()=>c,ub:()=>s,xT:()=>i});var a=r(1792);let n="utmax:prepare-demo",s="utmax:start-demo",o="utmax:demo-ended";function i(e){window.__utmaxDemoActive=e,e||(window.__utmaxDemoStartPending=!1),window.dispatchEvent(new CustomEvent(e?n:o))}function l(){return!!(window.__utmaxDemoActive||window.__utmaxDemoStartPending)}function d(){try{sessionStorage.setItem(a.Xb,"1")}catch{}i(!0),window.__utmaxDemoStartPending=!0,window.setTimeout(()=>{window.dispatchEvent(new CustomEvent(s))},0)}function c(){return!!window.__utmaxDemoStartPending&&(window.__utmaxDemoStartPending=!1,!0)}let u={startupDelayMs:200,startupDelayReducedMs:80,preClickDelayMs:600,preClickDelayReducedMs:50,clickPulseMs:280,clickPulseReducedMs:80,postActionPollIntervalMs:50,postActionPollMaxMs:800,focusDelayMs:50},m=[{id:"intro-tabs",target:"tab-nav",title:"Welcome to UTMAX",body:"Plan your semester in two views: Course Search for discovery and Planning for schedule building.",durationMs:1e4},{id:"goto-search",target:"tab-search",title:"Course Search",body:"Browse the full catalog by course code or unique section number.",durationMs:1e4,action:"click",waitAfterClickMs:350},{id:"search-surface",target:"search-surface",fallbackTarget:"course-search-view",title:"Discover sections",body:"Search and compare sections. Rows show meeting times, historical GPA, and RMP ratings when available.",durationMs:1e4},{id:"catalog-filters",target:"catalog-filters",fallbackTarget:"course-search-view",title:"Filter & sort",body:"Narrow by status, instruction mode, core requirements, and conflicts. Sort to find the best fit.",durationMs:1e4},{id:"goto-planning",target:"tab-planning",title:"Planning tab",body:"Switch to Planning to build conflict-free schedules from your course list.",durationMs:1e4,action:"click",waitAfterClickMs:350},{id:"schedule-calendar",target:"schedule-calendar",title:"Schedule calendar",body:"Your generated schedule appears on a weekday grid. Pin sections or reroll for alternatives.",durationMs:1e4},{id:"schedule-reroll",target:"schedule-reroll",title:"Reroll options",body:"Use Prev and Next to cycle through valid schedule combinations without conflicts.",durationMs:1e4},{id:"open-add-menu",target:"toolbar-add",targetAfterAction:"add-course-menu",title:"Add courses",body:"The Add toolbar opens quick actions for adding courses to your list.",durationMs:1e4,action:"click",waitAfterClickMs:300},{id:"open-course-picker",target:"add-course-menu",targetAfterAction:"course-picker",title:"Add Course",body:"Pick a course from the catalog search overlay â no typing needed during this demo.",durationMs:1e4,action:"click",waitAfterClickMs:400},{id:"schedule-preferences",target:"schedule-preferences",fallbackTarget:"schedule-calendar",title:"Time & gap preferences",body:"Set your preferred class hours, minimum gap between classes, and days on campus.",durationMs:1e4},{id:"schedule-block-zones",target:"schedule-calendar",title:"Time Blocking",body:"Click and drag on any empty space in the calendar to block off time for work or extracurriculars. UTMAX will warn you if you schedule a course over a block.",durationMs:1e4},{id:"open-layout",target:"toolbar-layout",targetAfterAction:"layout-criteria",title:"Layout ranking",body:"Open Layout to rank schedule alternatives by your priorities.",durationMs:1e4,action:"click",waitAfterClickMs:300},{id:"schedule-toolbar",target:"schedule-toolbar",title:"Save & share",body:"Save schedules, import from .ics, export your calendar, and prepare for registration.",durationMs:1e4},{id:"schedule-feed",target:"toolbar-sync-button",title:"Sync Calendar",body:"Get a live feed URL to sync your schedule directly with Apple Calendar or Google Calendar.",durationMs:1e4}
1,{id:"open-hamburger",target:"hamburger-menu-button",targetAfterAction:"hamburger-menu",title:"More tools",body:"The menu links to the registration simulator, help guides, live seat sync, and this guided demo.",durationMs:1e4,action:"click",waitAfterClickMs:350},{id:"finish",title:"You're ready!",body:"Search courses, build schedules, and register smarter. You're all set!",durationMs:1e4}];function x(e,t={}){let r=t.reduceMotion?u.preClickDelayReducedMs:u.preClickDelayMs,a="click"===e.action||"close-if-open"===e.action&&(t.guardOpen??!0),n=e.durationMs;return a&&(n+=r+(e.waitAfterClickMs??0)),n}!function(e=m){e.reduce((e,t)=>e+t.durationMs+("click"===t.action||"close-if-open"===t.action?t.waitAfterClickMs??0:0),0)}(),function(e=m,t={}){let r=t.reduceMotion??!1;r?u.startupDelayReducedMs:u.startupDelayMs,function(e,t={}){let r=t.guardOpenForClose??!0;e.reduce((e,a)=>e+x(a,{reduceMotion:t.reduceMotion,guardOpen:"close-if-open"===a.action?r:void 0}),0)}(e,{reduceMotion:r,guardOpenForClose:!0})}(),function(e=m,t={}){let r=t.reduceMotion??!1;r?u.startupDelayReducedMs:u.startupDelayMs,e.reduce((e,t)=>e+function(e,t={}){let r=x(e,t);return("click"===e.action||"close-if-open"===e.action&&(t.guardOpen??!0))&&e.targetAfterAction?r+u.postActionPollMaxMs:r}(t,{reduceMotion:r,guardOpen:"close-if-open"===t.action||void 0}),0)}();let f=12e3}}]);
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.