CINXE.COM
For these little robots, two heads are better than one - Princeton Engineering
<!DOCTYPE html> <html lang="en-US"> <head> <meta charset="UTF-8" /><script type="text/javascript">(window.NREUM||(NREUM={})).init={privacy:{cookies_enabled:true},ajax:{deny_list:["bam.nr-data.net"]},distributed_tracing:{enabled:true}};(window.NREUM||(NREUM={})).loader_config={agentID:"1588608049",accountID:"3348991",trustKey:"66686",xpid:"VwUDWV9aCRABUVNbDgUPUlMF",licenseKey:"NRJS-b00d4b4e7850ab82d90",applicationID:"1529948474"};;/*! For license information please see nr-loader-spa-1.274.0.min.js.LICENSE.txt */ (()=>{var e,t,r={8122:(e,t,r)=>{"use strict";r.d(t,{a:()=>i});var n=r(944);function i(e,t){try{if(!e||"object"!=typeof e)return(0,n.R)(3);if(!t||"object"!=typeof t)return(0,n.R)(4);const r=Object.create(Object.getPrototypeOf(t),Object.getOwnPropertyDescriptors(t)),o=0===Object.keys(r).length?e:r;for(let a in o)if(void 0!==e[a])try{if(null===e[a]){r[a]=null;continue}Array.isArray(e[a])&&Array.isArray(t[a])?r[a]=Array.from(new Set([...e[a],...t[a]])):"object"==typeof e[a]&&"object"==typeof t[a]?r[a]=i(e[a],t[a]):r[a]=e[a]}catch(e){(0,n.R)(1,e)}return r}catch(e){(0,n.R)(2,e)}}},2555:(e,t,r)=>{"use strict";r.d(t,{Vp:()=>c,fn:()=>s,x1:()=>u});var n=r(384),i=r(8122);const o={beacon:n.NT.beacon,errorBeacon:n.NT.errorBeacon,licenseKey:void 0,applicationID:void 0,sa:void 0,queueTime:void 0,applicationTime:void 0,ttGuid:void 0,user:void 0,account:void 0,product:void 0,extra:void 0,jsAttributes:{},userAttributes:void 0,atts:void 0,transactionName:void 0,tNamePlain:void 0},a={};function s(e){try{const t=c(e);return!!t.licenseKey&&!!t.errorBeacon&&!!t.applicationID}catch(e){return!1}}function c(e){if(!e)throw new Error("All info objects require an agent identifier!");if(!a[e])throw new Error("Info for ".concat(e," was never set"));return a[e]}function u(e,t){if(!e)throw new Error("All info objects require an agent identifier!");a[e]=(0,i.a)(t,o);const r=(0,n.nY)(e);r&&(r.info=a[e])}},9417:(e,t,r)=>{"use strict";r.d(t,{D0:()=>h,gD:()=>g,xN:()=>p});var n=r(993);const i=e=>{if(!e||"string"!=typeof e)return!1;try{document.createDocumentFragment().querySelector(e)}catch{return!1}return!0};var o=r(2614),a=r(944),s=r(384),c=r(8122);const u="[data-nr-mask]",d=()=>{const e={mask_selector:"*",block_selector:"[data-nr-block]",mask_input_options:{color:!1,date:!1,"datetime-local":!1,email:!1,month:!1,number:!1,range:!1,search:!1,tel:!1,text:!1,time:!1,url:!1,week:!1,textarea:!1,select:!1,password:!0}};return{ajax:{deny_list:void 0,block_internal:!0,enabled:!0,harvestTimeSeconds:10,autoStart:!0},distributed_tracing:{enabled:void 0,exclude_newrelic_header:void 0,cors_use_newrelic_header:void 0,cors_use_tracecontext_headers:void 0,allowed_origins:void 0},feature_flags:[],generic_events:{enabled:!0,harvestTimeSeconds:30,autoStart:!0},harvest:{tooManyRequestsDelay:60},jserrors:{enabled:!0,harvestTimeSeconds:10,autoStart:!0},logging:{enabled:!0,harvestTimeSeconds:10,autoStart:!0,level:n.p_.INFO},metrics:{enabled:!0,autoStart:!0},obfuscate:void 0,page_action:{enabled:!0},page_view_event:{enabled:!0,autoStart:!0},page_view_timing:{enabled:!0,harvestTimeSeconds:30,autoStart:!0},performance:{capture_marks:!1,capture_measures:!1},privacy:{cookies_enabled:!0},proxy:{assets:void 0,beacon:void 0},session:{expiresMs:o.wk,inactiveMs:o.BB},session_replay:{autoStart:!0,enabled:!1,harvestTimeSeconds:60,preload:!1,sampling_rate:10,error_sampling_rate:100,collect_fonts:!1,inline_images:!1,fix_stylesheets:!0,mask_all_inputs:!0,get mask_text_selector(){return e.mask_selector},set mask_text_selector(t){i(t)?e.mask_selector="".concat(t,",").concat(u):""===t||null===t?e.mask_selector=u:(0,a.R)(5,t)},get block_class(){return"nr-block"},get ignore_class(){return"nr-ignore"},get mask_text_class(){return"nr-mask"},get block_selector(){return e.block_selector},set block_selector(t){i(t)?e.block_selector+=",".concat(t):""!==t&&(0,a.R)(6,t)},get mask_input_options(){return e.mask_input_options},set mask_input_options(t){t&&"object"==typeof t?e.mask_input_options={...t,password:!0}:(0,a.R)(7,t)}},session_trace:{enabled:!0,harvestTimeSeconds:10,autoStart:!0},soft_navigations:{enabled:!0,harvestTimeSeconds:10,autoStart:!0},spa:{enabled:!0,harvestTimeSeconds:10,autoStart:!0},ssl:void 0,user_actions:{enabled:!0}}},l={},f="All configuration objects require an agent identifier!";function h(e){if(!e)throw new Error(f);if(!l[e])throw new Error("Configuration for ".concat(e," was never set"));return l[e]}function p(e,t){if(!e)throw new Error(f);l[e]=(0,c.a)(t,d());const r=(0,s.nY)(e);r&&(r.init=l[e])}function g(e,t){if(!e)throw new Error(f);var r=h(e);if(r){for(var n=t.split("."),i=0;i<n.length-1;i++)if("object"!=typeof(r=r[n[i]]))return;r=r[n[n.length-1]]}return r}},5603:(e,t,r)=>{"use strict";r.d(t,{a:()=>c,o:()=>s});var n=r(384),i=r(8122);const o={accountID:void 0,trustKey:void 0,agentID:void 0,licenseKey:void 0,applicationID:void 0,xpid:void 0},a={};function s(e){if(!e)throw new Error("All loader-config objects require an agent identifier!");if(!a[e])throw new Error("LoaderConfig for ".concat(e," was never set"));return a[e]}function c(e,t){if(!e)throw new Error("All loader-config objects require an agent identifier!");a[e]=(0,i.a)(t,o);const r=(0,n.nY)(e);r&&(r.loader_config=a[e])}},3371:(e,t,r)=>{"use strict";r.d(t,{V:()=>f,f:()=>l});var n=r(8122),i=r(384),o=r(6154),a=r(9324);let s=0;const c={buildEnv:a.F3,distMethod:a.Xs,version:a.xv,originTime:o.WN},u={customTransaction:void 0,disabled:!1,isolatedBacklog:!1,loaderType:void 0,maxBytes:3e4,onerror:void 0,ptid:void 0,releaseIds:{},appMetadata:{},session:void 0,denyList:void 0,timeKeeper:void 0,obfuscator:void 0},d={};function l(e){if(!e)throw new Error("All runtime objects require an agent identifier!");if(!d[e])throw new Error("Runtime for ".concat(e," was never set"));return d[e]}function f(e,t){if(!e)throw new Error("All runtime objects require an agent identifier!");d[e]={...(0,n.a)(t,u),...c},Object.hasOwnProperty.call(d[e],"harvestCount")||Object.defineProperty(d[e],"harvestCount",{get:()=>++s});const r=(0,i.nY)(e);r&&(r.runtime=d[e])}},9324:(e,t,r)=>{"use strict";r.d(t,{F3:()=>i,Xs:()=>o,Yq:()=>a,xv:()=>n});const n="1.274.0",i="PROD",o="CDN",a="^2.0.0-alpha.17"},6154:(e,t,r)=>{"use strict";r.d(t,{A4:()=>s,OF:()=>d,RI:()=>i,WN:()=>h,bv:()=>o,gm:()=>a,lR:()=>f,m:()=>u,mw:()=>c,sb:()=>l});var n=r(1863);const i="undefined"!=typeof window&&!!window.document,o="undefined"!=typeof WorkerGlobalScope&&("undefined"!=typeof self&&self instanceof WorkerGlobalScope&&self.navigator instanceof WorkerNavigator||"undefined"!=typeof globalThis&&globalThis instanceof WorkerGlobalScope&&globalThis.navigator instanceof WorkerNavigator),a=i?window:"undefined"!=typeof WorkerGlobalScope&&("undefined"!=typeof self&&self instanceof WorkerGlobalScope&&self||"undefined"!=typeof globalThis&&globalThis instanceof WorkerGlobalScope&&globalThis),s="complete"===a?.document?.readyState,c=Boolean("hidden"===a?.document?.visibilityState),u=""+a?.location,d=/iPad|iPhone|iPod/.test(a.navigator?.userAgent),l=d&&"undefined"==typeof SharedWorker,f=(()=>{const e=a.navigator?.userAgent?.match(/Firefox[/\s](\d+\.\d+)/);return Array.isArray(e)&&e.length>=2?+e[1]:0})(),h=Date.now()-(0,n.t)()},7295:(e,t,r)=>{"use strict";r.d(t,{Xv:()=>a,gX:()=>i,iW:()=>o});var n=[];function i(e){if(!e||o(e))return!1;if(0===n.length)return!0;for(var t=0;t<n.length;t++){var r=n[t];if("*"===r.hostname)return!1;if(s(r.hostname,e.hostname)&&c(r.pathname,e.pathname))return!1}return!0}function o(e){return void 0===e.hostname}function a(e){if(n=[],e&&e.length)for(var t=0;t<e.length;t++){let r=e[t];if(!r)continue;0===r.indexOf("http://")?r=r.substring(7):0===r.indexOf("https://")&&(r=r.substring(8));const i=r.indexOf("/");let o,a;i>0?(o=r.substring(0,i),a=r.substring(i)):(o=r,a="");let[s]=o.split(":");n.push({hostname:s,pathname:a})}}function s(e,t){return!(e.length>t.length)&&t.indexOf(e)===t.length-e.length}function c(e,t){return 0===e.indexOf("/")&&(e=e.substring(1)),0===t.indexOf("/")&&(t=t.substring(1)),""===e||e===t}},1687:(e,t,r)=>{"use strict";r.d(t,{Ak:()=>c,Ze:()=>l,x3:()=>u});var n=r(7836),i=r(3606),o=r(860),a=r(2646);const s={};function c(e,t){const r={staged:!1,priority:o.P3[t]||0};d(e),s[e].get(t)||s[e].set(t,r)}function u(e,t){e&&s[e]&&(s[e].get(t)&&s[e].delete(t),h(e,t,!1),s[e].size&&f(e))}function d(e){if(!e)throw new Error("agentIdentifier required");s[e]||(s[e]=new Map)}function l(e="",t="feature",r=!1){if(d(e),!e||!s[e].get(t)||r)return h(e,t);s[e].get(t).staged=!0,f(e)}function f(e){const t=Array.from(s[e]);t.every((([e,t])=>t.staged))&&(t.sort(((e,t)=>e[1].priority-t[1].priority)),t.forEach((([t])=>{s[e].delete(t),h(e,t)})))}function h(e,t,r=!0){const o=e?n.ee.get(e):n.ee,s=i.i.handlers;if(!o.aborted&&o.backlog&&s){if(r){const e=o.backlog[t],r=s[t];if(r){for(let t=0;e&&t<e.length;++t)p(e[t],r);Object.entries(r).forEach((([e,t])=>{Object.values(t||{}).forEach((t=>{t[0]?.on&&t[0]?.context()instanceof a.y&&t[0].on(e,t[1])}))}))}}o.isolatedBacklog||delete s[t],o.backlog[t]=null,o.emit("drain-"+t,[])}}function p(e,t){var r=e[1];Object.values(t[r]||{}).forEach((t=>{var r=e[0];if(t[0]===r){var n=t[1],i=e[3],o=e[2];n.apply(i,o)}}))}},7836:(e,t,r)=>{"use strict";r.d(t,{P:()=>c,ee:()=>u});var n=r(384),i=r(8990),o=r(3371),a=r(2646),s=r(5607);const c="nr@context:".concat(s.W),u=function e(t,r){var n={},s={},d={},l=!1;try{l=16===r.length&&(0,o.f)(r).isolatedBacklog}catch(e){}var f={on:p,addEventListener:p,removeEventListener:function(e,t){var r=n[e];if(!r)return;for(var i=0;i<r.length;i++)r[i]===t&&r.splice(i,1)},emit:function(e,r,n,i,o){!1!==o&&(o=!0);if(u.aborted&&!i)return;t&&o&&t.emit(e,r,n);for(var a=h(n),c=g(e),d=c.length,l=0;l<d;l++)c[l].apply(a,r);var p=v()[s[e]];p&&p.push([f,e,r,a]);return a},get:m,listeners:g,context:h,buffer:function(e,t){const r=v();if(t=t||"feature",f.aborted)return;Object.entries(e||{}).forEach((([e,n])=>{s[n]=t,t in r||(r[t]=[])}))},abort:function(){f._aborted=!0,Object.keys(f.backlog).forEach((e=>{delete f.backlog[e]}))},isBuffering:function(e){return!!v()[s[e]]},debugId:r,backlog:l?{}:t&&"object"==typeof t.backlog?t.backlog:{},isolatedBacklog:l};return Object.defineProperty(f,"aborted",{get:()=>{let e=f._aborted||!1;return e||(t&&(e=t.aborted),e)}}),f;function h(e){return e&&e instanceof a.y?e:e?(0,i.I)(e,c,(()=>new a.y(c))):new a.y(c)}function p(e,t){n[e]=g(e).concat(t)}function g(e){return n[e]||[]}function m(t){return d[t]=d[t]||e(f,t)}function v(){return f.backlog}}(void 0,"globalEE"),d=(0,n.Zm)();d.ee||(d.ee=u)},2646:(e,t,r)=>{"use strict";r.d(t,{y:()=>n});class n{constructor(e){this.contextId=e}}},9908:(e,t,r)=>{"use strict";r.d(t,{d:()=>n,p:()=>i});var n=r(7836).ee.get("handle");function i(e,t,r,i,o){o?(o.buffer([e],i),o.emit(e,t,r)):(n.buffer([e],i),n.emit(e,t,r))}},3606:(e,t,r)=>{"use strict";r.d(t,{i:()=>o});var n=r(9908);o.on=a;var i=o.handlers={};function o(e,t,r,o){a(o||n.d,i,e,t,r)}function a(e,t,r,i,o){o||(o="feature"),e||(e=n.d);var a=t[o]=t[o]||{};(a[r]=a[r]||[]).push([e,i])}},3878:(e,t,r)=>{"use strict";function n(e,t){return{capture:e,passive:!1,signal:t}}function i(e,t,r=!1,i){window.addEventListener(e,t,n(r,i))}function o(e,t,r=!1,i){document.addEventListener(e,t,n(r,i))}r.d(t,{DD:()=>o,jT:()=>n,sp:()=>i})},5607:(e,t,r)=>{"use strict";r.d(t,{W:()=>n});const n=(0,r(9566).bz)()},9566:(e,t,r)=>{"use strict";r.d(t,{LA:()=>s,ZF:()=>c,bz:()=>a,el:()=>u});var n=r(6154);const i="xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx";function o(e,t){return e?15&e[t]:16*Math.random()|0}function a(){const e=n.gm?.crypto||n.gm?.msCrypto;let t,r=0;return e&&e.getRandomValues&&(t=e.getRandomValues(new Uint8Array(30))),i.split("").map((e=>"x"===e?o(t,r++).toString(16):"y"===e?(3&o()|8).toString(16):e)).join("")}function s(e){const t=n.gm?.crypto||n.gm?.msCrypto;let r,i=0;t&&t.getRandomValues&&(r=t.getRandomValues(new Uint8Array(e)));const a=[];for(var s=0;s<e;s++)a.push(o(r,i++).toString(16));return a.join("")}function c(){return s(16)}function u(){return s(32)}},2614:(e,t,r)=>{"use strict";r.d(t,{BB:()=>a,H3:()=>n,g:()=>u,iL:()=>c,tS:()=>s,uh:()=>i,wk:()=>o});const n="NRBA",i="SESSION",o=144e5,a=18e5,s={STARTED:"session-started",PAUSE:"session-pause",RESET:"session-reset",RESUME:"session-resume",UPDATE:"session-update"},c={SAME_TAB:"same-tab",CROSS_TAB:"cross-tab"},u={OFF:0,FULL:1,ERROR:2}},1863:(e,t,r)=>{"use strict";function n(){return Math.floor(performance.now())}r.d(t,{t:()=>n})},7485:(e,t,r)=>{"use strict";r.d(t,{D:()=>i});var n=r(6154);function i(e){if(0===(e||"").indexOf("data:"))return{protocol:"data"};try{const t=new URL(e,location.href),r={port:t.port,hostname:t.hostname,pathname:t.pathname,search:t.search,protocol:t.protocol.slice(0,t.protocol.indexOf(":")),sameOrigin:t.protocol===n.gm?.location?.protocol&&t.host===n.gm?.location?.host};return r.port&&""!==r.port||("http:"===t.protocol&&(r.port="80"),"https:"===t.protocol&&(r.port="443")),r.pathname&&""!==r.pathname?r.pathname.startsWith("/")||(r.pathname="/".concat(r.pathname)):r.pathname="/",r}catch(e){return{}}}},944:(e,t,r)=>{"use strict";function n(e,t){"function"==typeof console.debug&&console.debug("New Relic Warning: https://github.com/newrelic/newrelic-browser-agent/blob/main/docs/warning-codes.md#".concat(e),t)}r.d(t,{R:()=>n})},5284:(e,t,r)=>{"use strict";r.d(t,{t:()=>c,B:()=>s});var n=r(7836),i=r(6154);const o="newrelic";const a=new Set,s={};function c(e,t){const r=n.ee.get(t);s[t]??={},e&&"object"==typeof e&&(a.has(t)||(r.emit("rumresp",[e]),s[t]=e,a.add(t),function(e={}){try{i.gm.dispatchEvent(new CustomEvent(o,{detail:e}))}catch(e){}}({loaded:!0})))}},8990:(e,t,r)=>{"use strict";r.d(t,{I:()=>i});var n=Object.prototype.hasOwnProperty;function i(e,t,r){if(n.call(e,t))return e[t];var i=r();if(Object.defineProperty&&Object.keys)try{return Object.defineProperty(e,t,{value:i,writable:!0,enumerable:!1}),i}catch(e){}return e[t]=i,i}},6389:(e,t,r)=>{"use strict";function n(e,t=500,r={}){const n=r?.leading||!1;let i;return(...r)=>{n&&void 0===i&&(e.apply(this,r),i=setTimeout((()=>{i=clearTimeout(i)}),t)),n||(clearTimeout(i),i=setTimeout((()=>{e.apply(this,r)}),t))}}function i(e){let t=!1;return(...r)=>{t||(t=!0,e.apply(this,r))}}r.d(t,{J:()=>i,s:()=>n})},3304:(e,t,r)=>{"use strict";r.d(t,{A:()=>o});var n=r(7836);const i=()=>{const e=new WeakSet;return(t,r)=>{if("object"==typeof r&&null!==r){if(e.has(r))return;e.add(r)}return r}};function o(e){try{return JSON.stringify(e,i())??""}catch(e){try{n.ee.emit("internal-error",[e])}catch(e){}return""}}},5289:(e,t,r)=>{"use strict";r.d(t,{GG:()=>o,sB:()=>a});var n=r(3878);function i(){return"undefined"==typeof document||"complete"===document.readyState}function o(e,t){if(i())return e();(0,n.sp)("load",e,t)}function a(e){if(i())return e();(0,n.DD)("DOMContentLoaded",e)}},384:(e,t,r)=>{"use strict";r.d(t,{NT:()=>o,US:()=>d,Zm:()=>a,bQ:()=>c,dV:()=>s,nY:()=>u,pV:()=>l});var n=r(6154),i=r(1863);const o={beacon:"bam.nr-data.net",errorBeacon:"bam.nr-data.net"};function a(){return n.gm.NREUM||(n.gm.NREUM={}),void 0===n.gm.newrelic&&(n.gm.newrelic=n.gm.NREUM),n.gm.NREUM}function s(){let e=a();return e.o||(e.o={ST:n.gm.setTimeout,SI:n.gm.setImmediate,CT:n.gm.clearTimeout,XHR:n.gm.XMLHttpRequest,REQ:n.gm.Request,EV:n.gm.Event,PR:n.gm.Promise,MO:n.gm.MutationObserver,FETCH:n.gm.fetch,WS:n.gm.WebSocket}),e}function c(e,t){let r=a();r.initializedAgents??={},t.initializedAt={ms:(0,i.t)(),date:new Date},r.initializedAgents[e]=t}function u(e){let t=a();return t.initializedAgents?.[e]}function d(e,t){a()[e]=t}function l(){return function(){let e=a();const t=e.info||{};e.info={beacon:o.beacon,errorBeacon:o.errorBeacon,...t}}(),function(){let e=a();const t=e.init||{};e.init={...t}}(),s(),function(){let e=a();const t=e.loader_config||{};e.loader_config={...t}}(),a()}},2843:(e,t,r)=>{"use strict";r.d(t,{u:()=>i});var n=r(3878);function i(e,t=!1,r,i){(0,n.DD)("visibilitychange",(function(){if(t)return void("hidden"===document.visibilityState&&e());e(document.visibilityState)}),r,i)}},8139:(e,t,r)=>{"use strict";r.d(t,{u:()=>f});var n=r(7836),i=r(3434),o=r(8990),a=r(6154);const s={},c=a.gm.XMLHttpRequest,u="addEventListener",d="removeEventListener",l="nr@wrapped:".concat(n.P);function f(e){var t=function(e){return(e||n.ee).get("events")}(e);if(s[t.debugId]++)return t;s[t.debugId]=1;var r=(0,i.YM)(t,!0);function f(e){r.inPlace(e,[u,d],"-",p)}function p(e,t){return e[1]}return"getPrototypeOf"in Object&&(a.RI&&h(document,f),h(a.gm,f),h(c.prototype,f)),t.on(u+"-start",(function(e,t){var n=e[1];if(null!==n&&("function"==typeof n||"object"==typeof n)){var i=(0,o.I)(n,l,(function(){var e={object:function(){if("function"!=typeof n.handleEvent)return;return n.handleEvent.apply(n,arguments)},function:n}[typeof n];return e?r(e,"fn-",null,e.name||"anonymous"):n}));this.wrapped=e[1]=i}})),t.on(d+"-start",(function(e){e[1]=this.wrapped||e[1]})),t}function h(e,t,...r){let n=e;for(;"object"==typeof n&&!Object.prototype.hasOwnProperty.call(n,u);)n=Object.getPrototypeOf(n);n&&t(n,...r)}},3434:(e,t,r)=>{"use strict";r.d(t,{Jt:()=>o,YM:()=>c});var n=r(7836),i=r(5607);const o="nr@original:".concat(i.W);var a=Object.prototype.hasOwnProperty,s=!1;function c(e,t){return e||(e=n.ee),r.inPlace=function(e,t,n,i,o){n||(n="");const a="-"===n.charAt(0);for(let s=0;s<t.length;s++){const c=t[s],u=e[c];d(u)||(e[c]=r(u,a?c+n:n,i,c,o))}},r.flag=o,r;function r(t,r,n,s,c){return d(t)?t:(r||(r=""),nrWrapper[o]=t,function(e,t,r){if(Object.defineProperty&&Object.keys)try{return Object.keys(e).forEach((function(r){Object.defineProperty(t,r,{get:function(){return e[r]},set:function(t){return e[r]=t,t}})})),t}catch(e){u([e],r)}for(var n in e)a.call(e,n)&&(t[n]=e[n])}(t,nrWrapper,e),nrWrapper);function nrWrapper(){var o,a,d,l;try{a=this,o=[...arguments],d="function"==typeof n?n(o,a):n||{}}catch(t){u([t,"",[o,a,s],d],e)}i(r+"start",[o,a,s],d,c);try{return l=t.apply(a,o)}catch(e){throw i(r+"err",[o,a,e],d,c),e}finally{i(r+"end",[o,a,l],d,c)}}}function i(r,n,i,o){if(!s||t){var a=s;s=!0;try{e.emit(r,n,i,t,o)}catch(t){u([t,r,n,i],e)}s=a}}}function u(e,t){t||(t=n.ee);try{t.emit("internal-error",e)}catch(e){}}function d(e){return!(e&&"function"==typeof e&&e.apply&&!e[o])}},9300:(e,t,r)=>{"use strict";r.d(t,{T:()=>n});const n=r(860).K7.ajax},3333:(e,t,r)=>{"use strict";r.d(t,{TZ:()=>n,Zp:()=>i,mq:()=>s,nf:()=>a,qN:()=>o});const n=r(860).K7.genericEvents,i=["auxclick","click","copy","keydown","paste","scrollend"],o=["focus","blur"],a=4,s=1e3},6774:(e,t,r)=>{"use strict";r.d(t,{T:()=>n});const n=r(860).K7.jserrors},993:(e,t,r)=>{"use strict";r.d(t,{ET:()=>o,TZ:()=>a,p_:()=>i});var n=r(860);const i={ERROR:"ERROR",WARN:"WARN",INFO:"INFO",DEBUG:"DEBUG",TRACE:"TRACE"},o="log",a=n.K7.logging},3785:(e,t,r)=>{"use strict";r.d(t,{R:()=>c,b:()=>u});var n=r(9908),i=r(1863),o=r(860),a=r(3969),s=r(993);function c(e,t,r={},c=s.p_.INFO){(0,n.p)(a.xV,["API/logging/".concat(c.toLowerCase(),"/called")],void 0,o.K7.metrics,e),(0,n.p)(s.ET,[(0,i.t)(),t,r,c],void 0,o.K7.logging,e)}function u(e){return"string"==typeof e&&Object.values(s.p_).some((t=>t===e.toUpperCase().trim()))}},3969:(e,t,r)=>{"use strict";r.d(t,{TZ:()=>n,XG:()=>s,rs:()=>i,xV:()=>a,z_:()=>o});const n=r(860).K7.metrics,i="sm",o="cm",a="storeSupportabilityMetrics",s="storeEventMetrics"},6630:(e,t,r)=>{"use strict";r.d(t,{T:()=>n});const n=r(860).K7.pageViewEvent},782:(e,t,r)=>{"use strict";r.d(t,{T:()=>n});const n=r(860).K7.pageViewTiming},6344:(e,t,r)=>{"use strict";r.d(t,{BB:()=>d,G4:()=>o,Qb:()=>l,TZ:()=>i,Ug:()=>a,_s:()=>s,bc:()=>u,yP:()=>c});var n=r(2614);const i=r(860).K7.sessionReplay,o={RECORD:"recordReplay",PAUSE:"pauseReplay",REPLAY_RUNNING:"replayRunning",ERROR_DURING_REPLAY:"errorDuringReplay"},a=.12,s={DomContentLoaded:0,Load:1,FullSnapshot:2,IncrementalSnapshot:3,Meta:4,Custom:5},c={[n.g.ERROR]:15e3,[n.g.FULL]:3e5,[n.g.OFF]:0},u={RESET:{message:"Session was reset",sm:"Reset"},IMPORT:{message:"Recorder failed to import",sm:"Import"},TOO_MANY:{message:"429: Too Many Requests",sm:"Too-Many"},TOO_BIG:{message:"Payload was too large",sm:"Too-Big"},CROSS_TAB:{message:"Session Entity was set to OFF on another tab",sm:"Cross-Tab"},ENTITLEMENTS:{message:"Session Replay is not allowed and will not be started",sm:"Entitlement"}},d=5e3,l={API:"api"}},5270:(e,t,r)=>{"use strict";r.d(t,{Aw:()=>c,CT:()=>u,SR:()=>s});var n=r(384),i=r(9417),o=r(7767),a=r(6154);function s(e){return!!(0,n.dV)().o.MO&&(0,o.V)(e)&&!0===(0,i.gD)(e,"session_trace.enabled")}function c(e){return!0===(0,i.gD)(e,"session_replay.preload")&&s(e)}function u(e,t){const r=t.correctAbsoluteTimestamp(e);return{originalTimestamp:e,correctedTimestamp:r,timestampDiff:e-r,originTime:a.WN,correctedOriginTime:t.correctedOriginTime,originTimeDiff:Math.floor(a.WN-t.correctedOriginTime)}}},3738:(e,t,r)=>{"use strict";r.d(t,{He:()=>i,Kp:()=>s,Lc:()=>u,Rz:()=>d,TZ:()=>n,bD:()=>o,d3:()=>a,jx:()=>l,uP:()=>c});const n=r(860).K7.sessionTrace,i="bstResource",o="resource",a="-start",s="-end",c="fn"+a,u="fn"+s,d="pushState",l=1e3},3962:(e,t,r)=>{"use strict";r.d(t,{AM:()=>o,O2:()=>s,Qu:()=>c,TZ:()=>a,ih:()=>u,tC:()=>i});var n=r(860);const i=["click","keydown","submit"],o="api",a=n.K7.softNav,s={INITIAL_PAGE_LOAD:"",ROUTE_CHANGE:1,UNSPECIFIED:2},c={INTERACTION:1,AJAX:2,CUSTOM_END:3,CUSTOM_TRACER:4},u={IP:"in progress",FIN:"finished",CAN:"cancelled"}},7378:(e,t,r)=>{"use strict";r.d(t,{$p:()=>x,BR:()=>b,Kp:()=>R,L3:()=>y,Lc:()=>c,NC:()=>o,SG:()=>d,TZ:()=>i,U6:()=>p,UT:()=>m,d3:()=>w,dT:()=>f,e5:()=>A,gx:()=>v,l9:()=>l,oW:()=>h,op:()=>g,rw:()=>u,tH:()=>E,uP:()=>s,wW:()=>T,xq:()=>a});var n=r(384);const i=r(860).K7.spa,o=["click","submit","keypress","keydown","keyup","change"],a=999,s="fn-start",c="fn-end",u="cb-start",d="api-ixn-",l="remaining",f="interaction",h="spaNode",p="jsonpNode",g="fetch-start",m="fetch-done",v="fetch-body-",b="jsonp-end",y=(0,n.dV)().o.ST,w="-start",R="-end",x="-body",T="cb"+R,A="jsTime",E="fetch"},4234:(e,t,r)=>{"use strict";r.d(t,{W:()=>o});var n=r(7836),i=r(1687);class o{constructor(e,t){this.agentIdentifier=e,this.ee=n.ee.get(e),this.featureName=t,this.blocked=!1}deregisterDrain(){(0,i.x3)(this.agentIdentifier,this.featureName)}}},7767:(e,t,r)=>{"use strict";r.d(t,{V:()=>o});var n=r(9417),i=r(6154);const o=e=>i.RI&&!0===(0,n.gD)(e,"privacy.cookies_enabled")},425:(e,t,r)=>{"use strict";r.d(t,{j:()=>j});var n=r(860),i=r(2555),o=r(3371),a=r(9908),s=r(7836),c=r(1687),u=r(5289),d=r(6154),l=r(944),f=r(3969),h=r(384),p=r(6344);const g=["setErrorHandler","finished","addToTrace","addRelease","addPageAction","setCurrentRouteName","setPageViewName","setCustomAttribute","interaction","noticeError","setUserId","setApplicationVersion","start",p.G4.RECORD,p.G4.PAUSE,"log","wrapLogger"],m=["setErrorHandler","finished","addToTrace","addRelease"];var v=r(1863),b=r(2614),y=r(993),w=r(3785),R=r(2646),x=r(3434);function T(e,t,r,n){if("object"!=typeof t||!t||"string"!=typeof r||!r||"function"!=typeof t[r])return(0,l.R)(29);const i=function(e){return(e||s.ee).get("logger")}(e),o=(0,x.YM)(i),a=new R.y(s.P);return a.level=n.level,a.customAttributes=n.customAttributes,o.inPlace(t,[r],"wrap-logger-",a),i}function A(){const e=(0,h.pV)();g.forEach((t=>{e[t]=(...r)=>function(t,...r){let n=[];return Object.values(e.initializedAgents).forEach((e=>{e&&e.api?e.exposed&&e.api[t]&&n.push(e.api[t](...r)):(0,l.R)(38,t)})),n.length>1?n:n[0]}(t,...r)}))}const E={};var S=r(9417),N=r(5603),O=r(5284);const _=e=>{const t=e.startsWith("http");e+="/",r.p=t?e:"https://"+e};let I=!1;function j(e,t={},g,R){let{init:x,info:j,loader_config:P,runtime:C={},exposed:k=!0}=t;C.loaderType=g;const L=(0,h.pV)();j||(x=L.init,j=L.info,P=L.loader_config),(0,S.xN)(e.agentIdentifier,x||{}),(0,N.a)(e.agentIdentifier,P||{}),j.jsAttributes??={},d.bv&&(j.jsAttributes.isWorker=!0),(0,i.x1)(e.agentIdentifier,j);const H=(0,S.D0)(e.agentIdentifier),D=[j.beacon,j.errorBeacon];I||(H.proxy.assets&&(_(H.proxy.assets),D.push(H.proxy.assets)),H.proxy.beacon&&D.push(H.proxy.beacon),A(),(0,h.US)("activatedFeatures",O.B),e.runSoftNavOverSpa&&=!0===H.soft_navigations.enabled&&H.feature_flags.includes("soft_nav")),C.denyList=[...H.ajax.deny_list||[],...H.ajax.block_internal?D:[]],C.ptid=e.agentIdentifier,(0,o.V)(e.agentIdentifier,C),e.ee=s.ee.get(e.agentIdentifier),void 0===e.api&&(e.api=function(e,t,h=!1){t||(0,c.Ak)(e,"api");const g={};var R=s.ee.get(e),x=R.get("tracer");E[e]=b.g.OFF,R.on(p.G4.REPLAY_RUNNING,(t=>{E[e]=t}));var A="api-",S=A+"ixn-";function N(t,r,n,o){const a=(0,i.Vp)(e);return null===r?delete a.jsAttributes[t]:(0,i.x1)(e,{...a,jsAttributes:{...a.jsAttributes,[t]:r}}),I(A,n,!0,o||null===r?"session":void 0)(t,r)}function O(){}g.log=function(e,{customAttributes:t={},level:r=y.p_.INFO}={}){(0,a.p)(f.xV,["API/log/called"],void 0,n.K7.metrics,R),(0,w.R)(R,e,t,r)},g.wrapLogger=(e,t,{customAttributes:r={},level:i=y.p_.INFO}={})=>{(0,a.p)(f.xV,["API/wrapLogger/called"],void 0,n.K7.metrics,R),T(R,e,t,{customAttributes:r,level:i})},m.forEach((e=>{g[e]=I(A,e,!0,"api")})),g.addPageAction=I(A,"addPageAction",!0,n.K7.genericEvents),g.setPageViewName=function(t,r){if("string"==typeof t)return"/"!==t.charAt(0)&&(t="/"+t),(0,o.f)(e).customTransaction=(r||"http://custom.transaction")+t,I(A,"setPageViewName",!0)()},g.setCustomAttribute=function(e,t,r=!1){if("string"==typeof e){if(["string","number","boolean"].includes(typeof t)||null===t)return N(e,t,"setCustomAttribute",r);(0,l.R)(40,typeof t)}else(0,l.R)(39,typeof e)},g.setUserId=function(e){if("string"==typeof e||null===e)return N("enduser.id",e,"setUserId",!0);(0,l.R)(41,typeof e)},g.setApplicationVersion=function(e){if("string"==typeof e||null===e)return N("application.version",e,"setApplicationVersion",!1);(0,l.R)(42,typeof e)},g.start=()=>{try{(0,a.p)(f.xV,["API/start/called"],void 0,n.K7.metrics,R),R.emit("manual-start-all")}catch(e){(0,l.R)(23,e)}},g[p.G4.RECORD]=function(){(0,a.p)(f.xV,["API/recordReplay/called"],void 0,n.K7.metrics,R),(0,a.p)(p.G4.RECORD,[],void 0,n.K7.sessionReplay,R)},g[p.G4.PAUSE]=function(){(0,a.p)(f.xV,["API/pauseReplay/called"],void 0,n.K7.metrics,R),(0,a.p)(p.G4.PAUSE,[],void 0,n.K7.sessionReplay,R)},g.interaction=function(e){return(new O).get("object"==typeof e?e:{})};const _=O.prototype={createTracer:function(e,t){var r={},i=this,o="function"==typeof t;return(0,a.p)(f.xV,["API/createTracer/called"],void 0,n.K7.metrics,R),h||(0,a.p)(S+"tracer",[(0,v.t)(),e,r],i,n.K7.spa,R),function(){if(x.emit((o?"":"no-")+"fn-start",[(0,v.t)(),i,o],r),o)try{return t.apply(this,arguments)}catch(e){const t="string"==typeof e?new Error(e):e;throw x.emit("fn-err",[arguments,this,t],r),t}finally{x.emit("fn-end",[(0,v.t)()],r)}}}};function I(e,t,r,i){return function(){return(0,a.p)(f.xV,["API/"+t+"/called"],void 0,n.K7.metrics,R),i&&(0,a.p)(e+t,[(0,v.t)(),...arguments],r?null:this,i,R),r?void 0:this}}function j(){r.e(478).then(r.bind(r,8778)).then((({setAPI:t})=>{t(e),(0,c.Ze)(e,"api")})).catch((e=>{(0,l.R)(27,e),R.abort()}))}return["actionText","setName","setAttribute","save","ignore","onEnd","getContext","end","get"].forEach((e=>{_[e]=I(S,e,void 0,h?n.K7.softNav:n.K7.spa)})),g.setCurrentRouteName=h?I(S,"routeName",void 0,n.K7.softNav):I(A,"routeName",!0,n.K7.spa),g.noticeError=function(t,r){"string"==typeof t&&(t=new Error(t)),(0,a.p)(f.xV,["API/noticeError/called"],void 0,n.K7.metrics,R),(0,a.p)("err",[t,(0,v.t)(),!1,r,!!E[e]],void 0,n.K7.jserrors,R)},d.RI?(0,u.GG)((()=>j()),!0):j(),g}(e.agentIdentifier,R,e.runSoftNavOverSpa)),void 0===e.exposed&&(e.exposed=k),I=!0}},8374:(e,t,r)=>{r.nc=(()=>{try{return document?.currentScript?.nonce}catch(e){}return""})()},860:(e,t,r)=>{"use strict";r.d(t,{$J:()=>o,K7:()=>n,P3:()=>i});const n={ajax:"ajax",genericEvents:"generic_events",jserrors:"jserrors",logging:"logging",metrics:"metrics",pageAction:"page_action",pageViewEvent:"page_view_event",pageViewTiming:"page_view_timing",sessionReplay:"session_replay",sessionTrace:"session_trace",softNav:"soft_navigations",spa:"spa"},i={[n.pageViewEvent]:1,[n.pageViewTiming]:2,[n.metrics]:3,[n.jserrors]:4,[n.spa]:5,[n.ajax]:6,[n.sessionTrace]:7,[n.softNav]:8,[n.sessionReplay]:9,[n.logging]:10,[n.genericEvents]:11},o={[n.pageViewTiming]:"events",[n.ajax]:"events",[n.spa]:"events",[n.softNav]:"events",[n.metrics]:"jserrors",[n.jserrors]:"jserrors",[n.sessionTrace]:"browser/blobs",[n.sessionReplay]:"browser/blobs",[n.logging]:"browser/logs",[n.genericEvents]:"ins"}}},n={};function i(e){var t=n[e];if(void 0!==t)return t.exports;var o=n[e]={exports:{}};return r[e](o,o.exports,i),o.exports}i.m=r,i.d=(e,t)=>{for(var r in t)i.o(t,r)&&!i.o(e,r)&&Object.defineProperty(e,r,{enumerable:!0,get:t[r]})},i.f={},i.e=e=>Promise.all(Object.keys(i.f).reduce(((t,r)=>(i.f[r](e,t),t)),[])),i.u=e=>({212:"nr-spa-compressor",249:"nr-spa-recorder",478:"nr-spa"}[e]+"-1.274.0.min.js"),i.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),e={},t="NRBA-1.274.0.PROD:",i.l=(r,n,o,a)=>{if(e[r])e[r].push(n);else{var s,c;if(void 0!==o)for(var u=document.getElementsByTagName("script"),d=0;d<u.length;d++){var l=u[d];if(l.getAttribute("src")==r||l.getAttribute("data-webpack")==t+o){s=l;break}}if(!s){c=!0;var f={478:"sha512-1vUqEfJPB8Pihje9mv5CfYgkitO1FWcS+UQb84DbXqP8oYctRv4/lzl/MzNLPlRhcY1WVDBGL20I8vm6s2VV7g==",249:"sha512-Y/BeZAh6VSTmUtUNmS5XdyKxL92s30Fyyj8xVW76HSPxcKItL4+x2+kGMZc8pMJnUpZDz1L4eftZQAJh3D8NnA==",212:"sha512-Gn2tQ3qog5Yhrx/gRutkSTYPp+7nkKFt4/mIXg99LxcNpMDAYJZDBYmAACdoHNM86+iq1F3cBcQotFNzjIX8bw=="};(s=document.createElement("script")).charset="utf-8",s.timeout=120,i.nc&&s.setAttribute("nonce",i.nc),s.setAttribute("data-webpack",t+o),s.src=r,0!==s.src.indexOf(window.location.origin+"/")&&(s.crossOrigin="anonymous"),f[a]&&(s.integrity=f[a])}e[r]=[n];var h=(t,n)=>{s.onerror=s.onload=null,clearTimeout(p);var i=e[r];if(delete e[r],s.parentNode&&s.parentNode.removeChild(s),i&&i.forEach((e=>e(n))),t)return t(n)},p=setTimeout(h.bind(null,void 0,{type:"timeout",target:s}),12e4);s.onerror=h.bind(null,s.onerror),s.onload=h.bind(null,s.onload),c&&document.head.appendChild(s)}},i.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},i.p="https://js-agent.newrelic.com/",(()=>{var e={38:0,788:0};i.f.j=(t,r)=>{var n=i.o(e,t)?e[t]:void 0;if(0!==n)if(n)r.push(n[2]);else{var o=new Promise(((r,i)=>n=e[t]=[r,i]));r.push(n[2]=o);var a=i.p+i.u(t),s=new Error;i.l(a,(r=>{if(i.o(e,t)&&(0!==(n=e[t])&&(e[t]=void 0),n)){var o=r&&("load"===r.type?"missing":r.type),a=r&&r.target&&r.target.src;s.message="Loading chunk "+t+" failed.\n("+o+": "+a+")",s.name="ChunkLoadError",s.type=o,s.request=a,n[1](s)}}),"chunk-"+t,t)}};var t=(t,r)=>{var n,o,[a,s,c]=r,u=0;if(a.some((t=>0!==e[t]))){for(n in s)i.o(s,n)&&(i.m[n]=s[n]);if(c)c(i)}for(t&&t(r);u<a.length;u++)o=a[u],i.o(e,o)&&e[o]&&e[o][0](),e[o]=0},r=self["webpackChunk:NRBA-1.274.0.PROD"]=self["webpackChunk:NRBA-1.274.0.PROD"]||[];r.forEach(t.bind(null,0)),r.push=t.bind(null,r.push.bind(r))})(),(()=>{"use strict";i(8374);var e=i(944),t=i(6344),r=i(9566);class n{agentIdentifier;constructor(e=(0,r.LA)(16)){this.agentIdentifier=e}#e(t,...r){if("function"==typeof this.api?.[t])return this.api[t](...r);(0,e.R)(35,t)}addPageAction(e,t){return this.#e("addPageAction",e,t)}setPageViewName(e,t){return this.#e("setPageViewName",e,t)}setCustomAttribute(e,t,r){return this.#e("setCustomAttribute",e,t,r)}noticeError(e,t){return this.#e("noticeError",e,t)}setUserId(e){return this.#e("setUserId",e)}setApplicationVersion(e){return this.#e("setApplicationVersion",e)}setErrorHandler(e){return this.#e("setErrorHandler",e)}addRelease(e,t){return this.#e("addRelease",e,t)}log(e,t){return this.#e("log",e,t)}}class o extends n{#e(t,...r){if("function"==typeof this.api?.[t])return this.api[t](...r);(0,e.R)(35,t)}start(){return this.#e("start")}finished(e){return this.#e("finished",e)}recordReplay(){return this.#e(t.G4.RECORD)}pauseReplay(){return this.#e(t.G4.PAUSE)}addToTrace(e){return this.#e("addToTrace",e)}setCurrentRouteName(e){return this.#e("setCurrentRouteName",e)}interaction(){return this.#e("interaction")}wrapLogger(e,t,r){return this.#e("wrapLogger",e,t,r)}}var a=i(860),s=i(9417);const c=Object.values(a.K7);function u(e){const t={};return c.forEach((r=>{t[r]=function(e,t){return!0===(0,s.gD)(t,"".concat(e,".enabled"))}(r,e)})),t}var d=i(425);var l=i(1687),f=i(4234),h=i(5289),p=i(6154),g=i(5270),m=i(7767),v=i(6389);class b extends f.W{constructor(e,t,r=!0){super(e.agentIdentifier,t),this.auto=r,this.abortHandler=void 0,this.featAggregate=void 0,this.onAggregateImported=void 0,!1===e.init[this.featureName].autoStart&&(this.auto=!1),this.auto?(0,l.Ak)(e.agentIdentifier,t):this.ee.on("manual-start-all",(0,v.J)((()=>{(0,l.Ak)(e.agentIdentifier,this.featureName),this.auto=!0,this.importAggregator(e)})))}importAggregator(t,r={}){if(this.featAggregate||!this.auto)return;let n;this.onAggregateImported=new Promise((e=>{n=e}));const o=async()=>{let o;try{if((0,m.V)(this.agentIdentifier)){const{setupAgentSession:e}=await i.e(478).then(i.bind(i,6526));o=e(t)}}catch(t){(0,e.R)(20,t),this.ee.emit("internal-error",[t]),this.featureName===a.K7.sessionReplay&&this.abortHandler?.()}try{if(t.sharedAggregator)await t.sharedAggregator;else{t.sharedAggregator=i.e(478).then(i.bind(i,9337));const{EventAggregator:e}=await t.sharedAggregator;t.sharedAggregator=new e}if(!this.#t(this.featureName,o))return(0,l.Ze)(this.agentIdentifier,this.featureName),void n(!1);const{lazyFeatureLoader:e}=await i.e(478).then(i.bind(i,6103)),{Aggregate:a}=await e(this.featureName,"aggregate");this.featAggregate=new a(t,r),n(!0)}catch(t){(0,e.R)(34,t),this.abortHandler?.(),(0,l.Ze)(this.agentIdentifier,this.featureName,!0),n(!1),this.ee&&this.ee.abort()}};p.RI?(0,h.GG)((()=>o()),!0):o()}#t(e,t){switch(e){case a.K7.sessionReplay:return(0,g.SR)(this.agentIdentifier)&&!!t;case a.K7.sessionTrace:return!!t;default:return!0}}}var y=i(6630);class w extends b{static featureName=y.T;constructor(e,t=!0){super(e,y.T,t),this.importAggregator(e)}}var R=i(384);var x=i(9908),T=i(2843),A=i(3878),E=i(782),S=i(1863);class N extends b{static featureName=E.T;constructor(e,t=!0){super(e,E.T,t),p.RI&&((0,T.u)((()=>(0,x.p)("docHidden",[(0,S.t)()],void 0,E.T,this.ee)),!0),(0,A.sp)("pagehide",(()=>(0,x.p)("winPagehide",[(0,S.t)()],void 0,E.T,this.ee))),this.importAggregator(e))}}var O=i(3969);class _ extends b{static featureName=O.TZ;constructor(e,t=!0){super(e,O.TZ,t),this.importAggregator(e)}}var I=i(6774),j=i(3304);class P{constructor(e,t,r,n,i){this.name="UncaughtError",this.message="string"==typeof e?e:(0,j.A)(e),this.sourceURL=t,this.line=r,this.column=n,this.__newrelic=i}}function C(e){return H(e)?e:new P(void 0!==e?.message?e.message:e,e?.filename||e?.sourceURL,e?.lineno||e?.line,e?.colno||e?.col,e?.__newrelic)}function k(e){const t="Unhandled Promise Rejection";if(!e?.reason)return;if(H(e.reason))try{return e.reason.message=t+": "+e.reason.message,C(e.reason)}catch(t){return C(e.reason)}const r=C(e.reason);return r.message=t+": "+r?.message,r}function L(e){if(e.error instanceof SyntaxError&&!/:\d+$/.test(e.error.stack?.trim())){const t=new P(e.message,e.filename,e.lineno,e.colno,e.error.__newrelic);return t.name=SyntaxError.name,t}return H(e.error)?e.error:C(e)}function H(e){return e instanceof Error&&!!e.stack}class D extends b{static featureName=I.T;#r=!1;constructor(e,r=!0){super(e,I.T,r);try{this.removeOnAbort=new AbortController}catch(e){}this.ee.on("internal-error",(e=>{this.abortHandler&&(0,x.p)("ierr",[C(e),(0,S.t)(),!0,{},this.#r],void 0,this.featureName,this.ee)})),this.ee.on(t.G4.REPLAY_RUNNING,(e=>{this.#r=e})),p.gm.addEventListener("unhandledrejection",(e=>{this.abortHandler&&(0,x.p)("err",[k(e),(0,S.t)(),!1,{unhandledPromiseRejection:1},this.#r],void 0,this.featureName,this.ee)}),(0,A.jT)(!1,this.removeOnAbort?.signal)),p.gm.addEventListener("error",(e=>{this.abortHandler&&(0,x.p)("err",[L(e),(0,S.t)(),!1,{},this.#r],void 0,this.featureName,this.ee)}),(0,A.jT)(!1,this.removeOnAbort?.signal)),this.abortHandler=this.#n,this.importAggregator(e)}#n(){this.removeOnAbort?.abort(),this.abortHandler=void 0}}var M=i(8990);let K=1;const U="nr@id";function V(e){const t=typeof e;return!e||"object"!==t&&"function"!==t?-1:e===p.gm?0:(0,M.I)(e,U,(function(){return K++}))}function G(e){if("string"==typeof e&&e.length)return e.length;if("object"==typeof e){if("undefined"!=typeof ArrayBuffer&&e instanceof ArrayBuffer&&e.byteLength)return e.byteLength;if("undefined"!=typeof Blob&&e instanceof Blob&&e.size)return e.size;if(!("undefined"!=typeof FormData&&e instanceof FormData))try{return(0,j.A)(e).length}catch(e){return}}}var F=i(8139),B=i(7836),W=i(3434);const z={},q=["open","send"];function Z(t){var r=t||B.ee;const n=function(e){return(e||B.ee).get("xhr")}(r);if(z[n.debugId]++)return n;z[n.debugId]=1,(0,F.u)(r);var i=(0,W.YM)(n),o=p.gm.XMLHttpRequest,a=p.gm.MutationObserver,s=p.gm.Promise,c=p.gm.setInterval,u="readystatechange",d=["onload","onerror","onabort","onloadstart","onloadend","onprogress","ontimeout"],l=[],f=p.gm.XMLHttpRequest=function(t){const r=new o(t),a=n.context(r);try{n.emit("new-xhr",[r],a),r.addEventListener(u,(s=a,function(){var e=this;e.readyState>3&&!s.resolved&&(s.resolved=!0,n.emit("xhr-resolved",[],e)),i.inPlace(e,d,"fn-",y)}),(0,A.jT)(!1))}catch(t){(0,e.R)(15,t);try{n.emit("internal-error",[t])}catch(e){}}var s;return r};function h(e,t){i.inPlace(t,["onreadystatechange"],"fn-",y)}if(function(e,t){for(var r in e)t[r]=e[r]}(o,f),f.prototype=o.prototype,i.inPlace(f.prototype,q,"-xhr-",y),n.on("send-xhr-start",(function(e,t){h(e,t),function(e){l.push(e),a&&(g?g.then(b):c?c(b):(m=-m,v.data=m))}(t)})),n.on("open-xhr-start",h),a){var g=s&&s.resolve();if(!c&&!s){var m=1,v=document.createTextNode(m);new a(b).observe(v,{characterData:!0})}}else r.on("fn-end",(function(e){e[0]&&e[0].type===u||b()}));function b(){for(var e=0;e<l.length;e++)h(0,l[e]);l.length&&(l=[])}function y(e,t){return t}return n}var Y="fetch-",X=Y+"body-",J=["arrayBuffer","blob","json","text","formData"],Q=p.gm.Request,ee=p.gm.Response,te="prototype";const re={};function ne(e){const t=function(e){return(e||B.ee).get("fetch")}(e);if(!(Q&&ee&&p.gm.fetch))return t;if(re[t.debugId]++)return t;function r(e,r,n){var i=e[r];"function"==typeof i&&(e[r]=function(){var e,r=[...arguments],o={};t.emit(n+"before-start",[r],o),o[B.P]&&o[B.P].dt&&(e=o[B.P].dt);var a=i.apply(this,r);return t.emit(n+"start",[r,e],a),a.then((function(e){return t.emit(n+"end",[null,e],a),e}),(function(e){throw t.emit(n+"end",[e],a),e}))})}return re[t.debugId]=1,J.forEach((e=>{r(Q[te],e,X),r(ee[te],e,X)})),r(p.gm,"fetch",Y),t.on(Y+"end",(function(e,r){var n=this;if(r){var i=r.headers.get("content-length");null!==i&&(n.rxSize=i),t.emit(Y+"done",[null,r],n)}else t.emit(Y+"done",[e],n)})),t}var ie=i(7485),oe=i(5603);class ae{constructor(e){this.agentIdentifier=e}generateTracePayload(e){if(!this.shouldGenerateTrace(e))return null;var t=(0,oe.o)(this.agentIdentifier);if(!t)return null;var n=(t.accountID||"").toString()||null,i=(t.agentID||"").toString()||null,o=(t.trustKey||"").toString()||null;if(!n||!i)return null;var a=(0,r.ZF)(),s=(0,r.el)(),c=Date.now(),u={spanId:a,traceId:s,timestamp:c};return(e.sameOrigin||this.isAllowedOrigin(e)&&this.useTraceContextHeadersForCors())&&(u.traceContextParentHeader=this.generateTraceContextParentHeader(a,s),u.traceContextStateHeader=this.generateTraceContextStateHeader(a,c,n,i,o)),(e.sameOrigin&&!this.excludeNewrelicHeader()||!e.sameOrigin&&this.isAllowedOrigin(e)&&this.useNewrelicHeaderForCors())&&(u.newrelicHeader=this.generateTraceHeader(a,s,c,n,i,o)),u}generateTraceContextParentHeader(e,t){return"00-"+t+"-"+e+"-01"}generateTraceContextStateHeader(e,t,r,n,i){return i+"@nr=0-1-"+r+"-"+n+"-"+e+"----"+t}generateTraceHeader(e,t,r,n,i,o){if(!("function"==typeof p.gm?.btoa))return null;var a={v:[0,1],d:{ty:"Browser",ac:n,ap:i,id:e,tr:t,ti:r}};return o&&n!==o&&(a.d.tk=o),btoa((0,j.A)(a))}shouldGenerateTrace(e){return this.isDtEnabled()&&this.isAllowedOrigin(e)}isAllowedOrigin(e){var t=!1,r={};if((0,s.gD)(this.agentIdentifier,"distributed_tracing")&&(r=(0,s.D0)(this.agentIdentifier).distributed_tracing),e.sameOrigin)t=!0;else if(r.allowed_origins instanceof Array)for(var n=0;n<r.allowed_origins.length;n++){var i=(0,ie.D)(r.allowed_origins[n]);if(e.hostname===i.hostname&&e.protocol===i.protocol&&e.port===i.port){t=!0;break}}return t}isDtEnabled(){var e=(0,s.gD)(this.agentIdentifier,"distributed_tracing");return!!e&&!!e.enabled}excludeNewrelicHeader(){var e=(0,s.gD)(this.agentIdentifier,"distributed_tracing");return!!e&&!!e.exclude_newrelic_header}useNewrelicHeaderForCors(){var e=(0,s.gD)(this.agentIdentifier,"distributed_tracing");return!!e&&!1!==e.cors_use_newrelic_header}useTraceContextHeadersForCors(){var e=(0,s.gD)(this.agentIdentifier,"distributed_tracing");return!!e&&!!e.cors_use_tracecontext_headers}}var se=i(9300),ce=i(7295),ue=["load","error","abort","timeout"],de=ue.length,le=(0,R.dV)().o.REQ,fe=(0,R.dV)().o.XHR;class he extends b{static featureName=se.T;constructor(e,t=!0){super(e,se.T,t),this.dt=new ae(e.agentIdentifier),this.handler=(e,t,r,n)=>(0,x.p)(e,t,r,n,this.ee);try{const e={xmlhttprequest:"xhr",fetch:"fetch",beacon:"beacon"};p.gm?.performance?.getEntriesByType("resource").forEach((t=>{if(t.initiatorType in e&&0!==t.responseStatus){const r={status:t.responseStatus},n={rxSize:t.transferSize,duration:Math.floor(t.duration),cbTime:0};pe(r,t.name),this.handler("xhr",[r,n,t.startTime,t.responseEnd,e[t.initiatorType]],void 0,a.K7.ajax)}}))}catch(e){}ne(this.ee),Z(this.ee),function(e,t,r,n){function i(e){var t=this;t.totalCbs=0,t.called=0,t.cbTime=0,t.end=R,t.ended=!1,t.xhrGuids={},t.lastSize=null,t.loadCaptureCalled=!1,t.params=this.params||{},t.metrics=this.metrics||{},e.addEventListener("load",(function(r){T(t,e)}),(0,A.jT)(!1)),p.lR||e.addEventListener("progress",(function(e){t.lastSize=e.loaded}),(0,A.jT)(!1))}function o(e){this.params={method:e[0]},pe(this,e[1]),this.metrics={}}function s(t,r){e.loader_config.xpid&&this.sameOrigin&&r.setRequestHeader("X-NewRelic-ID",e.loader_config.xpid);var i=n.generateTracePayload(this.parsedOrigin);if(i){var o=!1;i.newrelicHeader&&(r.setRequestHeader("newrelic",i.newrelicHeader),o=!0),i.traceContextParentHeader&&(r.setRequestHeader("traceparent",i.traceContextParentHeader),i.traceContextStateHeader&&r.setRequestHeader("tracestate",i.traceContextStateHeader),o=!0),o&&(this.dt=i)}}function c(e,r){var n=this.metrics,i=e[0],o=this;if(n&&i){var a=G(i);a&&(n.txSize=a)}this.startTime=(0,S.t)(),this.body=i,this.listener=function(e){try{"abort"!==e.type||o.loadCaptureCalled||(o.params.aborted=!0),("load"!==e.type||o.called===o.totalCbs&&(o.onloadCalled||"function"!=typeof r.onload)&&"function"==typeof o.end)&&o.end(r)}catch(e){try{t.emit("internal-error",[e])}catch(e){}}};for(var s=0;s<de;s++)r.addEventListener(ue[s],this.listener,(0,A.jT)(!1))}function u(e,t,r){this.cbTime+=e,t?this.onloadCalled=!0:this.called+=1,this.called!==this.totalCbs||!this.onloadCalled&&"function"==typeof r.onload||"function"!=typeof this.end||this.end(r)}function d(e,t){var r=""+V(e)+!!t;this.xhrGuids&&!this.xhrGuids[r]&&(this.xhrGuids[r]=!0,this.totalCbs+=1)}function l(e,t){var r=""+V(e)+!!t;this.xhrGuids&&this.xhrGuids[r]&&(delete this.xhrGuids[r],this.totalCbs-=1)}function f(){this.endTime=(0,S.t)()}function h(e,r){r instanceof fe&&"load"===e[0]&&t.emit("xhr-load-added",[e[1],e[2]],r)}function g(e,r){r instanceof fe&&"load"===e[0]&&t.emit("xhr-load-removed",[e[1],e[2]],r)}function m(e,t,r){t instanceof fe&&("onload"===r&&(this.onload=!0),("load"===(e[0]&&e[0].type)||this.onload)&&(this.xhrCbStart=(0,S.t)()))}function v(e,r){this.xhrCbStart&&t.emit("xhr-cb-time",[(0,S.t)()-this.xhrCbStart,this.onload,r],r)}function b(e){var t,r=e[1]||{};if("string"==typeof e[0]?0===(t=e[0]).length&&p.RI&&(t=""+p.gm.location.href):e[0]&&e[0].url?t=e[0].url:p.gm?.URL&&e[0]&&e[0]instanceof URL?t=e[0].href:"function"==typeof e[0].toString&&(t=e[0].toString()),"string"==typeof t&&0!==t.length){t&&(this.parsedOrigin=(0,ie.D)(t),this.sameOrigin=this.parsedOrigin.sameOrigin);var i=n.generateTracePayload(this.parsedOrigin);if(i&&(i.newrelicHeader||i.traceContextParentHeader))if(e[0]&&e[0].headers)s(e[0].headers,i)&&(this.dt=i);else{var o={};for(var a in r)o[a]=r[a];o.headers=new Headers(r.headers||{}),s(o.headers,i)&&(this.dt=i),e.length>1?e[1]=o:e.push(o)}}function s(e,t){var r=!1;return t.newrelicHeader&&(e.set("newrelic",t.newrelicHeader),r=!0),t.traceContextParentHeader&&(e.set("traceparent",t.traceContextParentHeader),t.traceContextStateHeader&&e.set("tracestate",t.traceContextStateHeader),r=!0),r}}function y(e,t){this.params={},this.metrics={},this.startTime=(0,S.t)(),this.dt=t,e.length>=1&&(this.target=e[0]),e.length>=2&&(this.opts=e[1]);var r,n=this.opts||{},i=this.target;"string"==typeof i?r=i:"object"==typeof i&&i instanceof le?r=i.url:p.gm?.URL&&"object"==typeof i&&i instanceof URL&&(r=i.href),pe(this,r);var o=(""+(i&&i instanceof le&&i.method||n.method||"GET")).toUpperCase();this.params.method=o,this.body=n.body,this.txSize=G(n.body)||0}function w(e,t){if(this.endTime=(0,S.t)(),this.params||(this.params={}),(0,ce.iW)(this.params))return;let n;this.params.status=t?t.status:0,"string"==typeof this.rxSize&&this.rxSize.length>0&&(n=+this.rxSize);const i={txSize:this.txSize,rxSize:n,duration:(0,S.t)()-this.startTime};r("xhr",[this.params,i,this.startTime,this.endTime,"fetch"],this,a.K7.ajax)}function R(e){const t=this.params,n=this.metrics;if(!this.ended){this.ended=!0;for(let t=0;t<de;t++)e.removeEventListener(ue[t],this.listener,!1);t.aborted||(0,ce.iW)(t)||(n.duration=(0,S.t)()-this.startTime,this.loadCazptureCalled||4!==e.readyState?null==t.status&&(t.status=0):T(this,e),n.cbTime=this.cbTime,r("xhr",[t,n,this.startTime,this.endTime,"xhr"],this,a.K7.ajax))}}function T(e,r){e.params.status=r.status;var n=function(e,t){var r=e.responseType;return"json"===r&&null!==t?t:"arraybuffer"===r||"blob"===r||"json"===r?G(e.response):"text"===r||""===r||void 0===r?G(e.responseText):void 0}(r,e.lastSize);if(n&&(e.metrics.rxSize=n),e.sameOrigin){var i=r.getResponseHeader("X-NewRelic-App-Data");i&&((0,x.p)(O.rs,["Ajax/CrossApplicationTracing/Header/Seen"],void 0,a.K7.metrics,t),e.params.cat=i.split(", ").pop())}e.loadCaptureCalled=!0}t.on("new-xhr",i),t.on("open-xhr-start",o),t.on("open-xhr-end",s),t.on("send-xhr-start",c),t.on("xhr-cb-time",u),t.on("xhr-load-added",d),t.on("xhr-load-removed",l),t.on("xhr-resolved",f),t.on("addEventListener-end",h),t.on("removeEventListener-end",g),t.on("fn-end",v),t.on("fetch-before-start",b),t.on("fetch-start",y),t.on("fn-start",m),t.on("fetch-done",w)}(e,this.ee,this.handler,this.dt),this.importAggregator(e)}}function pe(e,t){var r=(0,ie.D)(t),n=e.params||e;n.hostname=r.hostname,n.port=r.port,n.protocol=r.protocol,n.host=r.hostname+":"+r.port,n.pathname=r.pathname,e.parsedOrigin=r,e.sameOrigin=r.sameOrigin}const ge={},me=["pushState","replaceState"];function ve(e){const t=function(e){return(e||B.ee).get("history")}(e);return!p.RI||ge[t.debugId]++||(ge[t.debugId]=1,(0,W.YM)(t).inPlace(window.history,me,"-")),t}var be=i(3738);const{He:ye,bD:we,d3:Re,Kp:xe,TZ:Te,Lc:Ae,uP:Ee,Rz:Se}=be;class Ne extends b{static featureName=Te;constructor(e,t=!0){super(e,Te,t);if(!(0,m.V)(this.agentIdentifier))return void this.deregisterDrain();const r=this.ee;let n;ve(r),this.eventsEE=(0,F.u)(r),this.eventsEE.on(Ee,(function(e,t){this.bstStart=(0,S.t)()})),this.eventsEE.on(Ae,(function(e,t){(0,x.p)("bst",[e[0],t,this.bstStart,(0,S.t)()],void 0,a.K7.sessionTrace,r)})),r.on(Se+Re,(function(e){this.time=(0,S.t)(),this.startPath=location.pathname+location.hash})),r.on(Se+xe,(function(e){(0,x.p)("bstHist",[location.pathname+location.hash,this.startPath,this.time],void 0,a.K7.sessionTrace,r)}));try{n=new PerformanceObserver((e=>{const t=e.getEntries();(0,x.p)(ye,[t],void 0,a.K7.sessionTrace,r)})),n.observe({type:we,buffered:!0})}catch(e){}this.importAggregator(e,{resourceObserver:n})}}var Oe=i(2614);class _e extends b{static featureName=t.TZ;#i;#o;constructor(e,r=!0){let n;super(e,t.TZ,r),this.replayRunning=!1,this.#o=e;try{n=JSON.parse(localStorage.getItem("".concat(Oe.H3,"_").concat(Oe.uh)))}catch(e){}(0,g.SR)(e.agentIdentifier)&&this.ee.on(t.G4.RECORD,(()=>this.#a())),this.#s(n)?(this.#i=n?.sessionReplayMode,this.#c()):this.importAggregator(e),this.ee.on("err",(e=>{this.replayRunning&&(this.errorNoticed=!0,(0,x.p)(t.G4.ERROR_DURING_REPLAY,[e],void 0,this.featureName,this.ee))})),this.ee.on(t.G4.REPLAY_RUNNING,(e=>{this.replayRunning=e}))}#s(e){return e&&(e.sessionReplayMode===Oe.g.FULL||e.sessionReplayMode===Oe.g.ERROR)||(0,g.Aw)(this.agentIdentifier)}#u=!1;async#c(e){if(!this.#u){this.#u=!0;try{const{Recorder:t}=await Promise.all([i.e(478),i.e(249)]).then(i.bind(i,8589));this.recorder??=new t({mode:this.#i,agentIdentifier:this.agentIdentifier,trigger:e,ee:this.ee}),this.recorder.startRecording(),this.abortHandler=this.recorder.stopRecording}catch(e){}this.importAggregator(this.#o,{recorder:this.recorder,errorNoticed:this.errorNoticed})}}#a(){this.featAggregate?this.featAggregate.mode!==Oe.g.FULL&&this.featAggregate.initializeRecording(Oe.g.FULL,!0):(this.#i=Oe.g.FULL,this.#c(t.Qb.API),this.recorder&&this.recorder.parent.mode!==Oe.g.FULL&&(this.recorder.parent.mode=Oe.g.FULL,this.recorder.stopRecording(),this.recorder.startRecording(),this.abortHandler=this.recorder.stopRecording))}}var Ie=i(3962);class je extends b{static featureName=Ie.TZ;constructor(e,t=!0){if(super(e,Ie.TZ,t),!p.RI||!(0,R.dV)().o.MO)return;const r=ve(this.ee);Ie.tC.forEach((e=>{(0,A.sp)(e,(e=>{a(e)}),!0)}));const n=()=>(0,x.p)("newURL",[(0,S.t)(),""+window.location],void 0,this.featureName,this.ee);r.on("pushState-end",n),r.on("replaceState-end",n);try{this.removeOnAbort=new AbortController}catch(e){}(0,A.sp)("popstate",(e=>(0,x.p)("newURL",[e.timeStamp,""+window.location],void 0,this.featureName,this.ee)),!0,this.removeOnAbort?.signal);let i=!1;const o=new((0,R.dV)().o.MO)(((e,t)=>{i||(i=!0,requestAnimationFrame((()=>{(0,x.p)("newDom",[(0,S.t)()],void 0,this.featureName,this.ee),i=!1})))})),a=(0,v.s)((e=>{(0,x.p)("newUIEvent",[e],void 0,this.featureName,this.ee),o.observe(document.body,{attributes:!0,childList:!0,subtree:!0,characterData:!0})}),100,{leading:!0});this.abortHandler=function(){this.removeOnAbort?.abort(),o.disconnect(),this.abortHandler=void 0},this.importAggregator(e,{domObserver:o})}}var Pe=i(7378);const Ce={},ke=["appendChild","insertBefore","replaceChild"];function Le(e){const t=function(e){return(e||B.ee).get("jsonp")}(e);if(!p.RI||Ce[t.debugId])return t;Ce[t.debugId]=!0;var r=(0,W.YM)(t),n=/[?&](?:callback|cb)=([^&#]+)/,i=/(.*)\.([^.]+)/,o=/^(\w+)(\.|$)(.*)$/;function a(e,t){if(!e)return t;const r=e.match(o),n=r[1];return a(r[3],t[n])}return r.inPlace(Node.prototype,ke,"dom-"),t.on("dom-start",(function(e){!function(e){if(!e||"string"!=typeof e.nodeName||"script"!==e.nodeName.toLowerCase())return;if("function"!=typeof e.addEventListener)return;var o=(s=e.src,c=s.match(n),c?c[1]:null);var s,c;if(!o)return;var u=function(e){var t=e.match(i);if(t&&t.length>=3)return{key:t[2],parent:a(t[1],window)};return{key:e,parent:window}}(o);if("function"!=typeof u.parent[u.key])return;var d={};function l(){t.emit("jsonp-end",[],d),e.removeEventListener("load",l,(0,A.jT)(!1)),e.removeEventListener("error",f,(0,A.jT)(!1))}function f(){t.emit("jsonp-error",[],d),t.emit("jsonp-end",[],d),e.removeEventListener("load",l,(0,A.jT)(!1)),e.removeEventListener("error",f,(0,A.jT)(!1))}r.inPlace(u.parent,[u.key],"cb-",d),e.addEventListener("load",l,(0,A.jT)(!1)),e.addEventListener("error",f,(0,A.jT)(!1)),t.emit("new-jsonp",[e.src],d)}(e[0])})),t}const He={};function De(e){const t=function(e){return(e||B.ee).get("promise")}(e);if(He[t.debugId])return t;He[t.debugId]=!0;var r=t.context,n=(0,W.YM)(t),i=p.gm.Promise;return i&&function(){function e(r){var o=t.context(),a=n(r,"executor-",o,null,!1);const s=Reflect.construct(i,[a],e);return t.context(s).getCtx=function(){return o},s}p.gm.Promise=e,Object.defineProperty(e,"name",{value:"Promise"}),e.toString=function(){return i.toString()},Object.setPrototypeOf(e,i),["all","race"].forEach((function(r){const n=i[r];e[r]=function(e){let i=!1;[...e||[]].forEach((e=>{this.resolve(e).then(a("all"===r),a(!1))}));const o=n.apply(this,arguments);return o;function a(e){return function(){t.emit("propagate",[null,!i],o,!1,!1),i=i||!e}}}})),["resolve","reject"].forEach((function(r){const n=i[r];e[r]=function(e){const r=n.apply(this,arguments);return e!==r&&t.emit("propagate",[e,!0],r,!1,!1),r}})),e.prototype=i.prototype;const o=i.prototype.then;i.prototype.then=function(...e){var i=this,a=r(i);a.promise=i,e[0]=n(e[0],"cb-",a,null,!1),e[1]=n(e[1],"cb-",a,null,!1);const s=o.apply(this,e);return a.nextPromise=s,t.emit("propagate",[i,!0],s,!1,!1),s},i.prototype.then[W.Jt]=o,t.on("executor-start",(function(e){e[0]=n(e[0],"resolve-",this,null,!1),e[1]=n(e[1],"resolve-",this,null,!1)})),t.on("executor-err",(function(e,t,r){e[1](r)})),t.on("cb-end",(function(e,r,n){t.emit("propagate",[n,!0],this.nextPromise,!1,!1)})),t.on("propagate",(function(e,r,n){this.getCtx&&!r||(this.getCtx=function(){if(e instanceof Promise)var r=t.context(e);return r&&r.getCtx?r.getCtx():this})}))}(),t}const Me={},Ke="setTimeout",Ue="setInterval",Ve="clearTimeout",Ge="-start",Fe=[Ke,"setImmediate",Ue,Ve,"clearImmediate"];function Be(e){const t=function(e){return(e||B.ee).get("timer")}(e);if(Me[t.debugId]++)return t;Me[t.debugId]=1;var r=(0,W.YM)(t);return r.inPlace(p.gm,Fe.slice(0,2),Ke+"-"),r.inPlace(p.gm,Fe.slice(2,3),Ue+"-"),r.inPlace(p.gm,Fe.slice(3),Ve+"-"),t.on(Ue+Ge,(function(e,t,n){e[0]=r(e[0],"fn-",null,n)})),t.on(Ke+Ge,(function(e,t,n){this.method=n,this.timerDuration=isNaN(e[1])?0:+e[1],e[0]=r(e[0],"fn-",this,n)})),t}const We={};function ze(e){const t=function(e){return(e||B.ee).get("mutation")}(e);if(!p.RI||We[t.debugId])return t;We[t.debugId]=!0;var r=(0,W.YM)(t),n=p.gm.MutationObserver;return n&&(window.MutationObserver=function(e){return this instanceof n?new n(r(e,"fn-")):n.apply(this,arguments)},MutationObserver.prototype=n.prototype),t}const{TZ:qe,d3:Ze,Kp:Ye,$p:Xe,wW:Je,e5:Qe,tH:$e,uP:et,rw:tt,Lc:rt}=Pe;class nt extends b{static featureName=qe;constructor(e,t=!0){if(super(e,qe,t),!p.RI)return;try{this.removeOnAbort=new AbortController}catch(e){}let r,n=0;const i=this.ee.get("tracer"),o=Le(this.ee),a=De(this.ee),s=Be(this.ee),c=Z(this.ee),u=this.ee.get("events"),d=ne(this.ee),l=ve(this.ee),f=ze(this.ee);function h(e,t){l.emit("newURL",[""+window.location,t])}function g(){n++,r=window.location.hash,this[et]=(0,S.t)()}function m(){n--,window.location.hash!==r&&h(0,!0);var e=(0,S.t)();this[Qe]=~~this[Qe]+e-this[et],this[rt]=e}function v(e,t){e.on(t,(function(){this[t]=(0,S.t)()}))}this.ee.on(et,g),a.on(tt,g),o.on(tt,g),this.ee.on(rt,m),a.on(Je,m),o.on(Je,m),this.ee.on("fn-err",((...t)=>{t[2]?.__newrelic?.[e.agentIdentifier]||(0,x.p)("function-err",[...t],void 0,this.featureName,this.ee)})),this.ee.buffer([et,rt,"xhr-resolved"],this.featureName),u.buffer([et],this.featureName),s.buffer(["setTimeout"+Ye,"clearTimeout"+Ze,et],this.featureName),c.buffer([et,"new-xhr","send-xhr"+Ze],this.featureName),d.buffer([$e+Ze,$e+"-done",$e+Xe+Ze,$e+Xe+Ye],this.featureName),l.buffer(["newURL"],this.featureName),f.buffer([et],this.featureName),a.buffer(["propagate",tt,Je,"executor-err","resolve"+Ze],this.featureName),i.buffer([et,"no-"+et],this.featureName),o.buffer(["new-jsonp","cb-start","jsonp-error","jsonp-end"],this.featureName),v(d,$e+Ze),v(d,$e+"-done"),v(o,"new-jsonp"),v(o,"jsonp-end"),v(o,"cb-start"),l.on("pushState-end",h),l.on("replaceState-end",h),window.addEventListener("hashchange",h,(0,A.jT)(!0,this.removeOnAbort?.signal)),window.addEventListener("load",h,(0,A.jT)(!0,this.removeOnAbort?.signal)),window.addEventListener("popstate",(function(){h(0,n>1)}),(0,A.jT)(!0,this.removeOnAbort?.signal)),this.abortHandler=this.#n,this.importAggregator(e)}#n(){this.removeOnAbort?.abort(),this.abortHandler=void 0}}var it=i(3333);class ot extends b{static featureName=it.TZ;constructor(e,t=!0){super(e,it.TZ,t);const r=[e.init.page_action.enabled,e.init.performance.capture_marks,e.init.performance.capture_measures,e.init.user_actions.enabled];p.RI&&e.init.user_actions.enabled&&(it.Zp.forEach((e=>(0,A.sp)(e,(e=>(0,x.p)("ua",[e],void 0,this.featureName,this.ee)),!0))),it.qN.forEach((e=>(0,A.sp)(e,(e=>(0,x.p)("ua",[e],void 0,this.featureName,this.ee)))))),r.some((e=>e))?this.importAggregator(e):this.deregisterDrain()}}var at=i(993),st=i(3785);class ct extends b{static featureName=at.TZ;constructor(e,t=!0){super(e,at.TZ,t);const r=this.ee;this.ee.on("wrap-logger-end",(function([e]){const{level:t,customAttributes:n}=this;(0,st.R)(r,e,n,t)})),this.importAggregator(e)}}new class extends o{constructor(t,r){super(r),p.gm?(this.features={},(0,R.bQ)(this.agentIdentifier,this),this.desiredFeatures=new Set(t.features||[]),this.desiredFeatures.add(w),this.runSoftNavOverSpa=[...this.desiredFeatures].some((e=>e.featureName===a.K7.softNav)),(0,d.j)(this,t,t.loaderType||"agent"),this.run()):(0,e.R)(21)}get config(){return{info:this.info,init:this.init,loader_config:this.loader_config,runtime:this.runtime}}run(){try{const t=u(this.agentIdentifier),r=[...this.desiredFeatures];r.sort(((e,t)=>a.P3[e.featureName]-a.P3[t.featureName])),r.forEach((r=>{if(!t[r.featureName]&&r.featureName!==a.K7.pageViewEvent)return;if(this.runSoftNavOverSpa&&r.featureName===a.K7.spa)return;if(!this.runSoftNavOverSpa&&r.featureName===a.K7.softNav)return;const n=function(e){switch(e){case a.K7.ajax:return[a.K7.jserrors];case a.K7.sessionTrace:return[a.K7.ajax,a.K7.pageViewEvent];case a.K7.sessionReplay:return[a.K7.sessionTrace];case a.K7.pageViewTiming:return[a.K7.pageViewEvent];default:return[]}}(r.featureName).filter((e=>!(e in this.features)));n.length>0&&(0,e.R)(36,{targetFeature:r.featureName,missingDependencies:n}),this.features[r.featureName]=new r(this)}))}catch(t){(0,e.R)(22,t);for(const e in this.features)this.features[e].abortHandler?.();const r=(0,R.Zm)();delete r.initializedAgents[this.agentIdentifier]?.api,delete r.initializedAgents[this.agentIdentifier]?.features,delete this.sharedAggregator;return r.ee.get(this.agentIdentifier).abort(),!1}}}({features:[he,w,N,Ne,_e,_,D,ot,ct,je,nt],loaderType:"spa"})})()})();</script> <meta name="viewport" content="width=device-width, initial-scale=1" /> <meta name='robots' content='index, follow, max-image-preview:large, max-snippet:-1, max-video-preview:-1' /> <!-- This site is optimized with the Yoast SEO Premium plugin v21.5 (Yoast SEO v23.6) - https://yoast.com/wordpress/plugins/seo/ --> <meta name="description" content="Simple tethers turn brainless bots into maze-solving marvels" /> <link rel="canonical" href="https://engineering.princeton.edu/news/2024/10/31/these-little-robots-two-heads-are-better-one" /> <meta property="og:locale" content="en_US" /> <meta property="og:type" content="article" /> <meta property="og:title" content="Princeton Engineering - For these little robots, two heads are better than one" /> <meta property="og:description" content="Simple tethers turn brainless bots into maze-solving marvels" /> <meta property="og:url" content="https://engineering.princeton.edu/news/2024/10/31/these-little-robots-two-heads-are-better-one" /> <meta property="og:site_name" content="Princeton Engineering" /> <meta property="article:publisher" content="https://www.facebook.com/princetonengineering/" /> <meta property="article:modified_time" content="2024-11-21T21:34:47+00:00" /> <meta property="og:image" content="https://engineering.princeton.edu/wp-content/uploads/2024/10/PTBrunLab_101724_0030-1920x1200-1.jpg" /> <meta property="og:image:width" content="1600" /> <meta property="og:image:height" content="1000" /> <meta property="og:image:type" content="image/jpeg" /> <meta name="twitter:card" content="summary_large_image" /> <meta name="twitter:site" content="@EPrinceton" /> <meta name="twitter:label1" content="Est. reading time" /> <meta name="twitter:data1" content="4 minutes" /> <script type="application/ld+json" class="yoast-schema-graph">{"@context":"https://schema.org","@graph":[{"@type":"NewsArticle","@id":"https://engineering.princeton.edu/news/2024/10/31/these-little-robots-two-heads-are-better-one#article","isPartOf":{"@id":"https://engineering.princeton.edu/news/2024/10/31/these-little-robots-two-heads-are-better-one"},"author":{"name":"John Sullivan","@id":"https://engineering.princeton.edu/#/schema/person/654961a137c946a384cc0d3b03d1050b"},"headline":"For these little robots, two heads are better than one","datePublished":"2024-10-31T17:01:16+00:00","dateModified":"2024-11-21T21:34:47+00:00","mainEntityOfPage":{"@id":"https://engineering.princeton.edu/news/2024/10/31/these-little-robots-two-heads-are-better-one"},"wordCount":897,"publisher":{"@id":"https://engineering.princeton.edu/#organization"},"image":{"@id":"https://engineering.princeton.edu/news/2024/10/31/these-little-robots-two-heads-are-better-one#primaryimage"},"thumbnailUrl":"https://engineering.princeton.edu/wp-content/uploads/2024/10/PTBrunLab_101724_0030-1920x1200-1.jpg","inLanguage":"en-US","copyrightYear":"2024","copyrightHolder":{"@id":"https://engineering.princeton.edu/#organization"}},{"@type":"WebPage","@id":"https://engineering.princeton.edu/news/2024/10/31/these-little-robots-two-heads-are-better-one","url":"https://engineering.princeton.edu/news/2024/10/31/these-little-robots-two-heads-are-better-one","name":"For these little robots, two heads are better than one - Princeton Engineering","isPartOf":{"@id":"https://engineering.princeton.edu/#website"},"primaryImageOfPage":{"@id":"https://engineering.princeton.edu/news/2024/10/31/these-little-robots-two-heads-are-better-one#primaryimage"},"image":{"@id":"https://engineering.princeton.edu/news/2024/10/31/these-little-robots-two-heads-are-better-one#primaryimage"},"thumbnailUrl":"https://engineering.princeton.edu/wp-content/uploads/2024/10/PTBrunLab_101724_0030-1920x1200-1.jpg","datePublished":"2024-10-31T17:01:16+00:00","dateModified":"2024-11-21T21:34:47+00:00","description":"Simple tethers turn brainless bots into maze-solving marvels","breadcrumb":{"@id":"https://engineering.princeton.edu/news/2024/10/31/these-little-robots-two-heads-are-better-one#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https://engineering.princeton.edu/news/2024/10/31/these-little-robots-two-heads-are-better-one"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https://engineering.princeton.edu/news/2024/10/31/these-little-robots-two-heads-are-better-one#primaryimage","url":"https://engineering.princeton.edu/wp-content/uploads/2024/10/PTBrunLab_101724_0030-1920x1200-1.jpg","contentUrl":"https://engineering.princeton.edu/wp-content/uploads/2024/10/PTBrunLab_101724_0030-1920x1200-1.jpg","width":1600,"height":1000,"caption":"The robots have no internal controls. Guidance depends on a flexible tether. Photos by Sameer A. Khan/Fotobuddy"},{"@type":"BreadcrumbList","@id":"https://engineering.princeton.edu/news/2024/10/31/these-little-robots-two-heads-are-better-one#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https://engineering.princeton.edu/"},{"@type":"ListItem","position":2,"name":"For these little robots, two heads are better than one"}]},{"@type":"WebSite","@id":"https://engineering.princeton.edu/#website","url":"https://engineering.princeton.edu/","name":"Princeton Engineering","description":"","publisher":{"@id":"https://engineering.princeton.edu/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https://engineering.princeton.edu/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https://engineering.princeton.edu/#organization","name":"Princeton Engineering | Princeton University","url":"https://engineering.princeton.edu/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https://engineering.princeton.edu/#/schema/logo/image/","url":"https://engineering.princeton.edu/wp-content/uploads/2024/10/Princeton-Engineering-Social-Media-5-X-Profile-Icon.png","contentUrl":"https://engineering.princeton.edu/wp-content/uploads/2024/10/Princeton-Engineering-Social-Media-5-X-Profile-Icon.png","width":500,"height":500,"caption":"Princeton Engineering | Princeton University"},"image":{"@id":"https://engineering.princeton.edu/#/schema/logo/image/"},"sameAs":["https://www.facebook.com/princetonengineering/","https://x.com/EPrinceton","https://www.instagram.com/eprinceton/","https://www.linkedin.com/school/princetonengineering/","https://www.youtube.com/user/princetonengineering","https://en.m.wikipedia.org/wiki/Princeton_University_School_of_Engineering_and_Applied_Science"]},{"@type":"Person","@id":"https://engineering.princeton.edu/#/schema/person/654961a137c946a384cc0d3b03d1050b","name":"John Sullivan"}]}</script> <!-- / Yoast SEO Premium plugin. --> <title>For these little robots, two heads are better than one - Princeton Engineering</title> <link rel='dns-prefetch' href='//engineering.princeton.edu' /> <link rel='dns-prefetch' href='//kit.fontawesome.com' /> <link rel='dns-prefetch' href='//cdn.jsdelivr.net' /> <link rel='dns-prefetch' href='//www.googletagmanager.com' /> <link rel='dns-prefetch' href='//fonts.googleapis.com' /> <link rel="alternate" type="application/rss+xml" title="Princeton Engineering » Feed" href="https://engineering.princeton.edu/feed" /> <link rel="alternate" type="application/rss+xml" title="Princeton Engineering » Comments Feed" href="https://engineering.princeton.edu/comments/feed" /> <script> window._wpemojiSettings = {"baseUrl":"https:\/\/s.w.org\/images\/core\/emoji\/15.0.3\/72x72\/","ext":".png","svgUrl":"https:\/\/s.w.org\/images\/core\/emoji\/15.0.3\/svg\/","svgExt":".svg","source":{"concatemoji":"https:\/\/engineering.princeton.edu\/wp-includes\/js\/wp-emoji-release.min.js?ver=6.6.2"}}; /*! This file is auto-generated */ !function(i,n){var o,s,e;function c(e){try{var t={supportTests:e,timestamp:(new Date).valueOf()};sessionStorage.setItem(o,JSON.stringify(t))}catch(e){}}function p(e,t,n){e.clearRect(0,0,e.canvas.width,e.canvas.height),e.fillText(t,0,0);var t=new Uint32Array(e.getImageData(0,0,e.canvas.width,e.canvas.height).data),r=(e.clearRect(0,0,e.canvas.width,e.canvas.height),e.fillText(n,0,0),new Uint32Array(e.getImageData(0,0,e.canvas.width,e.canvas.height).data));return t.every(function(e,t){return e===r[t]})}function u(e,t,n){switch(t){case"flag":return n(e,"\ud83c\udff3\ufe0f\u200d\u26a7\ufe0f","\ud83c\udff3\ufe0f\u200b\u26a7\ufe0f")?!1:!n(e,"\ud83c\uddfa\ud83c\uddf3","\ud83c\uddfa\u200b\ud83c\uddf3")&&!n(e,"\ud83c\udff4\udb40\udc67\udb40\udc62\udb40\udc65\udb40\udc6e\udb40\udc67\udb40\udc7f","\ud83c\udff4\u200b\udb40\udc67\u200b\udb40\udc62\u200b\udb40\udc65\u200b\udb40\udc6e\u200b\udb40\udc67\u200b\udb40\udc7f");case"emoji":return!n(e,"\ud83d\udc26\u200d\u2b1b","\ud83d\udc26\u200b\u2b1b")}return!1}function f(e,t,n){var r="undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope?new OffscreenCanvas(300,150):i.createElement("canvas"),a=r.getContext("2d",{willReadFrequently:!0}),o=(a.textBaseline="top",a.font="600 32px Arial",{});return e.forEach(function(e){o[e]=t(a,e,n)}),o}function t(e){var t=i.createElement("script");t.src=e,t.defer=!0,i.head.appendChild(t)}"undefined"!=typeof Promise&&(o="wpEmojiSettingsSupports",s=["flag","emoji"],n.supports={everything:!0,everythingExceptFlag:!0},e=new Promise(function(e){i.addEventListener("DOMContentLoaded",e,{once:!0})}),new Promise(function(t){var n=function(){try{var e=JSON.parse(sessionStorage.getItem(o));if("object"==typeof e&&"number"==typeof e.timestamp&&(new Date).valueOf()<e.timestamp+604800&&"object"==typeof e.supportTests)return e.supportTests}catch(e){}return null}();if(!n){if("undefined"!=typeof Worker&&"undefined"!=typeof OffscreenCanvas&&"undefined"!=typeof URL&&URL.createObjectURL&&"undefined"!=typeof Blob)try{var e="postMessage("+f.toString()+"("+[JSON.stringify(s),u.toString(),p.toString()].join(",")+"));",r=new Blob([e],{type:"text/javascript"}),a=new Worker(URL.createObjectURL(r),{name:"wpTestEmojiSupports"});return void(a.onmessage=function(e){c(n=e.data),a.terminate(),t(n)})}catch(e){}c(n=f(s,u,p))}t(n)}).then(function(e){for(var t in e)n.supports[t]=e[t],n.supports.everything=n.supports.everything&&n.supports[t],"flag"!==t&&(n.supports.everythingExceptFlag=n.supports.everythingExceptFlag&&n.supports[t]);n.supports.everythingExceptFlag=n.supports.everythingExceptFlag&&!n.supports.flag,n.DOMReady=!1,n.readyCallback=function(){n.DOMReady=!0}}).then(function(){return e}).then(function(){var e;n.supports.everything||(n.readyCallback(),(e=n.source||{}).concatemoji?t(e.concatemoji):e.wpemoji&&e.twemoji&&(t(e.twemoji),t(e.wpemoji)))}))}((window,document),window._wpemojiSettings); </script> <style id='wp-block-group-inline-css'> .wp-block-group{box-sizing:border-box}:where(.wp-block-group.wp-block-group-is-layout-constrained){position:relative} </style> <style id='wp-block-post-featured-image-inline-css'> .wp-block-post-featured-image{margin-left:0;margin-right:0}.wp-block-post-featured-image a{display:block;height:100%}.wp-block-post-featured-image :where(img){box-sizing:border-box;height:auto;max-width:100%;vertical-align:bottom;width:100%}.wp-block-post-featured-image.alignfull img,.wp-block-post-featured-image.alignwide img{width:100%}.wp-block-post-featured-image .wp-block-post-featured-image__overlay.has-background-dim{background-color:#000;inset:0;position:absolute}.wp-block-post-featured-image{position:relative}.wp-block-post-featured-image .wp-block-post-featured-image__overlay.has-background-gradient{background-color:initial}.wp-block-post-featured-image .wp-block-post-featured-image__overlay.has-background-dim-0{opacity:0}.wp-block-post-featured-image .wp-block-post-featured-image__overlay.has-background-dim-10{opacity:.1}.wp-block-post-featured-image .wp-block-post-featured-image__overlay.has-background-dim-20{opacity:.2}.wp-block-post-featured-image .wp-block-post-featured-image__overlay.has-background-dim-30{opacity:.3}.wp-block-post-featured-image .wp-block-post-featured-image__overlay.has-background-dim-40{opacity:.4}.wp-block-post-featured-image .wp-block-post-featured-image__overlay.has-background-dim-50{opacity:.5}.wp-block-post-featured-image .wp-block-post-featured-image__overlay.has-background-dim-60{opacity:.6}.wp-block-post-featured-image .wp-block-post-featured-image__overlay.has-background-dim-70{opacity:.7}.wp-block-post-featured-image .wp-block-post-featured-image__overlay.has-background-dim-80{opacity:.8}.wp-block-post-featured-image .wp-block-post-featured-image__overlay.has-background-dim-90{opacity:.9}.wp-block-post-featured-image .wp-block-post-featured-image__overlay.has-background-dim-100{opacity:1}.wp-block-post-featured-image:where(.alignleft,.alignright){width:100%} </style> <style id='wp-block-post-title-inline-css'> .wp-block-post-title{box-sizing:border-box;word-break:break-word}.wp-block-post-title a{display:inline-block} </style> <style id='wp-block-paragraph-inline-css'> .is-small-text{font-size:.875em}.is-regular-text{font-size:1em}.is-large-text{font-size:2.25em}.is-larger-text{font-size:3em}.has-drop-cap:not(:focus):first-letter{float:left;font-size:8.4em;font-style:normal;font-weight:100;line-height:.68;margin:.05em .1em 0 0;text-transform:uppercase}body.rtl .has-drop-cap:not(:focus):first-letter{float:none;margin-left:.1em}p.has-drop-cap.has-background{overflow:hidden}:root :where(p.has-background){padding:1.25em 2.375em}:where(p.has-text-color:not(.has-link-color)) a{color:inherit}p.has-text-align-left[style*="writing-mode:vertical-lr"],p.has-text-align-right[style*="writing-mode:vertical-rl"]{rotate:180deg} </style> <style id='mfb-meta-field-block-style-inline-css'> .wp-block-mfb-meta-field-block,.wp-block-mfb-meta-field-block *{box-sizing:border-box}.wp-block-mfb-meta-field-block.is-layout-flow>.prefix,.wp-block-mfb-meta-field-block.is-layout-flow>.suffix,.wp-block-mfb-meta-field-block.is-layout-flow>.value{margin-block-end:0;margin-block-start:0}.wp-block-mfb-meta-field-block.is-display-inline-block>*{display:inline-block}.wp-block-mfb-meta-field-block.is-display-inline-block .prefix{margin-inline-end:var(--mfb--gap,.5em)}.wp-block-mfb-meta-field-block.is-display-inline-block .suffix{margin-inline-start:var(--mfb--gap,.5em)} </style> <style id='wp-block-post-date-inline-css'> .wp-block-post-date{box-sizing:border-box} </style> <style id='wp-block-image-inline-css'> .wp-block-image img{box-sizing:border-box;height:auto;max-width:100%;vertical-align:bottom}.wp-block-image[style*=border-radius] img,.wp-block-image[style*=border-radius]>a{border-radius:inherit}.wp-block-image.has-custom-border img{box-sizing:border-box}.wp-block-image.aligncenter{text-align:center}.wp-block-image.alignfull img,.wp-block-image.alignwide img{height:auto;width:100%}.wp-block-image .aligncenter,.wp-block-image .alignleft,.wp-block-image .alignright,.wp-block-image.aligncenter,.wp-block-image.alignleft,.wp-block-image.alignright{display:table}.wp-block-image .aligncenter>figcaption,.wp-block-image .alignleft>figcaption,.wp-block-image .alignright>figcaption,.wp-block-image.aligncenter>figcaption,.wp-block-image.alignleft>figcaption,.wp-block-image.alignright>figcaption{caption-side:bottom;display:table-caption}.wp-block-image .alignleft{float:left;margin:.5em 1em .5em 0}.wp-block-image .alignright{float:right;margin:.5em 0 .5em 1em}.wp-block-image .aligncenter{margin-left:auto;margin-right:auto}.wp-block-image :where(figcaption){margin-bottom:1em;margin-top:.5em}.wp-block-image.is-style-circle-mask img{border-radius:9999px}@supports ((-webkit-mask-image:none) or (mask-image:none)) or (-webkit-mask-image:none){.wp-block-image.is-style-circle-mask img{border-radius:0;-webkit-mask-image:url('data:image/svg+xml;utf8,<svg viewBox="0 0 100 100" xmlns="http://www.w3.org/2000/svg"><circle cx="50" cy="50" r="50"/></svg>');mask-image:url('data:image/svg+xml;utf8,<svg viewBox="0 0 100 100" xmlns="http://www.w3.org/2000/svg"><circle cx="50" cy="50" r="50"/></svg>');mask-mode:alpha;-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain}}:root :where(.wp-block-image.is-style-rounded img,.wp-block-image .is-style-rounded img){border-radius:9999px}.wp-block-image figure{margin:0}.wp-lightbox-container{display:flex;flex-direction:column;position:relative}.wp-lightbox-container img{cursor:zoom-in}.wp-lightbox-container img:hover+button{opacity:1}.wp-lightbox-container button{align-items:center;-webkit-backdrop-filter:blur(16px) saturate(180%);backdrop-filter:blur(16px) saturate(180%);background-color:#5a5a5a40;border:none;border-radius:4px;cursor:zoom-in;display:flex;height:20px;justify-content:center;opacity:0;padding:0;position:absolute;right:16px;text-align:center;top:16px;transition:opacity .2s ease;width:20px;z-index:100}.wp-lightbox-container button:focus-visible{outline:3px auto #5a5a5a40;outline:3px auto -webkit-focus-ring-color;outline-offset:3px}.wp-lightbox-container button:hover{cursor:pointer;opacity:1}.wp-lightbox-container button:focus{opacity:1}.wp-lightbox-container button:focus,.wp-lightbox-container button:hover,.wp-lightbox-container button:not(:hover):not(:active):not(.has-background){background-color:#5a5a5a40;border:none}.wp-lightbox-overlay{box-sizing:border-box;cursor:zoom-out;height:100vh;left:0;overflow:hidden;position:fixed;top:0;visibility:hidden;width:100%;z-index:100000}.wp-lightbox-overlay .close-button{align-items:center;cursor:pointer;display:flex;justify-content:center;min-height:40px;min-width:40px;padding:0;position:absolute;right:calc(env(safe-area-inset-right) + 16px);top:calc(env(safe-area-inset-top) + 16px);z-index:5000000}.wp-lightbox-overlay .close-button:focus,.wp-lightbox-overlay .close-button:hover,.wp-lightbox-overlay .close-button:not(:hover):not(:active):not(.has-background){background:none;border:none}.wp-lightbox-overlay .lightbox-image-container{height:var(--wp--lightbox-container-height);left:50%;overflow:hidden;position:absolute;top:50%;transform:translate(-50%,-50%);transform-origin:top left;width:var(--wp--lightbox-container-width);z-index:9999999999}.wp-lightbox-overlay .wp-block-image{align-items:center;box-sizing:border-box;display:flex;height:100%;justify-content:center;margin:0;position:relative;transform-origin:0 0;width:100%;z-index:3000000}.wp-lightbox-overlay .wp-block-image img{height:var(--wp--lightbox-image-height);min-height:var(--wp--lightbox-image-height);min-width:var(--wp--lightbox-image-width);width:var(--wp--lightbox-image-width)}.wp-lightbox-overlay .wp-block-image figcaption{display:none}.wp-lightbox-overlay button{background:none;border:none}.wp-lightbox-overlay .scrim{background-color:#fff;height:100%;opacity:.9;position:absolute;width:100%;z-index:2000000}.wp-lightbox-overlay.active{animation:turn-on-visibility .25s both;visibility:visible}.wp-lightbox-overlay.active img{animation:turn-on-visibility .35s both}.wp-lightbox-overlay.show-closing-animation:not(.active){animation:turn-off-visibility .35s both}.wp-lightbox-overlay.show-closing-animation:not(.active) img{animation:turn-off-visibility .25s both}@media (prefers-reduced-motion:no-preference){.wp-lightbox-overlay.zoom.active{animation:none;opacity:1;visibility:visible}.wp-lightbox-overlay.zoom.active .lightbox-image-container{animation:lightbox-zoom-in .4s}.wp-lightbox-overlay.zoom.active .lightbox-image-container img{animation:none}.wp-lightbox-overlay.zoom.active .scrim{animation:turn-on-visibility .4s forwards}.wp-lightbox-overlay.zoom.show-closing-animation:not(.active){animation:none}.wp-lightbox-overlay.zoom.show-closing-animation:not(.active) .lightbox-image-container{animation:lightbox-zoom-out .4s}.wp-lightbox-overlay.zoom.show-closing-animation:not(.active) .lightbox-image-container img{animation:none}.wp-lightbox-overlay.zoom.show-closing-animation:not(.active) .scrim{animation:turn-off-visibility .4s forwards}}@keyframes turn-on-visibility{0%{opacity:0}to{opacity:1}}@keyframes turn-off-visibility{0%{opacity:1;visibility:visible}99%{opacity:0;visibility:visible}to{opacity:0;visibility:hidden}}@keyframes lightbox-zoom-in{0%{transform:translate(calc((-100vw + var(--wp--lightbox-scrollbar-width))/2 + var(--wp--lightbox-initial-left-position)),calc(-50vh + var(--wp--lightbox-initial-top-position))) scale(var(--wp--lightbox-scale))}to{transform:translate(-50%,-50%) scale(1)}}@keyframes lightbox-zoom-out{0%{transform:translate(-50%,-50%) scale(1);visibility:visible}99%{visibility:visible}to{transform:translate(calc((-100vw + var(--wp--lightbox-scrollbar-width))/2 + var(--wp--lightbox-initial-left-position)),calc(-50vh + var(--wp--lightbox-initial-top-position))) scale(var(--wp--lightbox-scale));visibility:hidden}} </style> <style id='wp-block-separator-inline-css'> @charset "UTF-8";.wp-block-separator{border:none;border-top:2px solid}:root :where(.wp-block-separator.is-style-dots){height:auto;line-height:1;text-align:center}:root :where(.wp-block-separator.is-style-dots):before{color:currentColor;content:"···";font-family:serif;font-size:1.5em;letter-spacing:2em;padding-left:2em}.wp-block-separator.is-style-dots{background:none!important;border:none!important} </style> <style id='wp-emoji-styles-inline-css'> img.wp-smiley, img.emoji { display: inline !important; border: none !important; box-shadow: none !important; height: 1em !important; width: 1em !important; margin: 0 0.07em !important; vertical-align: -0.1em !important; background: none !important; padding: 0 !important; } </style> <style id='wp-block-library-inline-css'> :root{--wp-admin-theme-color:#007cba;--wp-admin-theme-color--rgb:0,124,186;--wp-admin-theme-color-darker-10:#006ba1;--wp-admin-theme-color-darker-10--rgb:0,107,161;--wp-admin-theme-color-darker-20:#005a87;--wp-admin-theme-color-darker-20--rgb:0,90,135;--wp-admin-border-width-focus:2px;--wp-block-synced-color:#7a00df;--wp-block-synced-color--rgb:122,0,223;--wp-bound-block-color:var(--wp-block-synced-color)}@media (min-resolution:192dpi){:root{--wp-admin-border-width-focus:1.5px}}.wp-element-button{cursor:pointer}:root{--wp--preset--font-size--normal:16px;--wp--preset--font-size--huge:42px}:root .has-very-light-gray-background-color{background-color:#eee}:root .has-very-dark-gray-background-color{background-color:#313131}:root .has-very-light-gray-color{color:#eee}:root .has-very-dark-gray-color{color:#313131}:root .has-vivid-green-cyan-to-vivid-cyan-blue-gradient-background{background:linear-gradient(135deg,#00d084,#0693e3)}:root .has-purple-crush-gradient-background{background:linear-gradient(135deg,#34e2e4,#4721fb 50%,#ab1dfe)}:root .has-hazy-dawn-gradient-background{background:linear-gradient(135deg,#faaca8,#dad0ec)}:root .has-subdued-olive-gradient-background{background:linear-gradient(135deg,#fafae1,#67a671)}:root .has-atomic-cream-gradient-background{background:linear-gradient(135deg,#fdd79a,#004a59)}:root .has-nightshade-gradient-background{background:linear-gradient(135deg,#330968,#31cdcf)}:root .has-midnight-gradient-background{background:linear-gradient(135deg,#020381,#2874fc)}.has-regular-font-size{font-size:1em}.has-larger-font-size{font-size:2.625em}.has-normal-font-size{font-size:var(--wp--preset--font-size--normal)}.has-huge-font-size{font-size:var(--wp--preset--font-size--huge)}.has-text-align-center{text-align:center}.has-text-align-left{text-align:left}.has-text-align-right{text-align:right}#end-resizable-editor-section{display:none}.aligncenter{clear:both}.items-justified-left{justify-content:flex-start}.items-justified-center{justify-content:center}.items-justified-right{justify-content:flex-end}.items-justified-space-between{justify-content:space-between}.screen-reader-text{border:0;clip:rect(1px,1px,1px,1px);clip-path:inset(50%);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px;word-wrap:normal!important}.screen-reader-text:focus{background-color:#ddd;clip:auto!important;clip-path:none;color:#444;display:block;font-size:1em;height:auto;left:5px;line-height:normal;padding:15px 23px 14px;text-decoration:none;top:5px;width:auto;z-index:100000}html :where(.has-border-color){border-style:solid}html :where([style*=border-top-color]){border-top-style:solid}html :where([style*=border-right-color]){border-right-style:solid}html :where([style*=border-bottom-color]){border-bottom-style:solid}html :where([style*=border-left-color]){border-left-style:solid}html :where([style*=border-width]){border-style:solid}html :where([style*=border-top-width]){border-top-style:solid}html :where([style*=border-right-width]){border-right-style:solid}html :where([style*=border-bottom-width]){border-bottom-style:solid}html :where([style*=border-left-width]){border-left-style:solid}html :where(img[class*=wp-image-]){height:auto;max-width:100%}:where(figure){margin:0 0 1em}html :where(.is-position-sticky){--wp-admin--admin-bar--position-offset:var(--wp-admin--admin-bar--height,0px)}@media screen and (max-width:600px){html :where(.is-position-sticky){--wp-admin--admin-bar--position-offset:0px}} </style> <link rel='stylesheet' id='engineering-block-global-style-css' href='https://engineering.princeton.edu/wp-content/plugins/engineering/engineering-block-global-style.css?ver=1732641265' media='all' /> <style id='global-styles-inline-css'> :root{--wp--preset--aspect-ratio--square: 1;--wp--preset--aspect-ratio--4-3: 4/3;--wp--preset--aspect-ratio--3-4: 3/4;--wp--preset--aspect-ratio--3-2: 3/2;--wp--preset--aspect-ratio--2-3: 2/3;--wp--preset--aspect-ratio--16-9: 16/9;--wp--preset--aspect-ratio--9-16: 9/16;--wp--preset--color--black: #000000;--wp--preset--color--cyan-bluish-gray: #abb8c3;--wp--preset--color--white: #ffffff;--wp--preset--color--pale-pink: #f78da7;--wp--preset--color--vivid-red: #cf2e2e;--wp--preset--color--luminous-vivid-orange: #ff6900;--wp--preset--color--luminous-vivid-amber: #fcb900;--wp--preset--color--light-green-cyan: #7bdcb5;--wp--preset--color--vivid-green-cyan: #00d084;--wp--preset--color--pale-cyan-blue: #8ed1fc;--wp--preset--color--vivid-cyan-blue: #0693e3;--wp--preset--color--vivid-purple: #9b51e0;--wp--preset--color--base: #f9f9f9;--wp--preset--color--base-2: #ffffff;--wp--preset--color--base-3: #00000025;--wp--preset--color--contrast-yellow: #FEF9C3;--wp--preset--color--contrast-green: #EEFDF2;--wp--preset--color--contrast-blue: #EDF5FF;--wp--preset--color--contrast-red: #FEF0F0;--wp--preset--gradient--vivid-cyan-blue-to-vivid-purple: linear-gradient(135deg,rgba(6,147,227,1) 0%,rgb(155,81,224) 100%);--wp--preset--gradient--light-green-cyan-to-vivid-green-cyan: linear-gradient(135deg,rgb(122,220,180) 0%,rgb(0,208,130) 100%);--wp--preset--gradient--luminous-vivid-amber-to-luminous-vivid-orange: linear-gradient(135deg,rgba(252,185,0,1) 0%,rgba(255,105,0,1) 100%);--wp--preset--gradient--luminous-vivid-orange-to-vivid-red: linear-gradient(135deg,rgba(255,105,0,1) 0%,rgb(207,46,46) 100%);--wp--preset--gradient--very-light-gray-to-cyan-bluish-gray: linear-gradient(135deg,rgb(238,238,238) 0%,rgb(169,184,195) 100%);--wp--preset--gradient--cool-to-warm-spectrum: linear-gradient(135deg,rgb(74,234,220) 0%,rgb(151,120,209) 20%,rgb(207,42,186) 40%,rgb(238,44,130) 60%,rgb(251,105,98) 80%,rgb(254,248,76) 100%);--wp--preset--gradient--blush-light-purple: linear-gradient(135deg,rgb(255,206,236) 0%,rgb(152,150,240) 100%);--wp--preset--gradient--blush-bordeaux: linear-gradient(135deg,rgb(254,205,165) 0%,rgb(254,45,45) 50%,rgb(107,0,62) 100%);--wp--preset--gradient--luminous-dusk: linear-gradient(135deg,rgb(255,203,112) 0%,rgb(199,81,192) 50%,rgb(65,88,208) 100%);--wp--preset--gradient--pale-ocean: linear-gradient(135deg,rgb(255,245,203) 0%,rgb(182,227,212) 50%,rgb(51,167,181) 100%);--wp--preset--gradient--electric-grass: linear-gradient(135deg,rgb(202,248,128) 0%,rgb(113,206,126) 100%);--wp--preset--gradient--midnight: linear-gradient(135deg,rgb(2,3,129) 0%,rgb(40,116,252) 100%);--wp--preset--gradient--gradient-1: linear-gradient(to bottom, #cfcabe 0%, #F9F9F9 100%);--wp--preset--gradient--gradient-2: linear-gradient(to bottom, #C2A990 0%, #F9F9F9 100%);--wp--preset--gradient--gradient-3: linear-gradient(to bottom, #D8613C 0%, #F9F9F9 100%);--wp--preset--gradient--gradient-4: linear-gradient(to bottom, #B1C5A4 0%, #F9F9F9 100%);--wp--preset--gradient--gradient-5: linear-gradient(to bottom, #B5BDBC 0%, #F9F9F9 100%);--wp--preset--gradient--gradient-6: linear-gradient(to bottom, #A4A4A4 0%, #F9F9F9 100%);--wp--preset--gradient--gradient-7: linear-gradient(to bottom, #cfcabe 50%, #F9F9F9 50%);--wp--preset--gradient--gradient-8: linear-gradient(to bottom, #C2A990 50%, #F9F9F9 50%);--wp--preset--gradient--gradient-9: linear-gradient(to bottom, #D8613C 50%, #F9F9F9 50%);--wp--preset--gradient--gradient-10: linear-gradient(to bottom, #B1C5A4 50%, #F9F9F9 50%);--wp--preset--gradient--gradient-11: linear-gradient(to bottom, #B5BDBC 50%, #F9F9F9 50%);--wp--preset--gradient--gradient-12: linear-gradient(to bottom, #A4A4A4 50%, #F9F9F9 50%);--wp--preset--font-size--small: 0.9rem;--wp--preset--font-size--medium: 1.05rem;--wp--preset--font-size--large: clamp(1.39rem, 1.39rem + ((1vw - 0.2rem) * 0.767), 1.85rem);--wp--preset--font-size--x-large: clamp(1.85rem, 1.85rem + ((1vw - 0.2rem) * 1.083), 2.5rem);--wp--preset--font-size--xx-large: clamp(2.5rem, 2.5rem + ((1vw - 0.2rem) * 1.283), 3.27rem);--wp--preset--font-family--body: "Inter", sans-serif;--wp--preset--font-family--heading: Cardo;--wp--preset--font-family--system-sans-serif: -apple-system, BlinkMacSystemFont, avenir next, avenir, segoe ui, helvetica neue, helvetica, Cantarell, Ubuntu, roboto, noto, arial, sans-serif;--wp--preset--font-family--system-serif: Iowan Old Style, Apple Garamond, Baskerville, Times New Roman, Droid Serif, Times, Source Serif Pro, serif, Apple Color Emoji, Segoe UI Emoji, Segoe UI Symbol;--wp--preset--spacing--20: min(1.5rem, 2vw);--wp--preset--spacing--30: min(2.5rem, 3vw);--wp--preset--spacing--40: min(4rem, 5vw);--wp--preset--spacing--50: min(6.5rem, 8vw);--wp--preset--spacing--60: min(10.5rem, 13vw);--wp--preset--spacing--70: 3.38rem;--wp--preset--spacing--80: 5.06rem;--wp--preset--spacing--10: 1rem;--wp--preset--shadow--natural: 6px 6px 9px rgba(0, 0, 0, 0.2);--wp--preset--shadow--deep: 12px 12px 50px rgba(0, 0, 0, 0.4);--wp--preset--shadow--sharp: 6px 6px 0px rgba(0, 0, 0, 0.2);--wp--preset--shadow--outlined: 6px 6px 0px -3px rgba(255, 255, 255, 1), 6px 6px rgba(0, 0, 0, 1);--wp--preset--shadow--crisp: 6px 6px 0px rgba(0, 0, 0, 1);}:root { --wp--style--global--content-size: 620px;--wp--style--global--wide-size: 1280px; }:where(body) { margin: 0; }.wp-site-blocks { padding-top: var(--wp--style--root--padding-top); padding-bottom: var(--wp--style--root--padding-bottom); }.has-global-padding { padding-right: var(--wp--style--root--padding-right); padding-left: var(--wp--style--root--padding-left); }.has-global-padding > .alignfull { margin-right: calc(var(--wp--style--root--padding-right) * -1); margin-left: calc(var(--wp--style--root--padding-left) * -1); }.has-global-padding :where(:not(.alignfull.is-layout-flow) > .has-global-padding:not(.wp-block-block, .alignfull)) { padding-right: 0; padding-left: 0; }.has-global-padding :where(:not(.alignfull.is-layout-flow) > .has-global-padding:not(.wp-block-block, .alignfull)) > .alignfull { margin-left: 0; margin-right: 0; }.wp-site-blocks > .alignleft { float: left; margin-right: 2em; }.wp-site-blocks > .alignright { float: right; margin-left: 2em; }.wp-site-blocks > .aligncenter { justify-content: center; margin-left: auto; margin-right: auto; }:where(.wp-site-blocks) > * { margin-block-start: 1.2rem; margin-block-end: 0; }:where(.wp-site-blocks) > :first-child { margin-block-start: 0; }:where(.wp-site-blocks) > :last-child { margin-block-end: 0; }:root { --wp--style--block-gap: 1.2rem; }:root :where(.is-layout-flow) > :first-child{margin-block-start: 0;}:root :where(.is-layout-flow) > :last-child{margin-block-end: 0;}:root :where(.is-layout-flow) > *{margin-block-start: 1.2rem;margin-block-end: 0;}:root :where(.is-layout-constrained) > :first-child{margin-block-start: 0;}:root :where(.is-layout-constrained) > :last-child{margin-block-end: 0;}:root :where(.is-layout-constrained) > *{margin-block-start: 1.2rem;margin-block-end: 0;}:root :where(.is-layout-flex){gap: 1.2rem;}:root :where(.is-layout-grid){gap: 1.2rem;}.is-layout-flow > .alignleft{float: left;margin-inline-start: 0;margin-inline-end: 2em;}.is-layout-flow > .alignright{float: right;margin-inline-start: 2em;margin-inline-end: 0;}.is-layout-flow > .aligncenter{margin-left: auto !important;margin-right: auto !important;}.is-layout-constrained > .alignleft{float: left;margin-inline-start: 0;margin-inline-end: 2em;}.is-layout-constrained > .alignright{float: right;margin-inline-start: 2em;margin-inline-end: 0;}.is-layout-constrained > .aligncenter{margin-left: auto !important;margin-right: auto !important;}.is-layout-constrained > :where(:not(.alignleft):not(.alignright):not(.alignfull)){max-width: var(--wp--style--global--content-size);margin-left: auto !important;margin-right: auto !important;}.is-layout-constrained > .alignwide{max-width: var(--wp--style--global--wide-size);}body .is-layout-flex{display: flex;}.is-layout-flex{flex-wrap: wrap;align-items: center;}.is-layout-flex > :is(*, div){margin: 0;}body .is-layout-grid{display: grid;}.is-layout-grid > :is(*, div){margin: 0;}body{background-color: var(--wp--preset--color--base);color: var(--wp--preset--color--contrast);font-family: var(--wp--preset--font-family--body);font-size: var(--wp--preset--font-size--medium);font-style: normal;font-weight: 400;line-height: 1.55;--wp--style--root--padding-top: 0px;--wp--style--root--padding-right: var(--wp--preset--spacing--50);--wp--style--root--padding-bottom: 0px;--wp--style--root--padding-left: var(--wp--preset--spacing--50);}a:where(:not(.wp-element-button)){color: var(--wp--preset--color--contrast);text-decoration: underline;}:root :where(a:where(:not(.wp-element-button)):hover){text-decoration: none;}h1, h2, h3, h4, h5, h6{color: var(--wp--preset--color--contrast);font-family: var(--wp--preset--font-family--heading);font-weight: 400;line-height: 1.2;}h1{font-size: var(--wp--preset--font-size--xx-large);line-height: 1.15;}h2{font-size: var(--wp--preset--font-size--x-large);}h3{font-size: var(--wp--preset--font-size--large);}h4{font-size: clamp(1.1rem, 1.1rem + ((1vw - 0.2rem) * 0.767), 1.5rem);}h5{font-size: var(--wp--preset--font-size--medium);}h6{font-size: var(--wp--preset--font-size--small);}:root :where(.wp-element-button, .wp-block-button__link){background-color: var(--wp--preset--color--contrast);border-radius: .33rem;border-color: var(--wp--preset--color--contrast);border-width: 0;color: var(--wp--preset--color--base);font-family: inherit;font-size: var(--wp--preset--font-size--small);font-style: normal;font-weight: 500;line-height: inherit;padding-top: 0.6rem;padding-right: 1rem;padding-bottom: 0.6rem;padding-left: 1rem;text-decoration: none;}:root :where(.wp-element-button:hover, .wp-block-button__link:hover){background-color: var(--wp--preset--color--contrast-2);border-color: var(--wp--preset--color--contrast-2);color: var(--wp--preset--color--base);}:root :where(.wp-element-button:focus, .wp-block-button__link:focus){background-color: var(--wp--preset--color--contrast-2);border-color: var(--wp--preset--color--contrast-2);color: var(--wp--preset--color--base);outline-color: var(--wp--preset--color--contrast);outline-offset: 2px;outline-style: dotted;outline-width: 1px;}:root :where(.wp-element-button:active, .wp-block-button__link:active){background-color: var(--wp--preset--color--contrast);color: var(--wp--preset--color--base);}:root :where(.wp-element-caption, .wp-block-audio figcaption, .wp-block-embed figcaption, .wp-block-gallery figcaption, .wp-block-image figcaption, .wp-block-table figcaption, .wp-block-video figcaption){color: var(--wp--preset--color--contrast-2);font-family: var(--wp--preset--font-family--body);font-size: 0.8rem;}.has-black-color{color: var(--wp--preset--color--black) !important;}.has-cyan-bluish-gray-color{color: var(--wp--preset--color--cyan-bluish-gray) !important;}.has-white-color{color: var(--wp--preset--color--white) !important;}.has-pale-pink-color{color: var(--wp--preset--color--pale-pink) !important;}.has-vivid-red-color{color: var(--wp--preset--color--vivid-red) !important;}.has-luminous-vivid-orange-color{color: var(--wp--preset--color--luminous-vivid-orange) !important;}.has-luminous-vivid-amber-color{color: var(--wp--preset--color--luminous-vivid-amber) !important;}.has-light-green-cyan-color{color: var(--wp--preset--color--light-green-cyan) !important;}.has-vivid-green-cyan-color{color: var(--wp--preset--color--vivid-green-cyan) !important;}.has-pale-cyan-blue-color{color: var(--wp--preset--color--pale-cyan-blue) !important;}.has-vivid-cyan-blue-color{color: var(--wp--preset--color--vivid-cyan-blue) !important;}.has-vivid-purple-color{color: var(--wp--preset--color--vivid-purple) !important;}.has-base-color{color: var(--wp--preset--color--base) !important;}.has-base-2-color{color: var(--wp--preset--color--base-2) !important;}.has-base-3-color{color: var(--wp--preset--color--base-3) !important;}.has-contrast-yellow-color{color: var(--wp--preset--color--contrast-yellow) !important;}.has-contrast-green-color{color: var(--wp--preset--color--contrast-green) !important;}.has-contrast-blue-color{color: var(--wp--preset--color--contrast-blue) !important;}.has-contrast-red-color{color: var(--wp--preset--color--contrast-red) !important;}.has-black-background-color{background-color: var(--wp--preset--color--black) !important;}.has-cyan-bluish-gray-background-color{background-color: var(--wp--preset--color--cyan-bluish-gray) !important;}.has-white-background-color{background-color: var(--wp--preset--color--white) !important;}.has-pale-pink-background-color{background-color: var(--wp--preset--color--pale-pink) !important;}.has-vivid-red-background-color{background-color: var(--wp--preset--color--vivid-red) !important;}.has-luminous-vivid-orange-background-color{background-color: var(--wp--preset--color--luminous-vivid-orange) !important;}.has-luminous-vivid-amber-background-color{background-color: var(--wp--preset--color--luminous-vivid-amber) !important;}.has-light-green-cyan-background-color{background-color: var(--wp--preset--color--light-green-cyan) !important;}.has-vivid-green-cyan-background-color{background-color: var(--wp--preset--color--vivid-green-cyan) !important;}.has-pale-cyan-blue-background-color{background-color: var(--wp--preset--color--pale-cyan-blue) !important;}.has-vivid-cyan-blue-background-color{background-color: var(--wp--preset--color--vivid-cyan-blue) !important;}.has-vivid-purple-background-color{background-color: var(--wp--preset--color--vivid-purple) !important;}.has-base-background-color{background-color: var(--wp--preset--color--base) !important;}.has-base-2-background-color{background-color: var(--wp--preset--color--base-2) !important;}.has-base-3-background-color{background-color: var(--wp--preset--color--base-3) !important;}.has-contrast-yellow-background-color{background-color: var(--wp--preset--color--contrast-yellow) !important;}.has-contrast-green-background-color{background-color: var(--wp--preset--color--contrast-green) !important;}.has-contrast-blue-background-color{background-color: var(--wp--preset--color--contrast-blue) !important;}.has-contrast-red-background-color{background-color: var(--wp--preset--color--contrast-red) !important;}.has-black-border-color{border-color: var(--wp--preset--color--black) !important;}.has-cyan-bluish-gray-border-color{border-color: var(--wp--preset--color--cyan-bluish-gray) !important;}.has-white-border-color{border-color: var(--wp--preset--color--white) !important;}.has-pale-pink-border-color{border-color: var(--wp--preset--color--pale-pink) !important;}.has-vivid-red-border-color{border-color: var(--wp--preset--color--vivid-red) !important;}.has-luminous-vivid-orange-border-color{border-color: var(--wp--preset--color--luminous-vivid-orange) !important;}.has-luminous-vivid-amber-border-color{border-color: var(--wp--preset--color--luminous-vivid-amber) !important;}.has-light-green-cyan-border-color{border-color: var(--wp--preset--color--light-green-cyan) !important;}.has-vivid-green-cyan-border-color{border-color: var(--wp--preset--color--vivid-green-cyan) !important;}.has-pale-cyan-blue-border-color{border-color: var(--wp--preset--color--pale-cyan-blue) !important;}.has-vivid-cyan-blue-border-color{border-color: var(--wp--preset--color--vivid-cyan-blue) !important;}.has-vivid-purple-border-color{border-color: var(--wp--preset--color--vivid-purple) !important;}.has-base-border-color{border-color: var(--wp--preset--color--base) !important;}.has-base-2-border-color{border-color: var(--wp--preset--color--base-2) !important;}.has-base-3-border-color{border-color: var(--wp--preset--color--base-3) !important;}.has-contrast-yellow-border-color{border-color: var(--wp--preset--color--contrast-yellow) !important;}.has-contrast-green-border-color{border-color: var(--wp--preset--color--contrast-green) !important;}.has-contrast-blue-border-color{border-color: var(--wp--preset--color--contrast-blue) !important;}.has-contrast-red-border-color{border-color: var(--wp--preset--color--contrast-red) !important;}.has-vivid-cyan-blue-to-vivid-purple-gradient-background{background: var(--wp--preset--gradient--vivid-cyan-blue-to-vivid-purple) !important;}.has-light-green-cyan-to-vivid-green-cyan-gradient-background{background: var(--wp--preset--gradient--light-green-cyan-to-vivid-green-cyan) !important;}.has-luminous-vivid-amber-to-luminous-vivid-orange-gradient-background{background: var(--wp--preset--gradient--luminous-vivid-amber-to-luminous-vivid-orange) !important;}.has-luminous-vivid-orange-to-vivid-red-gradient-background{background: var(--wp--preset--gradient--luminous-vivid-orange-to-vivid-red) !important;}.has-very-light-gray-to-cyan-bluish-gray-gradient-background{background: var(--wp--preset--gradient--very-light-gray-to-cyan-bluish-gray) !important;}.has-cool-to-warm-spectrum-gradient-background{background: var(--wp--preset--gradient--cool-to-warm-spectrum) !important;}.has-blush-light-purple-gradient-background{background: var(--wp--preset--gradient--blush-light-purple) !important;}.has-blush-bordeaux-gradient-background{background: var(--wp--preset--gradient--blush-bordeaux) !important;}.has-luminous-dusk-gradient-background{background: var(--wp--preset--gradient--luminous-dusk) !important;}.has-pale-ocean-gradient-background{background: var(--wp--preset--gradient--pale-ocean) !important;}.has-electric-grass-gradient-background{background: var(--wp--preset--gradient--electric-grass) !important;}.has-midnight-gradient-background{background: var(--wp--preset--gradient--midnight) !important;}.has-gradient-1-gradient-background{background: var(--wp--preset--gradient--gradient-1) !important;}.has-gradient-2-gradient-background{background: var(--wp--preset--gradient--gradient-2) !important;}.has-gradient-3-gradient-background{background: var(--wp--preset--gradient--gradient-3) !important;}.has-gradient-4-gradient-background{background: var(--wp--preset--gradient--gradient-4) !important;}.has-gradient-5-gradient-background{background: var(--wp--preset--gradient--gradient-5) !important;}.has-gradient-6-gradient-background{background: var(--wp--preset--gradient--gradient-6) !important;}.has-gradient-7-gradient-background{background: var(--wp--preset--gradient--gradient-7) !important;}.has-gradient-8-gradient-background{background: var(--wp--preset--gradient--gradient-8) !important;}.has-gradient-9-gradient-background{background: var(--wp--preset--gradient--gradient-9) !important;}.has-gradient-10-gradient-background{background: var(--wp--preset--gradient--gradient-10) !important;}.has-gradient-11-gradient-background{background: var(--wp--preset--gradient--gradient-11) !important;}.has-gradient-12-gradient-background{background: var(--wp--preset--gradient--gradient-12) !important;}.has-small-font-size{font-size: var(--wp--preset--font-size--small) !important;}.has-medium-font-size{font-size: var(--wp--preset--font-size--medium) !important;}.has-large-font-size{font-size: var(--wp--preset--font-size--large) !important;}.has-x-large-font-size{font-size: var(--wp--preset--font-size--x-large) !important;}.has-xx-large-font-size{font-size: var(--wp--preset--font-size--xx-large) !important;}.has-body-font-family{font-family: var(--wp--preset--font-family--body) !important;}.has-heading-font-family{font-family: var(--wp--preset--font-family--heading) !important;}.has-system-sans-serif-font-family{font-family: var(--wp--preset--font-family--system-sans-serif) !important;}.has-system-serif-font-family{font-family: var(--wp--preset--font-family--system-serif) !important;} :root :where(.wp-block-post-date){color: var(--wp--preset--color--contrast-2);font-size: var(--wp--preset--font-size--small);} :root :where(.wp-block-post-date a:where(:not(.wp-element-button))){color: var(--wp--preset--color--contrast-2);text-decoration: none;} :root :where(.wp-block-post-date a:where(:not(.wp-element-button)):hover){text-decoration: underline;} :root :where(.wp-block-post-featured-image img, .wp-block-post-featured-image .block-editor-media-placeholder, .wp-block-post-featured-image .wp-block-post-featured-image__overlay){border-radius: var(--wp--preset--spacing--20);} :root :where(.wp-block-post-title a:where(:not(.wp-element-button))){text-decoration: none;} :root :where(.wp-block-post-title a:where(:not(.wp-element-button)):hover){text-decoration: underline;} :root :where(.wp-block-separator){border-color: currentColor;border-width: 0 0 1px 0;border-style: solid;color: var(--wp--preset--color--contrast);}:root :where(.wp-block-separator){}:root :where(.wp-block-separator:not(.is-style-wide):not(.is-style-dots):not(.alignwide):not(.alignfull)){width: var(--wp--preset--spacing--60)} :where(.wp-site-blocks *:focus){outline-width:2px;outline-style:solid}:root :where(.wp-block-calendar.wp-block-calendar table:where(:not(.has-text-color)) th){background-color:var(--wp--preset--color--contrast-2);color:var(--wp--preset--color--base);border-color:var(--wp--preset--color--contrast-2)}:root :where(.wp-block-calendar table:where(:not(.has-text-color)) td){border-color:var(--wp--preset--color--contrast-2)}:root :where(.wp-block-categories){list-style-type:none;}:root :where(.wp-block-categories li){margin-bottom: 0.5rem;}:root :where(.wp-block-post-comments-form textarea, .wp-block-post-comments-form input){border-radius:.33rem}:root :where(.wp-block-loginout input){border-radius:.33rem;padding:calc(0.667em + 2px);border:1px solid #949494;}:root :where(.wp-block-post-terms .wp-block-post-terms__prefix){color: var(--wp--preset--color--contrast-2);}:root :where(.wp-block-query-title span){font-style: italic;}:root :where(.wp-block-quote :where(p)){margin-block-start:0;margin-block-end:calc(var(--wp--preset--spacing--10) + 0.5rem);}:root :where(.wp-block-quote :where(:last-child)){margin-block-end:0;}:root :where(.wp-block-quote.has-text-align-right.is-style-plain, .rtl .is-style-plain.wp-block-quote:not(.has-text-align-center):not(.has-text-align-left)){border-width: 0 2px 0 0;padding-left:calc(var(--wp--preset--spacing--20) + 0.5rem);padding-right:calc(var(--wp--preset--spacing--20) + 0.5rem);}:root :where(.wp-block-quote.has-text-align-left.is-style-plain, body:not(.rtl) .is-style-plain.wp-block-quote:not(.has-text-align-center):not(.has-text-align-right)){border-width: 0 0 0 2px;padding-left:calc(var(--wp--preset--spacing--20) + 0.5rem);padding-right:calc(var(--wp--preset--spacing--20) + 0.5rem)}:root :where(.wp-block-search .wp-block-search__input){border-radius:.33rem}:root :where(.wp-block-separator){}:root :where(.wp-block-separator:not(.is-style-wide):not(.is-style-dots):not(.alignwide):not(.alignfull)){width: var(--wp--preset--spacing--60)} </style> <style id='wp-block-template-skip-link-inline-css'> .skip-link.screen-reader-text { border: 0; clip: rect(1px,1px,1px,1px); clip-path: inset(50%); height: 1px; margin: -1px; overflow: hidden; padding: 0; position: absolute !important; width: 1px; word-wrap: normal !important; } .skip-link.screen-reader-text:focus { background-color: #eee; clip: auto !important; clip-path: none; color: #444; display: block; font-size: 1em; height: auto; left: 5px; line-height: normal; padding: 15px 23px 14px; text-decoration: none; top: 5px; width: auto; z-index: 100000; } </style> <link rel='stylesheet' id='dashicons-css' href='https://engineering.princeton.edu/wp-includes/css/dashicons.min.css?ver=6.6.2' media='all' /> <link rel='stylesheet' id='megamenu-google-fonts-css' href='//fonts.googleapis.com/css?family=Libre+Franklin%3A400%2C700&ver=6.6.2' media='all' /> <link rel='stylesheet' id='megamenu-genericons-css' href='https://engineering.princeton.edu/wp-content/plugins/megamenu-pro/icons/genericons/genericons/genericons.css?ver=2.4' media='all' /> <link rel='stylesheet' id='megamenu-fontawesome-css' href='https://engineering.princeton.edu/wp-content/plugins/megamenu-pro/icons/fontawesome/css/font-awesome.min.css?ver=2.4' media='all' /> <link rel='stylesheet' id='megamenu-fontawesome5-css' href='https://engineering.princeton.edu/wp-content/plugins/megamenu-pro/icons/fontawesome5/css/all.min.css?ver=2.4' media='all' /> <link rel='stylesheet' id='megamenu-fontawesome6-css' href='https://engineering.princeton.edu/wp-content/plugins/megamenu-pro/icons/fontawesome6/css/all.min.css?ver=2.4' media='all' /> <link rel='stylesheet' id='search-filter-plugin-styles-css' href='https://engineering.princeton.edu/wp-content/plugins/search-filter-pro/public/assets/css/search-filter.min.css?ver=2.5.17' media='all' /> <link rel='stylesheet' id='twentytwentyfour-style-css' href='https://engineering.princeton.edu/wp-content/themes/twentytwentyfour/style.css?ver=6.6.2' media='all' /> <link rel='stylesheet' id='engineering-style-v2-css' href='https://engineering.princeton.edu/wp-content/themes/engineering/style.css?ver=1732641271' media='all' /> <script src="https://engineering.princeton.edu/wp-includes/js/jquery/jquery.min.js?ver=3.7.1" id="jquery-core-js"></script> <script src="https://engineering.princeton.edu/wp-includes/js/jquery/jquery-migrate.min.js?ver=3.4.1" id="jquery-migrate-js"></script> <script defer crossorigin="anonymous" src="https://kit.fontawesome.com/8299227453.js" id="font-awesome-official-js"></script> <!-- Google tag (gtag.js) snippet added by Site Kit --> <!-- Google Analytics snippet added by Site Kit --> <script src="https://www.googletagmanager.com/gtag/js?id=G-LKJSE43ML1" id="google_gtagjs-js" async></script> <script id="google_gtagjs-js-after"> window.dataLayer = window.dataLayer || [];function gtag(){dataLayer.push(arguments);} gtag("set","linker",{"domains":["engineering.princeton.edu"]}); gtag("js", new Date()); gtag("set", "developer_id.dZTNiMT", true); gtag("config", "G-LKJSE43ML1"); </script> <!-- End Google tag (gtag.js) snippet added by Site Kit --> <link rel="https://api.w.org/" href="https://engineering.princeton.edu/wp-json/" /><link rel="alternate" title="JSON" type="application/json" href="https://engineering.princeton.edu/wp-json/wp/v2/news/17160" /><link rel="EditURI" type="application/rsd+xml" title="RSD" href="https://engineering.princeton.edu/xmlrpc.php?rsd" /> <meta name="generator" content="WordPress 6.6.2" /> <link rel='shortlink' href='https://engineering.princeton.edu/?p=17160' /> <link rel="alternate" title="oEmbed (JSON)" type="application/json+oembed" href="https://engineering.princeton.edu/wp-json/oembed/1.0/embed?url=https%3A%2F%2Fengineering.princeton.edu%2Fnews%2F2024%2F10%2F31%2Fthese-little-robots-two-heads-are-better-one" /> <link rel="alternate" title="oEmbed (XML)" type="text/xml+oembed" href="https://engineering.princeton.edu/wp-json/oembed/1.0/embed?url=https%3A%2F%2Fengineering.princeton.edu%2Fnews%2F2024%2F10%2F31%2Fthese-little-robots-two-heads-are-better-one&format=xml" /> <meta name="generator" content="Site Kit by Google 1.137.0" /> <script type='text/javascript'> document.addEventListener('DOMContentLoaded', function() { var globalStyles = document.getElementById('global-styles-inline-css'); if (globalStyles) { globalStyles.parentNode.removeChild(globalStyles); } }); </script> <!-- Google Tag Manager --> <script> (function(w, d, s, l, i) { w[l] = w[l] || []; w[l].push({ 'gtm.start': new Date().getTime(), event: 'gtm.js' }); var f = d.getElementsByTagName(s)[0], j = d.createElement(s), dl = l != 'dataLayer' ? '&l=' + l : ''; j.async = true; j.src = 'https://www.googletagmanager.com/gtm.js?id=' + i + dl; f.parentNode.insertBefore(j, f); })(window, document, 'script', 'dataLayer', 'GTM-MMWLX8H3'); </script> <!-- End Google Tag Manager --> <link rel="icon" href="/wp-content/themes/engineering/assets/images/favicon.ico" type="image/x-icon"><link rel="shortcut icon" href="/wp-content/themes/engineering/assets/images/favicon.ico" type="image/x-icon"><style id='wp-fonts-local'> @font-face{font-family:Inter;font-style:normal;font-weight:300 900;font-display:fallback;src:url('https://engineering.princeton.edu/wp-content/themes/twentytwentyfour/assets/fonts/inter/Inter-VariableFont_slnt,wght.woff2') format('woff2');font-stretch:normal;} @font-face{font-family:Cardo;font-style:normal;font-weight:400;font-display:fallback;src:url('https://engineering.princeton.edu/wp-content/themes/twentytwentyfour/assets/fonts/cardo/cardo_normal_400.woff2') format('woff2');} @font-face{font-family:Cardo;font-style:italic;font-weight:400;font-display:fallback;src:url('https://engineering.princeton.edu/wp-content/themes/twentytwentyfour/assets/fonts/cardo/cardo_italic_400.woff2') format('woff2');} @font-face{font-family:Cardo;font-style:normal;font-weight:700;font-display:fallback;src:url('https://engineering.princeton.edu/wp-content/themes/twentytwentyfour/assets/fonts/cardo/cardo_normal_700.woff2') format('woff2');} </style> <link rel="icon" href="https://engineering.princeton.edu/wp-content/uploads/2024/10/cropped-eng-favicon-32x32.png" sizes="32x32" /> <link rel="icon" href="https://engineering.princeton.edu/wp-content/uploads/2024/10/cropped-eng-favicon-192x192.png" sizes="192x192" /> <link rel="apple-touch-icon" href="https://engineering.princeton.edu/wp-content/uploads/2024/10/cropped-eng-favicon-180x180.png" /> <meta name="msapplication-TileImage" content="https://engineering.princeton.edu/wp-content/uploads/2024/10/cropped-eng-favicon-270x270.png" /> <style type="text/css">/** Mega Menu CSS: fs **/</style> </head> <body class="news-template-default single single-news postid-17160 wp-embed-responsive"> <!-- Google Tag Manager (noscript) --> <noscript><iframe src="https://www.googletagmanager.com/ns.html?id=GTM-MMWLX8H3" height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript> <!-- End Google Tag Manager (noscript) --> <div class="wp-site-blocks"><header class="wp-block-template-part"> <div class="wp-block-group engineering-site-header is-layout-flow wp-block-group-is-layout-flow"> <div class="wp-block-group engineering-site-header__content"> <div class="engineering-modal" x-data="{ open: false, searchOpen: false }"> <div class="engineering-navbar"> <div class="nav-item menu-item"> <a tabindex="0" role="button" @click="open = !open" @keydown.enter="open = !open" :aria-expanded="open ? 'true' : 'false'" :class="{ 'is-active': open }" > <i class="fa-solid fa-bars"></i> <div class="name-and-description"> <p class="name"><span>Menu</span></p> </div> </a> </div> <h1 class="engineering-logo"> <a href="/">School of Engineering & Applied Science</a> </h1> <div class="engineering-search"> <div class="nav-item search-item"> <a tabindex="0" role="button" @click="searchOpen = !searchOpen" @keydown.enter="searchOpen = !searchOpen" > <div class="name-and-description"> <p class="name"><span>Search</span></p> </div> <i class="fa-solid fa-magnifying-glass"></i> </a> </div> </div> </div> <nav id="engineering_menu" x-data="{ aboutOpen: false, deiOpen: false, undergradOpen: false, gradOpen: false, deptOpen: false, centersOpen: false, moreOpen: false }" x-show="open" @click.outside="open = false" @keydown.enter.outside="open = false" @keydown.esc.window="open = false" x-cloak x-transition > <div class="nav-item first-tier"> <a tabindex="0" role="button" @click="aboutOpen = !aboutOpen" @keydown.enter="aboutOpen = !aboutOpen" :aria-expanded="aboutOpen ? 'true' : 'false'" :class="{ 'is-active': aboutOpen }" > <div class="name-and-description"> <p class="name"><span>About</span></p> </div> <i class="fa-solid fa-chevron-right"></i> </a> </div> <section x-show="aboutOpen" @click.outside="aboutOpen = false" @keydown.enter.outside="aboutOpen = false" x-transition > <div class="column"> <p class="nav-items-group-title">School Information</p> <div class="nav-item second-tier"> <a href="/about"> <div class="name-and-description"> <p class="name"><span>Overview</span></p> <p class="description"> Your first points of contact with Princeton Engineering </p> </div> </a> </div> <div class="nav-item second-tier"> <a href="/about/leadership-and-staff"> <div class="name-and-description"> <p class="name"><span>Leadership and Staff</span></p> <p class="description">Meet our administrative team</p> </div> </a> </div> <div class="nav-item second-tier"> <a href="/about/leadership-council"> <div class="name-and-description"> <p class="name"><span>Leadership Council</span></p> <p class="description"> Accomplished leaders who serve as advisors to the dean </p> </div> </a> </div> <div class="nav-item second-tier"> <a href="/about/strategic-planning"> <div class="name-and-description"> <p class="name"><span>Strategic Planning</span></p> <p class="description">A bold vision for the next decade</p> </div> </a> </div> <div class="nav-item second-tier"> <a href="/princeton-engineers"> <div class="name-and-description"> <p class="name"><span>Princeton Engineers</span></p> <p class="description">Celebrating our community</p> </div> </a> </div> <div class="nav-item second-tier"> <a href="/about/by-the-numbers"> <div class="name-and-description"> <p class="name"><span>By the Numbers</span></p> <p class="description">Brief facts about the school</p> </div> </a> </div> </div> <div class="column"> <p class="nav-items-group-title">Information for</p> <div class="nav-item second-tier"> <a href="/about/prospective-students"> <div class="name-and-description"> <p class="name"><span>Prospective Students</span></p> <p class="description">Why become a Princeton Engineer</p> </div> </a> </div> <div class="nav-item second-tier"> <a href="/about/corporate-partners"> <div class="name-and-description"> <p class="name"><span>Corporate Partners</span></p> <p class="description"> Research partnerships, licensing, and recruiting </p> </div> </a> </div> <div class="nav-item second-tier"> <a href="/about/entrepreneurs"> <div class="name-and-description"> <p class="name"><span>Entrepreneurs</span></p> <p class="description"> Helping students turn inspiration into action </p> </div> </a> </div> <div class="nav-item second-tier"> <a href="/about/alumni"> <div class="name-and-description"> <p class="name"><span>Alumni</span></p> <p class="description"> Stay connected to Princeton Engineering </p> </div> </a> </div> <div class="nav-item second-tier"> <a href="/about/visitors"> <div class="name-and-description"> <p class="name"><span>Visitors</span></p> <p class="description">Directions, and tour information</p> </div> </a> </div> </div> </section> <div class="nav-item first-tier"> <a tabindex="0" role="button" @click="deiOpen = !deiOpen" @keydown.enter="deiOpen = !deiOpen" :aria-expanded="deiOpen ? 'true' : 'false'" :class="{ 'is-active': deiOpen }" > <div class="name-and-description"> <p class="name"><span>Diversity & Inclusion</span></p> </div> <i class="fa-solid fa-chevron-right"></i> </a> </div> <section x-show="deiOpen" @click.outside="deiOpen = false" @keydown.enter.outside="deiOpen = false" x-transition > <div class="column"> <p class="nav-items-group-title">General Information</p> <div class="nav-item second-tier"> <a href="/diversity-and-inclusion"> <div class="name-and-description"> <p class="name"><span>Diversity and Inclusion</span></p> <p class="description"> Our commitment to diversity and inclusion </p> </div> </a> </div> <div class="nav-item second-tier"> <a href="/diversity-and-inclusion/dashboard"> <div class="name-and-description"> <p class="name"><span>Diversity Dashboard</span></p> <p class="description">Demographic information and trends</p> </div> </a> </div> <div class="nav-item second-tier"> <a href="/diversity-champions-program"> <div class="name-and-description"> <p class="name"><span>Diversity Champions Program</span></p> <p class="description"> Learn, share, and practice strategies related to diversity, equity, and inclusion </p> </div> </a> </div> </div> <div class="column"> <p class="nav-items-group-title">Resources</p> <div class="nav-item second-tier"> <a href="/diversity-and-inclusion/programs"> <div class="name-and-description"> <p class="name"> <span> Diversity and Inclusion Programs and Resources</span> </p> <p class="description"> Fostering greater diversity in science and engineering </p> </div> </a> </div> <div class="nav-item second-tier"> <a href="/diversity-and-inclusion/events"> <div class="name-and-description"> <p class="name"> <span>Diversity and Inclusion Events</span> </p> <p class="description"> Professional, social opportunities for the Princeton community </p> </div> </a> </div> <div class="nav-item second-tier"> <a href="/diversity-and-inclusion/newsletter-archive"> <div class="name-and-description"> <p class="name"><span>Newsletter Archive</span></p> <p class="description"> Quarterly publication of the Office of Diversity and Inclusion at Princeton Engineering </p> </div> </a> </div> </div> </section> <div class="nav-item first-tier"> <a tabindex="0" role="button" @click="undergradOpen = !undergradOpen" @keydown.enter="undergradOpen = !undergradOpen" :aria-expanded="undergradOpen ? 'true' : 'false'" :class="{ 'is-active': undergradOpen }" > <div class="name-and-description"> <p class="name"><span>Undergraduate Studies</span></p> </div> <i class="fa-solid fa-chevron-right"></i> </a> </div> <section x-show="undergradOpen" @click.outside="undergradOpen = false" @keydown.enter.outside="undergradOpen = false" x-transition > <div class="column"> <p class="nav-items-group-title">General information</p> <div class="nav-item second-tier"> <a href="/undergraduate-studies"> <div class="name-and-description"> <p class="name"><span>Overview</span></p> <p class="description"> Rigorous foundation, hands-on experience, liberal arts context </p> </div> </a> </div> <div x-data="{ toursOpen: false}" x-cloak> <div class="nav-item second-tier"> <a tabindex="0" role="button" @click="toursOpen = !toursOpen" @keydown.enter="toursOpen = !toursOpen" :aria-expanded="toursOpen ? 'true' : 'false'" :class="{ 'is-active': toursOpen }" > <div class="name-and-description"> <p class="name"><span>Admission and Tours</span></p> <p class="description">Sign up for a tour</p> </div> <i class="fa-solid fa-chevron-right"></i> </a> </div> <section x-show="toursOpen" @click.outside="toursOpen = false" @keydown.enter.outside="toursOpen = false" x-transition > <div class="nav-item third-tier"> <a href="/undergraduate-studies/admission-and-tours"> <div class="name-and-description"> <p class="name"> <span>Admissions & Tours Overview</span> </p> </div> </a> </div> <div class="nav-item third-tier"> <a href="/undergraduate-studies/admission-and-tours/prospective-students-faq" > <div class="name-and-description"> <p class="name"><span>Prospective Students FAQ</span></p> </div> </a> </div> <div class="nav-item third-tier"> <a href="/undergraduate-studies/admission-and-tours/high-school-guidance" > <div class="name-and-description"> <p class="name"> <span>Guidance for high school students</span> </p> </div> </a> </div> </section> </div> <div x-data="{ academicsOpen: false}" x-cloak> <div class="nav-item second-tier"> <a tabindex="0" role="button" @click="academicsOpen = !academicsOpen" @keydown.enter="academicsOpen = !academicsOpen" :aria-expanded="academicsOpen ? 'true' : 'false'" :class="{ 'is-active': academicsOpen }" > <div class="name-and-description"> <p class="name"><span>Academics</span></p> <p class="description"> Six departments offer BSE degrees; one also offers A.B </p> </div> <i class="fa-solid fa-chevron-right"></i> </a> </div> <section x-show="academicsOpen" @click.outside="academicsOpen = false" @keydown.enter.outside="academicsOpen = false" x-transition > <div class="nav-item third-tier"> <a href="/undergraduate-studies/concentrations"> <div class="name-and-description"> <p class="name"><span>Academics Overview</span></p> </div> </a> </div> <div class="nav-item third-tier"> <a href="/undergraduate-studies/abet-accreditation"> <div class="name-and-description"> <p class="name"><span>ABET Accreditation</span></p> </div> </a> </div> <div class="nav-item third-tier"> <a href="/undergraduate-studies/certificate-programs"> <div class="name-and-description"> <p class="name"><span>Certificate programs</span></p> </div> </a> </div> </section> </div> </div> <div class="column"> <p class="nav-items-group-title">For current students</p> <div x-data="{ advisingOpen: false}" x-cloak> <div class="nav-item second-tier"> <a tabindex="0" role="button" @click="advisingOpen = !advisingOpen" @keydown.enter="advisingOpen = !advisingOpen" :aria-expanded="advisingOpen ? 'true' : 'false'" :class="{ 'is-active': advisingOpen }" > <div class="name-and-description"> <p class="name"><span>Advising</span></p> <p class="description">We are here to help</p> </div> <i class="fa-solid fa-chevron-right"></i> </a> </div> <section x-show="advisingOpen" @click.outside="advisingOpen = false" @keydown.enter.outside="advisingOpen = false" x-transition > <div class="nav-item third-tier"> <a href="/undergraduate-studies/undergraduate-affairs-office" ><div class="name-and-description"> <p class="name"><span>Advising Overview</span></p> </div> </a> </div> <div class="nav-item third-tier"> <a href="/undergraduate-studies/first-year-advising" ><div class="name-and-description"> <p class="name"><span>First-Year Advising</span></p> </div> </a> </div> <div class="nav-item fourth-tier"> <a href="/undergraduate-studies/first-year-advising/degree-requirements" ><div class="name-and-description"> <p class="name"><span>Degree Requirements</span></p> </div> </a> </div> <div class="nav-item fourth-tier"> <a href="/undergraduate-studies/first-year-advising/first-year-faq" ><div class="name-and-description"> <p class="name"> <span> Q and A About the First Year in Engineering</span > </p> </div> </a> </div> <div class="nav-item third-tier"> <a href="/undergraduate-studies/sophomore-senior-advising" ><div class="name-and-description"> <p class="name"><span>Sophomore-Senior Advising</span></p> </div> </a> </div> <div class="nav-item fourth-tier"> <a href="/undergraduate-studies/sophomore-senior-advising/rising-sophomore-faq" ><div class="name-and-description"> <p class="name"><span>Rising Sophomore FAQ</span></p> </div> </a> </div> <div class="nav-item fourth-tier"> <a href="/undergraduate-studies/sophomore-senior-advising/senior-thesis-independent-work-funding" ><div class="name-and-description"> <p class="name"> <span>Senior Thesis/Independent Work Funding</span> </p> </div> </a> </div> <div class="nav-item fourth-tier"> <a href="/undergraduate-studies/sophomore-senior-advising/summer-course-information" ><div class="name-and-description"> <p class="name"><span>Summer Course Information</span></p> </div> </a> </div> <div class="nav-item fourth-tier"> <a href="/undergraduate-studies/sophomore-senior-advising/study-abroad" ><div class="name-and-description"> <p class="name"><span>Study Abroad</span></p> </div> </a> </div> </section> </div> <div x-data="{ careersOpen: false}" x-cloak> <div class="nav-item second-tier"> <a tabindex="0" role="button" @click="careersOpen = !careersOpen" @keydown.enter="careersOpen = !careersOpen" :aria-expanded="careersOpen ? 'true' : 'false'" :class="{ 'is-active': careersOpen }" > <div class="name-and-description"> <p class="name"><span>Careers</span></p> <p class="description"> What do engineering students go on to do? </p> </div> <i class="fa-solid fa-chevron-right"></i> </a> </div> <section x-show="careersOpen" @click.outside="careersOpen = false" @keydown.enter.outside="careersOpen = false" x-transition > <div class="nav-item third-tier"> <a href="/undergraduate-studies/careers/" ><div class="name-and-description"> <p class="name"><span>Careers Overview</span></p> </div> </a> </div> <div class="nav-item third-tier"> <a href="/undergraduate-studies/careers/science-and-technology-fair" ><div class="name-and-description"> <p class="name"> <span>Science and Technology Job Fair</span> </p> </div> </a> </div> </section> </div> <div class="nav-item second-tier"> <a href="/undergraduate-studies/student-organizations"> <div class="name-and-description"> <p class="name"><span>Student Organizations</span></p> <p class="description"> Sixteen groups create community around special interests </p> </div> </a> </div> <div class="nav-item second-tier"> <a href="/undergraduate-studies/social-life"> <div class="name-and-description"> <p class="name"><span>Social Life</span></p> <p class="description"> Life outside the EQuad is key to your growth </p> </div> </a> </div> </div> </section> <div class="nav-item first-tier"> <a tabindex="0" role="button" @click="gradOpen = !gradOpen" @keydown.enter="gradOpen = !gradOpen" :aria-expanded="gradOpen ? 'true' : 'false'" :class="{ 'is-active': gradOpen }" > <div class="name-and-description"> <p class="name"><span>Graduate</span></p> </div> <i class="fa-solid fa-chevron-right"></i> </a> </div> <section x-show="gradOpen" @click.outside="gradOpen = false" @keydown.enter.outside="gradOpen = false" x-transition > <div class="column"> <p class="nav-items-group-title">General information</p> <div class="nav-item second-tier"> <a href="/graduate-studies/prospective-students"> <div class="name-and-description"> <p class="name"><span>Overview</span></p> <p class="description"> Learn to push the boundaries of your field and lead projects </p> </div> </a> </div> <div x-data="{ pathwaysOpen: false}" x-cloak> <div class="nav-item second-tier"> <a tabindex="0" role="button" @click="pathwaysOpen = !pathwaysOpen" @keydown.enter="pathwaysOpen = !pathwaysOpen" :aria-expanded="pathwaysOpen ? 'true' : 'false'" :class="{ 'is-active': pathwaysOpen }" > <div class="name-and-description"> <p class="name"><span>Academic Pathways</span></p> <p class="description"> Meet faculty and grad students, learn about applying </p> </div> <i class="fa-solid fa-chevron-right"></i> </a> </div> <section x-show="pathwaysOpen" @click.outside="pathwaysOpen = false" @keydown.enter.outside="pathwaysOpen = false" x-transition > <div class="nav-item third-tier"> <a href="/graduate-studies/academic-pathways/prospective-graduate-students" > <div class="name-and-description"> <p class="name"> <span> Pathways to Graduate School for Rising College Seniors</span > </p> </div> </a> </div> <div class="nav-item third-tier"> <a href="/graduate-studies/academic-pathways/prospective-faculty" > <div class="name-and-description"> <p class="name"> <span> Princeton Pathway into the Academy Program</span> </p> </div> </a> </div> </section> </div> <div class="nav-item second-tier"> <a href="/graduate-studies/degrees-and-research"> <div class="name-and-description"> <p class="name"><span>Degrees and Research</span></p> <p class="description"> Doctoral programs in six departments cover 40 specialties </p> </div> </a> </div> <div class="nav-item second-tier"> <a href="/graduate-studies/princeton-engineers"> <div class="name-and-description"> <p class="name"><span>Princeton Engineers</span></p> <p class="description"> Profiles of current graduate students </p> </div> </a> </div> <div class="nav-item second-tier"> <a href="/graduate-studies/funding"> <div class="name-and-description"> <p class="name"><span>Funding</span></p> <p class="description"> Every Ph.D. student receives full funding </p> </div> </a> </div> </div> <div class="column"> <p class="nav-items-group-title">For prospective students</p> <div class="nav-item second-tier"> <a href="/graduate-studies/student-organizations"> <div class="name-and-description"> <p class="name"><span>Student Organizations</span></p> <p class="description"> Several groups cater specifically to engineering grad students </p> </div> </a> </div> <div class="nav-item second-tier"> <a href="/graduate-studies/social-life"> <div class="name-and-description"> <p class="name"><span>Social Life</span></p> <p class="description"> An array of opportunities, plus proximity to NYC, Philly </p> </div> </a> </div> <div class="nav-item second-tier"> <a href="/graduate-studies/careers"> <div class="name-and-description"> <p class="name"><span>Careers</span></p> <p class="description">Many paths beyond grad school</p> </div> </a> </div> <div class="nav-item second-tier"> <a href="/graduate-studies/faq"> <div class="name-and-description"> <p class="name"><span>FAQ</span></p> <p class="description">Your questions answered</p> </div> </a> </div> <div class="nav-item second-tier"> <a href="/graduate-studies/resources-for-current-students"> <div class="name-and-description"> <p class="name"> <span>Resources for Current Students</span> </p> <p class="description"> Programs to support your academic goals </p> </div> </a> </div> </div> </section> <div class="nav-item first-tier"> <a tabindex="0" role="button" @click="deptOpen = !deptOpen" @keydown.enter="deptOpen = !deptOpen" :aria-expanded="deptOpen ? 'true' : 'false'" :class="{ 'is-active': deptOpen }" > <div class="name-and-description"> <p class="name"><span>Departments</span></p> </div> <i class="fa-solid fa-chevron-right"></i> </a> </div> <section x-show="deptOpen" @click.outside="deptOpen = false" @keydown.enter.outside="deptOpen = false" x-transition > <div class="column"> <div class="nav-item second-tier"> <a href="/departments/chemical-and-biological-engineering"> <div class="name-and-description"> <p class="name"> <span>Chemical and Biological Engineering</span> </p> <p class="description"> Advancing human health, energy, materials science, and industrial processes </p> </div> </a> </div> <div class="nav-item second-tier"> <a href="/departments/civil-and-environmental-engineering"> <div class="name-and-description"> <p class="name"> <span>Civil and Environmental Engineering</span> </p> <p class="description"> Fundamental insights into the built and natural environments, and interactions between the two </p> </div> </a> </div> <div class="nav-item second-tier"> <a href="/departments/computer-science"> <div class="name-and-description"> <p class="name"><span>Computer Science</span></p> <p class="description"> Leading the field through foundational theory, applications, and societal impact </p> </div> </a> </div> </div> <div class="column"> <div class="nav-item second-tier"> <a href="/departments/electrical-computer-engineering"> <div class="name-and-description"> <p class="name"> <span>Electrical and Computer Engineering</span> </p> <p class="description"> Improving human health, energy systems, computing and communications, and security </p> </div> </a> </div> <div class="nav-item second-tier"> <a href="/departments/mechanical-and-aerospace-engineering"> <div class="name-and-description"> <p class="name"> <span>Mechanical and Aerospace Engineering</span> </p> <p class="description"> Solving problems in energy, combustion, fluids, lasers, materials science, robotics and control systems, and nuclear security </p> </div> </a> </div> <div class="nav-item second-tier"> <a href="/departments/operations-research-and-financial-engineering" > <div class="name-and-description"> <p class="name"> <span> Operations Research and Financial Engineering</span> </p> <p class="description"> Developing mathematical and computational tools for making decisions under uncertainty </p> </div> </a> </div> </div> </section> <div class="nav-item first-tier"> <a tabindex="0" role="button" @click="centersOpen = !centersOpen" @keydown.enter="centersOpen = !centersOpen" :aria-expanded="centersOpen ? 'true' : 'false'" :class="{ 'is-active': centersOpen }" > <div class="name-and-description"> <p class="name"><span>Centers & Initiatives</span></p> </div> <i class="fa-solid fa-chevron-right"></i> </a> </div> <section x-show="centersOpen" @click.outside="centersOpen = false" @keydown.enter.outside="centersOpen = false" x-transition > <div class="column"> <div class="nav-item second-tier"> <a href="/centers/aiprinceton"> <div class="name-and-description"> <p class="name"><span>AI at Princeton</span></p> <p class="description"> Nimble, high-intensity research teams across engineering, science, social science, and humanities </p> </div> </a> </div> <div class="nav-item second-tier"> <a href="/centers/acee"> <div class="name-and-description"> <p class="name"> <span> Andlinger Center for Energy and the Environment</span > </p> <p class="description"> Decarbonizing the world while increasing energy access worldwide </p> </div> </a> </div> <div class="nav-item second-tier"> <a href="/centers/citp"> <div class="name-and-description"> <p class="name"> <span>Center for Information Technology Policy</span> </p> <p class="description"> Promoting informed discussion of digital technologies and their role in society </p> </div> </a> </div> <div class="nav-item second-tier"> <a href="/centers/center-decentralization-power-through-blockchain-technology-decenter" > <div class="name-and-description"> <p class="name"><span>DeCenter</span></p> <p class="description"> Exploring a wide range of decentralized technologies and their implications for society </p> </div> </a> </div> <div class="nav-item second-tier"> <a href="/centers/keller-center"> <div class="name-and-description"> <p class="name"> <span> Keller Center for Innovation in Engineering Education</span > </p> <p class="description"> Enabling students and faculty across Princeton to realize their aspirations for addressing societal challenges </p> </div> </a> </div> <div class="nav-item second-tier"> <a href="/centers/omenn-darling-bioengineering-institute"> <div class="name-and-description"> <p class="name"> <span>Omenn-Darling Bioengineering Institute</span> </p> <p class="description"> Interdisciplinary research on cellular, device and computational bioengineering </p> </div> </a> </div> </div> <div class="column"> <div class="nav-item second-tier"> <a href="/centers/metropolis-initiative"> <div class="name-and-description"> <p class="name"><span>Metropolis Initiative</span></p> <p class="description"> Innovations to make cities more sustainable, resilient, and equitable </p> </div> </a> </div> <div class="nav-item second-tier"> <a href="/centers/nextg"> <div class="name-and-description"> <p class="name"><span>NextG</span></p> <p class="description"> Creating the intelligent networks of the future </p> </div> </a> </div> <div class="nav-item second-tier"> <a href="/centers/pmi"> <div class="name-and-description"> <p class="name"><span>Princeton Materials Institute</span></p> <p class="description"> Multidisciplinary research driving advances in materials science and photonics </p> </div> </a> </div> <div class="nav-item second-tier"> <a href="/centers/princeton-quantum-initiative"> <div class="name-and-description"> <p class="name"><span>Princeton Quantum Initiative</span></p> <p class="description"> Taking a ‘full-stack’ approach to advancing quantum information science </p> </div> </a> </div> <div class="nav-item second-tier"> <a href="/centers/robotics-center"> <div class="name-and-description"> <p class="name"><span>Princeton Robotics</span></p> <p class="description"> Advancing innovative, safe, and ethical use of robotic systems </p> </div> </a> </div> </div> </section> <div class="nav-item first-tier"> <a tabindex="0" role="button" @click="moreOpen = !moreOpen" @keydown.enter="moreOpen = !moreOpen" :aria-expanded="moreOpen ? 'true' : 'false'" :class="{ 'is-active': moreOpen }" > <div class="name-and-description"> <p class="name"><span>More</span></p> </div> <i class="fa-solid fa-chevron-right"></i> </a> </div> <section x-show="moreOpen" @click.outside="moreOpen = false" @keydown.enter.outside="moreOpen = false" x-transition > <div class="column"> <p class="nav-items-group-title">Resources</p> <div class="nav-item second-tier"> <a href="/resources"> <div class="name-and-description"> <p class="name"><span>Resources</span></p> <p class="description"> Tools and policies for faculty and staff </p> </div> </a> </div> <div x-data="{ policyOpen: false}" x-cloak> <div class="nav-item second-tier"> <a tabindex="0" role="button" @click="policyOpen = !policyOpen" @keydown.enter="policyOpen = !policyOpen" :aria-expanded="policyOpen ? 'true' : 'false'" :class="{ 'is-active': policyOpen }" > <div class="name-and-description"> <p class="name"><span>Policies and Procedures</span></p> </div> <i class="fa-solid fa-chevron-right"></i> </a> </div> <section x-show="policyOpen" @click.outside="policyOpen = false" @keydown.enter.outside="policyOpen = false" x-transition > <div class="nav-item third-tier"> <a href="/resources/policies-and-procedures"> <div class="name-and-description"> <p class="name"><span>Policy Overview</span></p> </div> </a> </div> <div class="nav-item third-tier"> <a href="/resources/poster-policy"> <div class="name-and-description"> <p class="name"><span>Poster Policy</span></p> </div> </a> </div> <div class="nav-item third-tier"> <a href="/resources/policies-and-procedures/resource-recovery" ><div class="name-and-description"> <p class="name"><span>Resource Recovery Program</span></p> </div> </a> </div> <div class="nav-item third-tier"> <a href="/resources/policies-and-procedures/gas-cylinders"> <div class="name-and-description"> <p class="name"><span>Gas Cylinders</span></p> </div> </a> </div> <div class="nav-item third-tier"> <a href="/resources/policies-and-procedures/lab-coats"> <div class="name-and-description"> <p class="name"><span>Lab Coats</span></p> </div> </a> </div> <div class="nav-item third-tier"> <a href="/resources/policies-and-procedures/machine-shop"> <div class="name-and-description"> <p class="name"><span>Machine Shop Request Form</span></p> </div> </a> </div> <div class="nav-item third-tier"> <a href="/resources/policies-and-procedures/mailroom-shipping-receiving" > <div class="name-and-description"> <p class="name"> <span>Mailroom, Shipping and Receiving</span> </p> </div> </a> </div> <div class="nav-item third-tier"> <a href="/resources/policies-and-procedures/nitrogen-policy"> <div class="name-and-description"> <p class="name"><span>Nitrogen Policy</span></p> </div> </a> </div> <div class="nav-item third-tier"> <a href="/resources/policies-and-procedures/pet-policy"> <div class="name-and-description"> <p class="name"><span>Pet Policy and Guidelines</span></p> </div> </a> </div> <div class="nav-item third-tier"> <a href="/resources/policies-and-procedures/stockroom"> <div class="name-and-description"> <p class="name"><span>Stockroom</span></p> </div> </a> </div> <div class="nav-item third-tier"> <a href="/resources/policies-and-procedures/seas-vehicles"> <div class="name-and-description"> <p class="name"><span>Vehicle Reservations</span></p> </div> </a> </div> </section> </div> <div x-data="{ safetyOpen: false}" x-cloak> <div class="nav-item second-tier"> <a tabindex="0" role="button" @click="safetyOpen = !safetyOpen" @keydown.enter="safetyOpen = !safetyOpen" :aria-expanded="safetyOpen ? 'true' : 'false'" :class="{ 'is-active': safetyOpen }" > <div class="name-and-description"> <p class="name"><span>Safety</span></p> </div> <i class="fa-solid fa-chevron-right"></i> </a> </div> <section x-show="safetyOpen" @click.outside="safetyOpen = false" @keydown.enter.outside="safetyOpen = false" x-transition > <div class="nav-item third-tier"> <a href="/resources/safety/general-safety"> <div class="name-and-description"> <p class="name"><span>Overview</span></p> </div> </a> </div> <div class="nav-item third-tier"> <a href="/resources/safety/roles-and-responsibilities"> <div class="name-and-description"> <p class="name"> <span>Roles and Responsibilities</span> </p> </div> </a> </div> <div class="nav-item third-tier"> <a href="/resources/safety/emergency-response"> <div class="name-and-description"> <p class="name"><span>Emergency Response</span></p> </div> </a> </div> <div class="nav-item third-tier"> <a href="/resources/safety/illness-injury-reporting"> <div class="name-and-description"> <p class="name"> <span>Illness and Injury Reporting</span> </p> </div> </a> </div> <div class="nav-item third-tier"> <a href="/resources/safety/general-safety"> <div class="name-and-description"> <p class="name"><span>General Safety</span></p> </div> </a> </div> <div class="nav-item third-tier"> <a href="/resources/safety/dale-grieb-safety-award" ><div class="name-and-description"> <p class="name"><span>Dale Grieb Safety Award</span></p> </div> </a> </div> <div class="nav-item third-tier"> <a href="/resources/safety/safety-handbook"> <div class="name-and-description"> <p class="name"><span>Safety Handbook</span></p> </div> </a> </div> </section> </div> <div x-data="{ fundingOpen: false}" x-cloak> <div class="nav-item second-tier"> <a tabindex="0" role="button" @click="fundingOpen = !fundingOpen" @keydown.enter="fundingOpen = !fundingOpen" :aria-expanded="fundingOpen ? 'true' : 'false'" :class="{ 'is-active': fundingOpen }" > <div class="name-and-description"> <p class="name"><span>Funding</span></p> </div> <i class="fa-solid fa-chevron-right"></i> </a> </div> <section x-show="fundingOpen" @click.outside="fundingOpen = false" @keydown.enter.outside="fundingOpen = false" x-transition > <div class="nav-item third-tier"> <a href="/funding/"> <div class="name-and-description"> <p class="name"><span>Funding Overview</span></p> </div> </a> </div> <div class="nav-item third-tier"> <a href="/resources/funding/funding-guide-engineering-faculty" > <div class="name-and-description"> <p class="name"> <span>Funding Guide for Engineering Faculty</span> </p> </div> </a> </div> <div class="nav-item third-tier"> <a href="/funding/innovation-grants"> <div class="name-and-description"> <p class="name"><span>Innovation Grants</span></p> </div> </a> </div> <div class="nav-item third-tier"> <a href="/funding/seed-grants"> <div class="name-and-description"> <p class="name"><span>Seed Grants</span></p> </div> </a> </div> <div class="nav-item third-tier"> <a href="/resources/funding/william-pierson-field-fund-visiting-lecturers" > <div class="name-and-description"> <p class="name"> <span> William Pierson Field Fund for Visiting Lecturers</span > </p> </div> </a> </div> <div class="nav-item third-tier"> <a href="/funding/travel-funds"> <div class="name-and-description"> <p class="name"><span>Travel funds</span></p> </div> </a> </div> <div class="nav-item third-tier"> <a href="https://docs.google.com/forms/d/e/1FAIpQLSefr0g-gDTaZMq3yJHEOmCg9WiOKZxioUE9EeYlfSKQhRfnmQ/viewform" > <div class="name-and-description"> <p class="name"> <span>Diversity and Inclusion Initiatives</span> </p> </div> </a> </div> <div class="nav-item third-tier"> <a href="/funding/william-r-kenan-jr-visiting-professorship-for-distinguished-teaching" > <div class="name-and-description"> <p class="name"> <span> William R. Kenan, Jr. Visiting Professorship for Distinguished Teaching</span > </p> </div> </a> </div> </section> </div> <p class="nav-items-group-title">Quick links</p> <div class="nav-item second-tier"> <a href="/resources/faculty-directory"> <div class="name-and-description"> <p class="name"><span>Faculty Directory</span></p> <p class="description">Browse and filter our faculty list</p> </div> </a> </div> <div class="nav-item second-tier"> <a href="/jobs"> <div class="name-and-description"> <p class="name"><span>Jobs</span></p> <p class="description"> See open faculty positions across engineering and applied science </p> </div> </a> </div> <div class="nav-item second-tier"> <a href="/about"> <div class="name-and-description"> <p class="name"><span>Contact</span></p> <p class="description"> A dean’s welcome and key points of contact </p> </div> </a> </div> <div class="nav-item second-tier"> <a href="/about/visitors"> <div class="name-and-description"> <p class="name"><span>Visit</span></p> <p class="description">Directions and a map</p> </div> </a> </div> </div> <div class="column"> <p class="nav-items-group-title">News</p> <div class="nav-item second-tier"> <a href="/events"> <div class="name-and-description"> <p class="name"><span>Events</span></p> <p class="description">Upcoming events across the school</p> </div> </a> </div> <div class="nav-item second-tier"> <a href="/news"> <div class="name-and-description"> <p class="name"><span>News</span></p> <p class="description"> A filterable listing of news and features </p> </div> </a> </div> <div class="nav-item second-tier"> <a href="/podcasts"> <div class="name-and-description"> <p class="name"><span>Podcasts</span></p> <p class="description"> A deeper look at the research from our faculty, students and alumni </p> </div> </a> </div> <div class="nav-item second-tier"> <a href="/news/equad-magazine"> <div class="name-and-description"> <p class="name"><span>EQuad Magazine</span></p> <p class="description">Our semiannual news magazine</p> </div> </a> </div> <div class="nav-item second-tier"> <a href="/news/media-inquiries"> <div class="name-and-description"> <p class="name"><span>Media Inquiries</span></p> <p class="description">Information for journalists</p> </div> </a> </div> </div> </section> <section class="social-media"> <ul> <li> <a href="https://www.linkedin.com/school/princetonengineering" ><i class="fa-brands fa-linkedin"></i ></a> </li> <li> <a href="https://www.instagram.com/eprinceton" ><i class="fa-brands fa-instagram"></i ></a> </li> <li> <a href="https://www.x.com/eprinceton" ><i class="fa-brands fa-x-twitter"></i ></a> </li> <li> <a href="https://www.facebook.com/princetonengineering" ><i class="fa-brands fa-facebook"></i ></a> </li> <li> <a href="https://www.youtube.com/princetonengineering" ><i class="fa-brands fa-youtube"></i ></a> </li> </ul> </section> </nav> <section class="engineering-search-modal is-layout-flow wp-block-group-is-layout-flow" x-show="searchOpen" @click.outside="searchOpen = false" @keydown.enter.outside="searchOpen = false" @keydown.esc.window="searchOpen = false" x-transition x-cloak > <form role="search" method="get" class="search-form" action="https://engineering.princeton.edu/"> <label><br /> <span class="screen-reader-text">Search for:</span><br /> <input type="search" class="search-field" placeholder="Search …" value="" name="s" /><br /> </label><br /> <input type="submit" class="search-submit" value="Search" /><br /> </form> </section> <div class="engineering-modal-bg" x-show="open | searchOpen" x-transition x-cloak ></div> </div> </div> </div> </header> <main class="wp-block-group news-article is-layout-flow wp-block-group-is-layout-flow"> <article class="wp-block-group news is-layout-flow wp-block-group-is-layout-flow"> <div class="wp-block-group news__inner is-layout-flow wp-block-group-is-layout-flow"> <figure class="wp-block-post-featured-image"><img width="1600" height="1000" src="https://engineering.princeton.edu/wp-content/uploads/2024/10/PTBrunLab_101724_0030-1920x1200-1.jpg" class="attachment-post-thumbnail size-post-thumbnail wp-post-image" alt="Two small rectangular robots connected by a flexible tether; three researchers watch in background." style="object-position:50% 65%" decoding="async" fetchpriority="high" srcset="https://engineering.princeton.edu/wp-content/uploads/2024/10/PTBrunLab_101724_0030-1920x1200-1.jpg 1600w, https://engineering.princeton.edu/wp-content/uploads/2024/10/PTBrunLab_101724_0030-1920x1200-1-300x188.jpg 300w, https://engineering.princeton.edu/wp-content/uploads/2024/10/PTBrunLab_101724_0030-1920x1200-1-1024x640.jpg 1024w, https://engineering.princeton.edu/wp-content/uploads/2024/10/PTBrunLab_101724_0030-1920x1200-1-768x480.jpg 768w, https://engineering.princeton.edu/wp-content/uploads/2024/10/PTBrunLab_101724_0030-1920x1200-1-1536x960.jpg 1536w" sizes="(max-width: 1600px) 100vw, 1600px" /><figcaption class="featured-image-caption"> <i class="fa fa-camera" aria-hidden="true"></i> The robots have no internal controls. Guidance depends on a flexible tether. Photos by Sameer A. Khan/Fotobuddy</figcaption></figure> <header class="wp-block-group news__header is-layout-flow wp-block-group-is-layout-flow"> <h1 class="news__title wp-block-post-title">For these little robots, two heads are better than one</h1> <div class="wp-block-group news__meta"> <div class="byline is-layout-flow wp-block-group-is-layout-flow"> <p><span>By</span></p> <div class="is-acf-field author wp-block-mfb-meta-field-block"><div class="value">John Sullivan</div></div> <p><span>on</span></p> <div class="wp-block-post-date"><time datetime="2024-10-31T13:01:16-04:00">October 31, 2024</time></div> </div> <div id="social-bar"></div> </div> </header> <div class="wp-block-group news__content is-layout-flow wp-block-group-is-layout-flow"> <div class="entry-content wp-block-post-content is-layout-flow wp-block-post-content-is-layout-flow"> <p class="lede"> Left alone, the toy robots will skitter mindlessly across a tabletop and amuse small children and cats. But when engineers at Princeton paired the small toys with a flexible tether, the bots developed remarkable abilities. They explored enclosed spaces, solved mazes with ease, and even rounded up loose objects into patterns. </p> <p>“We wanted to take brainless agents and initiate complex behaviors,” said <a href="https://engineering.princeton.edu/faculty/pierre-thomas-brun">Pierre-Thomas Brun</a>, an associate professor of chemical and biological engineering and the research team leader.</p> <figure class="wp-block-image aligncenter size-large"><img decoding="async" width="1024" height="576" src="https://engineering.princeton.edu/wp-content/uploads/2024/10/16X9-for-web-PTBrunLab_101724_0021-1024x576.jpg" alt="Three researchers position small robots on a table" class="wp-image-17164" srcset="https://engineering.princeton.edu/wp-content/uploads/2024/10/16X9-for-web-PTBrunLab_101724_0021-1024x576.jpg 1024w, https://engineering.princeton.edu/wp-content/uploads/2024/10/16X9-for-web-PTBrunLab_101724_0021-300x169.jpg 300w, https://engineering.princeton.edu/wp-content/uploads/2024/10/16X9-for-web-PTBrunLab_101724_0021-768x432.jpg 768w, https://engineering.princeton.edu/wp-content/uploads/2024/10/16X9-for-web-PTBrunLab_101724_0021-1536x864.jpg 1536w, https://engineering.princeton.edu/wp-content/uploads/2024/10/16X9-for-web-PTBrunLab_101724_0021-2048x1152.jpg 2048w, https://engineering.princeton.edu/wp-content/uploads/2024/10/16X9-for-web-PTBrunLab_101724_0021-scaled.jpg 1600w" sizes="(max-width: 1024px) 100vw, 1024px" /><figcaption class="wp-element-caption">From left, researchers Tom Marzin, Yuchen Xi, and Pierre-Thomas Brun in Brun’s lab.</figcaption></figure> <p>In <a href="https://www.pnas.org/doi/10.1073/pnas.2410654121">an article</a> published Oct. 29 in the Proceedings of the National Academy of Sciences, the researchers said that connecting the robots with a flexible polymer tether enabled the two-inch-long machines to exhibit morphological computation — a phenomenon in which physical characteristics, rather than digital calculation, can be harnessed to solve complex problems.</p> <p>The findings have implications beyond interesting uses for robotic toys. Scientists are pursuing ways to control swarms of robots for everything from surveillance systems to space exploration. In many cases, researchers organize swarms by teaching each robot to respond to simple cues from its neighbors like a fish swimming in a school. Brun’s team wanted to explore whether it was possible to exert control over groups of robots that lack any computing power and that only respond to physical input.</p> <p>The toy bots that his team used are a type of small robot called bristlebots. They feature tiny, flexible legs and a vibrating internal motor that drives their insectile motion. The bots lack any type of computer control and rely on mechanical friction to direct them. Widely sold as a toy, bristlebots have found a use in scientific experiments in which they stand in for gas particles and bacteria.</p> <figure class="wp-block-image aligncenter size-large"><img decoding="async" width="1024" height="576" src="https://engineering.princeton.edu/wp-content/uploads/2024/10/16X9-for-web-PTBrunLab_101724_0025-1024x576.jpg" alt="Two small rectangular robots connected by a flexible tether" class="wp-image-17165" srcset="https://engineering.princeton.edu/wp-content/uploads/2024/10/16X9-for-web-PTBrunLab_101724_0025-1024x576.jpg 1024w, https://engineering.princeton.edu/wp-content/uploads/2024/10/16X9-for-web-PTBrunLab_101724_0025-300x169.jpg 300w, https://engineering.princeton.edu/wp-content/uploads/2024/10/16X9-for-web-PTBrunLab_101724_0025-768x432.jpg 768w, https://engineering.princeton.edu/wp-content/uploads/2024/10/16X9-for-web-PTBrunLab_101724_0025-1536x864.jpg 1536w, https://engineering.princeton.edu/wp-content/uploads/2024/10/16X9-for-web-PTBrunLab_101724_0025-2048x1152.jpg 2048w, https://engineering.princeton.edu/wp-content/uploads/2024/10/16X9-for-web-PTBrunLab_101724_0025-scaled.jpg 1600w" sizes="(max-width: 1024px) 100vw, 1024px" /><figcaption class="wp-element-caption">The robots have no internal controls. Guidance depends on a flexible tether.</figcaption></figure> <p>Brun’s team wanted to know if it would be possible to create complex behavior without using lights or other outside instructions. They planned to leverage mechanical intelligence in which physical systems solve problems in the same way a hand grasps a ball.</p> <p>The key was a flexible tether, which the researchers created with a 3D printer. They experimented with rigid tethers and others of varying flexibility. Using cameras to track the bots, the researchers created mathematical models that predicted the paired bots’ behavior based on variables including the bots’ force and the tether’s length and flexibility.</p> <p>In each setup, the researchers attached a tether to the front edge of each rectangular microbot. With the most rigid tether, basically a stiff polyester beam, the bots pushed against each other, and the pair barely moved. But as the researchers increased the polyester’s flexibility, the tethers began to buckle as the bots pushed. Eventually, the tethers buckled into a U-shaped curve, allowing the bots to push quickly forward toward the bend in the U — like two swimmers pushing each end of a noodle-shaped float. The tether connecting the bots controlled the pair’s direction by preventing either from skittering in a random direction. (This control decreases when the force delivered by the bots passes a threshold exceeding the tether’s resistance to buckling.) The researchers calculated the angle that allowed the bots to move forward in a controlled direction with the greatest speed.</p> <p>Having learned to control the paired bots’ direction, the researchers moved on to obstacles. They found that when running into a wall, the U-shaped tether flattens and causes one of the paired bots to scoot along the wall. Eventually, the curve in the tether reappears but pointing in a different direction. This leads the pair of bots to navigate away from the wall. The behavior allows the bot pair to explore a confined space. It is also key to the pair’s ability to navigate mazes.</p> <p>Besides this, the researchers examined the bots’ ability to squeeze through openings. They also developed ways to use the bots to gather loose objects on a tabletop into separate groups.</p> <p>The project began as Richard B. Huang’s senior thesis project. Huang, who graduated in 2023 with a degree in chemical and biological engineering, said he started working with Brun investigating the behavior of single robots connected to an elastic beam. One day, he connected two robots with a tether and “turned on the recorder to see what would happen.”</p> <p>“I let it go, and it moved around the walls of the experimental setup,” said Huang, now a doctoral student in chemical engineering at M.I.T. “I thought that was really interesting. And that’s when things started getting really exciting.”</p> <p>Brun said the team plans to keep working on the tether system. He said they would like to explore other behaviors and arrangements with larger numbers of tethered bots. Another possibility is applying the work to drones moving in three dimensions.</p> <hr class="wp-block-separator has-alpha-channel-opacity"/> <p>The article, <em>Emergent behaviors of buckling-driven elasto-active structures</em>, was published Oct. 29 in the Proceedings of the National Academy of Science. Besides Brun and Huang, authors include Yuchen Xi, a graduate student in chemical and biological engineering at Princeton; Tom Marzin, a post-doctoral researcher at Princeton; and Trevor Jones, a former doctoral student in Brun’s lab who is now an assistant professor of mechanical engineering at Carnegie Mellon University. Support for the project was provided in part by the National Science Foundation.</p> </div> </div> </div> </article> <section class="seas-section news-section not-prose" id="related-news"> <div class="seas-section__content"> <header class="seas-section__header"> <h2 class="seas-section__title"><a name="news" class="page-anchor"></a>Related News</h2> </header> <div class="cards news-cards"> <article class="card"> <a class="card__link" href="https://engineering.princeton.edu/news/2022/06/10/episode-6-dance-me-end" aria-label="Episode 6: Dance Me to the End"></a></p> <figure class="card__figure"> <img width="1600" height="900" src="https://engineering.princeton.edu/wp-content/uploads/2022/06/Episode-6_-Featured-Image.png" class="attachment-full size-full wp-post-image" alt="Episode 6: Dance Me to the End. "Composers & Computers" logo. The ampersand is a treble clef. There is a sound wave illustration" decoding="async" loading="lazy" srcset="https://engineering.princeton.edu/wp-content/uploads/2022/06/Episode-6_-Featured-Image.png 1600w, https://engineering.princeton.edu/wp-content/uploads/2022/06/Episode-6_-Featured-Image-300x169.png 300w, https://engineering.princeton.edu/wp-content/uploads/2022/06/Episode-6_-Featured-Image-1024x576.png 1024w, https://engineering.princeton.edu/wp-content/uploads/2022/06/Episode-6_-Featured-Image-768x432.png 768w, https://engineering.princeton.edu/wp-content/uploads/2022/06/Episode-6_-Featured-Image-1536x864.png 1536w, https://engineering.princeton.edu/wp-content/uploads/2022/06/Episode-6_-Featured-Image-800x450.png 800w, https://engineering.princeton.edu/wp-content/uploads/2022/06/Episode-6_-Featured-Image-1568x882.png 1568w" sizes="(max-width: 1600px) 100vw, 1600px" /> </p> <div class="card-border" ></div> </figure> <div class="card__content"> <div class="card__info"> <h3 class="card__title">Episode 6: Dance Me to the End</h3> </p></div> </p></div> </article> <article class="card"> <a class="card__link" href="https://engineering.princeton.edu/news/2024/05/16/meet-spot-bot-course-explores-learning-live-robots" aria-label="Meet SPOT the 'bot: Course explores learning to live with robots"></a></p> <figure class="card__figure"> <img width="1600" height="1066" src="https://engineering.princeton.edu/wp-content/uploads/2024/05/robot-qr-code_cc-scaled.jpg" class="attachment-full size-full wp-post-image" alt="Vivian Chen holds large QR code as Vasumathi Venkat, Aaron Serianni, and Alex Glaser look on, and the robot dog faces the QR code." decoding="async" loading="lazy" srcset="https://engineering.princeton.edu/wp-content/uploads/2024/05/robot-qr-code_cc-scaled.jpg 1600w, https://engineering.princeton.edu/wp-content/uploads/2024/05/robot-qr-code_cc-300x200.jpg 300w, https://engineering.princeton.edu/wp-content/uploads/2024/05/robot-qr-code_cc-1024x683.jpg 1024w, https://engineering.princeton.edu/wp-content/uploads/2024/05/robot-qr-code_cc-768x512.jpg 768w, https://engineering.princeton.edu/wp-content/uploads/2024/05/robot-qr-code_cc-1536x1024.jpg 1536w, https://engineering.princeton.edu/wp-content/uploads/2024/05/robot-qr-code_cc-2048x1365.jpg 2048w, https://engineering.princeton.edu/wp-content/uploads/2024/05/robot-qr-code_cc-1568x1045.jpg 1568w" sizes="(max-width: 1600px) 100vw, 1600px" /><figcaption class="featured-image-caption"> <i class="fa fa-camera" aria-hidden="true"></i> SPOT, a Boston Dynamics robot, performs tasks in response to QR codes. Vivian Chen ’25 holds the code, while Vasumathi Venkat ’25, Aaron Serianni ’25 and Prof. Alexander Glaser observe. Photo by Aaron Nathans</figcaption><div class="card-border" ></div> </figure> <div class="card__content"> <div class="card__info"> <h3 class="card__title">Meet SPOT the 'bot: Course explores learning to live with robots</h3> </p></div> </p></div> </article> <article class="card"> <a class="card__link" href="https://engineering.princeton.edu/news/2022/07/06/radhika-nagpal-joins-faculty-expanding-research-robotics-and-collective-intelligence" aria-label="Radhika Nagpal joins the faculty, expanding research in robotics and collective intelligence"></a></p> <figure class="card__figure"> <img width="1600" height="900" src="https://engineering.princeton.edu/wp-content/uploads/2022/06/Nagpal-final-DKC-2022_16X9-scaled.jpg" class="attachment-full size-full wp-post-image" alt="" decoding="async" loading="lazy" srcset="https://engineering.princeton.edu/wp-content/uploads/2022/06/Nagpal-final-DKC-2022_16X9-scaled.jpg 1600w, https://engineering.princeton.edu/wp-content/uploads/2022/06/Nagpal-final-DKC-2022_16X9-300x169.jpg 300w, https://engineering.princeton.edu/wp-content/uploads/2022/06/Nagpal-final-DKC-2022_16X9-1024x576.jpg 1024w, https://engineering.princeton.edu/wp-content/uploads/2022/06/Nagpal-final-DKC-2022_16X9-768x432.jpg 768w, https://engineering.princeton.edu/wp-content/uploads/2022/06/Nagpal-final-DKC-2022_16X9-1536x864.jpg 1536w, https://engineering.princeton.edu/wp-content/uploads/2022/06/Nagpal-final-DKC-2022_16X9-2048x1152.jpg 2048w, https://engineering.princeton.edu/wp-content/uploads/2022/06/Nagpal-final-DKC-2022_16X9-800x450.jpg 800w, https://engineering.princeton.edu/wp-content/uploads/2022/06/Nagpal-final-DKC-2022_16X9-1568x882.jpg 1568w" sizes="(max-width: 1600px) 100vw, 1600px" /><figcaption class="featured-image-caption"> <i class="fa fa-camera" aria-hidden="true"></i> Radhika Nagpal. Photo by David Kelly Crow</figcaption><div class="card-border" ></div> </figure> <div class="card__content"> <div class="card__info"> <h3 class="card__title">Radhika Nagpal joins the faculty, expanding research in robotics and collective intelligence</h3> </p></div> </p></div> </article> <article class="card"> <a class="card__link" href="https://engineering.princeton.edu/news/2023/11/28/how-do-you-make-robot-smarter-program-it-know-what-it-doesnt-know" aria-label="How do you make a robot smarter? Program it to know what it doesn’t know."></a></p> <figure class="card__figure"> <img width="1600" height="900" src="https://engineering.princeton.edu/wp-content/uploads/2023/11/metabot_bottles_16X9-scaled.jpg" class="attachment-full size-full wp-post-image" alt="Photo of a robot with a camera "face" looking at a kitchen counter with two plastic water bottles and an apple." decoding="async" loading="lazy" srcset="https://engineering.princeton.edu/wp-content/uploads/2023/11/metabot_bottles_16X9-scaled.jpg 1600w, https://engineering.princeton.edu/wp-content/uploads/2023/11/metabot_bottles_16X9-300x169.jpg 300w, https://engineering.princeton.edu/wp-content/uploads/2023/11/metabot_bottles_16X9-1024x576.jpg 1024w, https://engineering.princeton.edu/wp-content/uploads/2023/11/metabot_bottles_16X9-768x432.jpg 768w, https://engineering.princeton.edu/wp-content/uploads/2023/11/metabot_bottles_16X9-1536x864.jpg 1536w, https://engineering.princeton.edu/wp-content/uploads/2023/11/metabot_bottles_16X9-2048x1152.jpg 2048w, https://engineering.princeton.edu/wp-content/uploads/2023/11/metabot_bottles_16X9-800x450.jpg 800w, https://engineering.princeton.edu/wp-content/uploads/2023/11/metabot_bottles_16X9-1568x882.jpg 1568w" sizes="(max-width: 1600px) 100vw, 1600px" /><figcaption class="featured-image-caption"> <i class="fa fa-camera" aria-hidden="true"></i> Engineers at Princeton University and Google have come up with a new way to teach robots to know when they don’t know and ask for clarification from a human. Photo by the researchers</figcaption><div class="card-border" ></div> </figure> <div class="card__content"> <div class="card__info"> <h3 class="card__title">How do you make a robot smarter? Program it to know what it doesn’t know.</h3> </p></div> </p></div> </article> <article class="card"> <a class="card__link" href="https://engineering.princeton.edu/news/2022/01/25/picking-trash-robots-pick-new-approaches-work" aria-label="In picking up trash, robots pick up new approaches to work"></a></p> <figure class="card__figure"> <img width="1600" height="899" src="https://engineering.princeton.edu/wp-content/uploads/2022/01/Rusinkiewicz-IMG_8459-16x9-1-scaled.jpg" class="attachment-full size-full wp-post-image" alt="" decoding="async" loading="lazy" srcset="https://engineering.princeton.edu/wp-content/uploads/2022/01/Rusinkiewicz-IMG_8459-16x9-1-scaled.jpg 1600w, https://engineering.princeton.edu/wp-content/uploads/2022/01/Rusinkiewicz-IMG_8459-16x9-1-300x169.jpg 300w, https://engineering.princeton.edu/wp-content/uploads/2022/01/Rusinkiewicz-IMG_8459-16x9-1-1024x576.jpg 1024w, https://engineering.princeton.edu/wp-content/uploads/2022/01/Rusinkiewicz-IMG_8459-16x9-1-768x432.jpg 768w, https://engineering.princeton.edu/wp-content/uploads/2022/01/Rusinkiewicz-IMG_8459-16x9-1-1536x864.jpg 1536w, https://engineering.princeton.edu/wp-content/uploads/2022/01/Rusinkiewicz-IMG_8459-16x9-1-2048x1152.jpg 2048w, https://engineering.princeton.edu/wp-content/uploads/2022/01/Rusinkiewicz-IMG_8459-16x9-1-800x450.jpg 800w, https://engineering.princeton.edu/wp-content/uploads/2022/01/Rusinkiewicz-IMG_8459-16x9-1-1568x882.jpg 1568w" sizes="(max-width: 1600px) 100vw, 1600px" /><figcaption class="featured-image-caption"> <i class="fa fa-camera" aria-hidden="true"></i> Photo of experimental setup by graduate student Jimmy Wu.</figcaption><div class="card-border" ></div> </figure> <div class="card__content"> <div class="card__info"> <h3 class="card__title">In picking up trash, robots pick up new approaches to work</h3> </p></div> </p></div> </article> <article class="card"> <a class="card__link" href="https://engineering.princeton.edu/news/2023/06/26/innovation-funds-support-research-robotics-machine-learning-climate-resilience-and-more" aria-label="Innovation funds support research in robotics, machine learning, climate resilience and more"></a></p> <figure class="card__figure"> <img width="1600" height="900" src="https://engineering.princeton.edu/wp-content/uploads/2023/06/RoboticsLab_060623_0091_16X9-scaled.jpg" class="attachment-full size-full wp-post-image" alt="Foam board with a pinned grasshopper specimen, with wings extended, and four rows with different colors and shapes of synthetic wings under investigation for flying robots." decoding="async" loading="lazy" srcset="https://engineering.princeton.edu/wp-content/uploads/2023/06/RoboticsLab_060623_0091_16X9-scaled.jpg 1600w, https://engineering.princeton.edu/wp-content/uploads/2023/06/RoboticsLab_060623_0091_16X9-300x169.jpg 300w, https://engineering.princeton.edu/wp-content/uploads/2023/06/RoboticsLab_060623_0091_16X9-1024x576.jpg 1024w, https://engineering.princeton.edu/wp-content/uploads/2023/06/RoboticsLab_060623_0091_16X9-768x432.jpg 768w, https://engineering.princeton.edu/wp-content/uploads/2023/06/RoboticsLab_060623_0091_16X9-1536x864.jpg 1536w, https://engineering.princeton.edu/wp-content/uploads/2023/06/RoboticsLab_060623_0091_16X9-2048x1152.jpg 2048w, https://engineering.princeton.edu/wp-content/uploads/2023/06/RoboticsLab_060623_0091_16X9-800x450.jpg 800w, https://engineering.princeton.edu/wp-content/uploads/2023/06/RoboticsLab_060623_0091_16X9-1568x882.jpg 1568w" sizes="(max-width: 1600px) 100vw, 1600px" /><figcaption class="featured-image-caption"> <i class="fa fa-camera" aria-hidden="true"></i> A team led by Pierre-Thomas Brun and Aimy Wissa is studying the structures and capabilities of grasshopper wings and flying fish fins. An innovation grant will allow the researchers to test different types of foldable wings and model their performance. Photos by Tori Repp/Fotobuddy</figcaption><div class="card-border" ></div> </figure> <div class="card__content"> <div class="card__info"> <h3 class="card__title">Innovation funds support research in robotics, machine learning, climate resilience and more</h3> </p></div> </p></div> </article></div> </p></div> </section> <p><!-- Fetched from cache --></p> <div class="is-acf-field wp-block-mfb-meta-field-block"><div class="value"> <section class="seas-section faculty-section"> <div class="seas-section__content"> <header class="seas-section__header"> <h2 class="seas-section__title">Related Faculty</h2> </header> <div class="cards faculty-cards"> <article class="card faculty-card"><a class="card__link" href="https://engineering.princeton.edu/faculty/pierre-thomas-brun" aria-label="Pierre-Thomas Brun"></a> <figure class="card__figure"><img width="500" height="500" src="https://engineering.princeton.edu/wp-content/uploads/2020/06/pierre-thomas_brun.png" class="attachment-post-thumbnail size-post-thumbnail wp-post-image" alt="" loading="lazy" /><div class="card-border"></div></figure> <div class="card__content"> <div class="card__info"> <h3 class="card__title">Pierre-Thomas Brun</h3> </div><!-- .card__info --> </div><!-- .card__content --> </article><!-- .card --> </div><!-- .cards --> </div><!-- .seas-section__content --> </section><!-- .seas-section__content --> </div></div> <div class="is-acf-field wp-block-mfb-meta-field-block"><div class="value"> <section class="seas-section department-center-section"> <div class="seas-section__content"> <header class="seas-section__header"> <h2 class="seas-section__title">Related Departments</h2> </header> <div class="cards department-center-cards"> <article class="department-center-card card"> <a class="card__link" href="https://engineering.princeton.edu/departments/chemical-and-biological-engineering" aria-label="Chemical and Biological Engineering"></a> <figure class="card__figure"> <img width="1200" height="675" src="https://engineering.princeton.edu/wp-content/uploads/2021/08/chemical-and-biological-engineering-2.jpg" class="attachment-post-thumbnail size-post-thumbnail wp-post-image" alt="Professor and student work together in lab setting." loading="lazy" /> <div class="card-border"></div> </figure> <div class="card__content"> <div class="card__info"> <h3 class="card__title">Chemical and Biological Engineering</h3> <p class="card__description">Advancing human health, energy, materials science, and industrial processes</p> </div><!-- .card__info --> </div><!-- .card__content --> </article><!-- .card --> </div><!-- .cards --> </div><!-- .seas-section__content --> </section><!-- .seas-section__content --> </div></div> </main> <footer class="wp-block-template-part"> <div class="wp-block-group engineering-site-footer is-layout-flow wp-block-group-is-layout-flow"> <div class="wp-block-group engineering-site-footer__content is-layout-flow wp-block-group-is-layout-flow"> <div class="wp-block-group logos-and-address"> <h3 class="engineering-logo is-layout-flow wp-block-group-is-layout-flow"> <a href="/">School of Engineering & Applied Science</a> </h3> <div class="wp-block-group engineering-address is-layout-flow wp-block-group-is-layout-flow"> <address> <p>School of Engineering and Applied Science</p> <p>Princeton, New Jersey 08544</p> </address> </div> <div class="wp-block-group engineering-newsletter is-layout-flow wp-block-group-is-layout-flow"> <div id="mc_embed_shell" style="width: 100%"> <link href="//cdn-images.mailchimp.com/embedcode/classic-061523.css" rel="stylesheet" type="text/css" /> <div id="mc_embed_signup"> <form action="https://princeton.us15.list-manage.com/subscribe/post?u=815013b76bec0c1d6fae893ba&id=329ebd13b8&f_id=00479be0f0" method="post" id="mc-embedded-subscribe-form" name="mc-embedded-subscribe-form" class="validate" target="_blank" > <div id="mc_embed_signup_scroll"> <h2>Engineering Newsletter Signup</h2> <div class="mc-field-group"> <input type="email" name="EMAIL" placeholder="email address (required)" class="required email" id="mce-EMAIL" required="" value="" /> </div> <div id="mce-responses" class="clear"> <div class="response" id="mce-error-response" style="display: none" ></div> <div class="response" id="mce-success-response" style="display: none" ></div> </div> <div aria-hidden="true" style="position: absolute; left: -5000px" > <input type="text" name="b_815013b76bec0c1d6fae893ba_329ebd13b8" tabindex="-1" value="" /> </div> <div class="clear"> <input type="submit" name="subscribe" id="mc-embedded-subscribe" class="button" value="Subscribe" /> </div> </div> </form> </div> <script type="text/javascript" src="//s3.amazonaws.com/downloads.mailchimp.com/js/mc-validate.js" ></script> <script type="text/javascript"> (function ($) { window.fnames = new Array(); window.ftypes = new Array(); fnames[0] = "EMAIL"; ftypes[0] = "email"; fnames[1] = "FNAME"; ftypes[1] = "text"; fnames[2] = "LNAME"; ftypes[2] = "text"; fnames[3] = "ADDRESS"; ftypes[3] = "address"; fnames[4] = "PHONE"; ftypes[4] = "phone"; fnames[5] = "MMERGE5"; ftypes[5] = "text"; fnames[6] = "MMERGE6"; ftypes[6] = "text"; fnames[7] = "MMERGE7"; ftypes[7] = "text"; })(jQuery); var $mcj = jQuery.noConflict(true); </script> </div> </div> </div> <div class="equal-opportunity is-layout-flow wp-block-group-is-layout-flow"> <p> Equal Opportunity and Nondiscrimination at Princeton University: Princeton University believes that commitment to principles of fairness and respect for all is favorable to the free and open exchange of ideas, and the University seeks to reach out as widely as possible in order to attract the ablest individuals as students, faculty, and staff. In applying this policy, the University is committed to nondiscrimination on the basis of personal beliefs or characteristics such as political views, religion, national origin, ancestry, race, color, sex, sexual orientation, gender identity or expression, pregnancy/childbirth, age, marital or domestic partnership status, veteran status, disability, genetic information and/or other characteristics protected by applicable law in any phase of its education or employment programs or activities. In addition, pursuant to Title IX of the Education Amendments of 1972 and supporting regulations, Princeton does not discriminate on the basis of sex in the education programs or activities that it operates; this extends to admission and employment. Inquiries about the application of Title IX and its supporting regulations may be directed to the Assistant Secretary for Civil Rights, Office for Civil Rights, U.S. Department of Education or to the University’s Sexual Misconduct/Title IX Coordinator. See Princeton’s full Equal Opportunity Policy and Nondiscrimination Statement. </p> </div> <div class="university-info is-layout-flow wp-block-group-is-layout-flow"> <p>© 2024 The Trustees of Princeton University</p> <div class="wp-block-group university-address is-layout-flow wp-block-group-is-layout-flow"> <address> <p>Princeton, New Jersey 08544 United States</p> <p> <strong>Operator:</strong> <a href="tel+6092583000">(609) 258-3000</a> </p> </address> <p> <a href="https://www.princeton.edu/content/copyright-infringement" >Copyright Infringement</a > </p> </div> <div class="wp-block-group university-footer-logo is-layout-flow wp-block-group-is-layout-flow"> <h3 class="university-logo"> <a href="https://www.princeton.edu">Princeton University</a> </h3> <p> <a href="https://www.princeton.edu/privacy-notice">Privacy Notice</a> </p> </div> </div> </div> </div> </footer> </div> <script id="wp-block-template-skip-link-js-after"> ( function() { var skipLinkTarget = document.querySelector( 'main' ), sibling, skipLinkTargetID, skipLink; // Early exit if a skip-link target can't be located. if ( ! skipLinkTarget ) { return; } /* * Get the site wrapper. * The skip-link will be injected in the beginning of it. */ sibling = document.querySelector( '.wp-site-blocks' ); // Early exit if the root element was not found. if ( ! sibling ) { return; } // Get the skip-link target's ID, and generate one if it doesn't exist. skipLinkTargetID = skipLinkTarget.id; if ( ! skipLinkTargetID ) { skipLinkTargetID = 'wp--skip-link--target'; skipLinkTarget.id = skipLinkTargetID; } // Create the skip link. skipLink = document.createElement( 'a' ); skipLink.classList.add( 'skip-link', 'screen-reader-text' ); skipLink.href = '#' + skipLinkTargetID; skipLink.innerHTML = 'Skip to content'; // Inject the skip link. sibling.parentElement.insertBefore( skipLink, sibling ); }() ); </script> <script src="https://engineering.princeton.edu/wp-content/themes/engineering/app/dist/assets/index-vV-Zt8Fy.js?ver=1.0.3" id="vite-script-js"></script> <script src="https://engineering.princeton.edu/wp-content/themes/engineering/assets/js/main.js?ver=1732641271" id="main-js"></script> <script src="https://engineering.princeton.edu/wp-content/themes/engineering/assets/js/main.min.js?ver=1732641271" id="main-min-js"></script> <script src="https://kit.fontawesome.com/8299227453.js" id="fontawesome-js"></script> <script defer src="https://cdn.jsdelivr.net/npm/alpinejs@3.x.x/dist/cdn.min.js" id="alpinejs-js"></script> <script src="https://engineering.princeton.edu/wp-content/themes/engineering/assets/js/main.min.js" id="custom-js-js"></script> <script src="https://engineering.princeton.edu/wp-includes/js/hoverIntent.min.js?ver=1.10.2" id="hoverIntent-js"></script> <script id="megamenu-js-extra"> var megamenu = {"timeout":"300","interval":"100"}; </script> <script src="https://engineering.princeton.edu/wp-content/plugins/megamenu/js/maxmegamenu.js?ver=3.3.1.2" id="megamenu-js"></script> <script src="https://engineering.princeton.edu/wp-content/plugins/megamenu-pro/assets/public.js?ver=2.4" id="megamenu-pro-js"></script> <script type="text/javascript"> /* <![CDATA[ */ document.querySelectorAll("ul.nav-menu").forEach( ulist => { if (ulist.querySelectorAll("li").length == 0) { ulist.style.display = "none"; } } ); /* ]]> */ </script> <script type="text/javascript">window.NREUM||(NREUM={});NREUM.info={"beacon":"bam.nr-data.net","licenseKey":"NRJS-b00d4b4e7850ab82d90","applicationID":"1529948474","transactionName":"NFUAYEdRDBUFW0ReVw0fI1dBWQ0IS0xVWkgPURZRGFMDCBJZQw==","queueTime":0,"applicationTime":369,"atts":"GBIDFg9LHxs=","errorBeacon":"bam.nr-data.net","agent":""}</script></body> </html>