diff --git a/custom_components/houseplan/frontend/houseplan-card.js b/custom_components/houseplan/frontend/houseplan-card.js index 88b04da7..7124ad82 100755 --- a/custom_components/houseplan/frontend/houseplan-card.js +++ b/custom_components/houseplan/frontend/houseplan-card.js @@ -1,4 +1,4 @@ -globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="9370aa76e493dcb8caff0772a51dc5b38b8c7c48b58f80c8f357a091b26c7ef4";const e=globalThis,t=e.ShadowRoot&&(void 0===e.ShadyCSS||e.ShadyCSS.nativeShadow)&&"adoptedStyleSheets"in Document.prototype&&"replace"in CSSStyleSheet.prototype,i=Symbol(),s=new WeakMap;let n=class{constructor(e,t,s){if(this._$cssResult$=!0,s!==i)throw Error("CSSResult is not constructable. Use `unsafeCSS` or `css` instead.");this.cssText=e,this.t=t}get styleSheet(){let e=this.o;const i=this.t;if(t&&void 0===e){const t=void 0!==i&&1===i.length;t&&(e=s.get(i)),void 0===e&&((this.o=e=new CSSStyleSheet).replaceSync(this.cssText),t&&s.set(i,e))}return e}toString(){return this.cssText}};const o=(e,...t)=>{const s=1===e.length?e[0]:t.reduce((t,i,s)=>t+(e=>{if(!0===e._$cssResult$)return e.cssText;if("number"==typeof e)return e;throw Error("Value passed to 'css' function must be a 'css' function result: "+e+". Use 'unsafeCSS' to pass non-literal values, but take care to ensure page security.")})(i)+e[s+1],e[0]);return new n(s,e,i)},a=t?e=>e:e=>e instanceof CSSStyleSheet?(e=>{let t="";for(const i of e.cssRules)t+=i.cssText;return(e=>new n("string"==typeof e?e:e+"",void 0,i))(t)})(e):e,{is:r,defineProperty:l,getOwnPropertyDescriptor:c,getOwnPropertyNames:h,getOwnPropertySymbols:d,getPrototypeOf:p}=Object,u=globalThis,_=u.trustedTypes,m=_?_.emptyScript:"",g=u.reactiveElementPolyfillSupport,f=(e,t)=>e,v={toAttribute(e,t){switch(t){case Boolean:e=e?m:null;break;case Object:case Array:e=null==e?e:JSON.stringify(e)}return e},fromAttribute(e,t){let i=e;switch(t){case Boolean:i=null!==e;break;case Number:i=null===e?null:Number(e);break;case Object:case Array:try{i=JSON.parse(e)}catch(e){i=null}}return i}},b=(e,t)=>!r(e,t),y={attribute:!0,type:String,converter:v,reflect:!1,useDefault:!1,hasChanged:b};Symbol.metadata??=Symbol("metadata"),u.litPropertyMetadata??=new WeakMap;let w=class extends HTMLElement{static addInitializer(e){this._$Ei(),(this.l??=[]).push(e)}static get observedAttributes(){return this.finalize(),this._$Eh&&[...this._$Eh.keys()]}static createProperty(e,t=y){if(t.state&&(t.attribute=!1),this._$Ei(),this.prototype.hasOwnProperty(e)&&((t=Object.create(t)).wrapped=!0),this.elementProperties.set(e,t),!t.noAccessor){const i=Symbol(),s=this.getPropertyDescriptor(e,i,t);void 0!==s&&l(this.prototype,e,s)}}static getPropertyDescriptor(e,t,i){const{get:s,set:n}=c(this.prototype,e)??{get(){return this[t]},set(e){this[t]=e}};return{get:s,set(t){const o=s?.call(this);n?.call(this,t),this.requestUpdate(e,o,i)},configurable:!0,enumerable:!0}}static getPropertyOptions(e){return this.elementProperties.get(e)??y}static _$Ei(){if(this.hasOwnProperty(f("elementProperties")))return;const e=p(this);e.finalize(),void 0!==e.l&&(this.l=[...e.l]),this.elementProperties=new Map(e.elementProperties)}static finalize(){if(this.hasOwnProperty(f("finalized")))return;if(this.finalized=!0,this._$Ei(),this.hasOwnProperty(f("properties"))){const e=this.properties,t=[...h(e),...d(e)];for(const i of t)this.createProperty(i,e[i])}const e=this[Symbol.metadata];if(null!==e){const t=litPropertyMetadata.get(e);if(void 0!==t)for(const[e,i]of t)this.elementProperties.set(e,i)}this._$Eh=new Map;for(const[e,t]of this.elementProperties){const i=this._$Eu(e,t);void 0!==i&&this._$Eh.set(i,e)}this.elementStyles=this.finalizeStyles(this.styles)}static finalizeStyles(e){const t=[];if(Array.isArray(e)){const i=new Set(e.flat(1/0).reverse());for(const e of i)t.unshift(a(e))}else void 0!==e&&t.push(a(e));return t}static _$Eu(e,t){const i=t.attribute;return!1===i?void 0:"string"==typeof i?i:"string"==typeof e?e.toLowerCase():void 0}constructor(){super(),this._$Ep=void 0,this.isUpdatePending=!1,this.hasUpdated=!1,this._$Em=null,this._$Ev()}_$Ev(){this._$ES=new Promise(e=>this.enableUpdating=e),this._$AL=new Map,this._$E_(),this.requestUpdate(),this.constructor.l?.forEach(e=>e(this))}addController(e){(this._$EO??=new Set).add(e),void 0!==this.renderRoot&&this.isConnected&&e.hostConnected?.()}removeController(e){this._$EO?.delete(e)}_$E_(){const e=new Map,t=this.constructor.elementProperties;for(const i of t.keys())this.hasOwnProperty(i)&&(e.set(i,this[i]),delete this[i]);e.size>0&&(this._$Ep=e)}createRenderRoot(){const i=this.shadowRoot??this.attachShadow(this.constructor.shadowRootOptions);return((i,s)=>{if(t)i.adoptedStyleSheets=s.map(e=>e instanceof CSSStyleSheet?e:e.styleSheet);else for(const t of s){const s=document.createElement("style"),n=e.litNonce;void 0!==n&&s.setAttribute("nonce",n),s.textContent=t.cssText,i.appendChild(s)}})(i,this.constructor.elementStyles),i}connectedCallback(){this.renderRoot??=this.createRenderRoot(),this.enableUpdating(!0),this._$EO?.forEach(e=>e.hostConnected?.())}enableUpdating(e){}disconnectedCallback(){this._$EO?.forEach(e=>e.hostDisconnected?.())}attributeChangedCallback(e,t,i){this._$AK(e,i)}_$ET(e,t){const i=this.constructor.elementProperties.get(e),s=this.constructor._$Eu(e,i);if(void 0!==s&&!0===i.reflect){const n=(void 0!==i.converter?.toAttribute?i.converter:v).toAttribute(t,i.type);this._$Em=e,null==n?this.removeAttribute(s):this.setAttribute(s,n),this._$Em=null}}_$AK(e,t){const i=this.constructor,s=i._$Eh.get(e);if(void 0!==s&&this._$Em!==s){const e=i.getPropertyOptions(s),n="function"==typeof e.converter?{fromAttribute:e.converter}:void 0!==e.converter?.fromAttribute?e.converter:v;this._$Em=s;const o=n.fromAttribute(t,e.type);this[s]=o??this._$Ej?.get(s)??o,this._$Em=null}}requestUpdate(e,t,i,s=!1,n){if(void 0!==e){const o=this.constructor;if(!1===s&&(n=this[e]),i??=o.getPropertyOptions(e),!((i.hasChanged??b)(n,t)||i.useDefault&&i.reflect&&n===this._$Ej?.get(e)&&!this.hasAttribute(o._$Eu(e,i))))return;this.C(e,t,i)}!1===this.isUpdatePending&&(this._$ES=this._$EP())}C(e,t,{useDefault:i,reflect:s,wrapped:n},o){i&&!(this._$Ej??=new Map).has(e)&&(this._$Ej.set(e,o??t??this[e]),!0!==n||void 0!==o)||(this._$AL.has(e)||(this.hasUpdated||i||(t=void 0),this._$AL.set(e,t)),!0===s&&this._$Em!==e&&(this._$Eq??=new Set).add(e))}async _$EP(){this.isUpdatePending=!0;try{await this._$ES}catch(e){Promise.reject(e)}const e=this.scheduleUpdate();return null!=e&&await e,!this.isUpdatePending}scheduleUpdate(){return this.performUpdate()}performUpdate(){if(!this.isUpdatePending)return;if(!this.hasUpdated){if(this.renderRoot??=this.createRenderRoot(),this._$Ep){for(const[e,t]of this._$Ep)this[e]=t;this._$Ep=void 0}const e=this.constructor.elementProperties;if(e.size>0)for(const[t,i]of e){const{wrapped:e}=i,s=this[t];!0!==e||this._$AL.has(t)||void 0===s||this.C(t,void 0,i,s)}}let e=!1;const t=this._$AL;try{e=this.shouldUpdate(t),e?(this.willUpdate(t),this._$EO?.forEach(e=>e.hostUpdate?.()),this.update(t)):this._$EM()}catch(t){throw e=!1,this._$EM(),t}e&&this._$AE(t)}willUpdate(e){}_$AE(e){this._$EO?.forEach(e=>e.hostUpdated?.()),this.hasUpdated||(this.hasUpdated=!0,this.firstUpdated(e)),this.updated(e)}_$EM(){this._$AL=new Map,this.isUpdatePending=!1}get updateComplete(){return this.getUpdateComplete()}getUpdateComplete(){return this._$ES}shouldUpdate(e){return!0}update(e){this._$Eq&&=this._$Eq.forEach(e=>this._$ET(e,this[e])),this._$EM()}updated(e){}firstUpdated(e){}};w.elementStyles=[],w.shadowRootOptions={mode:"open"},w[f("elementProperties")]=new Map,w[f("finalized")]=new Map,g?.({ReactiveElement:w}),(u.reactiveElementVersions??=[]).push("2.1.2");const k=globalThis,x=e=>e,$=k.trustedTypes,S=$?$.createPolicy("lit-html",{createHTML:e=>e}):void 0,M="$lit$",C=`lit$${Math.random().toFixed(9).slice(2)}$`,D="?"+C,P=`<${D}>`,T=document,I=()=>T.createComment(""),R=e=>null===e||"object"!=typeof e&&"function"!=typeof e,A=Array.isArray,z="[ \t\n\f\r]",F=/<(?:(!--|\/[^a-zA-Z])|(\/?[a-zA-Z][^>\s]*)|(\/?$))/g,N=/-->/g,E=/>/g,O=RegExp(`>|${z}(?:([^\\s"'>=/]+)(${z}*=${z}*(?:[^ \t\n\f\r"'\`<>=]|("|')|))|$)`,"g"),H=/'/g,L=/"/g,B=/^(?:script|style|textarea|title)$/i,j=e=>(t,...i)=>({_$litType$:e,strings:t,values:i}),q=j(1),W=j(2),U=Symbol.for("lit-noChange"),G=Symbol.for("lit-nothing"),V=new WeakMap,K=T.createTreeWalker(T,129);function Y(e,t){if(!A(e)||!e.hasOwnProperty("raw"))throw Error("invalid template strings array");return void 0!==S?S.createHTML(t):t}const J=(e,t)=>{const i=e.length-1,s=[];let n,o=2===t?"":3===t?"":"",a=F;for(let t=0;t"===l[0]?(a=n??F,c=-1):void 0===l[1]?c=-2:(c=a.lastIndex-l[2].length,r=l[1],a=void 0===l[3]?O:'"'===l[3]?L:H):a===L||a===H?a=O:a===N||a===E?a=F:(a=O,n=void 0);const d=a===O&&e[t+1].startsWith("/>")?" ":"";o+=a===F?i+P:c>=0?(s.push(r),i.slice(0,c)+M+i.slice(c)+C+d):i+C+(-2===c?t:d)}return[Y(e,o+(e[i]||"")+(2===t?"":3===t?"":"")),s]};class X{constructor({strings:e,_$litType$:t},i){let s;this.parts=[];let n=0,o=0;const a=e.length-1,r=this.parts,[l,c]=J(e,t);if(this.el=X.createElement(l,i),K.currentNode=this.el.content,2===t||3===t){const e=this.el.content.firstChild;e.replaceWith(...e.childNodes)}for(;null!==(s=K.nextNode())&&r.length0){s.textContent=$?$.emptyScript:"";for(let i=0;iA(e)||"function"==typeof e?.[Symbol.iterator])(e)?this.k(e):this._(e)}O(e){return this._$AA.parentNode.insertBefore(e,this._$AB)}T(e){this._$AH!==e&&(this._$AR(),this._$AH=this.O(e))}_(e){this._$AH!==G&&R(this._$AH)?this._$AA.nextSibling.data=e:this.T(T.createTextNode(e)),this._$AH=e}$(e){const{values:t,_$litType$:i}=e,s="number"==typeof i?this._$AC(e):(void 0===i.el&&(i.el=X.createElement(Y(i.h,i.h[0]),this.options)),i);if(this._$AH?._$AD===s)this._$AH.p(t);else{const e=new Q(s,this),i=e.u(this.options);e.p(t),this.T(i),this._$AH=e}}_$AC(e){let t=V.get(e.strings);return void 0===t&&V.set(e.strings,t=new X(e)),t}k(e){A(this._$AH)||(this._$AH=[],this._$AR());const t=this._$AH;let i,s=0;for(const n of e)s===t.length?t.push(i=new ee(this.O(I()),this.O(I()),this,this.options)):i=t[s],i._$AI(n),s++;s2||""!==i[0]||""!==i[1]?(this._$AH=Array(i.length-1).fill(new String),this.strings=i):this._$AH=G}_$AI(e,t=this,i,s){const n=this.strings;let o=!1;if(void 0===n)e=Z(this,e,t,0),o=!R(e)||e!==this._$AH&&e!==U,o&&(this._$AH=e);else{const s=e;let a,r;for(e=n[0],a=0;a{const s=i?.renderBefore??t;let n=s._$litPart$;if(void 0===n){const e=i?.renderBefore??null;s._$litPart$=n=new ee(t.insertBefore(I(),e),e,void 0,i??{})}return n._$AI(e),n},ce=globalThis;let he=class extends w{constructor(){super(...arguments),this.renderOptions={host:this},this._$Do=void 0}createRenderRoot(){const e=super.createRenderRoot();return this.renderOptions.renderBefore??=e.firstChild,e}update(e){const t=this.render();this.hasUpdated||(this.renderOptions.isConnected=this.isConnected),super.update(e),this._$Do=le(t,this.renderRoot,this.renderOptions)}connectedCallback(){super.connectedCallback(),this._$Do?.setConnected(!0)}disconnectedCallback(){super.disconnectedCallback(),this._$Do?.setConnected(!1)}render(){return U}};he._$litElement$=!0,he.finalized=!0,ce.litElementHydrateSupport?.({LitElement:he});const de=ce.litElementPolyfillSupport;de?.({LitElement:he}),(ce.litElementVersions??=[]).push("4.2.2");const pe=2,ue=e=>(...t)=>({_$litDirective$:e,values:t});let _e=class{constructor(e){}get _$AU(){return this._$AM._$AU}_$AT(e,t,i){this._$Ct=e,this._$AM=t,this._$Ci=i}_$AS(e,t){return this.update(e,t)}update(e,t){return this.render(...t)}};const me={},ge=ue(class extends _e{constructor(){super(...arguments),this.ot=me}render(e,t){return t()}update(e,[t,i]){if(Array.isArray(t)){if(Array.isArray(this.ot)&&this.ot.length===t.length&&t.every((e,t)=>e===this.ot[t]))return U}else if(this.ot===t)return U;return this.ot=Array.isArray(t)?Array.from(t):t,this.render(t,i)}}),{I:fe}=ae,ve=e=>e,be=()=>document.createComment(""),ye=(e,t,i)=>{const s=e._$AA.parentNode,n=void 0===t?e._$AB:t._$AA;if(void 0===i){const t=s.insertBefore(be(),n),o=s.insertBefore(be(),n);i=new fe(t,o,e,e.options)}else{const t=i._$AB.nextSibling,o=i._$AM,a=o!==e;if(a){let t;i._$AQ?.(e),i._$AM=e,void 0!==i._$AP&&(t=e._$AU)!==o._$AU&&i._$AP(t)}if(t!==n||a){let e=i._$AA;for(;e!==t;){const t=ve(e).nextSibling;ve(s).insertBefore(e,n),e=t}}}return i},we=(e,t,i=e)=>(e._$AI(t,i),e),ke={},xe=(e,t=ke)=>e._$AH=t,$e=e=>{e._$AR(),e._$AA.remove()},Se=(e,t,i)=>{const s=new Map;for(let n=t;n<=i;n++)s.set(e[n],n);return s},Me=ue(class extends _e{constructor(e){if(super(e),e.type!==pe)throw Error("repeat() can only be used in text expressions")}dt(e,t,i){let s;void 0===i?i=t:void 0!==t&&(s=t);const n=[],o=[];let a=0;for(const t of e)n[a]=s?s(t,a):a,o[a]=i(t,a),a++;return{values:o,keys:n}}render(e,t,i){return this.dt(e,t,i).values}update(e,[t,i,s]){const n=(e=>e._$AH)(e),{values:o,keys:a}=this.dt(t,i,s);if(!Array.isArray(n))return this.ut=a,o;const r=this.ut??=[],l=[];let c,h,d=0,p=n.length-1,u=0,_=o.length-1;for(;d<=p&&u<=_;)if(null===n[d])d++;else if(null===n[p])p--;else if(r[d]===a[u])l[u]=we(n[d],o[u]),d++,u++;else if(r[p]===a[_])l[_]=we(n[p],o[_]),p--,_--;else if(r[d]===a[_])l[_]=we(n[d],o[_]),ye(e,l[_+1],n[d]),d++,_--;else if(r[p]===a[u])l[u]=we(n[p],o[u]),ye(e,n[d],n[p]),p--,u++;else if(void 0===c&&(c=Se(a,u,_),h=Se(r,d,p)),c.has(r[d]))if(c.has(r[p])){const t=h.get(a[u]),i=void 0!==t?n[t]:null;if(null===i){const t=ye(e,n[d]);we(t,o[u]),l[u]=t}else l[u]=we(i,o[u]),ye(e,n[d],i),n[t]=null;u++}else $e(n[p]),p--;else $e(n[d]),d++;for(;u<=_;){const t=ye(e,l[_+1]);we(t,o[u]),l[u++]=t}for(;d<=p;){const e=n[d++];null!==e&&$e(e)}return this.ut=a,xe(e,l),U}}),Ce=new WeakMap;let De=0;class Pe extends he{constructor(){super(...arguments),this.title="",this.icon="",this.wide=!1,this.dismissOnScrim=!1,this.hass=null,this._opener=null,this._focusRoot=null,this._useHaDialog=!1,this._closing=!1,this._overlays=[],this._titleId="hp-dialog-title-"+ ++De,this._focusInitial=()=>{const e=this._focusableElements(),t=e.find(e=>e.hasAttribute("autofocus"))||e[0]||(this._useHaDialog?null:this.renderRoot.querySelector(".close"))||this.renderRoot.querySelector(".surface")||this.renderRoot.querySelector("ha-dialog");t?.focus({preventScroll:!0})},this._requestClose=()=>{this._closing||(this._closing=!0,this.dispatchEvent(new CustomEvent("hp-close",{bubbles:!0,composed:!0})))},this._onKeyDown=e=>{if("Escape"===e.key){e.preventDefault(),e.stopImmediatePropagation(),this._pruneOverlays();const t=this._overlays[this._overlays.length-1];return t?void this._closeOverlay(t,"escape"):void this._requestClose()}if("Tab"!==e.key||this._useHaDialog)return;const t=this.renderRoot.querySelector(".close"),i=t?[t,...this._focusableElements()]:this._focusableElements();if(!i.length)return e.preventDefault(),void this.renderRoot.querySelector(".surface")?.focus({preventScroll:!0});const s=this._deepActiveElement(),n=i[0],o=i[i.length-1];!e.shiftKey||s!==n&&i.includes(s)?e.shiftKey||s!==o||(e.preventDefault(),n.focus()):(e.preventDefault(),o.focus())},this._onFallbackCancel=e=>{e.preventDefault(),this._requestClose()},this._onFallbackClick=e=>{this.dismissOnScrim&&e.target===e.currentTarget&&this._requestClose()}}connectedCallback(){super.connectedCallback(),this._opener=this._deepActiveElement();const e=this.getRootNode();this._focusRoot=e;const t=Ce.get(e)||{dialogs:new Set,opener:this._opener};t.dialogs.add(this),Ce.set(e,t),this._useHaDialog=!!customElements.get("ha-dialog"),this.addEventListener("keydown",this._onKeyDown,!0)}disconnectedCallback(){this.removeEventListener("keydown",this._onKeyDown,!0);const e=[...this._overlays];this._overlays=[];for(const t of e.reverse())t.close("disconnect");const t=this._focusRoot,i=this._opener;this._opener=null,this._focusRoot=null;const s=t?Ce.get(t):void 0;s?.dialogs.delete(this),super.disconnectedCallback(),t&&s&&requestAnimationFrame(()=>{const e=Ce.get(t);if(!e)return;if(!e.dialogs.size)return e.opener?.isConnected&&e.opener.focus({preventScroll:!0}),void Ce.delete(t);const s=i?.closest("hp-dialog");i?.isConnected&&s&&e.dialogs.has(s)&&i.focus({preventScroll:!0})})}firstUpdated(e){if(super.firstUpdated(e),!this._useHaDialog){const e=this.renderRoot.querySelector("dialog");e&&!e.open&&e.showModal()}queueMicrotask(()=>this._focusInitial())}_deepActiveElement(){let e=document.activeElement;for(;e?.shadowRoot?.activeElement;)e=e.shadowRoot.activeElement;return e&&e!==document.body?e:null}_focusableElements(){const e=["[autofocus]","a[href]","button:not([disabled])",'input:not([disabled]):not([type="hidden"])',"select:not([disabled])","textarea:not([disabled])",'[contenteditable="true"]','[tabindex]:not([tabindex="-1"])'].join(","),t=[],i=new Set,s=n=>{if(!i.has(n)){if(i.add(n),n instanceof HTMLElement){if(n.matches(e)&&t.push(n),n instanceof HTMLSlotElement){for(const e of n.assignedNodes({flatten:!0}))s(e);return}if(n.shadowRoot){for(const e of n.shadowRoot.childNodes)s(e);return}}for(const e of n.childNodes)s(e)}};for(const e of this.childNodes)s(e);const n=this.overlayPortal();return n&&s(n),t.filter(e=>{let t=e;for(;t;){const e=getComputedStyle(t);if(t.hidden||t.inert||"true"===t.getAttribute("aria-hidden")||"none"===e.display||"hidden"===e.visibility)return!1;if(t=t.assignedSlot||t.parentElement||(t.getRootNode()instanceof ShadowRoot?t.getRootNode().host:null),t===this)break}return!0})}_pruneOverlays(){this._overlays=this._overlays.filter(e=>e.owner.isConnected)}_closeOverlay(e,t){const i=this._overlays.findIndex(t=>t.token===e.token);i>=0&&this._overlays.splice(i,1),e.close(t)}registerOverlay(e){this._pruneOverlays();const t=this._overlays.find(t=>t.owner===e.owner);t&&this._overlays.splice(this._overlays.indexOf(t),1);const i=e.group||"transient";for(const e of[...this._overlays].reverse())e.group===i&&this._closeOverlay(e,"exclusive");const s={...e,group:i,token:Symbol("hp-overlay")};this._overlays.push(s);let n=!1;return()=>{if(n)return;n=!0;const e=this._overlays.findIndex(e=>e.token===s.token);e>=0&&this._overlays.splice(e,1)}}closeTransientOverlays(e="outside"){this._pruneOverlays();const t=[...this._overlays].filter(e=>"transient"===(e.group||"transient"));for(const i of t.reverse())this._closeOverlay(i,e);return t.length>0}overlayPortal(){return this.renderRoot.querySelector(".overlay-portal")}render(){const e=q` +globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="168a919c5ec63faaf462b6891840c9e8b3276354ce18c84d7526f3fbb5e1f3a5";const e=globalThis,t=e.ShadowRoot&&(void 0===e.ShadyCSS||e.ShadyCSS.nativeShadow)&&"adoptedStyleSheets"in Document.prototype&&"replace"in CSSStyleSheet.prototype,i=Symbol(),s=new WeakMap;let n=class{constructor(e,t,s){if(this._$cssResult$=!0,s!==i)throw Error("CSSResult is not constructable. Use `unsafeCSS` or `css` instead.");this.cssText=e,this.t=t}get styleSheet(){let e=this.o;const i=this.t;if(t&&void 0===e){const t=void 0!==i&&1===i.length;t&&(e=s.get(i)),void 0===e&&((this.o=e=new CSSStyleSheet).replaceSync(this.cssText),t&&s.set(i,e))}return e}toString(){return this.cssText}};const o=(e,...t)=>{const s=1===e.length?e[0]:t.reduce((t,i,s)=>t+(e=>{if(!0===e._$cssResult$)return e.cssText;if("number"==typeof e)return e;throw Error("Value passed to 'css' function must be a 'css' function result: "+e+". Use 'unsafeCSS' to pass non-literal values, but take care to ensure page security.")})(i)+e[s+1],e[0]);return new n(s,e,i)},a=t?e=>e:e=>e instanceof CSSStyleSheet?(e=>{let t="";for(const i of e.cssRules)t+=i.cssText;return(e=>new n("string"==typeof e?e:e+"",void 0,i))(t)})(e):e,{is:r,defineProperty:l,getOwnPropertyDescriptor:c,getOwnPropertyNames:h,getOwnPropertySymbols:d,getPrototypeOf:p}=Object,u=globalThis,_=u.trustedTypes,m=_?_.emptyScript:"",g=u.reactiveElementPolyfillSupport,f=(e,t)=>e,v={toAttribute(e,t){switch(t){case Boolean:e=e?m:null;break;case Object:case Array:e=null==e?e:JSON.stringify(e)}return e},fromAttribute(e,t){let i=e;switch(t){case Boolean:i=null!==e;break;case Number:i=null===e?null:Number(e);break;case Object:case Array:try{i=JSON.parse(e)}catch(e){i=null}}return i}},b=(e,t)=>!r(e,t),y={attribute:!0,type:String,converter:v,reflect:!1,useDefault:!1,hasChanged:b};Symbol.metadata??=Symbol("metadata"),u.litPropertyMetadata??=new WeakMap;let w=class extends HTMLElement{static addInitializer(e){this._$Ei(),(this.l??=[]).push(e)}static get observedAttributes(){return this.finalize(),this._$Eh&&[...this._$Eh.keys()]}static createProperty(e,t=y){if(t.state&&(t.attribute=!1),this._$Ei(),this.prototype.hasOwnProperty(e)&&((t=Object.create(t)).wrapped=!0),this.elementProperties.set(e,t),!t.noAccessor){const i=Symbol(),s=this.getPropertyDescriptor(e,i,t);void 0!==s&&l(this.prototype,e,s)}}static getPropertyDescriptor(e,t,i){const{get:s,set:n}=c(this.prototype,e)??{get(){return this[t]},set(e){this[t]=e}};return{get:s,set(t){const o=s?.call(this);n?.call(this,t),this.requestUpdate(e,o,i)},configurable:!0,enumerable:!0}}static getPropertyOptions(e){return this.elementProperties.get(e)??y}static _$Ei(){if(this.hasOwnProperty(f("elementProperties")))return;const e=p(this);e.finalize(),void 0!==e.l&&(this.l=[...e.l]),this.elementProperties=new Map(e.elementProperties)}static finalize(){if(this.hasOwnProperty(f("finalized")))return;if(this.finalized=!0,this._$Ei(),this.hasOwnProperty(f("properties"))){const e=this.properties,t=[...h(e),...d(e)];for(const i of t)this.createProperty(i,e[i])}const e=this[Symbol.metadata];if(null!==e){const t=litPropertyMetadata.get(e);if(void 0!==t)for(const[e,i]of t)this.elementProperties.set(e,i)}this._$Eh=new Map;for(const[e,t]of this.elementProperties){const i=this._$Eu(e,t);void 0!==i&&this._$Eh.set(i,e)}this.elementStyles=this.finalizeStyles(this.styles)}static finalizeStyles(e){const t=[];if(Array.isArray(e)){const i=new Set(e.flat(1/0).reverse());for(const e of i)t.unshift(a(e))}else void 0!==e&&t.push(a(e));return t}static _$Eu(e,t){const i=t.attribute;return!1===i?void 0:"string"==typeof i?i:"string"==typeof e?e.toLowerCase():void 0}constructor(){super(),this._$Ep=void 0,this.isUpdatePending=!1,this.hasUpdated=!1,this._$Em=null,this._$Ev()}_$Ev(){this._$ES=new Promise(e=>this.enableUpdating=e),this._$AL=new Map,this._$E_(),this.requestUpdate(),this.constructor.l?.forEach(e=>e(this))}addController(e){(this._$EO??=new Set).add(e),void 0!==this.renderRoot&&this.isConnected&&e.hostConnected?.()}removeController(e){this._$EO?.delete(e)}_$E_(){const e=new Map,t=this.constructor.elementProperties;for(const i of t.keys())this.hasOwnProperty(i)&&(e.set(i,this[i]),delete this[i]);e.size>0&&(this._$Ep=e)}createRenderRoot(){const i=this.shadowRoot??this.attachShadow(this.constructor.shadowRootOptions);return((i,s)=>{if(t)i.adoptedStyleSheets=s.map(e=>e instanceof CSSStyleSheet?e:e.styleSheet);else for(const t of s){const s=document.createElement("style"),n=e.litNonce;void 0!==n&&s.setAttribute("nonce",n),s.textContent=t.cssText,i.appendChild(s)}})(i,this.constructor.elementStyles),i}connectedCallback(){this.renderRoot??=this.createRenderRoot(),this.enableUpdating(!0),this._$EO?.forEach(e=>e.hostConnected?.())}enableUpdating(e){}disconnectedCallback(){this._$EO?.forEach(e=>e.hostDisconnected?.())}attributeChangedCallback(e,t,i){this._$AK(e,i)}_$ET(e,t){const i=this.constructor.elementProperties.get(e),s=this.constructor._$Eu(e,i);if(void 0!==s&&!0===i.reflect){const n=(void 0!==i.converter?.toAttribute?i.converter:v).toAttribute(t,i.type);this._$Em=e,null==n?this.removeAttribute(s):this.setAttribute(s,n),this._$Em=null}}_$AK(e,t){const i=this.constructor,s=i._$Eh.get(e);if(void 0!==s&&this._$Em!==s){const e=i.getPropertyOptions(s),n="function"==typeof e.converter?{fromAttribute:e.converter}:void 0!==e.converter?.fromAttribute?e.converter:v;this._$Em=s;const o=n.fromAttribute(t,e.type);this[s]=o??this._$Ej?.get(s)??o,this._$Em=null}}requestUpdate(e,t,i,s=!1,n){if(void 0!==e){const o=this.constructor;if(!1===s&&(n=this[e]),i??=o.getPropertyOptions(e),!((i.hasChanged??b)(n,t)||i.useDefault&&i.reflect&&n===this._$Ej?.get(e)&&!this.hasAttribute(o._$Eu(e,i))))return;this.C(e,t,i)}!1===this.isUpdatePending&&(this._$ES=this._$EP())}C(e,t,{useDefault:i,reflect:s,wrapped:n},o){i&&!(this._$Ej??=new Map).has(e)&&(this._$Ej.set(e,o??t??this[e]),!0!==n||void 0!==o)||(this._$AL.has(e)||(this.hasUpdated||i||(t=void 0),this._$AL.set(e,t)),!0===s&&this._$Em!==e&&(this._$Eq??=new Set).add(e))}async _$EP(){this.isUpdatePending=!0;try{await this._$ES}catch(e){Promise.reject(e)}const e=this.scheduleUpdate();return null!=e&&await e,!this.isUpdatePending}scheduleUpdate(){return this.performUpdate()}performUpdate(){if(!this.isUpdatePending)return;if(!this.hasUpdated){if(this.renderRoot??=this.createRenderRoot(),this._$Ep){for(const[e,t]of this._$Ep)this[e]=t;this._$Ep=void 0}const e=this.constructor.elementProperties;if(e.size>0)for(const[t,i]of e){const{wrapped:e}=i,s=this[t];!0!==e||this._$AL.has(t)||void 0===s||this.C(t,void 0,i,s)}}let e=!1;const t=this._$AL;try{e=this.shouldUpdate(t),e?(this.willUpdate(t),this._$EO?.forEach(e=>e.hostUpdate?.()),this.update(t)):this._$EM()}catch(t){throw e=!1,this._$EM(),t}e&&this._$AE(t)}willUpdate(e){}_$AE(e){this._$EO?.forEach(e=>e.hostUpdated?.()),this.hasUpdated||(this.hasUpdated=!0,this.firstUpdated(e)),this.updated(e)}_$EM(){this._$AL=new Map,this.isUpdatePending=!1}get updateComplete(){return this.getUpdateComplete()}getUpdateComplete(){return this._$ES}shouldUpdate(e){return!0}update(e){this._$Eq&&=this._$Eq.forEach(e=>this._$ET(e,this[e])),this._$EM()}updated(e){}firstUpdated(e){}};w.elementStyles=[],w.shadowRootOptions={mode:"open"},w[f("elementProperties")]=new Map,w[f("finalized")]=new Map,g?.({ReactiveElement:w}),(u.reactiveElementVersions??=[]).push("2.1.2");const k=globalThis,x=e=>e,$=k.trustedTypes,S=$?$.createPolicy("lit-html",{createHTML:e=>e}):void 0,M="$lit$",C=`lit$${Math.random().toFixed(9).slice(2)}$`,D="?"+C,P=`<${D}>`,T=document,I=()=>T.createComment(""),R=e=>null===e||"object"!=typeof e&&"function"!=typeof e,A=Array.isArray,z="[ \t\n\f\r]",F=/<(?:(!--|\/[^a-zA-Z])|(\/?[a-zA-Z][^>\s]*)|(\/?$))/g,N=/-->/g,E=/>/g,O=RegExp(`>|${z}(?:([^\\s"'>=/]+)(${z}*=${z}*(?:[^ \t\n\f\r"'\`<>=]|("|')|))|$)`,"g"),H=/'/g,L=/"/g,B=/^(?:script|style|textarea|title)$/i,j=e=>(t,...i)=>({_$litType$:e,strings:t,values:i}),q=j(1),W=j(2),U=Symbol.for("lit-noChange"),G=Symbol.for("lit-nothing"),V=new WeakMap,K=T.createTreeWalker(T,129);function Y(e,t){if(!A(e)||!e.hasOwnProperty("raw"))throw Error("invalid template strings array");return void 0!==S?S.createHTML(t):t}const J=(e,t)=>{const i=e.length-1,s=[];let n,o=2===t?"":3===t?"":"",a=F;for(let t=0;t"===l[0]?(a=n??F,c=-1):void 0===l[1]?c=-2:(c=a.lastIndex-l[2].length,r=l[1],a=void 0===l[3]?O:'"'===l[3]?L:H):a===L||a===H?a=O:a===N||a===E?a=F:(a=O,n=void 0);const d=a===O&&e[t+1].startsWith("/>")?" ":"";o+=a===F?i+P:c>=0?(s.push(r),i.slice(0,c)+M+i.slice(c)+C+d):i+C+(-2===c?t:d)}return[Y(e,o+(e[i]||"")+(2===t?"":3===t?"":"")),s]};class X{constructor({strings:e,_$litType$:t},i){let s;this.parts=[];let n=0,o=0;const a=e.length-1,r=this.parts,[l,c]=J(e,t);if(this.el=X.createElement(l,i),K.currentNode=this.el.content,2===t||3===t){const e=this.el.content.firstChild;e.replaceWith(...e.childNodes)}for(;null!==(s=K.nextNode())&&r.length0){s.textContent=$?$.emptyScript:"";for(let i=0;iA(e)||"function"==typeof e?.[Symbol.iterator])(e)?this.k(e):this._(e)}O(e){return this._$AA.parentNode.insertBefore(e,this._$AB)}T(e){this._$AH!==e&&(this._$AR(),this._$AH=this.O(e))}_(e){this._$AH!==G&&R(this._$AH)?this._$AA.nextSibling.data=e:this.T(T.createTextNode(e)),this._$AH=e}$(e){const{values:t,_$litType$:i}=e,s="number"==typeof i?this._$AC(e):(void 0===i.el&&(i.el=X.createElement(Y(i.h,i.h[0]),this.options)),i);if(this._$AH?._$AD===s)this._$AH.p(t);else{const e=new Q(s,this),i=e.u(this.options);e.p(t),this.T(i),this._$AH=e}}_$AC(e){let t=V.get(e.strings);return void 0===t&&V.set(e.strings,t=new X(e)),t}k(e){A(this._$AH)||(this._$AH=[],this._$AR());const t=this._$AH;let i,s=0;for(const n of e)s===t.length?t.push(i=new ee(this.O(I()),this.O(I()),this,this.options)):i=t[s],i._$AI(n),s++;s2||""!==i[0]||""!==i[1]?(this._$AH=Array(i.length-1).fill(new String),this.strings=i):this._$AH=G}_$AI(e,t=this,i,s){const n=this.strings;let o=!1;if(void 0===n)e=Z(this,e,t,0),o=!R(e)||e!==this._$AH&&e!==U,o&&(this._$AH=e);else{const s=e;let a,r;for(e=n[0],a=0;a{const s=i?.renderBefore??t;let n=s._$litPart$;if(void 0===n){const e=i?.renderBefore??null;s._$litPart$=n=new ee(t.insertBefore(I(),e),e,void 0,i??{})}return n._$AI(e),n},ce=globalThis;let he=class extends w{constructor(){super(...arguments),this.renderOptions={host:this},this._$Do=void 0}createRenderRoot(){const e=super.createRenderRoot();return this.renderOptions.renderBefore??=e.firstChild,e}update(e){const t=this.render();this.hasUpdated||(this.renderOptions.isConnected=this.isConnected),super.update(e),this._$Do=le(t,this.renderRoot,this.renderOptions)}connectedCallback(){super.connectedCallback(),this._$Do?.setConnected(!0)}disconnectedCallback(){super.disconnectedCallback(),this._$Do?.setConnected(!1)}render(){return U}};he._$litElement$=!0,he.finalized=!0,ce.litElementHydrateSupport?.({LitElement:he});const de=ce.litElementPolyfillSupport;de?.({LitElement:he}),(ce.litElementVersions??=[]).push("4.2.2");const pe=2,ue=e=>(...t)=>({_$litDirective$:e,values:t});let _e=class{constructor(e){}get _$AU(){return this._$AM._$AU}_$AT(e,t,i){this._$Ct=e,this._$AM=t,this._$Ci=i}_$AS(e,t){return this.update(e,t)}update(e,t){return this.render(...t)}};const me={},ge=ue(class extends _e{constructor(){super(...arguments),this.ot=me}render(e,t){return t()}update(e,[t,i]){if(Array.isArray(t)){if(Array.isArray(this.ot)&&this.ot.length===t.length&&t.every((e,t)=>e===this.ot[t]))return U}else if(this.ot===t)return U;return this.ot=Array.isArray(t)?Array.from(t):t,this.render(t,i)}}),{I:fe}=ae,ve=e=>e,be=()=>document.createComment(""),ye=(e,t,i)=>{const s=e._$AA.parentNode,n=void 0===t?e._$AB:t._$AA;if(void 0===i){const t=s.insertBefore(be(),n),o=s.insertBefore(be(),n);i=new fe(t,o,e,e.options)}else{const t=i._$AB.nextSibling,o=i._$AM,a=o!==e;if(a){let t;i._$AQ?.(e),i._$AM=e,void 0!==i._$AP&&(t=e._$AU)!==o._$AU&&i._$AP(t)}if(t!==n||a){let e=i._$AA;for(;e!==t;){const t=ve(e).nextSibling;ve(s).insertBefore(e,n),e=t}}}return i},we=(e,t,i=e)=>(e._$AI(t,i),e),ke={},xe=(e,t=ke)=>e._$AH=t,$e=e=>{e._$AR(),e._$AA.remove()},Se=(e,t,i)=>{const s=new Map;for(let n=t;n<=i;n++)s.set(e[n],n);return s},Me=ue(class extends _e{constructor(e){if(super(e),e.type!==pe)throw Error("repeat() can only be used in text expressions")}dt(e,t,i){let s;void 0===i?i=t:void 0!==t&&(s=t);const n=[],o=[];let a=0;for(const t of e)n[a]=s?s(t,a):a,o[a]=i(t,a),a++;return{values:o,keys:n}}render(e,t,i){return this.dt(e,t,i).values}update(e,[t,i,s]){const n=(e=>e._$AH)(e),{values:o,keys:a}=this.dt(t,i,s);if(!Array.isArray(n))return this.ut=a,o;const r=this.ut??=[],l=[];let c,h,d=0,p=n.length-1,u=0,_=o.length-1;for(;d<=p&&u<=_;)if(null===n[d])d++;else if(null===n[p])p--;else if(r[d]===a[u])l[u]=we(n[d],o[u]),d++,u++;else if(r[p]===a[_])l[_]=we(n[p],o[_]),p--,_--;else if(r[d]===a[_])l[_]=we(n[d],o[_]),ye(e,l[_+1],n[d]),d++,_--;else if(r[p]===a[u])l[u]=we(n[p],o[u]),ye(e,n[d],n[p]),p--,u++;else if(void 0===c&&(c=Se(a,u,_),h=Se(r,d,p)),c.has(r[d]))if(c.has(r[p])){const t=h.get(a[u]),i=void 0!==t?n[t]:null;if(null===i){const t=ye(e,n[d]);we(t,o[u]),l[u]=t}else l[u]=we(i,o[u]),ye(e,n[d],i),n[t]=null;u++}else $e(n[p]),p--;else $e(n[d]),d++;for(;u<=_;){const t=ye(e,l[_+1]);we(t,o[u]),l[u++]=t}for(;d<=p;){const e=n[d++];null!==e&&$e(e)}return this.ut=a,xe(e,l),U}}),Ce=new WeakMap;let De=0;class Pe extends he{constructor(){super(...arguments),this.title="",this.icon="",this.wide=!1,this.dismissOnScrim=!1,this.hass=null,this._opener=null,this._focusRoot=null,this._useHaDialog=!1,this._closing=!1,this._overlays=[],this._titleId="hp-dialog-title-"+ ++De,this._focusInitial=()=>{const e=this._focusableElements(),t=e.find(e=>e.hasAttribute("autofocus"))||e[0]||(this._useHaDialog?null:this.renderRoot.querySelector(".close"))||this.renderRoot.querySelector(".surface")||this.renderRoot.querySelector("ha-dialog");t?.focus({preventScroll:!0})},this._requestClose=()=>{this._closing||(this._closing=!0,this.dispatchEvent(new CustomEvent("hp-close",{bubbles:!0,composed:!0})))},this._onKeyDown=e=>{if("Escape"===e.key){e.preventDefault(),e.stopImmediatePropagation(),this._pruneOverlays();const t=this._overlays[this._overlays.length-1];return t?void this._closeOverlay(t,"escape"):void this._requestClose()}if("Tab"!==e.key||this._useHaDialog)return;const t=this.renderRoot.querySelector(".close"),i=t?[t,...this._focusableElements()]:this._focusableElements();if(!i.length)return e.preventDefault(),void this.renderRoot.querySelector(".surface")?.focus({preventScroll:!0});const s=this._deepActiveElement(),n=i[0],o=i[i.length-1];!e.shiftKey||s!==n&&i.includes(s)?e.shiftKey||s!==o||(e.preventDefault(),n.focus()):(e.preventDefault(),o.focus())},this._onFallbackCancel=e=>{e.preventDefault(),this._requestClose()},this._onFallbackClick=e=>{this.dismissOnScrim&&e.target===e.currentTarget&&this._requestClose()}}connectedCallback(){super.connectedCallback(),this._opener=this._deepActiveElement();const e=this.getRootNode();this._focusRoot=e;const t=Ce.get(e)||{dialogs:new Set,opener:this._opener};t.dialogs.add(this),Ce.set(e,t),this._useHaDialog=!!customElements.get("ha-dialog"),this.addEventListener("keydown",this._onKeyDown,!0)}disconnectedCallback(){this.removeEventListener("keydown",this._onKeyDown,!0);const e=[...this._overlays];this._overlays=[];for(const t of e.reverse())t.close("disconnect");const t=this._focusRoot,i=this._opener;this._opener=null,this._focusRoot=null;const s=t?Ce.get(t):void 0;s?.dialogs.delete(this),super.disconnectedCallback(),t&&s&&requestAnimationFrame(()=>{const e=Ce.get(t);if(!e)return;if(!e.dialogs.size)return e.opener?.isConnected&&e.opener.focus({preventScroll:!0}),void Ce.delete(t);const s=i?.closest("hp-dialog");i?.isConnected&&s&&e.dialogs.has(s)&&i.focus({preventScroll:!0})})}firstUpdated(e){if(super.firstUpdated(e),!this._useHaDialog){const e=this.renderRoot.querySelector("dialog");e&&!e.open&&e.showModal()}queueMicrotask(()=>this._focusInitial())}_deepActiveElement(){let e=document.activeElement;for(;e?.shadowRoot?.activeElement;)e=e.shadowRoot.activeElement;return e&&e!==document.body?e:null}_focusableElements(){const e=["[autofocus]","a[href]","button:not([disabled])",'input:not([disabled]):not([type="hidden"])',"select:not([disabled])","textarea:not([disabled])",'[contenteditable="true"]','[tabindex]:not([tabindex="-1"])'].join(","),t=[],i=new Set,s=n=>{if(!i.has(n)){if(i.add(n),n instanceof HTMLElement){if(n.matches(e)&&t.push(n),n instanceof HTMLSlotElement){for(const e of n.assignedNodes({flatten:!0}))s(e);return}if(n.shadowRoot){for(const e of n.shadowRoot.childNodes)s(e);return}}for(const e of n.childNodes)s(e)}};for(const e of this.childNodes)s(e);const n=this.overlayPortal();return n&&s(n),t.filter(e=>{let t=e;for(;t;){const e=getComputedStyle(t);if(t.hidden||t.inert||"true"===t.getAttribute("aria-hidden")||"none"===e.display||"hidden"===e.visibility)return!1;if(t=t.assignedSlot||t.parentElement||(t.getRootNode()instanceof ShadowRoot?t.getRootNode().host:null),t===this)break}return!0})}_pruneOverlays(){this._overlays=this._overlays.filter(e=>e.owner.isConnected)}_closeOverlay(e,t){const i=this._overlays.findIndex(t=>t.token===e.token);i>=0&&this._overlays.splice(i,1),e.close(t)}registerOverlay(e){this._pruneOverlays();const t=this._overlays.find(t=>t.owner===e.owner);t&&this._overlays.splice(this._overlays.indexOf(t),1);const i=e.group||"transient";for(const e of[...this._overlays].reverse())e.group===i&&this._closeOverlay(e,"exclusive");const s={...e,group:i,token:Symbol("hp-overlay")};this._overlays.push(s);let n=!1;return()=>{if(n)return;n=!0;const e=this._overlays.findIndex(e=>e.token===s.token);e>=0&&this._overlays.splice(e,1)}}closeTransientOverlays(e="outside"){this._pruneOverlays();const t=[...this._overlays].filter(e=>"transient"===(e.group||"transient"));for(const i of t.reverse())this._closeOverlay(i,e);return t.length>0}overlayPortal(){return this.renderRoot.querySelector(".overlay-portal")}render(){const e=q` ${this.icon?q``:G} ${this.title} `;return this._useHaDialog?q` `})} - `}const Br={color:"#607d8b",opacity:1,widthCm:3.6,fill:!1,fillColor:"#607d8b",fillOpacity:.25},jr=(e,t=1)=>{const i=Number(e);return Number.isFinite(i)?Math.min(1,Math.max(0,i)):t},qr=e=>{let t=Number(e);return Number.isFinite(t)?(t=(t%360+360)%360,t>180?t-360:t):0};function Wr(e,t,i){return qr(t)?[e.x,e.y]:i([e.x,e.y])}const Ur=(e,t,i)=>{const s=Number(e),n=Number.isFinite(t)&&t>0?t:5;return Number.isFinite(s)&&s>0?s/n*i:0},Gr=(e,t,i)=>{const s=Number(e),n=Number.isFinite(t)&&t>0?t:5;return Number.isFinite(s)&&i>0?s/i*n:0},Vr=(e,t,i,s=Br.widthCm)=>{const n=Number(e?.width_cm);if(Number.isFinite(n)&&n>0)return n;const o=Number(e?.width);return Number.isFinite(o)&&o>0?Gr(o,t,i):s};function Kr(e,t){return{color:e.color,opacity:jr(e.opacity),width_cm:Math.max(.1,Math.min(100,Number(e.widthCm)||.1)),...t?{fill:e.fill,fill_color:e.fillColor,fill_opacity:jr(e.fillOpacity,.25)}:{}}}function Yr(e){const t=e.x+e.w/2,i=e.y+e.h/2,s=qr(e.angle)*Math.PI/180,n=Math.cos(s),o=Math.sin(s),a=(e,s)=>{const a=e-t,r=s-i;return[t+a*n-r*o,i+a*o+r*n]};return[a(e.x,e.y),a(e.x+e.w,e.y),a(e.x+e.w,e.y+e.h),a(e.x,e.y+e.h)]}function Jr(e){const t=Yr(e),i=(e,t)=>[(e[0]+t[0])/2,(e[1]+t[1])/2],s=[(t[0][0]+t[2][0])/2,(t[0][1]+t[2][1])/2];return{points:[...t,i(t[0],t[1]),i(t[1],t[2]),i(t[2],t[3]),i(t[3],t[0]),s],segments:t.map((e,i)=>({a:e,b:t[(i+1)%4]}))}}function Xr(e,t,i,s,n,o,a,r){const l=qr(e.angle)*Math.PI/180,c=Math.cos(l),h=Math.sin(l),d=-Math.sin(l),p=Math.cos(l),u=e.x+e.w/2,_=e.y+e.h/2,m=t>0?-e.w/2:e.w/2,g=i>0?-e.h/2:e.h/2,f=u+m*c+g*d,v=_+m*h+g*p,b=s-f,y=n-v;let w=(b*c+y*h)*(t>0?1:-1),k=(b*d+y*p)*(i>0?1:-1),x=null;if(o){const t=w/Math.max(e.w,r),i=k/Math.max(e.h,r);x=Math.max(r/Math.max(e.w,r),r/Math.max(e.h,r),t,i),w=e.w*x,k=e.h*x}if(a>0)if(o){const t=Math.max(1,Math.round(e.w/a)),i=Math.max(1,Math.round(e.h/a));if(Math.abs(e.w-t*a)<1e-6&&Math.abs(e.h-i*a)<1e-6){const s=(e,t)=>{let i=Math.abs(e),s=Math.abs(t);for(;s;)[i,s]=[s,i%s];return Math.max(1,i)},n=1/s(t,i),o=Math.max(r/e.w,r/e.h),a=Math.max(o,Math.round((x??1)/n)*n);w=e.w*a,k=e.h*a}else{e.w>=e.h?(w=Math.round(w/a)*a,k=w*(e.h/Math.max(e.w,r))):(k=Math.round(k/a)*a,w=k*(e.w/Math.max(e.h,r)))}}else w=Math.round(w/a)*a,k=Math.round(k/a)*a;w=Math.max(r,w),k=Math.max(r,k);return{x:f+(t>0?w/2:-w/2)*c+(i>0?k/2:-k/2)*d-w/2,y:v+(t>0?w/2:-w/2)*h+(i>0?k/2:-k/2)*p-k/2,w:w,h:k,angle:qr(e.angle)||void 0}}const Zr=(e,t,i)=>{const s=i[0]-t[0],n=i[1]-t[1],o=s*s+n*n;if(o<1e-12)return[...t];const a=Math.max(0,Math.min(1,((e[0]-t[0])*s+(e[1]-t[1])*n)/o));return[t[0]+s*a,t[1]+n*a]};const Qr=10**9,el=240,tl=1e-4;function il(e){if(Array.isArray(e))return e.map(e=>il(e));if(null!==e&&"object"==typeof e){const t={};for(const[i,s]of Object.entries(e))t[i]=il(s);return t}return e}function sl(e){if("number"!=typeof e||!Number.isFinite(e))return e;const t=(e<0||Object.is(e,-0)?-1:1)*(Math.floor(Math.abs(e)*Qr+.5)/Qr);return 0===t?0:t}function nl(e){if("number"!=typeof e||!Number.isFinite(e))return e;const t=e*el,i=Math.round(t);if(Math.abs(t-i)null!==al(e)):[]}function ll(e,t){for(const i of t)Object.prototype.hasOwnProperty.call(e,i)&&(e[i]=sl(e[i]))}function cl(e,t){for(const i of t)Object.prototype.hasOwnProperty.call(e,i)&&(e[i]=nl(e[i]))}function hl(e){if(Array.isArray(e))for(let t=0;t{for(const n of s){const s=t[n];"number"==typeof s&&Number.isFinite(s)&&i(s,e)}},s=t=>{if(Array.isArray(t))for(let s=0;s{if(Array.isArray(e))for(const t of e)s(t)};for(const i of rl(e.rooms))t(i,["x","y","w","h"]),n(i.poly);for(const t of rl(e.walls))s(t.a),s(t.b);for(const t of rl(e.wall_segments))s(t.a),s(t.b);for(const i of rl(e.openings))t(i,["x","y"]);for(const i of rl(e.decor))"line"===i.kind?t(i,["x1","y1","x2","y2"]):"rect"===i.kind||"ellipse"===i.kind||"furniture"===i.kind?t(i,["x","y","w","h"]):"text"===i.kind&&t(i,["x","y"]);for(const t of rl(e.room_drafts))n(t.points);for(const t of rl(e.partitions))s(t.a),s(t.b);for(const t of rl(e.wall_columns))s(t.center);for(const t of rl(e.open_spans))s(t.a),s(t.b)}const n=al(t);if(!n)return;const o=new Map;if(s)for(const e of rl(s.spaces))null!=e.id&&o.set(String(e.id),e);for(const e of Object.values(n)){const t=al(e);if(!t)continue;const s=null!=t.s&&o.get(String(t.s))||null;for(const e of["x","y"]){const n=t[e];"number"==typeof n&&Number.isFinite(n)&&i(n,s)}}}function ul(e){const t=Number(e?.cell_cm);return t>0?t:5}function _l(e,t={}){const i={canonicalized:0,far:0,maxShift:0,maxShiftCm:0,spaces:[],bySpace:new Map},s=rl(al(e)?.spaces);let n=5;for(const e of s)n=Math.max(n,ul(e));pl(e,t,(e,t)=>{const s=e*el,o=Math.abs(s-Math.round(s)),a=nl(e),r=o>0&&o=tl))return;const l=r&&"number"==typeof a?Math.abs(a-e):0;if(r?i.canonicalized++:i.far++,i.maxShift=Math.max(i.maxShift,l),i.maxShiftCm=Math.max(i.maxShiftCm,l*el*(t?ul(t):n)),!t?.id||!r)return;const c=String(t.id);let h=i.bySpace.get(c);h||(h={spaceId:c,space:String(t.title||c),canonicalized:0,far:0,maxShift:0,maxShiftCm:0},i.bySpace.set(c,h)),h.canonicalized++,h.maxShift=Math.max(h.maxShift,l),h.maxShiftCm=Math.max(h.maxShiftCm,l*el*ul(t))}),i.bySpace.size&&pl(e,t,(e,t)=>{if(!t?.id)return;const s=i.bySpace.get(String(t.id));if(!s)return;const n=e*el;Math.abs(n-Math.round(n))>=tl&&s.far++}),i.spaces=[...i.bySpace.values()];const{bySpace:o,...a}=i;return a}function ml(e){return function(e){const t=e,i=al(t);i&&cl(i,["x","y"]);return t}(il(e))}function gl(e){const t=e,i=al(t);if(!i)return t;for(const e of Object.values(i)){const t=al(e);t&&cl(t,["x","y"])}return t}function fl(e){const t=e,i=al(t);if(!i)return t;for(const e of rl(i.spaces)){ll(e,["plan_x","plan_y","plan_scale","plan_scale_x","plan_scale_y","plan_angle"]);for(const t of rl(e.rooms))cl(t,["x","y","w","h"]),dl(t.poly);for(const t of rl(e.walls))hl(t.a),hl(t.b);for(const t of rl(e.wall_segments))hl(t.a),hl(t.b);for(const t of rl(e.openings)){cl(t,["x","y"]),ll(t,["angle","length"]);const e=al(t.host);e&&ll(e,["t"])}for(const t of rl(e.decor))"line"===t.kind?cl(t,["x1","y1","x2","y2"]):"rect"===t.kind||"ellipse"===t.kind||"furniture"===t.kind?(cl(t,["x","y","w","h"]),ll(t,["angle"])):"text"===t.kind&&(cl(t,["x","y"]),ll(t,["scale","angle"]));for(const t of rl(e.room_drafts))dl(t.points);for(const t of rl(e.partitions))hl(t.a),hl(t.b);for(const t of rl(e.wall_columns))hl(t.center),"square"===t.shape&&ll(t,["angle"]);for(const t of rl(e.open_spans))hl(t.a),hl(t.b)}for(const e of rl(i.markers))ll(e,["angle"]);return t}const vl=15;function bl(e,t,i,s,n){const o=i[0]-e[0],a=i[1]-e[1],r=Math.hypot(o,a);if(!(r>0)||r<=n+1e-9)return null;const l=o/r,c=a/r,h=t=>{const s=(t[0]-e[0])*l+(t[1]-e[1])*c,o=(n-s)/(r-s);return!Number.isFinite(o)||o<-1e-9||o>1+1e-9?null:[t[0]+(i[0]-t[0])*o,t[1]+(i[1]-t[1])*o]},d=h(t),p=h(s);return d&&p?[[e[0],e[1]],t,d,p,s]:null}const yl=Math.sin(.25*Math.PI/180);function wl(e,t){return Number.isFinite(e)&&e>0&&Number.isFinite(t)&&t>0&&e*t<3}function kl(e){const t=Number(e)>0?Number(e):5;if(5===t)return 8;const i=5/t*8;return Math.min(80,Math.max(.5,i))}function xl(e,t){return Number.isFinite(e)&&e>0&&Number.isFinite(t)&&t>0&&e*t<2}function $l(e){return Number.isFinite(e)?Math.max(1,Math.min(100,e)):1}function Sl(e,t){return!Number.isFinite(e)||e<0?"":String(t?Math.round(e/2.54*100)/100:Math.round(100*e)/100)}function Ml(e,t,i){if(!Number.isFinite(e)||e<=0)return 0;const s=Number(t)>0?Number(t):5;return $l(e)/s*i}function Cl(e,t){return t>0&&Number.isFinite(e)?Math.round(e/t)*t:e}function Dl(e){return Math.max(1e-6*Math.abs(e),1e-9)}function Pl(e,t){if(!(t>0&&Number.isFinite(e)))return e;const i=Cl(e,t);return Math.abs(i-e)<=Dl(t)?i:e}function Tl(e,t){let i=t[0]-e[0],s=t[1]-e[1];const n=Math.hypot(i,s);return n<1e-12?[1,0]:(i/=n,s/=n,(i<-1e-12||Math.abs(i)<=1e-12&&s<0)&&(i=-i,s=-s),[i,s])}function Il(e,t,i){const s=[Pl(e[0],i),Pl(e[1],i)],n=[Pl(t[0],i),Pl(t[1],i)],o=Cl((s[0]+n[0])/2,i),a=Cl((s[1]+n[1])/2,i),[r,l]=Tl(s,n);let c=Math.atan2(l,r);c<0&&(c+=Math.PI);const h=Math.round(1800*c)/1800,d=i>0&&i<.01?6:i<1?4:2;return`${o.toFixed(d)},${a.toFixed(d)}@${h.toFixed(4)}`}function Rl(e,t,i,s){return 1===s?Il(e,t,i):Il([e[0]/s,e[1]/s],[t[0]/s,t[1]/s],i)}function Al(e,t){if(!Array.isArray(e.a)||!Array.isArray(e.b)||e.a.length<2||e.b.length<2)return null;const i=[Number(e.a[0]),Number(e.a[1]),Number(e.b[0]),Number(e.b[1])];if(!i.every(Number.isFinite))return null;const s=t>0?t:1;return[[i[0]*s,i[1]*s],[i[2]*s,i[3]*s]]}function zl(e,t,i,s,n){const o=n>0?n:1;return{key:Rl(e,t,s,o),cm:$l(i),a:[e[0]/o,e[1]/o],b:[t[0]/o,t[1]/o]}}function Fl(e,t){const i=t>0?t:1,s=[];for(const t of e){const e=t.key.lastIndexOf("@");if(e<0)continue;const[n,o]=t.key.slice(0,e).split(",").map(Number),a=Number(t.key.slice(e+1));[n,o,a].every(Number.isFinite)&&s.push({w:t,x:n*i,y:o*i,ang:a})}return s}function Nl(e,t){const[i,s]=Tl(e,t);let n=Math.atan2(s,i);return n<0&&(n+=Math.PI),n}function El(e,t){let i=Math.abs(e-t);return i>Math.PI/2&&(i=Math.PI-i),i<.02}function Ol(e,t,i,s,n=1){if(!e?.length)return null;const o=Rl(t,i,s,n),a=e.find(e=>e.key===o);if(a)return a;const r=n>0?n:1,l=Dl(s)*r,c=(e,t)=>Math.abs(e[0]-t[0])<=l&&Math.abs(e[1]-t[1])<=l;for(const s of e){const e=Al(s,r);if(e&&(c(e[0],t)&&c(e[1],i)||c(e[0],i)&&c(e[1],t)))return s}const h=(t[0]+i[0])/2,d=(t[1]+i[1])/2,p=Nl(t,i),u=Math.max(.5*s,1e-9)*r;for(const t of Fl(e,r))if(El(t.ang,p)&&Math.hypot(t.x-h,t.y-d)<=u)return t.w;return null}function Hl(e,t,i,s,n=1){const o=Ol(e,t,i,s,n);if(o&&o.cm>0)return $l(o.cm);const a=function(e,t,i,s,n){if(!e?.length)return null;const o=n>0?n:1,a=Math.hypot(i[0]-t[0],i[1]-t[1]);if(a<1e-12)return null;const r=Nl(t,i),l=Math.max(.5*s,1e-9)*o;let c=null;for(const s of e){if(!(s.cm>0))continue;const e=Al(s,o);if(!e)continue;const n=Math.hypot(e[1][0]-e[0][0],e[1][1]-e[0][1]);if(n<1e-12||!El(Nl(e[0],e[1]),r))continue;if(Sc(t[0],t[1],e[0][0],e[0][1],e[1][0],e[1][1])>l||Sc(i[0],i[1],e[0][0],e[0][1],e[1][0],e[1][1])>l)continue;if(n+l(o.has(e.key)||(e=>{const t=Al(e,s);if(!t)return!1;const[i,o]=t,r=o[0]-i[0],c=o[1]-i[1],h=Math.hypot(r,c);if(h<=l)return!1;if(!a.some(e=>{const t=[e[0],e[1]],s=[e[2],e[3]];return El(Nl(i,o),Nl(t,s))&&Sc(i[0],i[1],t[0],t[1],s[0],s[1])<=l&&Sc(o[0],o[1],t[0],t[1],s[0],s[1])<=l}))return!1;const d=(n||[]).some(e=>{const t=[e[0],e[1]],s=[e[2],e[3]];if(!El(Nl(i,o),Nl(t,s)))return!1;const n=e=>Math.abs((e[0]-i[0])*c-(e[1]-i[1])*r)/h;if(n(t)>l||n(s)>l)return!1;const a=h*h,d=((t[0]-i[0])*r+(t[1]-i[1])*c)/a,p=((s[0]-i[0])*r+(s[1]-i[1])*c)/a;return Math.min(1,Math.max(d,p))-Math.max(0,Math.min(d,p))>l/h});return!d})(e))&&e.cm>=1&&e.cm<=100)}function Bl(e,t,i,s=8){const[n,o]=Tl(e,t);let a=Math.atan2(o,n);a<0&&(a+=Math.PI);let r=i*Math.PI/180%Math.PI;r<0&&(r+=Math.PI);let l=Math.abs(a-r);return l>Math.PI/2&&(l=Math.PI-l),l<=s*Math.PI/180}function jl(e,t,i,s,n=1,o="affine",a){if(!e?.length)return[];if(t.length!==i.length)return"fixed-topology"===o&&a?.(),e.slice();const r=n>0?n:1,l=Math.max(.5*s,1e-9)*r,c=Math.max(s*r*1e-6,1e-9),h=[],d=new Map,p=new Map,u=(e,t,i)=>{const s=e.get(t)||new Set;s.add(i),e.set(t,s)};for(let e=0;e[e[0]+(t[0]-e[0])*i,e[1]+(t[1]-e[1])*i],m=(e,t)=>Math.hypot(e[0]-t[0],e[1]-t[1])<=c,g=(e,t)=>{if("fixed-topology"===o){const i=t.na[0]-t.oa[0],s=t.na[1]-t.oa[1],n=t.nb[0]-t.ob[0],o=t.nb[1]-t.ob[1];return Math.hypot(i-n,s-o)<=c?[e[0]+i,e[1]+s]:m(e,t.oa)?[...t.na]:m(e,t.ob)?[...t.nb]:[...e]}const i=Math.max(0,Math.min(1,((e[0]-t.oa[0])*t.dx+(e[1]-t.oa[1])*t.dy)/t.len2));return _(t.na,t.nb,i)},f=(e,t)=>{const[i,s]=Tl(e,t);return(t[0]-e[0])*i+(t[1]-e[1])*s>=0?[[...e],[...t]]:[[...t],[...e]]},v=[],b=[],y=(e,t,i)=>{if(Math.hypot(t[0]-e[0],t[1]-e[1])<=c)return;const[n,o]=f(e,t),a=$l(i);if(b.some(e=>e.entry.cm===a&&m(e.span[0],n)&&m(e.span[1],o)))return;const l=zl(n,o,a,s,r);v.push(l),b.push({entry:l,span:[n,o]})};for(const t of e){const e=Al(t,r);if(e){const[i,s]=f(e[0],e[1]),n=s[0]-i[0],a=s[1]-i[1],r=n*n+a*a,d=Math.sqrt(r);if(d<=c){v.push({...t,cm:$l(t.cm)});continue}const p=[];for(const e of h){if(!El(Nl(i,s),Nl(e.oa,e.ob)))continue;const t=e=>Math.abs((e[0]-i[0])*a-(e[1]-i[1])*n)/d;if(t(e.oa)>l||t(e.ob)>l)continue;const o=((e.oa[0]-i[0])*n+(e.oa[1]-i[1])*a)/r,h=((e.ob[0]-i[0])*n+(e.ob[1]-i[1])*a)/r,u=Math.max(0,Math.min(o,h)),_=Math.min(1,Math.max(o,h));(_-u)*d>c&&p.push({lo:u,hi:_,move:e})}if(!p.length){"fixed-topology"===o?v.push({...t}):y(i,s,t.cm);continue}const u=[0,1,...p.flatMap(({lo:e,hi:t})=>[e,t])].sort((e,t)=>e-t).filter((e,t,i)=>0===t||Math.abs(e-i[t-1])*d>c),b=[];for(let e=0;e+1r>=e.lo-1e-12&&r<=e.hi+1e-12);if(!l.length){b.push([o,a]);continue}const h=[g(o,l[0].move),g(a,l[0].move)],f=l.slice(1).some(e=>{const t=g(o,e.move),i=g(a,e.move);return!m(h[0],t)||!m(h[1],i)});b.push(f?[o,a]:h)}const w=(e,t)=>{const i=e[1][0]-e[0][0],s=e[1][1]-e[0][1],n=t[1][0]-t[0][0],o=t[1][1]-t[0][1],a=Math.hypot(i,s);return!(a<=c||i*n+s*o<=0)&&Math.abs(i*o-s*n)/a<=c},k=[];for(const e of b){const t=k[k.length-1];t&&m(t[1],e[0])&&w(t,e)?t[1]=e[1]:k.push([[...e[0]],[...e[1]]])}if("fixed-topology"===o&&1===k.length){const[i,s]=k[0];if(m(i,e[0])&&m(s,e[1])||m(i,e[1])&&m(s,e[0])){v.push({...t});continue}}for(const[e,i]of k)y(e,i,t.cm);continue}if("fixed-topology"===o){const e=p.get(t.key);if(1===e?.size){const i=[...e][0];v.push(i===t.key?{...t}:{...t,key:i});continue}const i=[Fl([t],r)[0]];1!==r&&i.push(Fl([t],1)[0]);const s=i.filter(Boolean).some(e=>h.some(t=>{if(!El(e.ang,Nl(t.oa,t.ob)))return!1;const i=((e.x-t.oa[0])*t.dx+(e.y-t.oa[1])*t.dy)/t.len2;return i>=-1e-6&&i<=1.000001&&Sc(e.x,e.y,t.oa[0],t.oa[1],t.ob[0],t.ob[1])<=l}));((e?.size||0)>1||s)&&a?.(),v.push({...t});continue}let i="";const n=d.get(t.key);if(1===n?.size&&(i=[...n][0]),!i){const e=Fl([t],r)[0];if(e){const t=new Set;for(const i of h){if(!El(e.ang,Nl(i.oa,i.ob)))continue;const n=((e.x-i.oa[0])*i.dx+(e.y-i.oa[1])*i.dy)/i.len2;if(n<-1e-6||n>1.000001)continue;if(Sc(e.x,e.y,i.oa[0],i.oa[1],i.ob[0],i.ob[1])>l)continue;const o=g([e.x,e.y],i),[a,c]=Tl(i.na,i.nb),h=Math.max(s*r,1e-6);t.add(Rl([o[0]-a*h,o[1]-c*h],[o[0]+a*h,o[1]+c*h],s,r))}1===t.size&&(i=[...t][0])}}v.push({...t,key:i||t.key,cm:$l(t.cm)})}return v}function ql(e,t,i,s,n=1,o="affine"){return jl(e,t,i,s,n,o)}function Wl(e,t,i,s=1,n=[]){const o=s>0?s:1,a=Math.abs(i),r=Math.max(a*o*tl,1e-9),l=(n||[]).flatMap(e=>{const t=Al(e,o);return t?t.map(e=>[...e]):[]}),c=e=>e.every((e,t)=>(e=>{if(!(a>0))return!0;const t=e/o/a;return Math.abs(t-Math.round(t))Math.abs(e-i[t])<=r)),h=[],d=e=>JSON.stringify([e.key,e.cm,e.a,e.b]);for(const i of e||[]){const e=Al(i,o);if(!e)continue;const[s,n]=e;if(![s[0],s[1],n[0],n[1]].every(Number.isFinite)||!c(s)||!c(n)){h.push(d(i));continue}const a=n[0]-s[0],l=n[1]-s[1],p=Math.hypot(a,l);if(p<=r){h.push(d(i));continue}const u=a/p,_=l/p,m=[];for(const e of t){const[t,i]=e;if(![t?.[0],t?.[1],i?.[0],i?.[1]].every(Number.isFinite))continue;const n=e=>Math.abs((e[0]-s[0])*_-(e[1]-s[1])*u);if(n(t)>r||n(i)>r)continue;const o=(t[0]-s[0])*u+(t[1]-s[1])*_,a=(i[0]-s[0])*u+(i[1]-s[1])*_,l=Math.max(0,Math.min(o,a)),c=Math.min(p,Math.max(o,a));c-l>r&&m.push([l,c])}m.sort((e,t)=>e[0]-t[0]||e[1]-t[1]);let g=0;for(const[e,t]of m){if(e>g+r)break;if(g=Math.max(g,t),g>=p-r)break}ge.key!==a);return null==s||s<1?r:[...r,zl(t,i,s,n,o)]}function Gl(e,t,i,s,n,o=[],a=1){let r=e?e.slice():[];for(const e of function(e,t,i,s,n=1,o=[]){const a=dc(e,t,i,s,n,o);if(!a)return[];const r=[];for(let e=0;e0||(c=Ul(c,t,i,s,n,a)))}return c}function Kl(e){const{a:t,b:i,halfDepth:s}=e;if(!Array.isArray(t)||!Array.isArray(i)||t.length<2||i.length<2||![t[0],t[1],i[0],i[1]].every(Number.isFinite))return null;const n=i[0]-t[0],o=i[1]-t[1],a=Math.hypot(n,o);if(!(a>1e-9&&s>0&&Number.isFinite(s)))return null;const r=-o/a*s,l=n/a*s;return[[t[0]+r,t[1]+l],[i[0]+r,i[1]+l],[i[0]-r,i[1]-l],[t[0]-r,t[1]-l]]}function Yl(e,t,i){return Math.hypot(e[0]-t[0],e[1]-t[1])<=i}function Jl(e,t,i){const s=t.b[0]-t.a[0],n=t.b[1]-t.a[1],o=s*s+n*n;if(!(o>i*i))return!1;const a=((e[0]-t.a[0])*s+(e[1]-t.a[1])*n)/o;if(!(a>0&&a<1))return!1;const r=[t.a[0]+s*a,t.a[1]+n*a];return Math.hypot(e[0]-r[0],e[1]-r[1])<=i}function Xl(e,t,i,s){const n=Math.hypot(t,i);if(!(n>1e-9&&s>0))return;const o=[t/n,i/n],a=e.find(e=>Math.abs(e.u[0]*o[1]-e.u[1]*o[0])<1e-9&&e.u[0]*o[0]+e.u[1]*o[1]>1-1e-9);a?a.halfDepth=Math.max(a.halfDepth,s):e.push({u:o,halfDepth:s})}function Zl(e,t){try{const i=oi(Dc(e),Dc(t));let s=null,n=0;for(const e of i||[]){const t=e?.[0]||[],i=Math.abs(nc(t));t.length>=4&&i>n&&(n=i,s=t.slice(0,-1).map(e=>[e[0],e[1]]))}return s}catch{return null}}function Ql(e,t=1e-6){const i=(e||[]).map((e,t)=>({segment:e,index:t})).filter(({segment:e})=>e&&Array.isArray(e.a)&&Array.isArray(e.b)&&e.a.length>=2&&e.b.length>=2&&e.a.every(Number.isFinite)&&e.b.every(Number.isFinite)&&Number.isFinite(e.halfDepth)&&e.halfDepth>0&&Math.hypot(e.b[0]-e.a[0],e.b[1]-e.a[1])>1e-9);if(i.length<2)return[];const s=Math.max(Number.isFinite(t)?t:0,1e-9),n=i.flatMap(({segment:e})=>[e.a,e.b]).map(e=>[e[0],e[1]]).sort((e,t)=>e[0]-t[0]||e[1]-t[1]),o=[];for(const e of n)o.some(t=>Yl(t,e,s))||o.push(e);const a=[];for(const e of o){const t=[];let n=!1;for(const{segment:o,index:a}of i){const i=Math.hypot(o.b[0]-o.a[0],o.b[1]-o.a[1]);Yl(e,o.a,s)?t.push({u:[(o.b[0]-o.a[0])/i,(o.b[1]-o.a[1])/i],halfDepth:o.halfDepth,length:i,index:a}):Yl(e,o.b,s)?t.push({u:[(o.a[0]-o.b[0])/i,(o.a[1]-o.b[1])/i],halfDepth:o.halfDepth,length:i,index:a}):Jl(e,o,s)&&(n=!0)}if(n||2!==t.length)continue;const[o,r]=t,l=o.u[0]*r.u[1]-o.u[1]*r.u[0];if(Math.abs(l)<1e-9)continue;const c=l<0?1:-1,h=[-o.u[1],o.u[0]],d=[-r.u[1],r.u[0]],p=[e[0]+h[0]*o.halfDepth*c,e[1]+h[1]*o.halfDepth*c],u=[e[0]-d[0]*r.halfDepth*c,e[1]-d[1]*r.halfDepth*c];if(!rc(p,o.u,u,r.u))continue;const _=[[o,r,u,[d[0]*-c,d[1]*-c]],[r,o,p,[h[0]*c,h[1]*c]]];for(const[t,,i,n]of _){const o=Math.min(2*t.halfDepth,t.length),r=[-t.u[1]*t.halfDepth,t.u[0]*t.halfDepth],l=[[e[0]+r[0],e[1]+r[1]],[e[0]+t.u[0]*o+r[0],e[1]+t.u[1]*o+r[1]],[e[0]+t.u[0]*o-r[0],e[1]+t.u[1]*o-r[1]],[e[0]-r[0],e[1]-r[1]]],c=e=>(e[0]-i[0])*n[0]+(e[1]-i[1])*n[1],h=[];for(let e=0;e=-1e-12&&h.push(t),s>1e-12&&n<-1e-12||s<-1e-12&&n>1e-12){const e=s/(s-n);h.push([t[0]+(i[0]-t[0])*e,t[1]+(i[1]-t[1])*e])}}h.length>=3&&Math.abs(nc(h))>s*s&&a.push({segmentIndex:t.index,wedge:h})}}return a}function ec(e,t=1e-6){const i=(e||[]).filter(e=>e&&Array.isArray(e.a)&&Array.isArray(e.b)&&e.a.length>=2&&e.b.length>=2&&e.a.every(Number.isFinite)&&e.b.every(Number.isFinite)&&Number.isFinite(e.halfDepth)&&e.halfDepth>0&&Math.hypot(e.b[0]-e.a[0],e.b[1]-e.a[1])>1e-9);if(i.length<2)return[];const s=Math.max(Number.isFinite(t)?t:0,1e-9),n=i.flatMap(e=>[e.a,e.b]).map(e=>[e[0],e[1]]).sort((e,t)=>e[0]-t[0]||e[1]-t[1]),o=[];for(const e of n)o.some(t=>Yl(t,e,s))||o.push(e);const a=[],r=i.map((e,t)=>({roomId:"",a:[e.a[0],e.a[1]],b:[e.b[0],e.b[1]],key:`join-${t}`,kind:"outer",cm:0,open:!1,half:e.halfDepth})),l=gc(r,s);for(const e of fc(l).fans)a.push(e);const c=e=>!!vc(l,e);for(const e of o){if(c(e))continue;const t=[];for(const n of i)Yl(e,n.a,s)?Xl(t,n.b[0]-n.a[0],n.b[1]-n.a[1],n.halfDepth):Yl(e,n.b,s)?Xl(t,n.a[0]-n.b[0],n.a[1]-n.b[1],n.halfDepth):Jl(e,n,s)&&(Xl(t,n.a[0]-e[0],n.a[1]-e[1],n.halfDepth),Xl(t,n.b[0]-e[0],n.b[1]-e[1],n.halfDepth));if(!(t.length<2)){t.sort((e,t)=>Math.atan2(e.u[1],e.u[0])-Math.atan2(t.u[1],t.u[0])||e.halfDepth-t.halfDepth);for(let i=0;is*s&&a.push(m)}}}return a}function tc(e,t,i,s){if(!(t>0)||!e||e.length<2)return"";if(i&&e.length>=3){let i=e;const n=e[e.length-1];if(e.length>=4&&Math.hypot(e[0][0]-n[0],e[0][1]-n[1])<1e-9&&(i=e.slice(0,-1)),i.length>=3){const e=i.map((e,i)=>s?.[i]||t),n=Vc(i,e),o=lc(i,e);if(n&&o)return`${cc(n)} ${cc(hc(o))}`}}const n=[];for(let i=0;i=1e-9&&r>0&&n.push({a:o,b:a,halfDepth:r})}const o=n.map(Kl);for(const{segmentIndex:e,wedge:t}of Ql(n)){const i=o[e];if(!i)continue;const s=Zl(i,t);s&&(o[e]=s)}const a=[...o.filter(e=>!!e),...ec(n)],r=function(e){let t=null;try{for(const i of e){if(i.length<3)continue;const e=Dc(i);t=t?si(t,e):[e]}return t}catch{return null}}(a);return r?Lc(r):a.map(e=>cc(e)).join(" ")}function ic(e,t,i,s,n=1){if(!i.length)return!1;const o=sc(s,n),a=(e[0]+t[0])/2,r=(e[1]+t[1])/2,[l,c]=Tl(e,t);for(const e of i){const[t,i]=Tl([e[0],e[1]],[e[2],e[3]]);if(!(Math.abs(l*i-c*t)>.05)&&Sc(a,r,e[0],e[1],e[2],e[3])<=o)return!0}return!1}function sc(e,t){return Math.max(e*(t>0?t:1)*.04,1e-9)}function nc(e){let t=0;for(let i=0;ie[1]!=l>e[1]&&e[0]<(r-o)*(e[1]-a)/(l-a+0)+o&&(i=!i)}return i}([c[0]+.001*r,c[1]+.001*l],e)||(r=-r,l=-l),[r,l]}function ac(e,t){const i=e[0]*t[1]-e[1]*t[0],s=e[0]*t[0]+e[1]*t[1];return Math.abs(i)<1e-9&&s>0}function rc(e,t,i,s){const n=t[0]*s[1]-t[1]*s[0];if(Math.abs(n)<1e-12)return null;const o=[i[0]-e[0],i[1]-e[1]],a=(o[0]*s[1]-o[1]*s[0])/n;return[e[0]+a*t[0],e[1]+a*t[1]]}function lc(e,t,i){const s=e?.length||0;if(s<3||t.length!==s)return null;if(t.every(e=>!(e>0)))return e.map(e=>[e[0],e[1]]);const n=[];for(let o=0;o0||p>0)){n.push([e[o][0],e[o][1]]);continue}if(d>0!=p>0){const t=e[o],i=d>0?[t[0]+u*d,t[1]+_*d]:[t[0],t[1]],s=p>0?[t[0]+m*p,t[1]+g*p]:[t[0],t[1]];n.push(i),Math.hypot(s[0]-i[0],s[1]-i[1])>1e-9&&n.push(s);continue}if(ac(w,k)){const t=e[o],i=[t[0]+u*d,t[1]+_*d],s=[t[0]+m*p,t[1]+g*p];n.push(i),Math.hypot(s[0]-i[0],s[1]-i[1])>1e-9&&n.push(s);continue}const S=rc(x,w,$,k),M=Math.max(d,p,1e-9),C=vc(i,e[o])?.limit??4*M;if(S){const i=Math.hypot(S[0]-e[o][0],S[1]-e[o][1]);if(Number.isFinite(i)&&i<=C){n.push(S);continue}if(jc(e,t,o)){n.push(S);continue}}d>0&&n.push([e[o][0]+u*d,e[o][1]+_*d]),p>0&&n.push([e[o][0]+m*p,e[o][1]+g*p]),d>0||p>0||n.push([e[o][0],e[o][1]])}return n.length>=3?n:null}function cc(e,t=!0){if(!e.length)return"";let i=`M ${e[0][0]} ${e[0][1]}`;for(let t=1;te?.id===t),r=hi(a);if(!r||r.length<3)return null;const l=sc(s,n),c=[];for(const i of e||[]){if(!i||i.id===t)continue;const e=hi(i);if(e)for(const t of Cs(r,e,l))c.push([t[0],t[1]],[t[2],t[3]])}for(const e of i||[])c.push([e[0],e[1]],[e[2],e[3]]);for(const e of o||[]){const t=Al(e,n);t&&c.push(t[0],t[1])}const h=[],d=[];for(let e=0;el)continue;const a=((e[0]-t[0])*(i[0]-t[0])+(e[1]-t[1])*(i[1]-t[1]))/(s*s);a<=n||a>=1-n||(o.some(e=>Math.abs(e-a)*s<=2*l)||o.push(a))}o.sort((e,t)=>e-t);for(const s of o)h.push([t[0]+(i[0]-t[0])*s,t[1]+(i[1]-t[1])*s]),d.push(e)}return{poly:h,parent:d,orig:r}}function pc(e,t,i,s){const n=t.poly.length,o=new Array(n).fill(0);if(!e?.length)return o;const a=new Set,r=[];for(let l=0;l0?(o[l]=$l(c.cm),a.add(c.key)):r.push(l)}if(!r.length)return o;const l=s>0?s:1,c=Math.max(.5*i,1e-9)*l,h=Fl(e,l).filter(e=>e.w.cm>0);for(let e=r.length-1;e>=0;e--){const i=r[e],s=t.poly[i],a=t.poly[(i+1)%n],d=Nl(s,a);let p=null;for(const e of h){const t=Al(e.w,l);if(!t||!El(Nl(t[0],t[1]),d))continue;if(Sc(s[0],s[1],t[0][0],t[0][1],t[1][0],t[1][1])>c||Sc(a[0],a[1],t[0][0],t[0][1],t[1][0],t[1][1])>c)continue;const i=Math.hypot(a[0]-s[0],a[1]-s[1]),n=Math.hypot(t[1][0]-t[0][0],t[1][1]-t[0][1]),o=Math.max(0,n-i);(!p||oc||Sc(n[0],n[1],t[0][0],t[0][1],t[1][0],t[1][1])>c)continue;i=!0,o=Math.max(0,Math.hypot(t[1][0]-t[0][0],t[1][1]-t[0][1])-_)}else{if(Sc(e.x,e.y,s[0],s[1],n[0],n[1])>c)continue;o=Math.hypot(e.x-d,e.y-p)}(!u||i&&!u.exact||i===u.exact&&o0?i:1,o=(e||[]).filter(e=>e&&!e.open&&null!==e.kind&&Number.isFinite(e.half)&&e.half>0&&Array.isArray(e.a)&&Array.isArray(e.b)&&e.a.length>=2&&e.b.length>=2&&[e.a[0],e.a[1],e.b[0],e.b[1]].every(Number.isFinite)&&Math.hypot(e.b[0]-e.a[0],e.b[1]-e.a[1])>s).sort((e,t)=>e.key.localeCompare(t.key)||e.a[0]-t.a[0]||e.a[1]-t.a[1]||e.b[0]-t.b[0]||e.b[1]-t.b[1]||e.half-t.half),a=new Map;for(const e of o){const t=a.get(e.key);t?e.half>t.half&&a.set(e.key,{...t,half:e.half}):a.set(e.key,e)}const r=[...a.values()].flatMap(e=>[{point:[e.a[0],e.a[1]],other:e.b,halfDepth:e.half,kind:e.kind,key:e.key},{point:[e.b[0],e.b[1]],other:e.a,halfDepth:e.half,kind:e.kind,key:e.key}]).sort((e,t)=>e.point[0]-t.point[0]||e.point[1]-t.point[1]||e.other[0]-t.other[0]||e.other[1]-t.other[1]||e.halfDepth-t.halfDepth),l=new Map;for(const e of r){const[t,i]=uc(e.point,s),n=_c(t,i),o=l.get(n)||[];o.push(e),l.set(n,o)}const c=[],h=new Map;for(const e of r){const t=mc(h,e.point,s).filter(t=>Math.hypot(t.point[0]-e.point[0],t.point[1]-e.point[1])<=s).sort((t,i)=>Math.hypot(t.point[0]-e.point[0],t.point[1]-e.point[1])-Math.hypot(i.point[0]-e.point[0],i.point[1]-e.point[1])||t.point[0]-i.point[0]||t.point[1]-i.point[1]);let i=t[0];if(!i){i={point:[...e.point],rays:[]},c.push(i);const[t,n]=uc(i.point,s),o=_c(t,n),a=h.get(o)||[];a.push(i),h.set(o,a)}const n=e.other[0]-e.point[0],o=e.other[1]-e.point[1],a=Math.hypot(n,o);if(!(a>s))continue;const r=[n/a,o/a];let l=Math.atan2(r[1],r[0]);l<0&&(l+=2*Math.PI),i.rays.push({u:r,halfDepth:e.halfDepth,length:a,angle:l})}const d=[],p=e=>{const t=1e-9*Math.max(1,n),i=e.filter(e=>Number.isFinite(e.halfDepth)&&e.halfDepth>0&&Number.isFinite(e.length)&&e.length>s);return i.filter((e,s)=>!i.some((i,n)=>n!==s&&i.halfDepth>=e.halfDepth-t&&i.length>=e.length-t&&(i.halfDepth>e.halfDepth+t||i.length>e.length+t||ne.length-t.length||e.halfDepth-t.halfDepth).map(e=>({...e}))};for(const e of c){const t=e.rays.sort((e,t)=>e.angle-t.angle||e.length-t.length||e.halfDepth-t.halfDepth),i=[];for(const e of t){const t=i[i.length-1];t&&Math.abs(e.angle-t.angle)<=1e-9?t.supports.push({halfDepth:e.halfDepth,length:e.length}):i.push({u:[...e.u],angle:e.angle,supports:[{halfDepth:e.halfDepth,length:e.length}]})}if(i.length>1&&2*Math.PI-i[i.length-1].angle+i[0].angle<=1e-9){const e=i.pop();i[0].supports.push(...e.supports)}if(i.length<3)continue;const n=i.map(t=>{const i=p(t.supports),n=new Set,o=[];for(const a of i){const i=[e.point[0]+t.u[0]*a.length,e.point[1]+t.u[1]*a.length];for(const t of mc(l,i,s)){if("shared"!==t.kind||Math.hypot(t.point[0]-i[0],t.point[1]-i[1])>s)continue;const a=t.other[0]-t.point[0],r=t.other[1]-t.point[1],l=Math.hypot(a,r);if(!(l>s))continue;const c=a/l,h=r/l;if(Math.hypot(t.other[0]-e.point[0],t.other[1]-e.point[1])<=s)continue;const d=`${t.key}|${t.point[0]}|${t.point[1]}|${t.other[0]}|${t.other[1]}|${t.halfDepth}`;n.has(d)||(n.add(d),o.push({start:[t.point[0],t.point[1]],u:[c,h],length:l,halfDepth:t.halfDepth}))}}return o.sort((e,t)=>e.start[0]-t.start[0]||e.start[1]-t.start[1]||e.u[0]-t.u[0]||e.u[1]-t.u[1]||e.length-t.length||e.halfDepth-t.halfDepth),{u:[...t.u],halfDepth:Math.max(...i.map(e=>e.halfDepth)),length:Math.max(...i.map(e=>e.length)),supports:i,continuations:o}}).filter(e=>Number.isFinite(e.halfDepth)&&e.halfDepth>0&&Number.isFinite(e.length)&&e.length>s);if(n.length<3)continue;const o=Math.max(...n.map(e=>e.halfDepth));o>0&&Number.isFinite(o)&&d.push({point:[...e.point],rays:n,halfDepth:o,limit:1.25*o})}d.sort((e,t)=>e.point[0]-t.point[0]||e.point[1]-t.point[1]);const u=new Map;for(const e of d){const[t,i]=uc(e.point,s),n=_c(t,i),o=u.get(n)||[];o.push(e),u.set(n,o)}return{epsilon:s,coordinateScale:n,nodes:d,index:u}}function fc(e){const t={fans:[],supports:[]};if(!e?.nodes?.length)return t;const i=Math.max(e.epsilon,1e-9)**2;for(const s of e.nodes){const e=s.rays.filter(e=>Number.isFinite(e.halfDepth)&&e.halfDepth>0).map(e=>({...e,thickLength:Math.max(...e.supports.filter(t=>t.halfDepth>=e.halfDepth-1e-12).map(e=>e.length),0),angle:(()=>{const t=Math.atan2(e.u[1],e.u[0]);return t<0?t+2*Math.PI:t})()})).sort((e,t)=>e.angle-t.angle);if(e.length<2)continue;const n=s.point;for(const i of e)for(const e of i.supports){if(!(e.halfDepth>0&&e.length>0))continue;const s=-i.u[1]*e.halfDepth,o=i.u[0]*e.halfDepth,a=[n[0]+i.u[0]*e.length,n[1]+i.u[1]*e.length];t.supports.push([[n[0]+s,n[1]+o],[a[0]+s,a[1]+o],[a[0]-s,a[1]-o],[n[0]-s,n[1]-o]])}for(let s=0;s{const e=a.angle-o.angle;return e>0?e:e+2*Math.PI})();if(r<1e-9)continue;const l=r>Math.PI+1e-9,c=4*Math.max(o.halfDepth,a.halfDepth),h=[n[0]-o.u[1]*o.halfDepth,n[1]+o.u[0]*o.halfDepth],d=[n[0]+a.u[1]*a.halfDepth,n[1]-a.u[0]*a.halfDepth],p=o.u[0]*a.u[1]-o.u[1]*a.u[0],u=e=>{let t=Math.atan2(e[1]-n[1],e[0]-n[0])-o.angle;for(;t<0;)t+=2*Math.PI;return t<=r+1e-9};let _=null;if(Math.abs(p)>1e-9){const e=((d[0]-h[0])*a.u[1]-(d[1]-h[1])*a.u[0])/p,t=((d[0]-h[0])*o.u[1]-(d[1]-h[1])*o.u[0])/p,i=[h[0]+o.u[0]*e,h[1]+o.u[1]*e];(l?e<=1e-9&&t<=1e-9:e>1e-9&&e<=o.thickLength&&t<=a.thickLength)&&Math.hypot(i[0]-n[0],i[1]-n[1])<=c&&u(i)&&(_=i)}const m=e=>{Math.abs(nc(e))>i&&t.fans.push(e)};if(_){const e=1.5*Math.max(o.halfDepth,a.halfDepth);m(bl([n[0],n[1]],h,_,d,e)??[[n[0],n[1]],h,_,d]);continue}if(l){m([[n[0],n[1]],h,d]);continue}const g=(e,t)=>Math.min(t,Math.sqrt(Math.max(c**2-e**2,0)),2*Math.max(o.halfDepth,a.halfDepth)),f=[h[0]+o.u[0]*g(o.halfDepth,o.thickLength),h[1]+o.u[1]*g(o.halfDepth,o.thickLength)],v=[d[0]+a.u[0]*g(a.halfDepth,a.thickLength),d[1]+a.u[1]*g(a.halfDepth,a.thickLength)];m([[n[0],n[1]],h,f,v,d])}}return t}function vc(e,t){return!e||!Array.isArray(t)||t.length<2||!t.slice(0,2).every(Number.isFinite)?null:mc(e.index,t,e.epsilon).filter(i=>Math.hypot(i.point[0]-t[0],i.point[1]-t[1])<=e.epsilon).sort((e,i)=>Math.hypot(e.point[0]-t[0],e.point[1]-t[1])-Math.hypot(i.point[0]-t[0],i.point[1]-t[1])||e.point[0]-i.point[0]||e.point[1]-i.point[1])[0]||null}function bc(e,t,i,s,n,o,a){return gc(wc(e,t,i,s,n,o,a),4*sc(s,a),a)}function yc(e,t,i,s,n,o,a,r=1){const l=dc(e,t,s,n,r,i);if(!l)return null;const c=function(e,t,i){const s=(e||[]).find(e=>e?.id===t),n=hi(s);if(!n)return[];const o=[];for(const s of e||[]){if(!s||s.id===t)continue;const e=hi(s);if(e)for(const t of Cs(n,e,i))o.push(t)}return o}(e,t,sc(n,r)),h=function(e,t,i,s,n){const o=sc(s,n),a=[];for(let r=0;rSc(h,d,e[0],e[1],e[2],e[3])<=o);a.push(p?"shared":"outer")}return a}(l.poly,c,s,n,r),d=pc(i,l,n,r),p=d.map((e,t)=>h[t]&&e>0?Ml(e,o,a)/2:0);return{...l,kinds:h,cms:d,offsets:p}}function wc(e,t,i,s,n,o,a=1){const r=[];for(const l of e||[]){if(!l?.id)continue;const c=yc(e,l.id,t,i,s,n,o,a);if(c)for(let e=0;e0&&(r=Ul(r,e.a,e.b,e.cm,s,a));return r}function xc(e,t,i,s,n,o,a=1){if(!t?.length)return[];const r=wc(e,t,i,s,n,o,a),l=new Map;for(const e of r){if(e.open||!e.kind||!e.roomId)continue;const t=l.get(e.key)||new Set;t.add(e.roomId),l.set(e.key,t)}const c=e=>{const t=[...l.get(e)||[]].sort();return 1!==t.length&&2!==t.length?`ambiguous:${e}`:`${1===t.length?"outer":"shared"}:${t.join("|")}`},h=[],d=new Set;for(const e of r)!e.open&&e.cm>0&&!d.has(e.key)&&(d.add(e.key),h.push({...e,ownerSignature:c(e.key)}));const p=[];for(const r of e||[]){if(!r?.id)continue;const l=yc(e,r.id,t,i,s,n,o,a);if(l)for(let e=0;e0)||null===l.kinds[i]){e++;continue}const o=c(Rl(l.poly[i],l.poly[(i+1)%l.poly.length],s,a));let r=e;for(;r+10&&p.push({a:[d[0],d[1]],b:[u[0],u[1]],key:Rl(d,u,s,a),cm:n,len:_,ownerSignature:o}),e=r+1}}}p.sort((e,t)=>t.len-e.len||e.key.localeCompare(t.key));const u=[],_=new Set,m=new Set,g=4*sc(s,a);for(const e of p){const t=h.filter(t=>!m.has(t.key)&&t.cm===e.cm&&t.ownerSignature===e.ownerSignature&&El(Nl(t.a,t.b),Nl(e.a,e.b))&&Sc(t.a[0],t.a[1],e.a[0],e.a[1],e.b[0],e.b[1])<=g&&Sc(t.b[0],t.b[1],e.a[0],e.a[1],e.b[0],e.b[1])<=g);if(t.length){for(const e of t)m.add(e.key);_.has(e.key)||(_.add(e.key),u.push(zl(e.a,e.b,e.cm,s,a)))}}for(const e of h)m.has(e.key)||_.has(e.key)||(_.add(e.key),u.push(zl(e.a,e.b,e.cm,s,a)));return u}function $c(e,t,i,s,n,o,a,r=1){const l=sc(n,r),c=(s[0]+s[2])/2,h=(s[1]+s[3])/2,d=Nl([s[0],s[1]],[s[2],s[3]]);let p=null;for(const s of wc(e,t,i,n,o,a,r)){if(!El(Nl(s.a,s.b),d))continue;const e=Sc(c,h,s.a[0],s.a[1],s.b[0],s.b[1]);e>4*l||(!p||e[e[0],e[1]]),o=Math.abs(nc(n));n.length>=3&&o>i&&(t=n,i=o)}return t}function Cc(e,t,i,s,n,o,a,r=1,l,c){const h=(e||[]).find(e=>e?.id===t),d=hi(h);if(!d||d.length<3)return null;if(!i?.length)return d.map(e=>[e[0],e[1]]);const p=yc(e,t,i,s,n,o,a,r);if(!p||!p.offsets.some(e=>e>0))return d.map(e=>[e[0],e[1]]);const u=c||bc(e,i,s,n,o,a,r),_=lc(p.poly,p.offsets,u);if(!_)return d.map(e=>[e[0],e[1]]);if(!u.nodes.length)return _;const m=void 0===l?qc(e,i,s,[],n,o,a,r):null,g=l??("ok"===m?.status||"degraded-extra"===m?.status?m.roomGeom:void 0);if(g)try{const e=Mc(oi(Dc(p.poly),g));if(e)return e}catch{}return function(e,t){try{return Mc(ni(Dc(e),Dc(t)))}catch{return null}}(_,p.poly)||d.map(e=>[e[0],e[1]])}function Dc(e){const t=e.map(e=>[e[0],e[1]]);return t.push([e[0][0],e[0][1]]),[t]}function Pc(e){return!(!Array.isArray(e)||!e.length)&&e.every(e=>Array.isArray(e)&&e.length&&e.every(e=>Array.isArray(e)&&e.length>=4&&e.every(e=>Array.isArray(e)&&e.length>=2&&Number.isFinite(e[0])&&Number.isFinite(e[1])))&&Math.abs(Ti(e[0]))>1e-9)}function Tc(e,t,i,s){const n=s?new Set(s):null;let o=null;for(let s=0;st.epsilon))continue;const l=Fc([[e.point[0]+r[0]*s.halfDepth,e.point[1]+r[1]*s.halfDepth],[e.point[0]+a.u[0]*n+r[0]*s.halfDepth,e.point[1]+a.u[1]*n+r[1]*s.halfDepth],[e.point[0]+a.u[0]*n-r[0]*s.halfDepth,e.point[1]+a.u[1]*n-r[1]*s.halfDepth],[e.point[0]-r[0]*s.halfDepth,e.point[1]-r[1]*s.halfDepth]],t.coordinateScale);if(!l)continue;const c=Dc(l);o=o?si(o,c):c}}return o}function Ic(e,t,i){let s=null;for(const n of e.rays)for(const e of n.continuations){const n=[-e.u[1],e.u[0]],o=[e.start[0]+e.u[0]*e.length,e.start[1]+e.u[1]*e.length],a=Fc([[e.start[0]+n[0]*e.halfDepth,e.start[1]+n[1]*e.halfDepth],[o[0]+n[0]*e.halfDepth,o[1]+n[1]*e.halfDepth],[o[0]-n[0]*e.halfDepth,o[1]-n[1]*e.halfDepth],[e.start[0]-n[0]*e.halfDepth,e.start[1]-n[1]*e.halfDepth]],t.coordinateScale);if(!a)continue;const r=ni(Dc(a),i);Array.isArray(r)&&0!==r.length&&(s=s?si(s,r):r)}return s}function Rc(e,t,i=2*(4*e.halfDepth+2*t.epsilon)){const s=function(e,t=yl){const i=new Set,s=Number.isFinite(t)&&t>=0?t:yl;for(let t=0;te-t)}(e);return s.length?Tc(e,t,i,s):null}function Ac(e,t,i,s,n){const o=function(e){let t=null;for(const i of e){const e=Dc(i);try{t=t?si(t,e):e}catch{}}return t}(function(e,t,i=!1){if(!e)return[];const s=[];for(const n of e.nodes)for(let o=0;o1e-9)||h>=Math.PI-1e-9)continue;const d=[-a.u[1],a.u[0]],p=[-r.u[1],r.u[0]],u=[n.point[0]+d[0]*a.halfDepth,n.point[1]+d[1]*a.halfDepth],_=[n.point[0]-p[0]*r.halfDepth,n.point[1]-p[1]*r.halfDepth],m=rc(u,a.u,_,r.u);if(!m)continue;const g=Math.hypot(m[0]-n.point[0],m[1]-n.point[1]);if(!Number.isFinite(g)||g<=n.limit)continue;const f=t?Math.sqrt(Math.max(0,n.limit*n.limit-a.halfDepth*a.halfDepth)):0,v=t?Math.sqrt(Math.max(0,n.limit*n.limit-r.halfDepth*r.halfDepth)):0,b=Fc([[u[0]+a.u[0]*f,u[1]+a.u[1]*f],[_[0]+r.u[0]*v,_[1]+r.u[1]*v],m],e.coordinateScale);if(b&&s.push(b),i){const t=m[0]-n.point[0],i=m[1]-n.point[1],o=Math.hypot(t,i),a=g-n.limit;if(o>e.epsilon&&a>e.epsilon){const r=Math.min(Math.max(8*e.epsilon,.05*n.halfDepth),.25*a),l=t/o,c=i/o,h=-c,d=l,p=Fc([[m[0]-l*r+h*r,m[1]-c*r+d*r],[m[0]-l*r-h*r,m[1]-c*r-d*r],[m[0]+l*r,m[1]+c*r]],e.coordinateScale);p&&s.push(p)}}}return s}({...t,nodes:[e]},i,s));return o&&n?oi(o,n):o}function zc(e,t,i,s){if(!e||!t.nodes.length)return e;let n=null;try{n=function(e){let t=null;for(const i of e.nodes){const s=Rc(i,e);s&&(t=t?si(t,s):s)}return t}(t)}catch{return e}let o=e;for(const e of t.nodes){const a=4*e.halfDepth+2*t.epsilon,r=2*a,l=[[e.point[0]-a,e.point[1]-a],[e.point[0]+a,e.point[1]-a],[e.point[0]+a,e.point[1]+a],[e.point[0]-a,e.point[1]+a]];try{let a=o;const c=Ac(e,t,!1,!0,n);c&&(a=oi(a,c));let h=Tc(e,t,r);const d=Ac(e,t,!0,!0,n);d&&(h=oi(h,d)),n&&(h=si(h,n));const p=.02*Math.min(...e.rays.map(e=>e.halfDepth));if(h=si(h,Dc([[e.point[0]-p,e.point[1]-p],[e.point[0]+p,e.point[1]-p],[e.point[0]+p,e.point[1]+p],[e.point[0]-p,e.point[1]+p]])),!h)continue;let u=ni(h,Dc(l));s?u=ni(u,s):i&&(u=ni(u,i));const _=Dc(l),m=oi(a,_),g=i?oi(ni(a,_),i):null,f=Ic(e,t,_);o=si(m,...g?[g]:[],...f?[f]:[],u)}catch{}}if(n)try{let e=n;s?e=ni(e,s):i&&(e=ni(e,i)),o=si(o,e)}catch{}return o}function Fc(e,t=1){if(!Array.isArray(e)||e.length<3)return null;const i=Number.isFinite(t)&&t>0?t:1,s=1e-12*Math.max(1,i),n=[];for(const t of e){if(!Array.isArray(t)||t.length<2)return null;const e=Number(t[0]),i=Number(t[1]);if(!Number.isFinite(e)||!Number.isFinite(i))return null;const o=Math.round(e/s)*s,a=Math.round(i/s)*s;if(!Number.isFinite(o)||!Number.isFinite(a))return null;n.push([Object.is(o,-0)?0:o,Object.is(a,-0)?0:a])}return Math.abs(nc(n))>s*s?n:null}function Nc(e,t,i,s){if(Sc(e[0],e[1],t[0],t[1],i[0],i[1])>s)return!1;const n=i[0]-t[0],o=i[1]-t[1],a=(e[0]-t[0])*n+(e[1]-t[1])*o,r=n*n+o*o,l=s*Math.sqrt(r);return a>=-l&&a<=r+l}function Ec(e,t,i){const s=[],n=[];for(let o=0;oi*i))continue;const d=i/Math.sqrt(h),p=[0,1];for(const e of t)for(const t of[e.a,e.b]){if(!Nc(t,a,r,i))continue;const e=((t[0]-a[0])*l+(t[1]-a[1])*c)/h;e>d&&e<1-d&&p.push(e)}p.sort((e,t)=>e-t);const u=p.filter((e,t)=>0===t||Math.abs(e-p[t-1])>d);for(let e=0;e=3&&n.length===s.length?{poly:s,offsets:n}:null}function Oc(e,t,i,s,n,o,a,r){const l=(e||[]).map(hi).filter(e=>!!e&&e.length>=3);if(!l.length)return null;let c=si(Dc(l[0]));for(let e=1;e"outer"===e.kind&&e.half>0),p=4*sc(s,a),u=r||gc(h,p,a);let _=null;for(const e of function(e){const t=[];for(const i of Array.isArray(e)?e:[])if(Array.isArray(i))for(const e of i){if(!Array.isArray(e)||e.length<4)continue;const i=e.slice(0,-1).map(e=>[e[0],e[1]]);i.length>=3&&t.push(i)}return t}(c)){const t=Ec(e,d,p);if(!t||!t.offsets.some(e=>e>0))continue;const i=Vc(t.poly,t.offsets,u),s=lc(t.poly,t.offsets,u);if(!i||!s)continue;const n=oi(Dc(i),Dc(s));_=_?si(_,n):n}return{centre:c,shell:_||[]}}function Hc(e,t,i,s,n,o,a=1){try{const r=Oc(e,t,i,s,n,o,a,bc(e,t,i,s,n,o,a));if(!r)return[];return r.shell?.length?si(r.centre,r.shell):r.centre}catch{return null}}function Lc(e){if(!e)return"";let t="";for(const i of e)if(Array.isArray(i))for(const e of i){if(!Array.isArray(e)||e.length<4)continue;const i=e.slice(0,e.length-1);i.length<3||(t+=(t?" ":"")+cc(i.map(e=>[e[0],e[1]])))}return t}const Bc=15;function jc(e,t,i){const s=e?.length||0;if(s<3||t?.length!==s)return!1;const n=e[(i-1+s)%s],o=e[i],a=e[(i+1)%s],r=[n[0]-o[0],n[1]-o[1]],l=[a[0]-o[0],a[1]-o[1]],c=Math.hypot(r[0],r[1]),h=Math.hypot(l[0],l[1]);if(!(c>1e-9&&h>1e-9))return!1;const d=Math.max(-1,Math.min(1,(r[0]*l[0]+r[1]*l[1])/(c*h))),p=Math.acos(d);if(!(p>1e-9))return!1;if(p>=Bc*Math.PI/180)return!1;const u=Math.max(Math.max(0,t[(i-1+s)%s]),Math.max(0,t[i]));if(!(u>0))return!1;const _=u/Math.tan(p/2);return Number.isFinite(_)&&_>0&&_e>0))continue;for(const e of l.offsets)e>0&&(p=Math.max(p,2*e));const c=Vc(l.poly,l.offsets,d),u=lc(l.poly,l.offsets,d);c&&h.push({outset:c,inset:u})}for(const e of l){const t=e.map(e=>e[0]),i=e.map(e=>e[1]);if(t.length){const s=Math.min(Math.max(...t)-Math.min(...t),Math.max(...i)-Math.min(...i)),n=Math.min(...e.map((t,i)=>{const s=e[(i+1)%e.length];return Math.hypot(s[0]-t[0],s[1]-t[1])}));p=Math.max(p,e.length>16?s:n)}}const u=function(e,t,i,s,n,o,a,r){if(!t?.length||!i?.length)return[];const l=4*sc(s,a),c=new Map;for(const r of wc(e,t,i,s,n,o,a))!r.open&&r.half>0&&!c.has(r.key)&&c.set(r.key,r);const h=[...c.values()];if(h.length<2)return[];const d=r||gc(h,l),p=[];for(const e of i)for(const t of[[e[0],e[1]],[e[2],e[3]]])p.some(e=>Math.hypot(e[0]-t[0],e[1]-t[1])<=l)||p.push(t);const u=[],_=(e,t)=>{let i=0,s=0;if(Math.hypot(e.a[0]-t[0],e.a[1]-t[1])<=l)i=e.b[0]-e.a[0],s=e.b[1]-e.a[1];else{if(!(Math.hypot(e.b[0]-t[0],e.b[1]-t[1])<=l))return null;i=e.a[0]-e.b[0],s=e.a[1]-e.b[1]}const n=Math.hypot(i,s);return n>l?[i/n,s/n]:null};for(const e of p){const t=h.map(t=>({iv:t,u:_(t,e)})).filter(e=>!!e.u);for(let i=0;i0?[e.slice(),p,m,_]:[e.slice(),_,m,p];else{if(!f)continue;{const t=[-n.u[1],n.u[0]],i=[-o.u[1],o.u[0]],s=a<0?1:-1,r=[e[0]+t[0]*n.iv.half*s,e[1]+t[1]*n.iv.half*s],l=[e[0]-i[0]*o.iv.half*s,e[1]-i[1]*o.iv.half*s];b=a>0?[e.slice(),r,l]:[e.slice(),l,r]}}Math.abs(nc(b))>l*l&&u.push(b)}}return u}(e,t,i,n,o,a,r,d),_=s.length?Kc(e,t,i,n,o,a,r):null;let m="exterior";try{const v=Oc(e,t,i,n,o,a,r,d);m="paper";const b=v?v.shell?.length?si(v.centre,v.shell):v.centre:[],y=e=>{const t=Dc(e.outset);if(!e.inset)return t;const i=Dc(e.inset);return oi(t,i)};m="room-rings";let w=null;for(const e of h)try{const t=y(e);w=w?si(w,t):t}catch{}if(m="edge-bodies",v)for(const s of Gc(e,t,i,n,o,a,r))try{const e=ni(Dc(s.quad),v.centre);w=w?si(w,e):e}catch{}m="junctions",w=function(e,t,i=1,s=si){let n=e;for(const e of t||[]){const t=Fc(e,i);if(t)try{const e=Dc(t);n=n?s(n,e):e}catch{}}return n}(w,u,r),m="facade-clip",w&&v&&(w=ni(w,v.centre)),m="exterior-shell";const k=[];let x=0;if(v?.shell?.length)if(w)try{const e=si(w,v.shell);if(!Pc(e))throw new Error("invalid shell union");w=e}catch{if(!Pc(w)||!Pc(v.shell))throw new Error("invalid shell");k.push({id:"exterior-shell",geom:v.shell}),x++}else w=v.shell;if(m="multi-wall-trim",w&&d.nodes.length){const e=e=>e.rays.some(e=>e.supports.some(e=>e.length<2*e.halfDepth)),t=d.nodes.filter(e);if(t.length){w=zc(w,{...d,nodes:t},v?.centre,b)}}if(m="junction-corners",d.nodes.length){const s=fc(d),l=function(e,t,i,s,n,o,a,r){try{const l=Oc(e,t,i,s,n,o,a,{epsilon:r.epsilon,coordinateScale:r.coordinateScale,nodes:[],index:new Map});return l?l.shell?.length?si(l.centre,l.shell):l.centre:null}catch{return null}}(e,t,i,n,o,a,r,d);for(const e of s.fans)try{let t=[Dc(e)];if(l&&(t=ni(t,l)),!t?.length)continue;w=w?si(w,t):t}catch{}g=w,f=Math.max(d.epsilon,1e-9)**2,w=Array.isArray(g)?g.map(e=>{if(!Array.isArray(e)||!e.length)return e;const[t,...i]=e;return Math.abs(nc(t||[]))<=f?null:[t,...i.filter(e=>Math.abs(nc(e||[]))>f)]}).filter(e=>!!e):g}const $=w||[],S=[...Pc($)?[{id:"room-primary",geom:$}]:[],...k.map((e,t)=>({id:`room-isolated-${t}`,geom:e.geom}))];m="openings";for(const e of s){if(!(e.length>0))continue;const t=Xc(_,e,!0);if(!t.negative&&!t.positive)continue;const i=e.angle*Math.PI/180,s=Math.cos(i),o=Math.sin(i),a=-o,l=s,c=e.length/2,h=1.25*Math.max(p,n*r),d=[[e.x-s*c-a*h,e.y-o*c-l*h],[e.x+s*c-a*h,e.y+o*c-l*h],[e.x+s*c+a*h,e.y+o*c+l*h],[e.x-s*c+a*h,e.y-o*c+l*h]];w&&(w=oi(w,Dc(d)));for(const e of k)e.geom=oi(e.geom,Dc(d))}m="extras";const M=[];let C=0;const D=c.mergeExtra||((e,t)=>e?si(e,t):t);for(let e=0;ee.length>=2&&Number.isFinite(e[0])&&Number.isFinite(e[1]))||Math.abs(Ti(t))<=1e-9){C++;continue}const i=[Dc(t)];try{const t=D(w,i,e);if(!Pc(t))throw new Error("invalid extra union");w=t}catch{C++,Pc(i)&&M.push({id:`extra-${e}`,geom:i})}}M.push(...k),M.sort((e,t)=>Lc(e.geom).localeCompare(Lc(t.geom)));const P=w||[];return{status:C||x?"degraded-extra":"ok",geom:P,components:[...Pc(P)?[{id:"primary",geom:P}]:[],...M.map((e,t)=>({...e,id:`isolated-${t}`}))],roomGeom:$,roomComponents:S,paperGeom:b,depthUnits:p,openingPadUnits:1.25*Math.max(p,n*r),openingIndex:_,multiWallNodes:d,degradedExtraCount:C+x}}catch{return c.onCoreFailure?.(m),{status:"failed-core",geom:[],components:[],roomGeom:[],paperGeom:[],roomComponents:[],depthUnits:p,openingIndex:null,multiWallNodes:d,degradedExtraCount:0}}var g,f}function Wc(e,t,i,s=[],n,o,a,r=1,l=[],c={}){if(!t?.length&&!l.length)return null;return Uc(qc(e,t,i,s,n,o,a,r,l,c))}function Uc(e){if("failed-core"===e.status||"not-applicable"===e.status)return null;const t=e.components.map(e=>({id:e.id,d:Lc(e.geom),fillRule:"evenodd"})).filter(e=>!!e.d),i=t[0]?.d||"",s=Lc(e.paperGeom);if(t.length){const n={status:e.status,d:i,paths:t,components:e.components,roomGeom:e.roomGeom,multiWallNodes:e.multiWallNodes,paperD:s,depthUnits:e.depthUnits,fillRule:"evenodd"};return Object.defineProperties(n,{roomComponents:{value:e.roomComponents||[],enumerable:!1},openingIndex:{value:e.openingIndex,enumerable:!1},openingPadUnits:{value:e.openingPadUnits,enumerable:!1}}),n}return null}function Gc(e,t,i,s,n,o,a=1){if(!t?.length)return[];const r=new Set,l=[];for(const c of e||[]){if(!c?.id)continue;const h=yc(e,c.id,t,i,s,n,o,a);if(!h)continue;const d=h.poly;for(let e=0;e0))continue;const u=Rl(t,i,s,a);if(r.has(u))continue;r.add(u);const _=Ml(p,n,o),[m,g]=oc(d,e),f=-m,v=-g,b=_/2,y=[[t[0]+f*b,t[1]+v*b],[i[0]+f*b,i[1]+v*b],[i[0]+m*b,i[1]+g*b],[t[0]+m*b,t[1]+g*b]];l.push({key:u,kind:c,cm:p,quad:y,a:[t[0],t[1]],b:[i[0],i[1]],depthUnits:_})}}return l}function Vc(e,t,i){const s=e?.length||0;if(s<3||t.length!==s)return null;if(t.every(e=>!(e>0)))return e.map(e=>[e[0],e[1]]);hc(e),t.slice().reverse();const n=[];for(let o=0;o0||l>0)){n.push([e[o][0],e[o][1]]);continue}if(r>0!=l>0){const t=e[o],i=r>0?[t[0]-c*r,t[1]-h*r]:[t[0],t[1]],s=l>0?[t[0]-d*l,t[1]-p*l]:[t[0],t[1]];n.push(i),Math.hypot(s[0]-i[0],s[1]-i[1])>1e-9&&n.push(s);continue}if(ac(w,k)){const t=e[o],i=[t[0]-c*r,t[1]-h*r],s=[t[0]-d*l,t[1]-p*l];n.push(i),Math.hypot(s[0]-i[0],s[1]-i[1])>1e-9&&n.push(s);continue}const S=rc(x,w,$,k),M=Math.max(r,l,1e-9),C=vc(i,e[o])?.limit??4*M;if(S){const i=Math.hypot(S[0]-e[o][0],S[1]-e[o][1]);if(Number.isFinite(i)&&i<=C){n.push(S);continue}if(jc(e,t,o)){n.push([e[o][0],e[o][1]]);continue}}r>0&&n.push([e[o][0]-c*r,e[o][1]-h*r]),l>0&&n.push([e[o][0]-d*l,e[o][1]-p*l])}return n.length>=3?n:null}function Kc(e,t,i,s,n,o,a=1){const r=[];for(const l of e||[]){if(!l?.id)continue;const c=yc(e,l.id,t,i,s,n,o,a);if(!c)continue;const h=Math.abs(Ti(c.poly));for(let e=0;e[Math.max(t,e.x0),Math.min(i,e.x1)]).filter(e=>e[1]-e[0]>s).sort((e,t)=>e[0]-t[0]||e[1]-t[1]);if(!n.length)return{coverage:0,full:!1};let o=n[0][0],a=n[0][1],r=0,l=o<=t+s;for(let e=1;e=i-s,{coverage:r,full:l}}function Jc(e,t){return Number(t.full)-Number(e.full)||e.faceDistance-t.faceDistance||e.area-t.area||e.roomId.localeCompare(t.roomId)}function Xc(e,t,i=!1){const s=Number(t?.x),n=Number(t?.y),o=Number(t?.angle),a=Number(t?.length);if(!([s,n,o,a].every(Number.isFinite)&&a>0))return{negative:null,positive:null};const r=o*Math.PI/180,l=Math.cos(r),c=Math.sin(r),h=-c,d=l,p=a/2,u=Math.max(1e-9,e.adjacencyEps),_=new Map;let m=0;for(const t of e.edges){if(i&&!(t.half>0))continue;if(!Bl(t.a,t.b,o))continue;const[e,a]=Tl(t.a,t.b);if(Math.abs((s-t.a[0])*a-(n-t.a[1])*e)>u)continue;const r=(t.a[0]-s)*l+(t.a[1]-n)*c,g=(t.b[0]-s)*l+(t.b[1]-n)*c,f=Math.max(-p,Math.min(r,g)),v=Math.min(p,Math.max(r,g));if(v-f<=u)continue;const b=t.inward[0]*h+t.inward[1]*d>=0?1:-1,y=((t.a[0]+t.b[0])/2-s)*h+((t.a[1]+t.b[1])/2-n)*d,w=Math.abs(y+b*t.half),k=`${b}|${t.roomId}`,x={x0:f,x1:v,half:t.half,cm:t.cm,key:t.key,axis:[e,a]},$=_.get(k);$?($.pieces.push(x),$.faceDistance=Math.min($.faceDistance,w)):_.set(k,{roomId:t.roomId,side:b,order:m++,pieces:[x],faceDistance:w,area:t.area,coverage:0,full:!1})}for(const e of _.values()){const t=Yc(e.pieces,-p,p,u);e.coverage=t.coverage,e.full=t.full}const g=e=>{const t=[..._.values()].filter(t=>t.side===e&&t.coverage>u);return t.sort(Jc),t[0]||null};return{negative:g(-1),positive:g(1)}}function Zc(e,t){const i=Xc(e,t),s=[i.negative,i.positive].filter(e=>!!e);if(!s.length)return{ox:0,oy:0,cm:0,side:-1};const n=i.negative&&i.positive?-1:s[0].side,o=t.flip_v?-n:n,a=(-1===o?i.negative:i.positive)||s[0],r=[...a.pieces].sort((e,t)=>(e.x0<=0&&e.x1>=0?0:Math.min(Math.abs(e.x0),Math.abs(e.x1)))-(t.x0<=0&&t.x1>=0?0:Math.min(Math.abs(t.x0),Math.abs(t.x1)))||t.x1-t.x0-(e.x1-e.x0)||e.key.localeCompare(t.key))[0];if(!(r.half>0&&r.cm>0))return{ox:0,oy:0,cm:0,side:o};const l=t.angle*Math.PI/180,c=-Math.sin(l),h=Math.cos(l);return{ox:c*o*r.half,oy:h*o*r.half,cm:r.cm,side:o}}function Qc(e,t){const i=1e-9,s=t.filter(e=>Number.isFinite(e.x0)&&Number.isFinite(e.x1)&&Number.isFinite(e.half)&&e.x1>e.x0&&e.half>0);if(!s.length)return"";const n=s.flatMap(e=>[e.x0,e.x1]).sort((e,t)=>e-t),o=[];for(const e of n){const t=o[o.length-1];(void 0===t||e>t+i)&&o.push(e)}const a=[];for(let e=0;e+1t+i))continue;const r=(t+n)/2,l=s.reduce((e,t)=>r>=t.x0-i&&r<=t.x1+i?Math.max(e,t.half):e,0);if(!(l>0))continue;const c=a[a.length-1];c&&t<=c.x1+i&&Math.abs(l-c.half)<=i?c.x1=n:a.push({x0:t,x1:n,half:l})}const r=[];for(const e of a){const t=r[r.length-1],s=t?.[t.length-1];s&&e.x0<=s.x1+i?(e.x0=s.x1,t.push(e)):r.push([e])}return r.map(t=>{const i=t[0],s=t[t.length-1],n=Math.min(.25*Math.min(...t.map(e=>e.half)),.75),o=-e*n,a=[];if(1===e){a.push(`M ${i.x0} ${o} L ${s.x1} ${o}`);for(let e=t.length-1;e>=0;e--){const i=t[e];a.push(`L ${i.x1} ${i.half} L ${i.x0} ${i.half}`)}}else{a.push(`M ${s.x1} ${o} L ${i.x0} ${o}`);for(const e of t)a.push(`L ${e.x0} ${-e.half} L ${e.x1} ${-e.half}`)}return a.push("Z"),a.join(" ")}).join(" ")}function eh(e,t,i,s){if(!s)return i;const n=e.angle*Math.PI/180,o=Math.cos(n),a=Math.sin(n),r=[],l=1e-9;for(const n of i){const[i,c]=n.axis,h=o*i+a*c;if(Math.abs(h)<=l)continue;const d=e.x*i+e.y*c,p=d+h*n.x0,u=d+h*n.x1,_=Math.min(p,u),m=Math.max(p,u),g=`${n.key}|${t}`,f=s.get(g)||[];let v=[[_,m]];for(const[e,t]of f){const i=[];for(const[s,n]of v)t<=s+l||e>=n-l?i.push([s,n]):(e>s+l&&i.push([s,Math.min(n,e)]),te[0]-t[0]||e[1]-t[1]),y=[];for(const e of b){const t=y[y.length-1];t&&e[0]<=t[1]+l?t[1]=Math.max(t[1],e[1]):y.push([e[0],e[1]])}s.set(g,y)}return r}function th(e,t){const i=new Map;return t.map(t=>function(e,t,i){const s=Xc(e,t,!0),n=s.negative,o=s.positive;if(!n&&!o)return null;let a;if(n&&o)a=[{candidate:n,side:-1},{candidate:o,side:1}];else{const e=n||o;a=[{candidate:e,side:-1},{candidate:e,side:1}]}const r=a.map(({candidate:e,side:s})=>({candidate:e,side:s,pieces:eh(t,s,e.pieces,i)})),l=r.map(({candidate:e,side:t,pieces:i})=>({side:t,roomId:e.roomId,d:Qc(t,i)})),c=r.flatMap(({pieces:e})=>e);if(!c.length)return null;const h=Math.max(...c.map(e=>e.half));return{faces:l,minY:-h,maxY:h,wallKey:[...new Set(c.map(e=>e.key))].sort().join("|")}}(e,t,i))}const ih=150,sh=1e-6;function nh(e){return Number.isFinite(e)?Math.max(1,Math.min(ih,e)):1}function oh(e){return((Number.isFinite(Number(e))?Number(e):0)%90+90)%90}const ah=e=>{const t=e.map(e=>[e[0],e[1]]);return!t.length||t[0][0]===t[t.length-1][0]&&t[0][1]===t[t.length-1][1]||t.push([...t[0]]),[t]},rh=(e,t)=>e[0]===t[0]&&e[1]===t[1];function lh(e,t=1e-6){const i=Number.isFinite(t)&&t>0?t:sh,s=[];for(const t of e||[]){if(!Array.isArray(t)||t.length<2)return null;const e=Number(t[0]),n=Number(t[1]);if(!Number.isFinite(e)||!Number.isFinite(n))return null;const o=Math.round(e/i)*i,a=Math.round(n/i)*i;if(!Number.isFinite(o)||!Number.isFinite(a))return null;const r=[Object.is(o,-0)?0:o,Object.is(a,-0)?0:a];s.length&&rh(s[s.length-1],r)||s.push(r)}return s.length>1&&rh(s[0],s[s.length-1])&&s.pop(),s.length<3||new Set(s.map(e=>`${e[0]},${e[1]}`)).size<3?null:Ti(s)>i*i?s:null}function ch(e){const t=[];for(const i of e||[])for(const e of i||[]){const i=(e||[]).filter(e=>Array.isArray(e)&&e.length>=2);i.length<4||t.push(`M ${i.slice(0,-1).map(e=>`${e[0]} ${e[1]}`).join(" L ")} Z`)}return t.join(" ")}function hh(e,t,i,s,n){return Kl({a:e,b:t,halfDepth:Ml(i,s,n)/2})}function dh(e,t,i){const s=Number(t)>0?Number(t):5,n=nh(e.cm)/s*i,o=e.center[0],a=e.center[1];if("circle"===e.shape){const e=n/2;return Array.from({length:96},(t,i)=>{const s=i/96*Math.PI*2;return[o+Math.cos(s)*e,a+Math.sin(s)*e]})}const r=n/2,l=oh(e.angle)*Math.PI/180,c=Math.cos(l),h=Math.sin(l);return[[-r,-r],[r,-r],[r,r],[-r,r]].map(([e,t])=>[o+e*c-t*h,a+e*h+t*c])}function ph(e,t,i=1e-9){if(!t.length)return[e];let s=[ah(e)];try{for(const e of t){const t=e.b[0]-e.a[0],n=e.b[1]-e.a[1],o=Math.hypot(t,n);if(!(o>i))continue;const a=t/o,r=n/o,l=-r,c=a,h=1.25*Math.max(Number(e.depth)||0,4*i),d=Math.max(2*i,1e-9*o),p=[[e.a[0]-a*d-l*h,e.a[1]-r*d-c*h],[e.b[0]+a*d-l*h,e.b[1]+r*d-c*h],[e.b[0]+a*d+l*h,e.b[1]+r*d+c*h],[e.a[0]-a*d+l*h,e.a[1]-r*d+c*h]];s=oi(s,ah(p))}return kh(s)}catch{return[e]}}function uh(e,t){try{const i=oi([[...e.map(e=>[e[0],e[1]]),[e[0][0],e[0][1]]]],[[...t.map(e=>[e[0],e[1]]),[t[0][0],t[0][1]]]]);let s=null,n=0;for(const e of i||[]){const t=e?.[0]||[],i=Math.abs(Ti(t));t.length>=4&&i>n&&(n=i,s=t.slice(0,-1).map(e=>[e[0],e[1]]))}return s}catch{return null}}function _h(e,t,i,s=Math.max(2e-4*i,1e-9),n=[]){const o=[],a=[],r=new Map;for(const e of n){const t=r.get(e.hostId)||[];t.push(e),r.set(e.hostId,t)}const l=[],c=[],h=[];for(const s of e.room_drafts||[])for(let e=0;e+10))continue;const r={a:s.points[e],b:s.points[e+1],halfDepth:a},c=Kl(r);c&&(o.push(r),l.push(c))}const d=[];for(const s of e.partitions||[]){const e={a:s.a,b:s.b,halfDepth:Ml(s.cm,t,i)/2};if(!(e.halfDepth>0))continue;const n=Kl(e);n&&(a.push(e),c.push(n),d.push({id:s.id,body:n}))}const p=[...o,...a];for(const{segmentIndex:e,wedge:t}of Ql(p,s)){const i=e=o.length&&(d[i.at].body=s))}for(const e of d)h.push(...ph(e.body,r.get(e.id)||[],s));const u=(e.wall_columns||[]).map(e=>dh(e,t,i)),_=ec([...o,...a],s).flatMap(e=>ph(e,n,s));return{drafts:l,partitions:c,columns:u,patches:_,all:[...l,...h,..._,...u]}}function mh(e){try{const t=e.map(e=>lh(e)).filter(e=>!!e).map(e=>ah(e));return t.length?si(t[0],...t.slice(1)):null}catch{return null}}const gh=e=>`M ${e.map(e=>`${e[0]} ${e[1]}`).join(" L ")} Z`;function fh(e){const t=[];for(const i of e||[]){if(yh([i])<=1e-6)continue;const e=[];for(const t of i||[]){const i=(t||[]).filter(e=>Array.isArray(e)&&e.length>=2);i.length<4||e.push(gh(i.slice(0,-1)))}e.length&&t.push(e.join(" "))}return t}function vh(e,t,i={}){const s=mh(e.filter(e=>e.length>=3)),n=t.some(e=>!lh(e))?null:mh(t);if(!s)return[];if(n)try{return fh(ni(s,n))}catch{}return function(e,t,i){let s=null;for(let n=0;n=4&&t.push(e.slice(0,-1).map(e=>[e[0],e[1]]));return t}function kh(e){const t=[];for(const i of e||[]){const e=i?.[0];e?.length>=4&&t.push(e.slice(0,-1).map(e=>[e[0],e[1]]))}return t}function xh(e,t){let i=!1;for(let s=0,n=t.length-1;se[1]!=l>e[1]&&e[0]<(r-o)*(e[1]-a)/(l-a||1e-12)+o&&(i=!i)}return i}function $h(e,t,i){return function(e,t){for(const i of t||[]){const t=i?.[0];if(!t?.length||!xh(e,t))continue;let s=!1;for(let t=1;txh(e,t))}function Sh(e,t,i){if(Math.hypot(e.center[0]-t.center[0],e.center[1]-t.center[1])>i)return!1;if(Math.abs(nh(e.cm)-nh(t.cm))>1e-6)return!1;if(e.shape!==t.shape)return!0;if("circle"===e.shape||"circle"===t.shape)return!0;const s=Math.abs(oh(e.angle)-oh(t.angle));return Math.min(s,90-s)<=1e-6}const Mh=2.54;function Ch(e){const t="number"==typeof e?e:NaN;return!Number.isFinite(t)||t<=0||5===t?1:5/t}function Dh(e,t){return e*Ch(t)}function Ph(e){return e?Mh:1}function Th(e,t){if(!t)return String(e);const i=e/Mh;return String(Math.round(1e6*i)/1e6)}const Ih=1e3;function Rh(e,t){const i=Number(e),s=Number.isFinite(i)&&i>0?i:1,n=s>=1?t:t*s,o=s>=1?t/s:t;return{x:(t-n)/2,y:(t-o)/2,w:n,h:o}}const Ah=.01,zh=100;function Fh(e,t=1e3){const i=Rh(e?.plan_aspect,t),s=Number(e?.plan_scale),n=Number.isFinite(s)&&s>0?Math.min(zh,Math.max(Ah,s)):1,o=Number(e?.plan_scale_x),a=Number(e?.plan_scale_y),r=Number.isFinite(o)&&o>0?Math.min(zh,Math.max(Ah,o)):n,l=Number.isFinite(a)&&a>0?Math.min(zh,Math.max(Ah,a)):n,c=Number(e?.plan_x),h=Number(e?.plan_y),d=qr(e?.plan_angle);return{x:i.x+(Number.isFinite(c)?Gh(c):0)*t,y:i.y+(Number.isFinite(h)?Gh(h):0)*t,w:i.w*r,h:i.h*l,...d?{angle:d}:{}}}function Nh(e){if(null==e.x||null==e.y)return{x:e.x,y:e.y,w:e.w,h:e.h};const t=Number(e.w)||0,i=Number(e.h)||0;return{x:t<0?e.x+t:e.x,y:i<0?e.y+i:e.y,w:Math.abs(t),h:Math.abs(i)}}function Eh(e){return e&&Array.isArray(e.spaces)?e.spaces.map(e=>{const t=Ih,i=function(e){return Array.isArray(e)&&4===e.length&&e.every(e=>Number.isFinite(e))&&e[2]>1e-6&&e[3]>1e-6?e:[0,0,1,1]}(e.view_box);return{id:e.id,title:e.title,cellCm:Number.isFinite(Number(e.cell_cm))&&Number(e.cell_cm)>0?Number(e.cell_cm):5,vb:[i[0]*Ih,i[1]*t,i[2]*Ih,i[3]*t],bg:e.plan_url?{href:As(e.plan_url),...Fh(e,Ih)}:null,rooms:(e.rooms||[]).map(e=>{const i={...e,...Nh(e)};return{id:i.id,name:i.name,area:i.area??null,open_to:i.open_to||void 0,settings:i.settings||void 0,x:null!=i.x?i.x*Ih:void 0,y:null!=i.y?i.y*t:void 0,w:null!=i.w?i.w*Ih:void 0,h:null!=i.h?i.h*t:void 0,poly:i.poly?i.poly.map(e=>[e[0]*Ih,e[1]*t]):void 0,wall_ids:Array.isArray(i.wall_ids)?[...i.wall_ids]:void 0}}),wall_segments:(e.wall_segments||[]).map(e=>({...e,id:String(e.id),a:[Number(e.a?.[0])*Ih,Number(e.a?.[1])*t],b:[Number(e.b?.[0])*Ih,Number(e.b?.[1])*t],cm:Number(e.cm)})),room_drafts:(e.room_drafts||[]).map(e=>({id:e.id,points:(e.points||[]).map(e=>[e[0]*Ih,e[1]*t]),segments:(e.segments||[]).map(e=>({..."string"==typeof e.id&&e.id?{id:e.id}:{},cm:Number(e.cm)}))})),partitions:(e.partitions||[]).map(e=>({id:e.id,a:[e.a[0]*Ih,e.a[1]*t],b:[e.b[0]*Ih,e.b[1]*t],cm:Number(e.cm)})),wall_columns:(e.wall_columns||[]).map(e=>({id:e.id,shape:"circle"===e.shape?"circle":"square",center:[e.center[0]*Ih,e.center[1]*t],cm:Number(e.cm),..."circle"===e.shape?{}:{angle:oh(e.angle)}}))}}):[]}const Oh=5e3,Hh=Oh*Ih,Lh=240,Bh=Ih/Lh,jh=1/Lh;function qh(e){if(!Number.isFinite(e))return e;const t=Math.round(e*Lh/Ih)*Ih/Lh;return Math.abs(t-e)<=1e-9*Bh?e:t}function Wh(e){return{x:qh(e.x),y:qh(e.y)}}function Uh(e){return Number.isFinite(e)?Math.min(Hh,Math.max(-Hh,e)):0}function Gh(e){return Number.isFinite(e)?Math.min(Oh,Math.max(-Oh,e)):0}const Vh=1/3,Kh=200;function Yh(e){let t=1/0,i=1/0,s=-1/0,n=-1/0;for(const o of e){const e=Number(o[0]),a=Number(o[1]);Number.isFinite(e)&&Number.isFinite(a)&&(es&&(s=e),a>n&&(n=a))}return t>s?null:{minX:t,minY:i,maxX:s,maxY:n}}function Jh(e){return e.poly&&e.poly.length?Yh(e.poly):null==e.x||null==e.y?null:Yh([[e.x,e.y],[e.x+(e.w||0),e.y+(e.h||0)]])}function Xh(e,t){const i=[];for(const t of e.rooms||[]){const e=Jh(t);e&&i.push(e)}if(e.bg){const t=Yh(Yr(e.bg));t&&i.push(t)}for(const e of t||[])if(Array.isArray(e)){const t=Yh([e]);t&&i.push(t)}else i.push(e);return i}const Zh=e=>{if(!e.length)return 0;const t=[...e].sort((e,t)=>e-t),i=t.length>>1;return t.length%2?t[i]:(t[i-1]+t[i])/2},Qh=e=>{let t=1/0,i=1/0,s=-1/0,n=-1/0;for(const o of e)o.minXs&&(s=o.maxX),o.maxY>n&&(n=o.maxY);return t>s||i>n?null:{x:t,y:i,w:s-t,h:n-i}};function ed(e,t){let{x:i,y:s,w:n,h:o}=e;n<30&&(i=i+n/2-100,n=Kh),o<30&&(s=s+o/2-100,o=Kh);const a=Math.max(n,o)*t;return{x:i-a,y:s-a,w:n+2*a,h:o+2*a}}function td(e,t={}){const i=t.pad??.05,s=t.k??10,n=t.minSpread??50,o=e.filter(e=>Number.isFinite(e.minX)&&Number.isFinite(e.minY)&&Number.isFinite(e.maxX)&&Number.isFinite(e.maxY)&&Math.abs(e.minX)<=Hh&&Math.abs(e.maxX)<=Hh&&Math.abs(e.minY)<=Hh&&Math.abs(e.maxY)<=Hh);if(!o.length)return{core:null,all:null,outliers:0};const a=Qh(o);if(o.length<4){const e=ed(a,i);return{core:e,all:e,outliers:0}}const r=o.map(e=>(e.minX+e.maxX)/2),l=o.map(e=>(e.minY+e.maxY)/2),c=Zh(r),h=Zh(l),d=o.map((e,t)=>Math.max(Math.abs(r[t]-c),Math.abs(l[t]-h))),p=Math.max(((e,t)=>e.length?e[Math.min(e.length-1,Math.max(0,Math.round(t*(e.length-1))))]:0)([...d].sort((e,t)=>e-t),.75),n),u=d.map(e=>e>s*p),_=u.filter(Boolean).length,m=_&&_<=o.length*Vh?o.filter((e,t)=>!u[t]):o;return{core:ed(Qh(m)||a,i),all:ed(a,i),outliers:m===o?0:_}}function id(e,t,i=.05){const s=td(Xh(e,t),{pad:i});if(s.core)return s.core;const n=e.vb&&4===e.vb.length&&e.vb[2]>0&&e.vb[3]>0?e.vb:[0,0,Ih,Ih];return{x:n[0],y:n[1],w:n[2],h:n[3]}}function sd(e){const t=id(e);return{x:t.x+t.w/2,y:t.y+t.h/2}}function nd(e){const t=[];for(const i of e.rooms||[]){const e=Jh(i);e&&t.push(e)}const i=td(t,{pad:0}).core,s=Ih*Ch(e.cellCm??5);return i?Math.max(s,Math.min(Hh,Math.max(i.w,i.h))):s}function od(e,t,i,s=1){const n=Number(i),o=Number.isFinite(s)&&s>0?s:1;return!Number.isFinite(n)||n<=0?e*o:e*nd(t)*o/n}const ad=[1,2,5,10,20,50,100,200,500,1e3];function rd(e){if(e.poly&&e.poly.length){const t=e.poly.map(e=>e[0]),i=e.poly.map(e=>e[1]),s=Math.min(...t),n=Math.min(...i);return{x:s,y:n,w:Math.max(...t)-s,h:Math.max(...i)-n}}return{x:e.x??0,y:e.y??0,w:e.w??0,h:e.h??0}}function ld(e,t,i,s){const n=i["rl_"+(e.id||"")];if(n&&n.s===t)return{x:n.x*Ih,y:n.y*Ih};const o=function(e){if(e.poly){const t=e.poly.length;return[e.poly.reduce((e,t)=>e+t[0],0)/t,e.poly.reduce((e,t)=>e+t[1],0)/t]}return[e.x+e.w/2,e.y+.1*Math.min(e.w,e.h)]}(e);return Wh({x:o[0],y:o[1]})}const cd=["furniture","appliance","sanitary","other"],hd=[{id:"sofa",group:"furniture",w:220,h:90,g:[["r",0,0,1,1],["l",.09,.26,.91,.26],["l",.09,.26,.09,1],["l",.91,.26,.91,1],["l",.5,.26,.5,1]]},{id:"armchair",group:"furniture",w:90,h:85,g:[["r",0,0,1,1],["l",.14,.28,.86,.28],["l",.14,.28,.14,1],["l",.86,.28,.86,1]]},{id:"coffee_table",group:"furniture",w:110,h:60,g:[["r",0,0,1,1],["r",.08,.14,.84,.72]]},{id:"table_dining",group:"furniture",w:140,h:80,g:[["r",0,0,1,1],["r",.06,.11,.88,.78]]},{id:"table_round",group:"furniture",w:120,h:120,g:[["e",.5,.5,.5,.5],["e",.5,.5,.41,.41]]},{id:"chair",group:"furniture",w:45,h:45,g:[["r",0,0,1,.18],["r",.06,.18,.88,.8]]},{id:"desk",group:"furniture",w:120,h:60,g:[["r",0,0,1,1],["r",.63,.07,.31,.86],["l",.63,.5,.94,.5]]},{id:"bed_double",group:"furniture",w:160,h:200,g:[["r",0,0,1,1],["r",0,0,1,.07],["r",.06,.1,.4,.15],["r",.54,.1,.4,.15],["l",0,.33,1,.33]]},{id:"bed_single",group:"furniture",w:90,h:200,g:[["r",0,0,1,1],["r",0,0,1,.07],["r",.15,.1,.7,.15],["l",0,.33,1,.33]]},{id:"nightstand",group:"furniture",w:45,h:40,g:[["r",0,0,1,1],["r",.12,.14,.76,.33],["r",.12,.53,.76,.33]]},{id:"wardrobe",group:"furniture",w:100,h:60,g:[["r",0,0,1,1],["l",0,.72,1,.72],["l",.5,.72,.5,1]]},{id:"bookshelf",group:"furniture",w:80,h:30,g:[["r",0,0,1,1],["l",.34,0,.34,1],["l",.67,0,.67,1]]},{id:"fridge",group:"appliance",w:60,h:65,g:[["r",0,0,1,1],["l",0,.36,1,.36],["l",.83,.44,.83,.64]]},{id:"stove",group:"appliance",w:60,h:60,g:[["r",0,0,1,1],["e",.29,.31,.15,.15],["e",.71,.31,.15,.15],["e",.29,.71,.15,.15],["e",.71,.71,.15,.15]]},{id:"dishwasher",group:"appliance",w:60,h:60,g:[["r",0,0,1,1],["r",.1,.12,.8,.76],["e",.5,.5,.27,.27],["e",.5,.5,.13,.13]]},{id:"washer",group:"appliance",w:60,h:60,g:[["r",0,0,1,1],["l",.08,.17,.92,.17],["e",.5,.57,.3,.3],["e",.5,.57,.14,.14]]},{id:"dryer",group:"appliance",w:60,h:60,g:[["r",0,0,1,1],["l",.08,.17,.92,.17],["e",.5,.57,.3,.3],["p",.36,.5,.5,.64,.64,.5]]},{id:"tv",group:"appliance",w:120,h:30,g:[["r",0,0,1,.42],["l",.5,.42,.5,.72],["l",.3,.72,.7,.72]]},{id:"ac",group:"appliance",w:90,h:25,g:[["r",0,0,1,1],["l",.05,.55,.95,.55],["l",.05,.79,.95,.79]]},{id:"water_heater",group:"appliance",w:45,h:45,g:[["e",.5,.5,.5,.5],["e",.5,.5,.31,.31]]},{id:"toilet",group:"sanitary",w:40,h:70,g:[["r",.06,0,.88,.2],["e",.5,.58,.37,.35],["e",.5,.58,.22,.2]]},{id:"bathtub",group:"sanitary",w:170,h:75,g:[["r",0,0,1,1],["r",.05,.11,.77,.78],["e",.89,.5,.045,.1]]},{id:"shower",group:"sanitary",w:90,h:90,g:[["r",0,0,1,1],["l",0,0,1,1],["l",1,0,0,1],["e",.5,.5,.08,.08]]},{id:"sink",group:"sanitary",w:60,h:45,g:[["r",0,0,1,1],["e",.5,.6,.34,.3],["e",.5,.15,.07,.07]]},{id:"kitchen_sink",group:"sanitary",w:80,h:60,g:[["r",0,0,1,1],["r",.06,.24,.44,.64],["r",.54,.24,.4,.64],["e",.5,.12,.06,.06]]},{id:"bidet",group:"sanitary",w:40,h:55,g:[["e",.5,.5,.44,.5],["e",.5,.5,.26,.3]]},{id:"stairs",group:"other",w:100,h:280,g:[["r",0,0,1,1],["l",0,.111,1,.111],["l",0,.222,1,.222],["l",0,.333,1,.333],["l",0,.444,1,.444],["l",0,.556,1,.556],["l",0,.667,1,.667],["l",0,.778,1,.778],["l",0,.889,1,.889],["l",.5,.93,.5,.06],["p",.38,.16,.5,.06,.62,.16]]},{id:"fireplace",group:"other",w:120,h:40,g:[["r",0,0,1,1],["p",.22,1,.22,.42,.78,.42,.78,1]]},{id:"plant",group:"other",w:40,h:40,g:[["e",.5,.5,.22,.22],["l",.5,.28,.5,.02],["l",.5,.72,.5,.98],["l",.28,.5,.02,.5],["l",.72,.5,.98,.5],["l",.34,.34,.13,.13],["l",.66,.66,.87,.87],["l",.66,.34,.87,.13],["l",.34,.66,.13,.87]]},{id:"rug",group:"other",w:200,h:140,g:[["r",0,0,1,1],["r",.06,.09,.88,.82]]}],dd=new Map(hd.map(e=>[e.id,e]));function pd(e){return e&&dd.get(e)||null}function ud(e){return hd.filter(t=>t.group===e)}function _d(e,t,i=Bh,s=1e3){const n=Number(t)>0?Number(t):5;return(Number(e)||0)/n*i/s}const md=5e-4,gd=Oh;function fd(e){return Number.isFinite(e)?Math.max(md,Math.min(gd,e)):md}const vd=e=>{const t=Math.round(1e3*e)/1e3;return Object.is(t,-0)?"0":String(t)};function bd(e,t,i){const s=pd(e);if(!(s&&t>0&&i>0))return"";const n=e=>vd(e*t),o=e=>vd(e*i),a=[];for(const e of s.g)if("r"===e[0]){const[,t,i,s,r]=e;a.push(`M${n(t)} ${o(i)}H${n(t+s)}V${o(i+r)}H${n(t)}Z`)}else if("l"===e[0]){const[,t,i,s,r]=e;a.push(`M${n(t)} ${o(i)}L${n(s)} ${o(r)}`)}else if("e"===e[0]){const[,s,r,l,c]=e;a.push(`M${n(s-l)} ${o(r)}A${vd(l*t)} ${vd(c*i)} 0 0 1 ${n(s+l)} ${o(r)}A${vd(l*t)} ${vd(c*i)} 0 0 1 ${n(s-l)} ${o(r)}Z`)}else{const t=e.slice(1);if(t.length<4)continue;let i=`M${n(t[0])} ${o(t[1])}`;for(let e=2;e+1{let t=(e%360+360)%360;return t>180&&(t-=360),t};function wd(e,t,i,s,n,o=0){let a=null,r=n;for(const n of s){const[s,l,c,h]=n,d=c-s,p=h-l,u=d*d+p*p;if(!u)continue;const _=Math.sqrt(u);let m=((e-s)*d+(t-l)*p)/u;m=Math.max(0,Math.min(1,m));let g=s+m*d,f=l+m*p;const v=Math.hypot(e-g,t-f);if(!(v0){const e=Math.round(m*_/o)*o;g=s+e/_*d,f=l+e/_*p}a={cx:g+b*(i/2),cy:f+y*(i/2),angle:yd(180*Math.atan2(-b,y)/Math.PI),dist:v}}return a}const kd=1e-9,xd=e=>`${e[0].toFixed(6)},${e[1].toFixed(6)}`,$d=(e,t)=>Math.hypot(t[0]-e[0],t[1]-e[1]),Sd=(e,t)=>Math.atan2(t[1]-e[1],t[0]-e[0]),Md=e=>Array.isArray(e)&&e.length>=2&&e.every(e=>Number.isFinite(e)),Cd=e=>(e||[]).filter(e=>Md(e?.a)&&Md(e?.b)&&$d(e.a,e.b)>kd);function Dd(e,{minAngleDeg:t=15,maxValence:i=6}={}){const s=new Map;for(const t of Cd(e))for(const[e,i]of[[t.a,t.b],[t.b,t.a]]){const t=s.get(xd(e))||[];t.push(Sd(e,i)),s.set(xd(e),t)}const n=[];for(const[e,o]of s){if(o.length>i&&n.push({rule:"valence",subject:e,actual:o.length,limit:i}),o.length<2)continue;const s=[...o].sort((e,t)=>e-t);let a=1/0;for(let e=0;ekd&&i(180*Math.atan2(e.b[1]-e.a[1],e.b[0]-e.a[0])/Math.PI%180+180)%180;function Td(e,t){const i=Cd(t),s=new Map;for(const e of i)for(const t of[e.a,e.b])s.set(xd(t),[...s.get(xd(t))||[],e]);const n=new Set([e]);let o=$d(e.a,e.b);const a=(e,t)=>{const i=(s.get(xd(t))||[]).find(t=>!n.has(t)&&((e,t,i=1)=>{const s=Math.abs(Pd(e)-Pd(t));return Math.min(s,180-s)<=i})(t,e)&&Number(t.cm||0)===Number(e.cm||0));i&&(n.add(i),o+=$d(i.a,i.b),a(i,xd(i.a)===xd(t)?i.b:i.a))};return a(e,e.a),a(e,e.b),o}function Id(e,t,i,{minLengthCm:s=20}={}){const n=[],o=Cd(e);for(const e of o){const a=Td(e,o)/i*(t||1),r=Math.max(s,Number(e.cm)>0?Number(e.cm):0);a{const s=i[0]-t[0],n=i[1]-t[1],o=s*s+n*n,a=o<=kd?0:Math.max(0,Math.min(1,((e[0]-t[0])*s+(e[1]-t[1])*n)/o));return Math.hypot(e[0]-(t[0]+s*a),e[1]-(t[1]+n*a))};function Ad(e,t,i,{minDistanceCm:s=5}={}){const n=Cd(e),o=new Map;for(const e of n)o.set(xd(e.a),e.a),o.set(xd(e.b),e.b);const a=((e,t,i)=>e/(t||1)*i)(s,t,i),r=[],l=[...o.entries()];for(let e=0;e{const s=o[(i+1)%o.length];return e+(t[0]*s[1]-s[0]*t[1])},0))/2,r=(i||1)/s,l=a*r*r;return l0?i:1;return{a:[e[0]/s,e[1]/s],b:[t[0]/s,t[1]/s]}}function Nd(e,t){const i=t>0?t:1;return[e.a[0]*i,e.a[1]*i,e.b[0]*i,e.b[1]*i]}function Ed(e){return Array.isArray(e)&&e.length>=2&&Number.isFinite(Number(e[0]))&&Number.isFinite(Number(e[1]))}function Od(e){if(!Array.isArray(e))return[];const t=[];for(const i of e){if(!i||"object"!=typeof i)continue;const e=i;if(!Ed(e.a)||!Ed(e.b))continue;const s=[Number(e.a[0]),Number(e.a[1])],n=[Number(e.b[0]),Number(e.b[1])];Math.hypot(n[0]-s[0],n[1]-s[1])<.001||t.push({a:s,b:n})}return t}function Hd(e,t,i,s,n=!0){const o=(e||[]).filter(e=>e?.id),a=Od(t);if(a.length)return function(e,t,i,s){const n=Od(e);if(!n.length)return[];const o=function(e,t){const i=[],s=(e||[]).filter(e=>e?.id);for(let e=0;e4*s||o>4*s)continue;const a=(e[0]-n)*p+(e[1]-l)*u,c=(e[2]-n)*p+(e[3]-l)*u,h=Math.max(0,Math.min(a,c)),m=Math.min(d,Math.max(a,c));if(m-he.lo-t.lo||e.hi-t.hi);const i=[];for(const e of t){const t=i[i.length-1];t&&e.lo<=t.hi+r?t.hi=Math.max(t.hi,e.hi):i.push({...e})}for(const t of i){const i=[n+p*t.lo,l+u*t.lo],s=[n+p*t.hi,l+u*t.hi];Math.hypot(s[0]-i[0],s[1]-i[1])i.pair===e&&Math.abs(i.ux*a-i.uy*o)<=1e-6&&Math.abs((t[0]-i.origin[0])*i.uy-(t[1]-i.origin[1])*i.ux)<=c&&Math.abs((t[2]-i.origin[0])*i.uy-(t[3]-i.origin[1])*i.ux)<=c);h||(h={pair:e,origin:[t[0],t[1]],ux:o,uy:a,ranges:[]},l.push(h));const d=(t[0]-h.origin[0])*h.ux+(t[1]-h.origin[1])*h.uy,p=(t[2]-h.origin[0])*h.ux+(t[3]-h.origin[1])*h.uy;h.ranges.push({lo:Math.min(d,p),hi:Math.max(d,p)})}const h=[];for(const e of l){e.ranges.sort((e,t)=>e.lo-t.lo||e.hi-t.hi);const t=[];for(const i of e.ranges){const e=t[t.length-1];e&&i.lo<=e.hi+r?e.hi=Math.max(e.hi,i.hi):t.push({...i})}for(const s of t){const t=[e.origin[0]+e.ux*s.lo,e.origin[1]+e.uy*s.lo],n=[e.origin[0]+e.ux*s.hi,e.origin[1]+e.uy*s.hi];Math.hypot(n[0]-t[0],n[1]-t[1])>=r&&h.push(Fd(t,n,i))}}return h}(a,e,i,s).map(e=>Nd(e,i));if(!n)return[];const r=[],l=(e,t)=>(e.open_to||[]).includes(t.id)||(t.open_to||[]).includes(e.id);for(let e=0;e{const t=jd.get(e);if(!t)return;const i=Date.now();if("hidden"===e.visibilityState){t.hiddenAt||(t.hiddenAt=i);const e={kind:"hidden",token:t.token,at:i,hiddenFor:0,long:!1};for(const i of[...t.subscribers])i(e);return}const s=t.hiddenAt?Math.max(0,i-t.hiddenAt):0;t.hiddenAt=0,t.token++;const n={kind:"visible",token:t.token,at:i,hiddenFor:s,long:s>=Ld};for(const e of[...t.subscribers])e(n)},onPageShow:t=>{const i=jd.get(e);if(!i)return;const s=Date.now();i.token++;const n={kind:"pageshow",token:i.token,at:s,hiddenFor:0,long:!!t.persisted,persisted:!!t.persisted};for(const e of[...i.subscribers])e(n)}},jd.set(e,i),e.addEventListener("visibilitychange",i.onVisibility),e.defaultView?.addEventListener("pageshow",i.onPageShow)}return i.subscribers.add(t),()=>{const i=jd.get(e);i&&(i.subscribers.delete(t),i.subscribers.size||(e.removeEventListener("visibilitychange",i.onVisibility),e.defaultView?.removeEventListener("pageshow",i.onPageShow),jd.delete(e)))}}const Wd={now:()=>Date.now(),setTimeout:(e,t)=>window.setTimeout(e,t),clearTimeout:e=>window.clearTimeout(e),requestAnimationFrame:e=>window.requestAnimationFrame(e),cancelAnimationFrame:e=>window.cancelAnimationFrame(e)};class Ud{constructor(e,t=Wd){this.onChange=e,this.clock=t,this._state="steady",this._token=0,this._frameFingerprint="",this._hasCompleteFrame=!1,this._overlayPhase="none",this._recoveryReason=null,this._overlayTimer=0,this._overlayRaf=0,this._overlayOpaqueAt=0,this._barrierRafs=new Set,this._trace=[],this._disposed=!1}get state(){return this._state}get token(){return this._token}get frameFingerprint(){return this._frameFingerprint}get hasCompleteFrame(){return this._hasCompleteFrame}get overlayPhase(){return this._overlayPhase}get overlayVisible(){return"none"!==this._overlayPhase}get overlayBlocksInteraction(){return this.overlayVisible}get recoveryReason(){return this._recoveryReason}get trace(){return this._trace.map(e=>({...e,...e.stage?{stage:[...e.stage]}:{}}))}note(e,t={}){this.record(e,void 0,t)}record(e,t,i={}){this._trace.push({at:this.clock.now(),token:this._token,event:e,state:this._state,...t?{reason:t}:{},...i}),this._trace.length>80&&this._trace.splice(0,this._trace.length-80)}changed(){this._disposed||this.onChange()}adoptCompleteFrame(e){e&&(this._hasCompleteFrame=!0,this._frameFingerprint=e,this._state="steady",this._recoveryReason=null,this.clearOverlay(),this.record("frame-adopted"),this.changed())}markCompleteFrame(e){e&&(this._hasCompleteFrame=!0,this._frameFingerprint=e,this._state="steady",this._recoveryReason=null,this.clearOverlay(),this.record("frame-complete"),this.changed())}refreshCompleteFrame(e){!this._disposed&&this._hasCompleteFrame&&"steady"===this._state&&e&&e!==this._frameFingerprint&&(this._frameFingerprint=e,this.record("frame-refreshed"))}visibility(e){return"hidden"===e.kind?(this.record("visibility-hidden"),this._token):e.long||"visible"!==e.kind&&"pageshow"!==e.kind?this.beginCandidate("pageshow"===e.kind?"pageshow":"long-resume"):(this.record("pageshow"===e.kind?"pageshow-noop":"visibility-visible-quick"),this._token)}beginCandidate(e,t="plan"){return this._token++,this._recoveryReason=t,this._hasCompleteFrame?(this._state="connection"===t?"offline-stale":"holding",this.clearOverlay()):this.overlayVisible?this._state="overlay-visible":(this._state="overlay-pending",this.scheduleOverlay(t)),this.record("candidate-start",e),this.changed(),this._token}connectionLost(){return this.beginCandidate("connection-lost","connection")}candidateReady(e){return!this._disposed&&e===this._token&&(this._state="candidate-ready",this.record("candidate-ready"),this.changed(),!0)}async commitAfterPaint(e,t){if(this._disposed||e!==this._token)return!1;let i=!0;const s=(async()=>{for(await t.updateComplete();i&&!this._disposed&&e===this._token;)if(t.stageValid()&&t.assetsReady()){if(await this.nextFrame(),e!==this._token||!t.stageValid()||!t.assetsReady())continue;if(await this.nextFrame(),e===this._token&&t.stageValid()&&t.assetsReady())return!0}else await this.nextFrame();return!1})();let n=0;const o=new Promise(e=>{n=this.clock.setTimeout(()=>e({ready:!1,timedOut:!0}),Bd)}),a=await Promise.race([s.then(e=>({ready:e,timedOut:!1})),o]);return i=!1,this.clock.clearTimeout(n),!this._disposed&&e===this._token&&(!(!a.ready&&!a.timedOut)&&(a.ready?(this._hasCompleteFrame=!0,this._frameFingerprint=t.frameFingerprint(),this.record("paint-barrier"),this.finishOverlayAfterCommit(),!0):(this.record("paint-barrier-timeout"),this._hasCompleteFrame?(this._state="connection"===this._recoveryReason?"offline-stale":"steady",this.clearOverlay()):(this._state="recovery-error","opaque"!==this._overlayPhase&&this.showOverlayNow()),this.changed(),!1)))}retry(e=this._recoveryReason||"plan"){return this.beginCandidate("retry",e)}nextFrame(){return new Promise(e=>{const t=this.clock.requestAnimationFrame(()=>{this._barrierRafs.delete(t),e()});this._barrierRafs.add(t)})}scheduleOverlay(e){this.clearOverlayTimer(),this._recoveryReason=e,this._overlayTimer=this.clock.setTimeout(()=>{this._overlayTimer=0,this._hasCompleteFrame||"overlay-pending"!==this._state&&"candidate-ready"!==this._state||(this._state="overlay-visible",this._overlayPhase="entering",this.record("overlay-enter"),this.changed(),this._overlayRaf=this.clock.requestAnimationFrame(()=>{this._overlayRaf=0,"entering"===this._overlayPhase&&(this._overlayPhase="fading-in",this.changed(),this._overlayTimer=this.clock.setTimeout(()=>{this._overlayTimer=0,"fading-in"===this._overlayPhase&&(this._overlayPhase="opaque",this._overlayOpaqueAt=this.clock.now(),this.record("overlay-opaque"),this.changed())},150))}))},150)}showOverlayNow(){this.clearOverlayTimer(),this._overlayPhase="opaque",this._overlayOpaqueAt=this.clock.now(),this.record("overlay-error")}finishOverlayAfterCommit(){if(this.clearOverlayTimer(),"none"===this._overlayPhase||"entering"===this._overlayPhase||"fading-in"===this._overlayPhase)return this.clearOverlay(),this._state="steady",this._recoveryReason=null,this.record("candidate-committed"),void this.changed();const e=Math.max(0,this._overlayOpaqueAt+250-this.clock.now());this._overlayTimer=this.clock.setTimeout(()=>{this._overlayTimer=0,this._overlayPhase="leaving",this.record("overlay-leave"),this.changed(),this._overlayTimer=this.clock.setTimeout(()=>{this._overlayTimer=0,this._overlayPhase="none",this._state="steady",this._recoveryReason=null,this.record("candidate-committed"),this.changed()},180)},e)}clearOverlayTimer(){this._overlayTimer&&this.clock.clearTimeout(this._overlayTimer),this._overlayTimer=0}clearOverlay(){this.clearOverlayTimer(),this._overlayRaf&&this.clock.cancelAnimationFrame(this._overlayRaf),this._overlayRaf=0,this._overlayPhase="none",this._overlayOpaqueAt=0}dispose(){this._disposed=!0,this._token++,this.clearOverlay();for(const e of this._barrierRafs)this.clock.cancelAnimationFrame(e);this._barrierRafs.clear()}}function Gd(e){let t=2166136261,i=2654435769;const s=new WeakSet,n=e=>{for(let s=0;s>>0)+(i>>>2)}},o=e=>{if(null===e)return void n("n");const t=typeof e;if("string"===t)return void n(`s${e.length}:${e}`);if("number"===t)return void n(`d${Number.isNaN(e)?"NaN":String(e)}`);if("boolean"===t)return void n(e?"t":"f");if("undefined"===t)return void n("u");if("object"!==t)return void n(`${t}:${String(e)}`);const i=e;if(s.has(i))n("[cycle]");else{if(s.add(i),Array.isArray(e)){n("[");for(const t of e)o(t);return n("]"),void s.delete(i)}n("{");for(const t of Object.keys(e).sort())n(t),o(e[t]);n("}"),s.delete(i)}};return o(e),`${(t>>>0).toString(16).padStart(8,"0")}${(i>>>0).toString(16).padStart(8,"0")}`}function Vd(e){return Gd(e)}const Kd=new WeakMap;class Yd{constructor(e,t=()=>Date.now()){this.onUpdate=e,this.now=t,this.fallbackAuthority={},this.referenceOwner={},this.referenced=new Set,this.queued=new Set,this.disposed=!1,this.sharedUpdate=()=>{this.disposed||this.onUpdate()}}bind(e){const t=((e,t)=>{const i=e?.connection||e?.callWS||t;return!i||"object"!=typeof i&&"function"!=typeof i?t:i})(e,this.fallbackAuthority);return this.shared&&this.authority===t||(this.shared&&(this.shared.listeners.delete(this.sharedUpdate),this.shared.references.delete(this.referenceOwner)),this.authority=t,this.shared=(e=>{let t=Kd.get(e);return t||(t={signed:{},queued:new Set,inFlight:new Map,retry:new Map,listeners:new Set,settlers:new Set,references:new Map},Kd.set(e,t)),t})(t),this.disposed||(this.shared.listeners.add(this.sharedUpdate),this.shared.references.set(this.referenceOwner,new Set(this.referenced)))),this.shared}start(e,t){this.disposed=!1,this.referenced=new Set(t());const i=this.bind(e());i.listeners.add(this.sharedUpdate),i.references.set(this.referenceOwner,new Set(this.referenced)),this.stopTimer(),this.resignTimer=setInterval(()=>this.resign(e(),t()),288e5)}dispose(){if(this.disposed=!0,this.stopTimer(),clearTimeout(this.batchTimer),this.shared){this.shared.listeners.delete(this.sharedUpdate),this.shared.references.delete(this.referenceOwner);for(const e of this.queued)this.shared.queued.delete(e)}this.queued.clear()}invalidate(e){const t=this.bind(e);clearTimeout(this.batchTimer),this.queued.clear(),t.queued.clear(),t.inFlight.clear(),t.retry.clear(),t.signed={}}stopTimer(){void 0!==this.resignTimer&&clearInterval(this.resignTimer),this.resignTimer=void 0}display(e,t){const i=As(t);if(!i.startsWith("/api/houseplan/content/"))return i;const s=this.bind(e);this.referenced.add(i),s.references.set(this.referenceOwner,new Set(this.referenced));const n=s.signed[i],o=n?this.now()-n.at:1/0;return o{const t=[...this.queued];this.queued.clear();for(const e of t)i.queued.delete(e);this.sign(e,t)},30))}sign(e,t){if(!t.length||!e?.callWS)return;const i=this.bind(e);for(const s of function(e,t){const i=Math.max(1,Math.floor(t)),s=[];for(let t=0;t{const s=i.inFlight.get(e);return!(void 0!==s&&t-s<15e3)&&(i.inFlight.set(e,t),!0)});n.length&&e.callWS({type:"houseplan/content/sign",paths:n}).then(e=>{const t=this.now();let s=0,o=!1;for(const a of n){const n=e?.urls?.[a];if("string"==typeof n&&n){const e=i.signed[a];e?.loaded&&e.url!==n?(e.pending={url:n,at:t},this.preloadReplacement(i,a,n,t)):(i.signed[a]={url:n,at:t,loaded:e?.url===n&&!!e.loaded},o=!0),i.retry.delete(a),s++}else this.backOff(i,a)}if(s&&(this.trimShared(i),o))for(const e of[...i.listeners])e()}).catch(()=>{for(const e of n)this.backOff(i,e)}).finally(()=>{for(const e of n)i.inFlight.get(e)===t&&i.inFlight.delete(e);for(const e of[...i.settlers])e()})}}preloadReplacement(e,t,i,s){const n=()=>{const n=e.signed[t];if(n?.pending?.url===i){e.signed[t]={url:i,at:s,loaded:!0},e.retry.delete(t),this.trimShared(e);for(const t of[...e.listeners])t()}},o=()=>{const s=e.signed[t];s?.pending?.url===i&&(delete s.pending,this.backOff(e,t))};if("undefined"==typeof Image)return void n();const a=new Image;a.onload=()=>{("function"==typeof a.decode?a.decode():Promise.resolve()).then(n).catch(o)},a.onerror=o,a.src=i}preloadCurrentImage(e,t,i){if(i.loaded)return Promise.resolve(!0);if(i.preload)return i.preload;if("undefined"==typeof Image)return i.loaded=!0,Promise.resolve(!0);const s=i.url;return i.preload=new Promise(n=>{const o=new Image;let a=!1;const r=o=>{if(a)return;a=!0,clearTimeout(l);const r=e.signed[t];if(r===i&&delete r.preload,o&&r===i&&r.url===s){r.loaded=!0;for(const t of[...e.listeners])t();n(!0)}else o||r!==i||this.backOff(e,t),n(!1)};o.onload=()=>{("function"==typeof o.decode?o.decode():Promise.resolve()).then(()=>r(!0)).catch(()=>r(!1))},o.onerror=()=>r(!1);const l=setTimeout(()=>r(!1),Bd);o.src=s}),i.preload}prepareImage(e,t){const i=As(t);if(!i.startsWith("/api/houseplan/content/"))return Promise.resolve(!0);const s=this.bind(e),n=()=>{const t=s.signed[i];if(t&&this.now()-t.atthis.now()&&!s.inFlight.has(i)&&!s.queued.has(i)?Promise.resolve(!1):null},o=n();return o?(a=o,new Promise(e=>{let t=!1;const i=i=>{t||(t=!0,clearTimeout(s),e(i))},s=setTimeout(()=>i(!1),Bd);a.then(i).catch(()=>i(!1))})):new Promise(e=>{let t=!1,i=null;const o=i=>{t||(t=!0,clearTimeout(r),s.settlers.delete(a),e(i))},a=()=>{t||i||(i=n(),i&&i.then(o).catch(()=>o(!1)))},r=setTimeout(()=>o(!1),Bd);s.settlers.add(a),a()});var a}backOff(e,t){const i=e.retry.get(t)?.delay||0,s=Math.min(6e4,i?2*i:2e3);e.retry.set(t,{notBefore:this.now()+s,delay:s})}trimShared(e){const t=Object.entries(e.signed);if(t.length<=512)return;const i=new Set(e.inFlight.keys());for(const t of e.references.values())for(const e of t)i.add(e);for(const[e,s]of t)(s.pending||s.preload)&&i.add(e);t.sort((e,t)=>t[1].at-e[1].at);const s=t.filter(([e])=>i.has(e));for(const e of t){if(s.length>=512)break;i.has(e[0])||s.push(e)}e.signed=Object.fromEntries(s)}resign(e,t){const i=this.bind(e);this.referenced=new Set(t),i.references.set(this.referenceOwner,new Set(this.referenced));const s=this.now(),n=new Set;for(const e of i.references.values())for(const t of e)n.add(t);const o={};for(const[e,t]of Object.entries(i.signed))n.has(e)&&s-t.at!!o[e]&&!o[e].pending))}markLoaded(e,t,i){const s=As(t);if(!s.startsWith("/api/houseplan/content/"))return;const n=this.bind(e).signed[s];if(n&&(!i||n.url===i)&&!n.loaded){n.loaded=!0;for(const t of[...this.bind(e).listeners])t()}}isReady(e,t){const i=As(t);if(!i.startsWith("/api/houseplan/content/"))return!0;const s=this.bind(e).signed[i];return!!s&&this.now()-s.ate.id===t)}function Xd(e="file"){const t="draw"===e;return{source:e,showBorders:t,showNames:t,displayTouched:!1}}function Zd(e,t){if(e.displayTouched)return{...e,source:t};const i="draw"===t;return{...e,source:t,showBorders:i,showNames:i}}function Qd(e,t,i){return{...e,[t]:i,displayTouched:!0}}function ep(e,t,i){return[e[0]*t+e[1]*i+e[2],e[3]*t+e[4]*i+e[5]]}function tp(e,t){let i=0;for(const[s,n]of t){const t=ep(e,s[0],s[1]);i=Math.max(i,Math.hypot(t[0]-n[0],t[1]-n[1]))}return i}const ip=e=>{if(null==e||""===e)return null;const t=Number(e);return Number.isFinite(t)?t:null},sp=e=>{const t=e,i=ip(Array.isArray(t)?t[0]:t?.x),s=ip(Array.isArray(t)?t[1]:t?.y);return null==i||null==s?null:[i,s]};function np(e){if(!Array.isArray(e))return null;const t=[];for(const i of e){const e=sp(i);if(!e)return null;t.push(e)}if(t.length>1){const e=t[0],i=t[t.length-1];e[0]===i[0]&&e[1]===i[1]&&t.pop()}if(t.length<3)return null;let i=0,s=0,n=0;for(let e=0;ee+t[0],0)/t.length,t.reduce((e,t)=>e+t[1],0)/t.length]:[s/(3*i),n/(3*i)]}function op(e){if(!Array.isArray(e))return null;const t=[];for(const i of e){const e=sp(i);if(!e)return null;t.push(e)}if(t.length>1){const e=t[0],i=t[t.length-1];e[0]===i[0]&&e[1]===i[1]&&t.pop()}const i=np(t);if(!i)return null;const s=t.map(e=>e[0]),n=t.map(e=>e[1]);return{centroid:i,bbox:[Math.min(...s),Math.min(...n),Math.max(...s),Math.max(...n)]}}function ap(e){let t=e;if(t&&"object"==typeof t&&!Array.isArray(t)){const e=t;t=e.path??e.points??t}if(!Array.isArray(t)||!t.length)return[];let i=(t.some(e=>(e=>Array.isArray(e)?e.length>=2&&!Array.isArray(e[0])&&("object"!=typeof e[0]||null==e[0]):!!e&&"object"==typeof e&&("x"in e||"y"in e))(e))?[t]:t.filter(Array.isArray)).map(e=>e.map(sp).filter(e=>null!=e)).filter(e=>e.length>=2);i.length>64&&(i=i.slice(-64));const s=i.reduce((e,t)=>e+t.length,0);if(s<=4e3)return i.map(e=>e.slice());const n=4e3-2*i.length,o=i.map(e=>e.length-2),a=o.reduce((e,t)=>e+t,0),r=o.map(e=>n*e/a),l=r.map(Math.floor);let c=n-l.reduce((e,t)=>e+t,0);const h=r.map((e,t)=>({index:t,fraction:e-Math.floor(e)})).sort((e,t)=>t.fraction-e.fraction||e.index-t.index);for(let e=0;efunction(e,t){if(t>=e.length)return e.slice();if(t<=2)return[e[0],e[e.length-1]];const i=[];for(let s=0;se.slice()),i=t[t.length-1];return i?(i.length>2?i.pop():t.pop(),t):[]}function cp(e){if(!e)return null;const t=e.vacuum_position||e.robot_position||null,i=t&&null!=ip(t.x)&&null!=ip(t.y)?{x:ip(t.x),y:ip(t.y),a:ip(t.a??t.angle??t.theta)}:null,s=ap(e.path?.path??e.path?.points??e.path),n=[],o=e.rooms,a=Array.isArray(o)?o.map((e,t)=>[String(e?.id??t),e]):o&&"object"==typeof o?Object.entries(o):[];for(const[e,t]of a){if(!t||"object"!=typeof t)continue;const i=String(t.name??t.label??"").trim(),s=[[ip(t.cx),ip(t.cy)],[ip(t.center?.x),ip(t.center?.y)],[ip(t.x),ip(t.y)]].find(([e,t])=>null!=e&&null!=t);let o=s?.[0]??null,a=s?.[1]??null;const r=op(t.outline),l=ip(t.x0),c=ip(t.y0),h=ip(t.x1),d=ip(t.y1),p=(null!=l&&null!=c&&null!=h&&null!=d?[Math.min(l,h),Math.min(c,d),Math.max(l,h),Math.max(c,d)]:null)||r?.bbox||null;if(null!=o&&null!=a||!r||([o,a]=r.centroid),null!=o&&null!=a||!p||(o=(p[0]+p[2])/2,a=(p[1]+p[3])/2),i&&null!=o&&null!=a){const t={id:e,name:i,cx:o,cy:a};p&&([t.x0,t.y0,t.x1,t.y1]=p),n.push(t)}}const r=function(e){return String(e.map_name??e.current_map??e.map_index??e.selected_map??"default")}(e);return i||n.length||s.length?{pos:i,path:s,rooms:n,mapId:r}:null}function hp(e,t,i){if(!e||!t)return null;const s=t.attributes||{},n=e.split(".")[0]||"",o=null!=i?.platform?String(i.platform):null,a=!!sp(s.vacuum_position??s.robot_position),r=!(!s.rooms||"object"!=typeof s.rooms),l=ap(s.path?.path??s.path?.points??s.path).length>0,c=[s.map_name,s.current_map,s.map_index,s.selected_map].some(e=>null!=e),h="xiaomi_cloud_map_extractor"===o,d=r||l||c;let p=null;if(a?p="compatible":h?p="known_xcme_incomplete":d?p="partial":"camera"===n&&(p="camera"),!p)return null;const u=a?"camera"===n?300:200:h?100:d?50:0;return{entityId:e,name:String(s.friendly_name||e),platform:o,category:p,hasPosition:a,hasRooms:r,hasPath:l,hasMapId:c,score:u}}const dp=e=>e.toLowerCase().replace(/[\s_\-.,]+/g,"");function pp(e,t){const i=new Map(t.map(e=>[dp(e.name),e])),s=[],n=[];for(const t of e){const e=i.get(dp(t.name));e&&(s.push([[t.cx,t.cy],[e.cx,e.cy]]),n.push(t.name))}if(s.length<3)return null;const o=function(e){if(e.length<3)return null;let t=0,i=0,s=0,n=0,o=0,a=0,r=0,l=0,c=0,h=0,d=0,p=0;for(const[[u,_],[m,g]]of e){if(![u,_,m,g].every(Number.isFinite))return null;t+=u*u,i+=u*_,s+=u,n+=_*_,o+=_,a+=1,r+=u*m,l+=_*m,c+=m,h+=u*g,d+=_*g,p+=g}const u=[t,i,s,i,n,o,s,o,a],_=e=>{const[t,i,s,n,o,a,r,l,c]=u,h=t*(o*c-a*l)-i*(n*c-a*r)+s*(n*l-o*r);if(!Number.isFinite(h)||Math.abs(h)<1e-9)return null;const d=[(o*c-a*l)/h,(s*l-i*c)/h,(i*a-s*o)/h,(a*r-n*c)/h,(t*c-s*r)/h,(s*n-t*a)/h,(n*l-o*r)/h,(i*r-t*l)/h,(t*o-i*n)/h];return[d[0]*e[0]+d[1]*e[1]+d[2]*e[2],d[3]*e[0]+d[4]*e[1]+d[5]*e[2],d[6]*e[0]+d[7]*e[1]+d[8]*e[2]]},m=_([r,l,c]),g=_([h,d,p]);if(!m||!g)return null;const f=[m[0],m[1],m[2],g[0],g[1],g[2]];return f.every(Number.isFinite)?f:null}(s);return o?{matrix:o,matched:n,residual:tp(o,s)}:null}function up(e,t,i){const s=e[e.length-1];if(s&&s[0]===t[0]&&s[1]===t[1])return e;if(e.push(t),e.length<=600)return e;let n=function(e,t){if(e.length<3)return e.slice();const i=new Uint8Array(e.length);i[0]=i[e.length-1]=1;const s=[[0,e.length-1]];for(;s.length;){const[n,o]=s.pop(),[a,r]=e[n],[l,c]=e[o],h=l-a,d=c-r,p=Math.hypot(h,d)||1e-9;let u=0,_=-1;for(let t=n+1;tu&&(u=i,_=t)}_>0&&u>t&&(i[_]=1,s.push([n,_],[_,o]))}const n=[];for(let t=0;t600&&(n=n.filter((e,t)=>t%2==0||t===n.length-1)),n}function _p(e){return"cleaning"===e||"returning"===e||"on"===e}const mp={0:[1,0],90:[0,1],180:[-1,0],270:[0,-1]};function gp(e){const[t,i]=mp[e.rot]||[1,0],s=e.mir?-1:1;return[e.s*t*s,-e.s*i,e.ox,e.s*i*s,e.s*t,e.oy]}function fp(e){const t=e[0]*e[4]-e[1]*e[3];if(!Number.isFinite(t)||Math.abs(t)<1e-12)return null;const i=t<0,s=Math.sqrt(Math.abs(t));let n=180*Math.atan2(-e[1],e[4])/Math.PI;return n=(90*Math.round(n/90)%360+360)%360,{ox:e[2],oy:e[5],s:s,rot:n,mir:i}}function vp(e,t,i,s){const[n,o]=ep(gp(t),i,s),a=gp({...e,ox:0,oy:0}),[r,l]=ep(a,i,s);return{...e,ox:n-r,oy:o-l}}function bp(e){const t=e?.trail_mode;return"never"===t||"cleaning"===t||"always"===t?t:!1===e?.trail?"never":"cleaning"}const yp=new Set(["group","template","derivative","min_max","threshold","integration","statistics","trend","utility_meter","tod","switch_as_x","schedule"]);function wp(e){const{hass:t,devices:i,markers:s,showEntities:n,currentBinding:o,currentDeviceId:a,labels:r}=e,l=wo(s),c=new Set(s.filter(e=>e.removed).map(e=>e.binding)),h=new Set;for(const e of i)e.id!==a&&("device"===e.bindingKind&&e.bindingRef&&h.add(`device:${e.bindingRef}`),"entity"===e.bindingKind&&e.bindingRef&&h.add(`entity:${e.bindingRef}`));const d=new Set;for(const e of i)"device"===e.bindingKind&&e.name&&d.add(`${e.name.trim()}|${e.area||""}`);const p=[];for(const e of Object.values(t?.devices||{})){if(!e||"service"===e.entry_type)continue;const t=`device:${e.id}`;if(h.has(t))continue;const i=String(e.name_by_user||e.name||e.id).trim();t!==o&&!c.has(t)&&d.has(`${i}|${e.area_id||""}`)||p.push({value:t,label:i,sub:(e.model||r.device)+("Group"===e.model?r.z2mGroup:""),kind:"device",ref:e.id,areaId:e.area_id||"",model:e.model||""})}for(const[e,i]of Object.entries(t?.entities||{})){const s=`entity:${e}`;if(h.has(s))continue;if(ko(t,e,l)&&!c.has(s))continue;const n=yp.has(i?.platform),o="group"===i?.platform;if(!n&&!o)continue;if(i?.hidden&&!c.has(s))continue;const a=t?.states?.[e];p.push({value:s,label:i?.name||a?.attributes?.friendly_name||e,sub:`${e.split(".")[0]} · ${o?r.group:r.helper}`,kind:"entity",ref:e,areaId:i?.area_id||i?.device_id&&t?.devices?.[i.device_id]?.area_id||"",model:"",parentDeviceId:i?.device_id||void 0})}if(n){const e=new Set(p.map(e=>e.value));for(const[i,s]of Object.entries(t?.entities||{})){const n=`entity:${i}`;if(h.has(n)||e.has(n)||s?.hidden&&!c.has(n))continue;const o=!!s?.device_id&&l.devices.has(s.device_id);if(ko(t,i,l)&&!c.has(n)&&!o)continue;const a=t?.states?.[i],d=s?.device_id?t?.devices?.[s.device_id]:null,u=d?String(d.name_by_user||d.name||""):"";p.push({value:n,label:s?.name||a?.attributes?.friendly_name||i,sub:`${i.split(".")[0]} · ${r.entity}${u?` · ${u}`:""}`,kind:"entity",ref:i,areaId:s?.area_id||d?.area_id||"",model:"",parentDeviceId:s?.device_id||void 0})}}return p.sort((e,t)=>e.label.localeCompare(t.label)||e.value.localeCompare(t.value))}const kp={kind:"active",enabledEntityIds:[],allEntityIds:[]};function xp(e){return e.startsWith("entity:")?"entity":"device"}function $p(e){const t=e.binding.indexOf(":"),i=t>=0?e.binding.slice(t+1):"",s=Object.keys(e).filter(e=>!["id","binding","hidden"].includes(e));return e.id===`h${i}`&&0===s.length}const Sp={offStates:["off"],unknownUsesToggle:!0},Mp={light:Sp,switch:Sp,fan:Sp,humidifier:Sp,input_boolean:Sp,automation:Sp,remote:Sp,group:Sp,climate:{...Sp,featureMasks:{turn_on:256,turn_off:128,toggle:384}},media_player:{...Sp,featureMasks:{turn_on:128,turn_off:256,toggle:384}},siren:{...Sp,featureMasks:{turn_on:1,turn_off:2,toggle:3}},vacuum:{...Sp,featureMasks:{turn_on:1,turn_off:2,toggle:3}},water_heater:{...Sp,featureMasks:{turn_on:8,turn_off:8,toggle:8}},camera:{...Sp,featureMasks:{turn_on:1,turn_off:1,toggle:1}}};function Cp(e){return e.slice(0,e.indexOf("."))}function Dp(e,t,i){if(!e?.services||"object"!=typeof e.services)return!1;const s=e.services?.[t];return!!s&&Object.prototype.hasOwnProperty.call(s,i)}function Pp(e,t,i){return Dp(e,t,i)?{domain:t,service:i}:Dp(e,"homeassistant",i)?{domain:"homeassistant",service:i}:null}function Tp(e,t){return e?.entities?.[t]||null}function Ip(e,t,i){const s=e?.states?.[i],n=Tp(t,i);return s?.attributes?.friendly_name||n?.name||n?.original_name||i}function Rp(e,t){const i=Tp(e,t);if(null!=i?.disabled_by)return!0;const s=i?.device_id?e?.devices?.[i.device_id]:null;return null!=s?.disabled_by}function Ap(e,t){const i=e?.attributes?.supported_features;if(null==i||""===i)return!1;const s=Number(i);return Number.isFinite(s)&&(s&t)===t}function zp(e,t,i){const s=Cp(i);if("lock"===s||"alarm_control_panel"===s)return!0;if("cover"!==s)return!1;const n=e?.states?.[i],o=Tp(t,i),a=String(n?.attributes?.device_class||o?.device_class||o?.original_device_class||"");return Ui.has(a)}function Fp(e,t,i,s,n){return{ref:i,entityId:s,name:s?Ip(e,t,s):null,reason:n}}function Np(e,t,i,s,n,o=null){return{target:null,skipped:Fp(e,t,i,s,n),semantics:o,nextEffect:null,command:null}}function Ep(e,t,i,s,n=i){const o=Cp(i);if("cover"!==o&&"valve"!==o)return function(e,t,i,s,n=i){const o=Cp(i),a=e?.states?.[i];if(Rp(t,i))return Np(e,t,n,i,"ha-disabled","power");if(zp(e,t,i))return Np(e,t,n,i,"secure");if(!a)return Np(e,t,n,i,"missing","power");if("unavailable"===a.state)return Np(e,t,n,i,"unavailable","power");const r=Mp[o];if(!r)return Np(e,t,n,i,"unsupported");let l,c;if("unknown"===a.state||""===a.state){if(!r.unknownUsesToggle)return Np(e,t,n,i,"unsupported","power");l="toggle",c="toggle"}else r.offStates.includes(String(a.state))?(l="turn-on",c="turn_on"):(l="turn-off",c="turn_off");const h=r.featureMasks?.[c];if(h&&!Ap(a,h))return Np(e,t,n,i,"unsupported","power");const d=Pp(e,o,c);return d?{target:{entityId:i,name:Ip(e,t,i),state:String(a.state||""),via:s},skipped:null,semantics:"power",nextEffect:l,command:{...d,data:{entity_id:i}}}:Np(e,t,n,i,"unsupported","power")}(e,t,i,s,n);if(Rp(t,i))return Np(e,t,n,i,"ha-disabled",o);if(zp(e,t,i))return Np(e,t,n,i,"secure",o);const a=e?.states?.[i];if(!a)return Np(e,t,n,i,"missing",o);if("unavailable"===a.state)return Np(e,t,n,i,"unavailable",o);const r=function(e,t,i){const s=String(i?.state||""),n="closed"===s?{service:`open_${t}`,effect:"open",feature:1}:"open"===s?{service:`close_${t}`,effect:"close",feature:2}:"opening"===s||"closing"===s?{service:`stop_${t}`,effect:"stop",feature:8}:null;return n&&Ap(i,n.feature)&&Dp(e,t,n.service)?n:Ap(i,3)&&Dp(e,t,"toggle")?{service:"toggle",effect:"toggle"}:null}(e,o,a);if(!r)return Np(e,t,n,i,"unsupported",o);return{target:{entityId:i,name:Ip(e,t,i),state:String(a.state||""),via:s},skipped:null,semantics:o,nextEffect:r.effect,command:{domain:o,service:r.service,data:{entity_id:i}}}}function Op(e){return"entity"===e.bindingKind?e.bindingRef&&Ms(e.bindingRef)?[e.bindingRef]:[]:"virtual"===e.bindingKind?[]:eo(e)}function Hp(e){const t=e.marker?.toggle_entity;return t&&Op(e).includes(t)?t:null}function Lp(e,t,i){const s=function(e,t){if("entity"===e.bindingKind&&e.bindingRef){const t=e.marker?.light_entity?to(e):null;return[...new Set([t,e.bindingRef].filter(e=>!!e))]}const i=e.entities.length?e.entities:e.allEntities||[],s=e.marker?.light_entity||e.primary&&Ms(e.primary)?to(e):null;return[...new Set([s,...Yn(t,i)].filter(e=>!!e))]}(i,t);if(!s.length)return null;const n="entity"===i.bindingKind?"binding":"device-role";if("binding"===n)return Ep(e,t,s[0],n);let o=null,a=null;for(const i of s){const s=Ep(e,t,i,n);if(s.command)return s;const r=s.skipped?.reason;if("missing"===r||"unavailable"===r||"secure"===r)return s;"ha-disabled"!==r?o||=s:a||=s}return o||a}function Bp(e){const t=e.skipped?.reason;return"missing"===t?"unavailable":t||"unsupported"}function jp(e,t){return{origin:e,kind:"none",semantics:null,targets:[],skippedTargets:[],noneReason:t,nextEffect:null,command:null}}function qp(e,t){return"cover"===e||"toggle"===e?"toggle":"more-info"===e||"run"===e||"info"===e?e:(null==e||""===e)&&"light"===t?"toggle":"info"}function Wp(e,t){return{origin:e,kind:"single",semantics:t.semantics,targets:t.target?[t.target]:[],skippedTargets:t.skipped?[t.skipped]:[],noneReason:t.command?null:Bp(t),nextEffect:t.nextEffect,command:t.command}}function Up(e,t,i,s=[]){const n=new Map,o=[],a=new Set,r=e=>{const t=`${e.ref}\n${e.entityId||""}\n${e.reason}`;a.has(t)||(a.add(t),o.push(e))};for(const e of s)r(e);for(const s of i){const i=Ep(e,t,s.entityId,s.via,s.ref);i.target?n.set(s.entityId,n.get(s.entityId)||i.target):i.skipped&&r(i.skipped)}const l=[...n.values()];if(!l.length)return{origin:"explicit-toggle",kind:"group",semantics:"group-power",targets:l,skippedTargets:o,noneReason:o.length&&o.every(e=>"secure"===e.reason)?"secure":"configured-targets-missing",nextEffect:null,command:null};const c=l.some(e=>"on"===e.state)?"turn_off":"turn_on",h=Pp(e,"homeassistant",c);return h?{origin:"explicit-toggle",kind:"group",semantics:"group-power",targets:l,skippedTargets:o,noneReason:null,nextEffect:"turn_on"===c?"turn-on":"turn-off",command:{...h,data:{entity_id:l.map(e=>e.entityId)}}}:{origin:"explicit-toggle",kind:"group",semantics:"group-power",targets:[],skippedTargets:[...o,...l.map(i=>Fp(e,t,i.entityId,i.entityId,"unsupported"))],noneReason:"unsupported",nextEffect:null,command:null}}function Gp(e){return String(e.marker?.id||e.id||"")}function Vp(e){const{hass:t,device:i}=e,s=e.registryHass||t,n=function(e){return"toggle"===e.tapAction?"explicit-toggle":"cover"===e.tapAction?"legacy-cover":!e.tapAction&&e.primary?.startsWith("light.")?"default-light":null}(i);if(!n)return null;const o=i.marker;if("explicit-toggle"===n&&bn(o)){const t=String(o?.id||i.id||""),s=ro(e.devices).get(t);if(s)return function(e,t){const i=e.registryHass||e.hass;return Up(e.hass,i,t.driverEids.map(e=>({entityId:e,via:"control-marker-driver",ref:`marker:${t.markerId}`})))}(e,s);const a=yn(o,e.virtualLights);return{origin:n,kind:"single",semantics:"power",targets:[{entityId:"",name:i.name,state:a?"on":"off",via:"virtual-light"}],skippedTargets:[],noneReason:null,nextEffect:a?"turn-off":"turn-on",command:null,operation:{kind:"virtual-light",markerId:o.id}}}if("explicit-toggle"===n){if(Zn(i.marker?.binding,i.marker?.controls??i.controls,i.entities).length)return function(e,t=null){const{hass:i,device:s,devices:n}=e,o=e.registryHass||i,a=Zn(s.marker?.binding,s.marker?.controls??s.controls,s.entities),r=e.lightSources||ho(i,n,null,e.virtualLights),l=new Map;for(const e of r){if(!e.key.startsWith("marker:"))continue;const t=l.get(e.key)||[];t.push(e),l.set(e.key,t)}const c=ro(n),h=new Map;for(const e of n){const t=String(e.marker?.id||e.id||"");t&&h.set(t,e)}const d=[],p=[];t&&d.push({entityId:t,via:"entity"===s.bindingKind?"binding":"device-role",ref:t});for(const e of a){if(!e.startsWith("marker:")){Ms(e)?d.push({entityId:e,via:"control-entity",ref:e}):p.push(Fp(i,o,e,e.includes(".")?e:null,"unsupported"));continue}const t=l.get(e)||[];if(!t.length){const t=h.get(e.slice(7));if("ha_disabled"===t?.bindingStatus?.kind){const s=t.bindingStatus.allEntityIds[0]||null;p.push({ref:e,entityId:s,name:t.name||(s?Ip(i,o,s):null),reason:"ha-disabled"})}else p.push(Fp(i,o,e,null,"missing"));continue}const n=[...new Set(t.flatMap(e=>e.serviceEids))];if(n.length){for(const t of n)d.push({entityId:t,via:"control-entity",ref:e});continue}const a=t.some(e=>e.passive),r=e.slice(7),u=Gp(s),_=c.get(r)?.controllers.find(e=>Gp(e.device)===u);if(a&&_?.driverEids.length)for(const t of _.driverEids)d.push({entityId:t,via:"control-marker-driver",ref:e});else p.push(Fp(i,o,e,null,a?"missing":"unsupported"))}return Up(i,o,d,p)}(e,Hp(i))}if("legacy-cover"===n){const e=i.entities.find(e=>e.startsWith("cover."))||i.allEntities?.find(e=>e.startsWith("cover."));return e?Wp(n,Ep(t,s,e,"device-role")):jp(n,"no-actionable-entity")}const a=Hp(i),r=a?Ep(t,s,a,"entity"===i.bindingKind?"binding":"device-role"):Lp(t,s,i);return r?Wp(n,r):jp(n,i.virtual||"virtual"===i.bindingKind?"no-actionable-entity":"no-binding")}function Kp(e){if(!e)return[];const t=Array.isArray(e.data.entity_id)?e.data.entity_id:[e.data.entity_id];return[...new Set(t)].sort()}function Yp(e){return e?e.operation?e.operation:e.command?{kind:"ha-service",command:e.command}:null:null}const Jp=new Set(["missing","ha-disabled","unavailable"]);function Xp(e,t){const i=Yp(e),s=Yp(t);return!(!i||!s||i.kind!==s.kind)&&("virtual-light"===i.kind&&"virtual-light"===s.kind?i.markerId===s.markerId:"ha-service"===i.kind&&"ha-service"===s.kind&&function(e,t){const i=Kp(e),s=Kp(t);return i.length===s.length&&i.every((e,t)=>e===s[t])}(i.command,s.command))}const Zp=e=>!!e&&e.length>=2&&Number.isFinite(e[0])&&Number.isFinite(e[1]);function Qp(e,t=5,i=5){return Ml(e.cm,t,i)/2}function eu(e,t,i=1,s=5,n=5,o=0){const a=e.host;if(!a||"partition"!==a.kind||"string"!=typeof a.id||!a.id)return{resolved:null,reason:"invalid-host"};const r=t.find(e=>e.id===a.id);if(!r)return{resolved:null,reason:"missing-partition"};if(!Zp(r.a)||!Zp(r.b)||!Number.isFinite(a.t)||a.t<0||a.t>1)return{resolved:null,reason:"invalid-position"};const l=r.b[0]-r.a[0],c=r.b[1]-r.a[1],h=Math.hypot(l,c),d=Number(e.length)*i;if(!(h>1e-9&&d>0&&Number.isFinite(d)))return{resolved:null,reason:"invalid-length"};const p=a.t*h;if(p-d/2h-o+1e-9)return{resolved:null,reason:"does-not-fit"};const u=l/h,_=c/h;let m=180*Math.atan2(c,l)/Math.PI;return m>=90?m-=180:m<-90&&(m+=180),{reason:null,resolved:{opening:e,host:a,partition:r,center:[r.a[0]+l*a.t,r.a[1]+c*a.t],angle:m,length:d,depth:Ml(r.cm,s,n),t:a.t,axis:{a:[r.a[0],r.a[1]],b:[r.b[0],r.b[1]],ux:u,uy:_,length:h}}}}function tu(e,t,i=1,s=5,n=5){return eu(e,t,i,s,n,0)}function iu(e,t,i=1,s=5,n=5){const o=e.host,a="partition"===o?.kind?t.find(e=>e.id===o.id):void 0;if(!a)return tu(e,t,i,s,n);const r=eu(e,t,i,s,n,Qp(a,s,n));return"does-not-fit"===r.reason?{resolved:null,reason:"does-not-fit-jamb"}:r}function su(e,t){return!e||(e.length!==t.length||e.host?.kind!==t.host?.kind||e.host?.id!==t.host?.id||e.host?.t!==t.host?.t)}function nu(e){const{center:t,length:i,axis:s,host:n}=e,o=i/2;return{hostId:n.id,a:[t[0]-s.ux*o,t[1]-s.uy*o],b:[t[0]+s.ux*o,t[1]+s.uy*o],depth:e.depth}}function ou(e,t=!1){const i=t?1:-1,s=e.depth/2;return{ox:-e.axis.uy*i*s,oy:e.axis.ux*i*s,cm:e.partition.cm,side:i}}function au(e,t,i){return e.flatMap(e=>!Zp(e.a)||!Zp(e.b)||Math.hypot(e.b[0]-e.a[0],e.b[1]-e.a[1])<=1e-9?[]:[{roomId:"",a:[e.a[0],e.a[1]],b:[e.b[0],e.b[1]],key:`partition:${e.id}`,kind:"outer",cm:e.cm,open:!1,half:Ml(e.cm,t,i)/2,partitionHost:{kind:"partition",id:e.id}}])}function ru(e,t,i){const{center:s,length:n,axis:o}=e,a=n/2,r=t.flatMap(e=>{if(!e.kind||e.open)return[];const t=e.b[0]-e.a[0],n=e.b[1]-e.a[1],r=Math.hypot(t,n);if(!(r>i))return[];const l=t/r,c=n/r;if(Math.abs(o.ux*c-o.uy*l)>1e-6)return[];if(Math.abs((s[0]-e.a[0])*c-(s[1]-e.a[1])*l)>i)return[];const h=e=>(e[0]-s[0])*o.ux+(e[1]-s[1])*o.uy,d=h(e.a),p=h(e.b),u=Math.max(-a,Math.min(d,p)),_=Math.min(a,Math.max(d,p));return _>=u-i?[[u,_]]:[]});if(!r.length)return!1;r.sort((e,t)=>e[0]-t[0]||e[1]-t[1]);let l=-a;for(const[e,t]of r){if(e>l+i)return!1;if(l=Math.max(l,t),l>=a-i)return!0}return!1}function lu(e,t,i){return{...e,x:t.center[0]/i,y:t.center[1]/i,angle:t.angle}}const cu=.001;function hu(e){return!!e&&e.length>=2&&Number.isFinite(e[0])&&Number.isFinite(e[1])}function du(e){return`${e[0].toFixed(6)},${e[1].toFixed(6)}`}function pu(e,t,i){return Math.abs(e[0]-t[0])"room"!==e.kind&&i.some(i=>i!==e&&function(e,t,i){const s=e.b[0]-e.a[0],n=e.b[1]-e.a[1],o=Math.hypot(s,n);if(!(o>i))return!1;const a=s/o,r=n/o,l=t=>Math.abs((t[0]-e.a[0])*r-(t[1]-e.a[1])*a);if(l(t.a)>i||l(t.b)>i)return!1;const c=(t.a[0]-e.a[0])*a+(t.a[1]-e.a[1])*r,h=(t.b[0]-e.a[0])*a+(t.b[1]-e.a[1])*r;return Math.min(o,Math.max(c,h))-Math.max(0,Math.min(c,h))>i}(e,i,t))),n=s.map(e=>{const[t,i]=uu(e.a,e.b);return{a:t,b:i,key:`hidden|${mu(e,t,i)}`,sourceKind:e.kind,sourceId:e.id}}).sort((e,t)=>e.key.localeCompare(t.key)),o=s.flatMap(e=>[e.a,e.b].map((t,i)=>({point:[t[0],t[1]],key:`hidden|${_u(e)}|endpoint-${i}`,sourceKind:e.kind,sourceId:e.id}))).sort((e,t)=>e.key.localeCompare(t.key));return{segments:n,endpoints:o}}function bu(e){const t=e.epsilon??cu,i=e.roomCuts||[],s=new Map;for(const t of e.partitionCuts||[]){if("string"!=typeof t.hostId||!t.hostId||!hu(t.a)||!hu(t.b))continue;const e=s.get(t.hostId)||[];e.push([t.a[0],t.a[1],t.b[0],t.b[1]]),s.set(t.hostId,e)}const n=[];for(const[t,s]of pi(e.space.rooms).entries())s.length<4||n.push({a:[s[0],s[1]],b:[s[2],s[3]],kind:"room",id:`room-edge-${t}`,cuts:i});for(const t of e.space.room_drafts||[])if(t.id!==e.activeDraftId)for(let e=0;e+1fu(s,e,t)))continue;const e=du(s);a.has(e)||a.set(e,{point:[s[0],s[1]],key:e})}}}return{segments:[...o.values()].sort((e,t)=>e.key.localeCompare(t.key)),endpoints:[...a.values()].sort((e,t)=>e.key.localeCompare(t.key))}}function yu(e,t,i){return t.some(t=>hu(t)&&pu(e,t,i))}function wu(e,t,i){if(!i)return!0;const s=e-i.distance;return s<-1e-9||Math.abs(s)<=1e-9&&t.localeCompare(i.key)<0}function ku(e,t,i){const s=i.epsilon??cu,n=i.excludePoints||[],o=[...e.endpoints,...(i.extraEndpoints||[]).filter(e=>hu(e.point)).map(e=>({point:[e.point[0],e.point[1]],key:e.key}))],a=new Map;for(const e of o){if(yu(e.point,n,s))continue;const t=du(e.point),i=a.get(t);(!i||e.key.localeCompare(i.key)<0)&&a.set(t,e)}return[...a.values()].map(e=>({kind:"endpoint",point:[...e.point],key:e.key,distance:Math.hypot(t[0]-e.point[0],t[1]-e.point[1])})).filter(e=>e.distance<=i.tolerance).sort((e,t)=>e.distance-t.distance||e.key.localeCompare(t.key))}function xu(e,t){if(!e.length)return null;if(t>0){const i=new Set;for(let s=0;s1)return{kind:"ambiguous",candidate:null,conflicts:e.filter(e=>i.has(e.key)).map(e=>({point:[...e.point],key:e.key}))}}return{kind:"resolved",candidate:e[0],conflicts:[]}}function $u(e,t,i){const s=e.b[0]-e.a[0],n=e.b[1]-e.a[1],o=Math.hypot(s,n);if(!(o>0))return[...e.a];const a=s/o,r=n/o,l=Math.max(0,Math.min(o,(t[0]-e.a[0])*a+(t[1]-e.a[1])*r)),c=i>0?Math.max(0,Math.min(o,Math.round(l/i)*i)):l;return[e.a[0]+a*c,e.a[1]+r*c]}function Su(e,t,i){if(!(hu(t)&&hu(i.anchor)&&i.tolerance>=0))return{kind:"none",candidate:null,conflicts:[]};const s=i.epsilon??cu,n=function(e,t){const i=t[0]-e[0],s=t[1]-e[1];if(!(Math.hypot(i,s)>Number.EPSILON))return null;const n=Math.round(Math.atan2(s,i)/(Math.PI/4))*(Math.PI/4);return[Math.cos(n),Math.sin(n)]}(i.anchor,t);if(!n)return{kind:"none",candidate:null,conflicts:[]};const o=ku(e,t,i).filter(e=>function(e,t,i,s){const n=e[0]-t[0],o=e[1]-t[1];return n*i[0]+o*i[1]>s&&Math.abs(n*i[1]-o*i[0])<=s*Math.max(Math.hypot(n,o),1)}(e.point,i.anchor,n,s)),a=xu(o,i.distinguishTolerance||0);if(a)return a;let r=null;for(const o of e.segments){const e=o.b[0]-o.a[0],a=o.b[1]-o.a[1],l=o.a[0]-i.anchor[0],c=o.a[1]-i.anchor[1],h=n[0]*a-n[1]*e;let d=null;if(Math.abs(h)<=s*Math.max(Math.hypot(e,a),1)){if(Math.abs(l*n[1]-c*n[0])>s*Math.max(Math.hypot(l,c),1))continue;const e=[o.a,o.b].map(e=>({point:e,along:(e[0]-i.anchor[0])*n[0]+(e[1]-i.anchor[1])*n[1]})).filter(e=>e.along>s).sort((e,t)=>e.along-t.along);e.length&&(d=[...e[0].point])}else{const t=(l*a-c*e)/h,o=(l*n[1]-c*n[0])/h;t>s&&o>=-s&&o<=1+s&&(d=[i.anchor[0]+n[0]*t,i.anchor[1]+n[1]*t])}if(!d)continue;const p=Math.hypot(t[0]-d[0],t[1]-d[1]);p>i.tolerance||yu(d,i.excludePoints||[],s)||!wu(p,o.key,r)||(r={kind:"line",point:d,key:o.key,distance:p,segment:o})}return r?{kind:"resolved",candidate:r,conflicts:[]}:{kind:"none",candidate:null,conflicts:[]}}const Mu=.001;function Cu(e,t,i,s){const n=Number.isFinite(e)&&e>0?Math.floor(e):0,o=e=>"number"==typeof e&&Number.isFinite(e)&&e>=0?e:null,a=o(i),r=o(s)??0,l=[];let c=null;for(let e=0;e=2&&Number.isFinite(e[0])&&Number.isFinite(e[1])}function Tu(e,t,i,s){return e*s-t*i}function Iu(e){let t=0;for(let i=0;ie.localeCompare(t)),t[0]}function Nu(e,t,i){const s=[...e];for(let e=!0;e&&s.length>=3;){e=!1;for(let n=0;n=0){s.splice(n,1),e=!0;break}}}return s}function Eu(e,t){const i=e.map(e=>Math.max(0,Math.min(1,e))).sort((e,t)=>e-t),s=[];for(const e of i)(!s.length||Math.abs(e-s[s.length-1])>t)&&s.push(e);return s}function Ou(e,t){return[e.a[0]+(e.b[0]-e.a[0])*t,e.a[1]+(e.b[1]-e.a[1])*t]}function Hu(e,t,i){const s=function(e,t){const i=t.b[0]-t.a[0],s=t.b[1]-t.a[1],n=i*i+s*s;return n>0?((e[0]-t.a[0])*i+(e[1]-t.a[1])*s)/n:0}(e,t);if(s<-i||s>1+i)return null;const n=Ou(t,s);return Math.hypot(n[0]-e[0],n[1]-e[1])<=i?Math.max(0,Math.min(1,s)):null}function Lu(e,t,i,s,n){const o=e.b[0]-e.a[0],a=e.b[1]-e.a[1],r=t.b[0]-t.a[0],l=t.b[1]-t.a[1],c=t.a[0]-e.a[0],h=t.a[1]-e.a[1],d=Tu(o,a,r,l),p=Math.max(Math.hypot(o,a),Math.hypot(r,l),1);if(Math.abs(d)>n*p){const e=Tu(c,h,r,l)/d,t=Tu(c,h,o,a)/d;return void(e>=-n&&e<=1+n&&t>=-n&&t<=1+n&&(i.push(Math.max(0,Math.min(1,e))),s.push(Math.max(0,Math.min(1,t)))))}if(!(Math.abs(Tu(c,h,o,a))>n*p)){for(const s of[t.a,t.b]){const t=Hu(s,e,n);null!=t&&i.push(t)}for(const i of[e.a,e.b]){const e=Hu(i,t,n);null!=e&&s.push(e)}}}function Bu(e){let t=e+1|0;return t^=t<<13,t^=t>>>17,t^=t<<5,t>>>0}function ju(e,t){return e.minY-t.minY||e.index-t.index}function qu(e){return e.subtreeMaxY=Math.max(e.item.maxY,e.left?.subtreeMaxY??-1/0,e.right?.subtreeMaxY??-1/0),e}function Wu(e){const t=e.right;return e.right=t.left,t.left=qu(e),qu(t)}function Uu(e){const t=e.left;return e.left=t.right,t.right=qu(e),qu(t)}function Gu(e,t){return e?(ju(t,e.item)<0?(e.left=Gu(e.left,t),e.left.priority0)e.right=Vu(e.right,t);else{if(!e.left)return e.right;if(!e.right)return e.left;e.left.priority=t&&Ku(e.left,t,i,s),e.item.minY<=i&&e.item.maxY>=t&&s.push(e.item),e.item.minY<=i&&Ku(e.right,t,i,s))}function Yu(e,t=.001){const i=Number.isFinite(t)&&t>0?t:Mu,s=e.filter(e=>Pu(e.a)&&Pu(e.b)&&"string"==typeof e.key&&e.key.length>0&&Math.hypot(e.b[0]-e.a[0],e.b[1]-e.a[1])>i),n=s.map(()=>[0,1]);!function(e,t,i){const s=e.map((e,t)=>({index:t,minX:Math.min(e.a[0],e.b[0])-i,maxX:Math.max(e.a[0],e.b[0])+i,minY:Math.min(e.a[1],e.b[1])-i,maxY:Math.max(e.a[1],e.b[1])+i})),n=[...s].sort((e,t)=>e.minX-t.minX||e.minY-t.minY||e.index-t.index),o=[...s].sort((e,t)=>e.maxX-t.maxX||e.index-t.index),a=new Set;let r=null,l=0;for(const s of n){for(;le.index-t.index);for(const o of n)Lu(e[o.index],e[s.index],t[o.index],t[s.index],i);a.add(s.index),r=Gu(r,s)}}(s,n,i);const o=new Map;for(let e=0;e({key:e,a:t.a,b:t.b,sourceKeys:[...t.sourceKeys].sort((e,t)=>e.localeCompare(t))})).sort((e,t)=>e.key.localeCompare(t.key))}function Ju(e,t=.001){const i=Number.isFinite(t)&&t>0?t:Mu,s=Yu(e,i),n=new Map,o=new Map,a=new Map(s.map(e=>[e.key,e]));for(const e of s){const t=Au(e.a,i),s=Au(e.b,i);n.set(t,e.a),n.set(s,e.b),o.has(t)||o.set(t,new Set),o.has(s)||o.set(s,new Set),o.get(t).add(s),o.get(s).add(t)}const r=new Map;for(const[e,t]of o){const i=n.get(e);r.set(e,[...t].sort((e,t)=>{const s=n.get(e),o=n.get(t);return Math.atan2(s[1]-i[1],s[0]-i[0])-Math.atan2(o[1]-i[1],o[0]-i[0])||e.localeCompare(t)}))}const l=new Set,c=new Map,h=(e,t)=>`${e}>${t}`;for(const e of s){const t=[Au(e.a,i),Au(e.b,i)];for(const[e,o]of[t,[t[1],t[0]]]){if(l.has(h(e,o)))continue;const t=[],d=[];let p=e,u=o,_=!1;for(let i=0;i<=2*s.length+2;i++){const i=h(p,u);if(l.has(i)){_=p===e&&u===o;break}l.add(i),t.push(p),d.push(zu(p,u));const s=r.get(u)||[],n=s.indexOf(p);if(n<0||!s.length)break;if(p=u,u=s[(n-1+s.length)%s.length],p===e&&u===o){_=!0;break}}if(!_||new Set(t).size<3||new Set(t).size!==t.length)continue;const m=t.map(e=>n.get(e)),g=Iu(m);if(!(g>i*i))continue;const f=Fu(Nu(t,n,i)),v=new Set;for(const e of d)for(const t of a.get(e)?.sourceKeys||[])v.add(t);const b={ring:m,key:f,area:g,atomKeys:[...d],sourceKeys:[...v].sort((e,t)=>e.localeCompare(t))};c.has(f)||c.set(f,b)}}return{atoms:s,faces:[...c.values()].sort((e,t)=>e.area-t.area||e.key.localeCompare(t.key))}}function Xu(e,t,i=.001){if(!Pu(t))return null;const s=e.faces.filter(e=>{if(e.ring.some((s,n)=>function(e,t,i,s){const n=i[0]-t[0],o=i[1]-t[1],a=n*n+o*o;if(!(a>0))return Math.hypot(e[0]-t[0],e[1]-t[1])<=s;const r=((e[0]-t[0])*n+(e[1]-t[1])*o)/a;return!(r<0||r>1)&&Math.hypot(t[0]+n*r-e[0],t[1]+o*r-e[1])<=s}(t,s,e.ring[(n+1)%e.ring.length],i)))return!1;let s=!1;for(let i=0,n=e.ring.length-1;it[1]!=a[1]>t[1]&&t[0]<(a[0]-o[0])*(t[1]-o[1])/(a[1]-o[1])+o[0]&&(s=!s)}return s});return[...s].sort((e,t)=>e.area-t.area||e.key.localeCompare(t.key))[0]||null}function Zu(e,t,i){const s=i[0]-t[0],n=i[1]-t[1],o=s*s+n*n,a=o>0?Math.max(0,Math.min(1,((e[0]-t[0])*s+(e[1]-t[1])*n)/o)):0;return Math.hypot(t[0]+s*a-e[0],t[1]+n*a-e[1])}function Qu(e,t,i=.5){let s=Math.abs(e-t)%180;return s>90&&(s=180-s),s<=i}function e_(e,t,i,s){const n=e.filter(e=>"outer"===e.kind&&!e.open&&e.cm>0).map(e=>({interval:e,reusePartitionId:t.find(t=>function(e,t,i){return!(Math.abs(e.cm-t.cm)>1e-6)&&(Qu(180*Math.atan2(e.b[1]-e.a[1],e.b[0]-e.a[0])/Math.PI,180*Math.atan2(t.b[1]-t.a[1],t.b[0]-t.a[0])/Math.PI,.001)&&Zu(t.a,e.a,e.b)<=i&&Zu(t.b,e.a,e.b)<=i)}(t,e,s))?.id||null})),o=new Map;for(const t of i){if("partition"===t.host?.kind)continue;const i=e.map(e=>{const i=180*Math.atan2(e.b[1]-e.a[1],e.b[0]-e.a[0])/Math.PI;return{interval:e,distance:Qu(t.angle,i)?Zu([t.x,t.y],e.a,e.b):1/0}}).filter(e=>e.distance<=s).sort((e,t)=>e.distance-t.distance||e.interval.key.localeCompare(t.interval.key)),n=i[0]?.interval;"outer"===n?.kind&&!n.open&&n.cm>0&&o.set(t.id,n.key)}return{materialize:n,openingIntervals:o,removeOpeningIds:[...o.keys()].sort((e,t)=>e.localeCompare(t))}}function t_(e,t){const i=t.b[0]-t.a[0],s=t.b[1]-t.a[1],n=i*i+s*s;return n>0?Math.max(0,Math.min(1,((e[0]-t.a[0])*i+(e[1]-t.a[1])*s)/n)):0}const i_=e=>!e.key.startsWith("static:room|");function s_(e,t){const i=t.b[0]-t.a[0],s=t.b[1]-t.a[1],n=i*i+s*s;if(!(n>0))return null;const o=((e[0]-t.a[0])*i+(e[1]-t.a[1])*s)/n,a=[t.a[0]+i*o,t.a[1]+s*o];return{point:a,t:o,distance:Math.hypot(a[0]-e[0],a[1]-e[1])}}function n_(e,t){return t>0?Math.hypot(e[0]-Math.round(e[0]/t)*t,e[1]-Math.round(e[1]/t)*t):0}function o_(e,t,i){if(i_(e.source)!==i_(t.source))return i_(e.source)?e:t;const s=n_(e.point,i),n=n_(t.point,i);return Math.abs(s-n)>1e-9?s>n?e:t:function(e,t){return e[0]-t[0]||e[1]-t[1]}(e.point,t.point)>0?e:t}function a_(e){return[e.from[0],e.from[1],e.to[0],e.to[1],e.targetKind].map(e=>"number"==typeof e?e.toFixed(6):e).join("|")}function r_(e,t){return e.map(e=>e.key!==t.sourceKey?e:{...e,[t.endpoint]:[...t.to]})}function l_(e,t){const i=t.epsilon??.001;if(!(t.maxDistance>=0)||!t.point&&!t.requiredSourceKey)return{kind:"none"};const s=new Map,n=e.flatMap(e=>[{source:e,endpoint:"a",point:e.a},{source:e,endpoint:"b",point:e.b}]);for(let e=0;ei)||l>t.maxDistance)continue;const c=o_(a,r,t.gridStep||0),h=c===a?r:a;if(!i_(c.source))continue;const d={sourceKey:c.source.key,endpoint:c.endpoint,from:[c.point[0],c.point[1]],to:[h.point[0],h.point[1]],targetSourceKey:h.source.key,targetKind:"endpoint",distance:l};s.set(a_(d),d)}for(const o of n)if(i_(o.source))for(const n of e){if(n===o.source)continue;const e=s_(o.point,n);if(!e||e.t<=i||e.t>=1-i||!(e.distance>i)||e.distance>t.maxDistance)continue;const a={sourceKey:o.source.key,endpoint:o.endpoint,from:[o.point[0],o.point[1]],to:e.point,targetSourceKey:n.key,targetKind:"line",distance:e.distance};s.set(a_(a),a)}const o=[];for(const n of s.values()){const s=Ju(r_(e,n),i),a=t.point?Xu(s,t.point,i):s.faces.find(e=>!t.requiredSourceKey||e.sourceKeys.includes(t.requiredSourceKey))||null;a&&o.push({proposal:n,face:a})}if(o.sort((e,t)=>e.proposal.distance-t.proposal.distance||a_(e.proposal).localeCompare(a_(t.proposal))),!o.length)return{kind:"none"};return new Set(o.map(e=>`${a_(e.proposal)}|${e.face.key}`)).size>1?{kind:"ambiguous",proposals:o.map(e=>e.proposal)}:{kind:"repair",...o[0]}}const c_=1e-5;function h_(e){const t=e.map(()=>[]);for(let i=0;i=1-1e-9||p<=1e-9||p>=1-1e-9||(t[i].push(d),t[a].push(p))}}const i=[];for(let s=0;se-t),1];for(let e=1;e{const i=t[2]-t[0],s=t[3]-t[1],n=i*i+s*s;if(!(n>0))return Math.hypot(e[0]-t[0],e[1]-t[1]);const o=Math.max(0,Math.min(1,((e[0]-t[0])*i+(e[1]-t[1])*s)/n));return Math.hypot(e[0]-(t[0]+o*i),e[1]-(t[1]+o*s))},u_=(e,t,i,s)=>{const n=s[2]-s[0],o=s[3]-s[1],a=t*o-i*n;if(Math.abs(a)<1e-12)return 1/0;const r=s[0]-e[0],l=s[1]-e[1],c=(r*o-l*n)/a;if(!(c>1e-9))return 1/0;const h=(r*i-l*t)/a;return h<-1e-9||h>1+1e-9?1/0:c};function __(e,t,i,s=96){if(!(t>0&&Number.isFinite(e[0])&&Number.isFinite(e[1])))return[];const n=[];for(const s of i){if(!s||s.length<4)continue;if(![s[0],s[1],s[2],s[3]].every(Number.isFinite))continue;const i=p_(e,s);if(i<1e-7)return[];i>t||n.push(s)}const o=[],a=Math.max(12,Math.round(s));for(let e=0;ee-t);const l=[];let c=Number.NEGATIVE_INFINITY;for(const i of o){if(i-c<1e-9)continue;c=i;const s=Math.cos(i),o=Math.sin(i);let a=t;for(const t of n){const i=u_(e,s,o,t);i=3?l:[]}class m_ extends he{constructor(){super(...arguments),this._spaces=null,this._spacesLoading=!1,this._spacesAuthoritative=!1}setConfig(e){this._config=e}async _loadSpaces(){if(!this._spaces&&!this._spacesLoading&&this.hass){this._spacesLoading=!0;try{const e=await this.hass.callWS({type:"houseplan/config/get"});this._spaces=(e?.config?.spaces||[]).map(e=>({value:e.id,label:e.title||e.id})),this._spacesAuthoritative=!0}catch{this._spaces=[],this._spacesAuthoritative=!1}finally{this._spacesLoading=!1}}}get _lang(){return pa(this.hass,this._config?.language)}get _floorToken(){const e=this._config?.floor;return"number"==typeof e?`__houseplan_yaml_floor_index__:${String(e)}`:null}get _formData(){const e={...this._config},t=this._floorToken;return t?e.floor=t:Object.prototype.hasOwnProperty.call(e,"floor")||(e.floor=""),e}get _schema(){const e=this._spaces||[],t=this._lang,i=[{value:"",label:ua(t,"editor.floor_none")}],s=this._floorToken;s&&i.push({value:s,label:ua(t,"editor.floor_index",{index:String(this._config?.floor)})});const n="string"==typeof this._config?.floor?this._config.floor:"";n&&!e.some(e=>e.value===n)&&i.push({value:n,label:n}),i.push(...e);const o="string"==typeof this._config?.default_floor?this._config.default_floor:"",a=[...e];return o&&!e.some(e=>e.value===o)&&a.unshift({value:o,label:o}),[{name:"title",selector:{text:{}}},{name:"floor",selector:{select:{mode:"dropdown",options:i}}},e.length?{name:"default_floor",selector:{select:{mode:"dropdown",options:a}}}:{name:"default_floor",selector:{text:{}}},{name:"language",selector:{select:{mode:"dropdown",options:da(ua(t,"editor.lang_auto"),this._config?.language)}}},{name:"icon_size",selector:{number:{min:1,max:6,step:.1,mode:"box"}}},{name:"show_temperature",selector:{boolean:{}}},{name:"live_states",selector:{boolean:{}}},{name:"show_signal",selector:{boolean:{}}},{name:"kiosk",selector:{boolean:{}}},{name:"cycle",selector:{number:{min:0,max:3600,step:5,mode:"box"}}}]}render(){if(!this.hass||!this._config)return G;this._loadSpaces();const e=this._lang,t={title:ua(e,"editor.title"),floor:ua(e,"editor.floor"),default_floor:ua(e,"editor.default_floor"),language:ua(e,"editor.language"),icon_size:ua(e,"editor.icon_size"),show_temperature:ua(e,"editor.show_temperature"),live_states:ua(e,"editor.live_states"),show_signal:ua(e,"editor.show_signal"),kiosk:ua(e,"editor.kiosk"),cycle:ua(e,"editor.cycle")},i=this._schema,s=function(e,t,i){if(!i||null===t)return null;const s="string"==typeof e?.default_floor?e.default_floor:"";return!s||t.some(e=>e.value===s)?null:s}(this._config,this._spaces,this._spacesAuthoritative),n=e=>q``}const Br={color:"#607d8b",opacity:1,widthCm:3.6,fill:!1,fillColor:"#607d8b",fillOpacity:.25},jr=(e,t=1)=>{const i=Number(e);return Number.isFinite(i)?Math.min(1,Math.max(0,i)):t},qr=e=>{let t=Number(e);return Number.isFinite(t)?(t=(t%360+360)%360,t>180?t-360:t):0};function Wr(e,t,i){return qr(t)?[e.x,e.y]:i([e.x,e.y])}const Ur=(e,t,i)=>{const s=Number(e),n=Number.isFinite(t)&&t>0?t:5;return Number.isFinite(s)&&s>0?s/n*i:0},Gr=(e,t,i)=>{const s=Number(e),n=Number.isFinite(t)&&t>0?t:5;return Number.isFinite(s)&&i>0?s/i*n:0},Vr=(e,t,i,s=Br.widthCm)=>{const n=Number(e?.width_cm);if(Number.isFinite(n)&&n>0)return n;const o=Number(e?.width);return Number.isFinite(o)&&o>0?Gr(o,t,i):s};function Kr(e,t){return{color:e.color,opacity:jr(e.opacity),width_cm:Math.max(.1,Math.min(100,Number(e.widthCm)||.1)),...t?{fill:e.fill,fill_color:e.fillColor,fill_opacity:jr(e.fillOpacity,.25)}:{}}}function Yr(e){const t=e.x+e.w/2,i=e.y+e.h/2,s=qr(e.angle)*Math.PI/180,n=Math.cos(s),o=Math.sin(s),a=(e,s)=>{const a=e-t,r=s-i;return[t+a*n-r*o,i+a*o+r*n]};return[a(e.x,e.y),a(e.x+e.w,e.y),a(e.x+e.w,e.y+e.h),a(e.x,e.y+e.h)]}function Jr(e){const t=Yr(e),i=(e,t)=>[(e[0]+t[0])/2,(e[1]+t[1])/2],s=[(t[0][0]+t[2][0])/2,(t[0][1]+t[2][1])/2];return{points:[...t,i(t[0],t[1]),i(t[1],t[2]),i(t[2],t[3]),i(t[3],t[0]),s],segments:t.map((e,i)=>({a:e,b:t[(i+1)%4]}))}}function Xr(e,t,i,s,n,o,a,r){const l=qr(e.angle)*Math.PI/180,c=Math.cos(l),h=Math.sin(l),d=-Math.sin(l),p=Math.cos(l),u=e.x+e.w/2,_=e.y+e.h/2,m=t>0?-e.w/2:e.w/2,g=i>0?-e.h/2:e.h/2,f=u+m*c+g*d,v=_+m*h+g*p,b=s-f,y=n-v;let w=(b*c+y*h)*(t>0?1:-1),k=(b*d+y*p)*(i>0?1:-1),x=null;if(o){const t=w/Math.max(e.w,r),i=k/Math.max(e.h,r);x=Math.max(r/Math.max(e.w,r),r/Math.max(e.h,r),t,i),w=e.w*x,k=e.h*x}if(a>0)if(o){const t=Math.max(1,Math.round(e.w/a)),i=Math.max(1,Math.round(e.h/a));if(Math.abs(e.w-t*a)<1e-6&&Math.abs(e.h-i*a)<1e-6){const s=(e,t)=>{let i=Math.abs(e),s=Math.abs(t);for(;s;)[i,s]=[s,i%s];return Math.max(1,i)},n=1/s(t,i),o=Math.max(r/e.w,r/e.h),a=Math.max(o,Math.round((x??1)/n)*n);w=e.w*a,k=e.h*a}else{e.w>=e.h?(w=Math.round(w/a)*a,k=w*(e.h/Math.max(e.w,r))):(k=Math.round(k/a)*a,w=k*(e.w/Math.max(e.h,r)))}}else w=Math.round(w/a)*a,k=Math.round(k/a)*a;w=Math.max(r,w),k=Math.max(r,k);return{x:f+(t>0?w/2:-w/2)*c+(i>0?k/2:-k/2)*d-w/2,y:v+(t>0?w/2:-w/2)*h+(i>0?k/2:-k/2)*p-k/2,w:w,h:k,angle:qr(e.angle)||void 0}}const Zr=(e,t,i)=>{const s=i[0]-t[0],n=i[1]-t[1],o=s*s+n*n;if(o<1e-12)return[...t];const a=Math.max(0,Math.min(1,((e[0]-t[0])*s+(e[1]-t[1])*n)/o));return[t[0]+s*a,t[1]+n*a]};const Qr=10**9,el=240,tl=1e-4;function il(e){if(Array.isArray(e))return e.map(e=>il(e));if(null!==e&&"object"==typeof e){const t={};for(const[i,s]of Object.entries(e))t[i]=il(s);return t}return e}function sl(e){if("number"!=typeof e||!Number.isFinite(e))return e;const t=(e<0||Object.is(e,-0)?-1:1)*(Math.floor(Math.abs(e)*Qr+.5)/Qr);return 0===t?0:t}function nl(e){if("number"!=typeof e||!Number.isFinite(e))return e;const t=e*el,i=Math.round(t);if(Math.abs(t-i)null!==al(e)):[]}function ll(e,t){for(const i of t)Object.prototype.hasOwnProperty.call(e,i)&&(e[i]=sl(e[i]))}function cl(e,t){for(const i of t)Object.prototype.hasOwnProperty.call(e,i)&&(e[i]=nl(e[i]))}function hl(e){if(Array.isArray(e))for(let t=0;t{for(const n of s){const s=t[n];"number"==typeof s&&Number.isFinite(s)&&i(s,e)}},s=t=>{if(Array.isArray(t))for(let s=0;s{if(Array.isArray(e))for(const t of e)s(t)};for(const i of rl(e.rooms))t(i,["x","y","w","h"]),n(i.poly);for(const t of rl(e.walls))s(t.a),s(t.b);for(const t of rl(e.wall_segments))s(t.a),s(t.b);for(const i of rl(e.openings))t(i,["x","y"]);for(const i of rl(e.decor))"line"===i.kind?t(i,["x1","y1","x2","y2"]):"rect"===i.kind||"ellipse"===i.kind||"furniture"===i.kind?t(i,["x","y","w","h"]):"text"===i.kind&&t(i,["x","y"]);for(const t of rl(e.room_drafts))n(t.points);for(const t of rl(e.partitions))s(t.a),s(t.b);for(const t of rl(e.wall_columns))s(t.center);for(const t of rl(e.open_spans))s(t.a),s(t.b)}const n=al(t);if(!n)return;const o=new Map;if(s)for(const e of rl(s.spaces))null!=e.id&&o.set(String(e.id),e);for(const e of Object.values(n)){const t=al(e);if(!t)continue;const s=null!=t.s&&o.get(String(t.s))||null;for(const e of["x","y"]){const n=t[e];"number"==typeof n&&Number.isFinite(n)&&i(n,s)}}}function ul(e){const t=Number(e?.cell_cm);return t>0?t:5}function _l(e,t={}){const i={canonicalized:0,far:0,maxShift:0,maxShiftCm:0,spaces:[],bySpace:new Map},s=rl(al(e)?.spaces);let n=5;for(const e of s)n=Math.max(n,ul(e));pl(e,t,(e,t)=>{const s=e*el,o=Math.abs(s-Math.round(s)),a=nl(e),r=o>0&&o=tl))return;const l=r&&"number"==typeof a?Math.abs(a-e):0;if(r?i.canonicalized++:i.far++,i.maxShift=Math.max(i.maxShift,l),i.maxShiftCm=Math.max(i.maxShiftCm,l*el*(t?ul(t):n)),!t?.id||!r)return;const c=String(t.id);let h=i.bySpace.get(c);h||(h={spaceId:c,space:String(t.title||c),canonicalized:0,far:0,maxShift:0,maxShiftCm:0},i.bySpace.set(c,h)),h.canonicalized++,h.maxShift=Math.max(h.maxShift,l),h.maxShiftCm=Math.max(h.maxShiftCm,l*el*ul(t))}),i.bySpace.size&&pl(e,t,(e,t)=>{if(!t?.id)return;const s=i.bySpace.get(String(t.id));if(!s)return;const n=e*el;Math.abs(n-Math.round(n))>=tl&&s.far++}),i.spaces=[...i.bySpace.values()];const{bySpace:o,...a}=i;return a}function ml(e){return function(e){const t=e,i=al(t);i&&cl(i,["x","y"]);return t}(il(e))}function gl(e){const t=e,i=al(t);if(!i)return t;for(const e of Object.values(i)){const t=al(e);t&&cl(t,["x","y"])}return t}function fl(e){const t=e,i=al(t);if(!i)return t;for(const e of rl(i.spaces)){ll(e,["plan_x","plan_y","plan_scale","plan_scale_x","plan_scale_y","plan_angle"]);for(const t of rl(e.rooms))cl(t,["x","y","w","h"]),dl(t.poly);for(const t of rl(e.walls))hl(t.a),hl(t.b);for(const t of rl(e.wall_segments))hl(t.a),hl(t.b);for(const t of rl(e.openings)){cl(t,["x","y"]),ll(t,["angle","length"]);const e=al(t.host);e&&ll(e,["t"])}for(const t of rl(e.decor))"line"===t.kind?cl(t,["x1","y1","x2","y2"]):"rect"===t.kind||"ellipse"===t.kind||"furniture"===t.kind?(cl(t,["x","y","w","h"]),ll(t,["angle"])):"text"===t.kind&&(cl(t,["x","y"]),ll(t,["scale","angle"]));for(const t of rl(e.room_drafts))dl(t.points);for(const t of rl(e.partitions))hl(t.a),hl(t.b);for(const t of rl(e.wall_columns))hl(t.center),"square"===t.shape&&ll(t,["angle"]);for(const t of rl(e.open_spans))hl(t.a),hl(t.b)}for(const e of rl(i.markers))ll(e,["angle"]);return t}const vl=15;function bl(e,t,i,s,n){const o=i[0]-e[0],a=i[1]-e[1],r=Math.hypot(o,a);if(!(r>0)||r<=n+1e-9)return null;const l=o/r,c=a/r,h=t=>{const s=(t[0]-e[0])*l+(t[1]-e[1])*c,o=(n-s)/(r-s);return!Number.isFinite(o)||o<-1e-9||o>1+1e-9?null:[t[0]+(i[0]-t[0])*o,t[1]+(i[1]-t[1])*o]},d=h(t),p=h(s);return d&&p?[[e[0],e[1]],t,d,p,s]:null}const yl=Math.sin(.25*Math.PI/180);function wl(e,t){return Number.isFinite(e)&&e>0&&Number.isFinite(t)&&t>0&&e*t<3}function kl(e){const t=Number(e)>0?Number(e):5;if(5===t)return 8;const i=5/t*8;return Math.min(80,Math.max(.5,i))}function xl(e,t){return Number.isFinite(e)&&e>0&&Number.isFinite(t)&&t>0&&e*t<2}function $l(e){return Number.isFinite(e)?Math.max(1,Math.min(100,e)):1}function Sl(e,t){return!Number.isFinite(e)||e<0?"":String(t?Math.round(e/2.54*100)/100:Math.round(100*e)/100)}function Ml(e,t,i){if(!Number.isFinite(e)||e<=0)return 0;const s=Number(t)>0?Number(t):5;return $l(e)/s*i}function Cl(e,t){return t>0&&Number.isFinite(e)?Math.round(e/t)*t:e}function Dl(e){return Math.max(1e-6*Math.abs(e),1e-9)}function Pl(e,t){if(!(t>0&&Number.isFinite(e)))return e;const i=Cl(e,t);return Math.abs(i-e)<=Dl(t)?i:e}function Tl(e,t){let i=t[0]-e[0],s=t[1]-e[1];const n=Math.hypot(i,s);return n<1e-12?[1,0]:(i/=n,s/=n,(i<-1e-12||Math.abs(i)<=1e-12&&s<0)&&(i=-i,s=-s),[i,s])}function Il(e,t,i){const s=[Pl(e[0],i),Pl(e[1],i)],n=[Pl(t[0],i),Pl(t[1],i)],o=Cl((s[0]+n[0])/2,i),a=Cl((s[1]+n[1])/2,i),[r,l]=Tl(s,n);let c=Math.atan2(l,r);c<0&&(c+=Math.PI);const h=Math.round(1800*c)/1800,d=i>0&&i<.01?6:i<1?4:2;return`${o.toFixed(d)},${a.toFixed(d)}@${h.toFixed(4)}`}function Rl(e,t,i,s){return 1===s?Il(e,t,i):Il([e[0]/s,e[1]/s],[t[0]/s,t[1]/s],i)}function Al(e,t){if(!Array.isArray(e.a)||!Array.isArray(e.b)||e.a.length<2||e.b.length<2)return null;const i=[Number(e.a[0]),Number(e.a[1]),Number(e.b[0]),Number(e.b[1])];if(!i.every(Number.isFinite))return null;const s=t>0?t:1;return[[i[0]*s,i[1]*s],[i[2]*s,i[3]*s]]}function zl(e,t,i,s,n){const o=n>0?n:1;return{key:Rl(e,t,s,o),cm:$l(i),a:[e[0]/o,e[1]/o],b:[t[0]/o,t[1]/o]}}function Fl(e,t){const i=t>0?t:1,s=[];for(const t of e){const e=t.key.lastIndexOf("@");if(e<0)continue;const[n,o]=t.key.slice(0,e).split(",").map(Number),a=Number(t.key.slice(e+1));[n,o,a].every(Number.isFinite)&&s.push({w:t,x:n*i,y:o*i,ang:a})}return s}function Nl(e,t){const[i,s]=Tl(e,t);let n=Math.atan2(s,i);return n<0&&(n+=Math.PI),n}function El(e,t){let i=Math.abs(e-t);return i>Math.PI/2&&(i=Math.PI-i),i<.02}function Ol(e,t,i,s,n=1){if(!e?.length)return null;const o=Rl(t,i,s,n),a=e.find(e=>e.key===o);if(a)return a;const r=n>0?n:1,l=Dl(s)*r,c=(e,t)=>Math.abs(e[0]-t[0])<=l&&Math.abs(e[1]-t[1])<=l;for(const s of e){const e=Al(s,r);if(e&&(c(e[0],t)&&c(e[1],i)||c(e[0],i)&&c(e[1],t)))return s}const h=(t[0]+i[0])/2,d=(t[1]+i[1])/2,p=Nl(t,i),u=Math.max(.5*s,1e-9)*r;for(const t of Fl(e,r))if(El(t.ang,p)&&Math.hypot(t.x-h,t.y-d)<=u)return t.w;return null}function Hl(e,t,i,s,n=1){const o=Ol(e,t,i,s,n);if(o&&o.cm>0)return $l(o.cm);const a=function(e,t,i,s,n){if(!e?.length)return null;const o=n>0?n:1,a=Math.hypot(i[0]-t[0],i[1]-t[1]);if(a<1e-12)return null;const r=Nl(t,i),l=Math.max(.5*s,1e-9)*o;let c=null;for(const s of e){if(!(s.cm>0))continue;const e=Al(s,o);if(!e)continue;const n=Math.hypot(e[1][0]-e[0][0],e[1][1]-e[0][1]);if(n<1e-12||!El(Nl(e[0],e[1]),r))continue;if(Sc(t[0],t[1],e[0][0],e[0][1],e[1][0],e[1][1])>l||Sc(i[0],i[1],e[0][0],e[0][1],e[1][0],e[1][1])>l)continue;if(n+l(o.has(e.key)||(e=>{const t=Al(e,s);if(!t)return!1;const[i,o]=t,r=o[0]-i[0],c=o[1]-i[1],h=Math.hypot(r,c);if(h<=l)return!1;if(!a.some(e=>{const t=[e[0],e[1]],s=[e[2],e[3]];return El(Nl(i,o),Nl(t,s))&&Sc(i[0],i[1],t[0],t[1],s[0],s[1])<=l&&Sc(o[0],o[1],t[0],t[1],s[0],s[1])<=l}))return!1;const d=(n||[]).some(e=>{const t=[e[0],e[1]],s=[e[2],e[3]];if(!El(Nl(i,o),Nl(t,s)))return!1;const n=e=>Math.abs((e[0]-i[0])*c-(e[1]-i[1])*r)/h;if(n(t)>l||n(s)>l)return!1;const a=h*h,d=((t[0]-i[0])*r+(t[1]-i[1])*c)/a,p=((s[0]-i[0])*r+(s[1]-i[1])*c)/a;return Math.min(1,Math.max(d,p))-Math.max(0,Math.min(d,p))>l/h});return!d})(e))&&e.cm>=1&&e.cm<=100)}function Bl(e,t,i,s=8){const[n,o]=Tl(e,t);let a=Math.atan2(o,n);a<0&&(a+=Math.PI);let r=i*Math.PI/180%Math.PI;r<0&&(r+=Math.PI);let l=Math.abs(a-r);return l>Math.PI/2&&(l=Math.PI-l),l<=s*Math.PI/180}function jl(e,t,i,s,n=1,o="affine",a){if(!e?.length)return[];if(t.length!==i.length)return"fixed-topology"===o&&a?.(),e.slice();const r=n>0?n:1,l=Math.max(.5*s,1e-9)*r,c=Math.max(s*r*1e-6,1e-9),h=[],d=new Map,p=new Map,u=(e,t,i)=>{const s=e.get(t)||new Set;s.add(i),e.set(t,s)};for(let e=0;e[e[0]+(t[0]-e[0])*i,e[1]+(t[1]-e[1])*i],m=(e,t)=>Math.hypot(e[0]-t[0],e[1]-t[1])<=c,g=(e,t)=>{if("fixed-topology"===o){const i=t.na[0]-t.oa[0],s=t.na[1]-t.oa[1],n=t.nb[0]-t.ob[0],o=t.nb[1]-t.ob[1];return Math.hypot(i-n,s-o)<=c?[e[0]+i,e[1]+s]:m(e,t.oa)?[...t.na]:m(e,t.ob)?[...t.nb]:[...e]}const i=Math.max(0,Math.min(1,((e[0]-t.oa[0])*t.dx+(e[1]-t.oa[1])*t.dy)/t.len2));return _(t.na,t.nb,i)},f=(e,t)=>{const[i,s]=Tl(e,t);return(t[0]-e[0])*i+(t[1]-e[1])*s>=0?[[...e],[...t]]:[[...t],[...e]]},v=[],b=[],y=(e,t,i)=>{if(Math.hypot(t[0]-e[0],t[1]-e[1])<=c)return;const[n,o]=f(e,t),a=$l(i);if(b.some(e=>e.entry.cm===a&&m(e.span[0],n)&&m(e.span[1],o)))return;const l=zl(n,o,a,s,r);v.push(l),b.push({entry:l,span:[n,o]})};for(const t of e){const e=Al(t,r);if(e){const[i,s]=f(e[0],e[1]),n=s[0]-i[0],a=s[1]-i[1],r=n*n+a*a,d=Math.sqrt(r);if(d<=c){v.push({...t,cm:$l(t.cm)});continue}const p=[];for(const e of h){if(!El(Nl(i,s),Nl(e.oa,e.ob)))continue;const t=e=>Math.abs((e[0]-i[0])*a-(e[1]-i[1])*n)/d;if(t(e.oa)>l||t(e.ob)>l)continue;const o=((e.oa[0]-i[0])*n+(e.oa[1]-i[1])*a)/r,h=((e.ob[0]-i[0])*n+(e.ob[1]-i[1])*a)/r,u=Math.max(0,Math.min(o,h)),_=Math.min(1,Math.max(o,h));(_-u)*d>c&&p.push({lo:u,hi:_,move:e})}if(!p.length){"fixed-topology"===o?v.push({...t}):y(i,s,t.cm);continue}const u=[0,1,...p.flatMap(({lo:e,hi:t})=>[e,t])].sort((e,t)=>e-t).filter((e,t,i)=>0===t||Math.abs(e-i[t-1])*d>c),b=[];for(let e=0;e+1r>=e.lo-1e-12&&r<=e.hi+1e-12);if(!l.length){b.push([o,a]);continue}const h=[g(o,l[0].move),g(a,l[0].move)],f=l.slice(1).some(e=>{const t=g(o,e.move),i=g(a,e.move);return!m(h[0],t)||!m(h[1],i)});b.push(f?[o,a]:h)}const w=(e,t)=>{const i=e[1][0]-e[0][0],s=e[1][1]-e[0][1],n=t[1][0]-t[0][0],o=t[1][1]-t[0][1],a=Math.hypot(i,s);return!(a<=c||i*n+s*o<=0)&&Math.abs(i*o-s*n)/a<=c},k=[];for(const e of b){const t=k[k.length-1];t&&m(t[1],e[0])&&w(t,e)?t[1]=e[1]:k.push([[...e[0]],[...e[1]]])}if("fixed-topology"===o&&1===k.length){const[i,s]=k[0];if(m(i,e[0])&&m(s,e[1])||m(i,e[1])&&m(s,e[0])){v.push({...t});continue}}for(const[e,i]of k)y(e,i,t.cm);continue}if("fixed-topology"===o){const e=p.get(t.key);if(1===e?.size){const i=[...e][0];v.push(i===t.key?{...t}:{...t,key:i});continue}const i=[Fl([t],r)[0]];1!==r&&i.push(Fl([t],1)[0]);const s=i.filter(Boolean).some(e=>h.some(t=>{if(!El(e.ang,Nl(t.oa,t.ob)))return!1;const i=((e.x-t.oa[0])*t.dx+(e.y-t.oa[1])*t.dy)/t.len2;return i>=-1e-6&&i<=1.000001&&Sc(e.x,e.y,t.oa[0],t.oa[1],t.ob[0],t.ob[1])<=l}));((e?.size||0)>1||s)&&a?.(),v.push({...t});continue}let i="";const n=d.get(t.key);if(1===n?.size&&(i=[...n][0]),!i){const e=Fl([t],r)[0];if(e){const t=new Set;for(const i of h){if(!El(e.ang,Nl(i.oa,i.ob)))continue;const n=((e.x-i.oa[0])*i.dx+(e.y-i.oa[1])*i.dy)/i.len2;if(n<-1e-6||n>1.000001)continue;if(Sc(e.x,e.y,i.oa[0],i.oa[1],i.ob[0],i.ob[1])>l)continue;const o=g([e.x,e.y],i),[a,c]=Tl(i.na,i.nb),h=Math.max(s*r,1e-6);t.add(Rl([o[0]-a*h,o[1]-c*h],[o[0]+a*h,o[1]+c*h],s,r))}1===t.size&&(i=[...t][0])}}v.push({...t,key:i||t.key,cm:$l(t.cm)})}return v}function ql(e,t,i,s,n=1,o="affine"){return jl(e,t,i,s,n,o)}function Wl(e,t,i,s=1,n=[]){const o=s>0?s:1,a=Math.abs(i),r=Math.max(a*o*tl,1e-9),l=(n||[]).flatMap(e=>{const t=Al(e,o);return t?t.map(e=>[...e]):[]}),c=e=>e.every((e,t)=>(e=>{if(!(a>0))return!0;const t=e/o/a;return Math.abs(t-Math.round(t))Math.abs(e-i[t])<=r)),h=[],d=e=>JSON.stringify([e.key,e.cm,e.a,e.b]);for(const i of e||[]){const e=Al(i,o);if(!e)continue;const[s,n]=e;if(![s[0],s[1],n[0],n[1]].every(Number.isFinite)||!c(s)||!c(n)){h.push(d(i));continue}const a=n[0]-s[0],l=n[1]-s[1],p=Math.hypot(a,l);if(p<=r){h.push(d(i));continue}const u=a/p,_=l/p,m=[];for(const e of t){const[t,i]=e;if(![t?.[0],t?.[1],i?.[0],i?.[1]].every(Number.isFinite))continue;const n=e=>Math.abs((e[0]-s[0])*_-(e[1]-s[1])*u);if(n(t)>r||n(i)>r)continue;const o=(t[0]-s[0])*u+(t[1]-s[1])*_,a=(i[0]-s[0])*u+(i[1]-s[1])*_,l=Math.max(0,Math.min(o,a)),c=Math.min(p,Math.max(o,a));c-l>r&&m.push([l,c])}m.sort((e,t)=>e[0]-t[0]||e[1]-t[1]);let g=0;for(const[e,t]of m){if(e>g+r)break;if(g=Math.max(g,t),g>=p-r)break}ge.key!==a);return null==s||s<1?r:[...r,zl(t,i,s,n,o)]}function Gl(e,t,i,s,n,o=[],a=1){let r=e?e.slice():[];for(const e of function(e,t,i,s,n=1,o=[]){const a=dc(e,t,i,s,n,o);if(!a)return[];const r=[];for(let e=0;e0||(c=Ul(c,t,i,s,n,a)))}return c}function Kl(e){const{a:t,b:i,halfDepth:s}=e;if(!Array.isArray(t)||!Array.isArray(i)||t.length<2||i.length<2||![t[0],t[1],i[0],i[1]].every(Number.isFinite))return null;const n=i[0]-t[0],o=i[1]-t[1],a=Math.hypot(n,o);if(!(a>1e-9&&s>0&&Number.isFinite(s)))return null;const r=-o/a*s,l=n/a*s;return[[t[0]+r,t[1]+l],[i[0]+r,i[1]+l],[i[0]-r,i[1]-l],[t[0]-r,t[1]-l]]}function Yl(e,t,i){return Math.hypot(e[0]-t[0],e[1]-t[1])<=i}function Jl(e,t,i){const s=t.b[0]-t.a[0],n=t.b[1]-t.a[1],o=s*s+n*n;if(!(o>i*i))return!1;const a=((e[0]-t.a[0])*s+(e[1]-t.a[1])*n)/o;if(!(a>0&&a<1))return!1;const r=[t.a[0]+s*a,t.a[1]+n*a];return Math.hypot(e[0]-r[0],e[1]-r[1])<=i}function Xl(e,t,i,s){const n=Math.hypot(t,i);if(!(n>1e-9&&s>0))return;const o=[t/n,i/n],a=e.find(e=>Math.abs(e.u[0]*o[1]-e.u[1]*o[0])<1e-9&&e.u[0]*o[0]+e.u[1]*o[1]>1-1e-9);a?a.halfDepth=Math.max(a.halfDepth,s):e.push({u:o,halfDepth:s})}function Zl(e,t){try{const i=oi(Dc(e),Dc(t));let s=null,n=0;for(const e of i||[]){const t=e?.[0]||[],i=Math.abs(nc(t));t.length>=4&&i>n&&(n=i,s=t.slice(0,-1).map(e=>[e[0],e[1]]))}return s}catch{return null}}function Ql(e,t=1e-6){const i=(e||[]).map((e,t)=>({segment:e,index:t})).filter(({segment:e})=>e&&Array.isArray(e.a)&&Array.isArray(e.b)&&e.a.length>=2&&e.b.length>=2&&e.a.every(Number.isFinite)&&e.b.every(Number.isFinite)&&Number.isFinite(e.halfDepth)&&e.halfDepth>0&&Math.hypot(e.b[0]-e.a[0],e.b[1]-e.a[1])>1e-9);if(i.length<2)return[];const s=Math.max(Number.isFinite(t)?t:0,1e-9),n=i.flatMap(({segment:e})=>[e.a,e.b]).map(e=>[e[0],e[1]]).sort((e,t)=>e[0]-t[0]||e[1]-t[1]),o=[];for(const e of n)o.some(t=>Yl(t,e,s))||o.push(e);const a=[];for(const e of o){const t=[];let n=!1;for(const{segment:o,index:a}of i){const i=Math.hypot(o.b[0]-o.a[0],o.b[1]-o.a[1]);Yl(e,o.a,s)?t.push({u:[(o.b[0]-o.a[0])/i,(o.b[1]-o.a[1])/i],halfDepth:o.halfDepth,length:i,index:a}):Yl(e,o.b,s)?t.push({u:[(o.a[0]-o.b[0])/i,(o.a[1]-o.b[1])/i],halfDepth:o.halfDepth,length:i,index:a}):Jl(e,o,s)&&(n=!0)}if(n||2!==t.length)continue;const[o,r]=t,l=o.u[0]*r.u[1]-o.u[1]*r.u[0];if(Math.abs(l)<1e-9)continue;const c=l<0?1:-1,h=[-o.u[1],o.u[0]],d=[-r.u[1],r.u[0]],p=[e[0]+h[0]*o.halfDepth*c,e[1]+h[1]*o.halfDepth*c],u=[e[0]-d[0]*r.halfDepth*c,e[1]-d[1]*r.halfDepth*c];if(!rc(p,o.u,u,r.u))continue;const _=[[o,r,u,[d[0]*-c,d[1]*-c]],[r,o,p,[h[0]*c,h[1]*c]]];for(const[t,,i,n]of _){const o=Math.min(2*t.halfDepth,t.length),r=[-t.u[1]*t.halfDepth,t.u[0]*t.halfDepth],l=[[e[0]+r[0],e[1]+r[1]],[e[0]+t.u[0]*o+r[0],e[1]+t.u[1]*o+r[1]],[e[0]+t.u[0]*o-r[0],e[1]+t.u[1]*o-r[1]],[e[0]-r[0],e[1]-r[1]]],c=e=>(e[0]-i[0])*n[0]+(e[1]-i[1])*n[1],h=[];for(let e=0;e=-1e-12&&h.push(t),s>1e-12&&n<-1e-12||s<-1e-12&&n>1e-12){const e=s/(s-n);h.push([t[0]+(i[0]-t[0])*e,t[1]+(i[1]-t[1])*e])}}h.length>=3&&Math.abs(nc(h))>s*s&&a.push({segmentIndex:t.index,wedge:h})}}return a}function ec(e,t=1e-6){const i=(e||[]).filter(e=>e&&Array.isArray(e.a)&&Array.isArray(e.b)&&e.a.length>=2&&e.b.length>=2&&e.a.every(Number.isFinite)&&e.b.every(Number.isFinite)&&Number.isFinite(e.halfDepth)&&e.halfDepth>0&&Math.hypot(e.b[0]-e.a[0],e.b[1]-e.a[1])>1e-9);if(i.length<2)return[];const s=Math.max(Number.isFinite(t)?t:0,1e-9),n=i.flatMap(e=>[e.a,e.b]).map(e=>[e[0],e[1]]).sort((e,t)=>e[0]-t[0]||e[1]-t[1]),o=[];for(const e of n)o.some(t=>Yl(t,e,s))||o.push(e);const a=[],r=i.map((e,t)=>({roomId:"",a:[e.a[0],e.a[1]],b:[e.b[0],e.b[1]],key:`join-${t}`,kind:"outer",cm:0,open:!1,half:e.halfDepth})),l=gc(r,s);for(const e of fc(l).fans)a.push(e);const c=e=>!!vc(l,e);for(const e of o){if(c(e))continue;const t=[];for(const n of i)Yl(e,n.a,s)?Xl(t,n.b[0]-n.a[0],n.b[1]-n.a[1],n.halfDepth):Yl(e,n.b,s)?Xl(t,n.a[0]-n.b[0],n.a[1]-n.b[1],n.halfDepth):Jl(e,n,s)&&(Xl(t,n.a[0]-e[0],n.a[1]-e[1],n.halfDepth),Xl(t,n.b[0]-e[0],n.b[1]-e[1],n.halfDepth));if(!(t.length<2)){t.sort((e,t)=>Math.atan2(e.u[1],e.u[0])-Math.atan2(t.u[1],t.u[0])||e.halfDepth-t.halfDepth);for(let i=0;is*s&&a.push(m)}}}return a}function tc(e,t,i,s){if(!(t>0)||!e||e.length<2)return"";if(i&&e.length>=3){let i=e;const n=e[e.length-1];if(e.length>=4&&Math.hypot(e[0][0]-n[0],e[0][1]-n[1])<1e-9&&(i=e.slice(0,-1)),i.length>=3){const e=i.map((e,i)=>s?.[i]||t),n=Vc(i,e),o=lc(i,e);if(n&&o)return`${cc(n)} ${cc(hc(o))}`}}const n=[];for(let i=0;i=1e-9&&r>0&&n.push({a:o,b:a,halfDepth:r})}const o=n.map(Kl);for(const{segmentIndex:e,wedge:t}of Ql(n)){const i=o[e];if(!i)continue;const s=Zl(i,t);s&&(o[e]=s)}const a=[...o.filter(e=>!!e),...ec(n)],r=function(e){let t=null;try{for(const i of e){if(i.length<3)continue;const e=Dc(i);t=t?si(t,e):[e]}return t}catch{return null}}(a);return r?Lc(r):a.map(e=>cc(e)).join(" ")}function ic(e,t,i,s,n=1){if(!i.length)return!1;const o=sc(s,n),a=(e[0]+t[0])/2,r=(e[1]+t[1])/2,[l,c]=Tl(e,t);for(const e of i){const[t,i]=Tl([e[0],e[1]],[e[2],e[3]]);if(!(Math.abs(l*i-c*t)>.05)&&Sc(a,r,e[0],e[1],e[2],e[3])<=o)return!0}return!1}function sc(e,t){return Math.max(e*(t>0?t:1)*.04,1e-9)}function nc(e){let t=0;for(let i=0;ie[1]!=l>e[1]&&e[0]<(r-o)*(e[1]-a)/(l-a+0)+o&&(i=!i)}return i}([c[0]+.001*r,c[1]+.001*l],e)||(r=-r,l=-l),[r,l]}function ac(e,t){const i=e[0]*t[1]-e[1]*t[0],s=e[0]*t[0]+e[1]*t[1];return Math.abs(i)<1e-9&&s>0}function rc(e,t,i,s){const n=t[0]*s[1]-t[1]*s[0];if(Math.abs(n)<1e-12)return null;const o=[i[0]-e[0],i[1]-e[1]],a=(o[0]*s[1]-o[1]*s[0])/n;return[e[0]+a*t[0],e[1]+a*t[1]]}function lc(e,t,i){const s=e?.length||0;if(s<3||t.length!==s)return null;if(t.every(e=>!(e>0)))return e.map(e=>[e[0],e[1]]);const n=[];for(let o=0;o0||p>0)){n.push([e[o][0],e[o][1]]);continue}if(d>0!=p>0){const t=e[o],i=d>0?[t[0]+u*d,t[1]+_*d]:[t[0],t[1]],s=p>0?[t[0]+m*p,t[1]+g*p]:[t[0],t[1]];n.push(i),Math.hypot(s[0]-i[0],s[1]-i[1])>1e-9&&n.push(s);continue}if(ac(w,k)){const t=e[o],i=[t[0]+u*d,t[1]+_*d],s=[t[0]+m*p,t[1]+g*p];n.push(i),Math.hypot(s[0]-i[0],s[1]-i[1])>1e-9&&n.push(s);continue}const S=rc(x,w,$,k),M=Math.max(d,p,1e-9),C=vc(i,e[o])?.limit??4*M;if(S){const i=Math.hypot(S[0]-e[o][0],S[1]-e[o][1]);if(Number.isFinite(i)&&i<=C){n.push(S);continue}if(jc(e,t,o)){n.push(S);continue}}d>0&&n.push([e[o][0]+u*d,e[o][1]+_*d]),p>0&&n.push([e[o][0]+m*p,e[o][1]+g*p]),d>0||p>0||n.push([e[o][0],e[o][1]])}return n.length>=3?n:null}function cc(e,t=!0){if(!e.length)return"";let i=`M ${e[0][0]} ${e[0][1]}`;for(let t=1;te?.id===t),r=hi(a);if(!r||r.length<3)return null;const l=sc(s,n),c=[];for(const i of e||[]){if(!i||i.id===t)continue;const e=hi(i);if(e)for(const t of Cs(r,e,l))c.push([t[0],t[1]],[t[2],t[3]])}for(const e of i||[])c.push([e[0],e[1]],[e[2],e[3]]);for(const e of o||[]){const t=Al(e,n);t&&c.push(t[0],t[1])}const h=[],d=[];for(let e=0;el)continue;const a=((e[0]-t[0])*(i[0]-t[0])+(e[1]-t[1])*(i[1]-t[1]))/(s*s);a<=n||a>=1-n||(o.some(e=>Math.abs(e-a)*s<=2*l)||o.push(a))}o.sort((e,t)=>e-t);for(const s of o)h.push([t[0]+(i[0]-t[0])*s,t[1]+(i[1]-t[1])*s]),d.push(e)}return{poly:h,parent:d,orig:r}}function pc(e,t,i,s){const n=t.poly.length,o=new Array(n).fill(0);if(!e?.length)return o;const a=new Set,r=[];for(let l=0;l0?(o[l]=$l(c.cm),a.add(c.key)):r.push(l)}if(!r.length)return o;const l=s>0?s:1,c=Math.max(.5*i,1e-9)*l,h=Fl(e,l).filter(e=>e.w.cm>0);for(let e=r.length-1;e>=0;e--){const i=r[e],s=t.poly[i],a=t.poly[(i+1)%n],d=Nl(s,a);let p=null;for(const e of h){const t=Al(e.w,l);if(!t||!El(Nl(t[0],t[1]),d))continue;if(Sc(s[0],s[1],t[0][0],t[0][1],t[1][0],t[1][1])>c||Sc(a[0],a[1],t[0][0],t[0][1],t[1][0],t[1][1])>c)continue;const i=Math.hypot(a[0]-s[0],a[1]-s[1]),n=Math.hypot(t[1][0]-t[0][0],t[1][1]-t[0][1]),o=Math.max(0,n-i);(!p||oc||Sc(n[0],n[1],t[0][0],t[0][1],t[1][0],t[1][1])>c)continue;i=!0,o=Math.max(0,Math.hypot(t[1][0]-t[0][0],t[1][1]-t[0][1])-_)}else{if(Sc(e.x,e.y,s[0],s[1],n[0],n[1])>c)continue;o=Math.hypot(e.x-d,e.y-p)}(!u||i&&!u.exact||i===u.exact&&o0?i:1,o=(e||[]).filter(e=>e&&!e.open&&null!==e.kind&&Number.isFinite(e.half)&&e.half>0&&Array.isArray(e.a)&&Array.isArray(e.b)&&e.a.length>=2&&e.b.length>=2&&[e.a[0],e.a[1],e.b[0],e.b[1]].every(Number.isFinite)&&Math.hypot(e.b[0]-e.a[0],e.b[1]-e.a[1])>s).sort((e,t)=>e.key.localeCompare(t.key)||e.a[0]-t.a[0]||e.a[1]-t.a[1]||e.b[0]-t.b[0]||e.b[1]-t.b[1]||e.half-t.half),a=new Map;for(const e of o){const t=a.get(e.key);t?e.half>t.half&&a.set(e.key,{...t,half:e.half}):a.set(e.key,e)}const r=[...a.values()].flatMap(e=>[{point:[e.a[0],e.a[1]],other:e.b,halfDepth:e.half,kind:e.kind,key:e.key},{point:[e.b[0],e.b[1]],other:e.a,halfDepth:e.half,kind:e.kind,key:e.key}]).sort((e,t)=>e.point[0]-t.point[0]||e.point[1]-t.point[1]||e.other[0]-t.other[0]||e.other[1]-t.other[1]||e.halfDepth-t.halfDepth),l=new Map;for(const e of r){const[t,i]=uc(e.point,s),n=_c(t,i),o=l.get(n)||[];o.push(e),l.set(n,o)}const c=[],h=new Map;for(const e of r){const t=mc(h,e.point,s).filter(t=>Math.hypot(t.point[0]-e.point[0],t.point[1]-e.point[1])<=s).sort((t,i)=>Math.hypot(t.point[0]-e.point[0],t.point[1]-e.point[1])-Math.hypot(i.point[0]-e.point[0],i.point[1]-e.point[1])||t.point[0]-i.point[0]||t.point[1]-i.point[1]);let i=t[0];if(!i){i={point:[...e.point],rays:[]},c.push(i);const[t,n]=uc(i.point,s),o=_c(t,n),a=h.get(o)||[];a.push(i),h.set(o,a)}const n=e.other[0]-e.point[0],o=e.other[1]-e.point[1],a=Math.hypot(n,o);if(!(a>s))continue;const r=[n/a,o/a];let l=Math.atan2(r[1],r[0]);l<0&&(l+=2*Math.PI),i.rays.push({u:r,halfDepth:e.halfDepth,length:a,angle:l})}const d=[],p=e=>{const t=1e-9*Math.max(1,n),i=e.filter(e=>Number.isFinite(e.halfDepth)&&e.halfDepth>0&&Number.isFinite(e.length)&&e.length>s);return i.filter((e,s)=>!i.some((i,n)=>n!==s&&i.halfDepth>=e.halfDepth-t&&i.length>=e.length-t&&(i.halfDepth>e.halfDepth+t||i.length>e.length+t||ne.length-t.length||e.halfDepth-t.halfDepth).map(e=>({...e}))};for(const e of c){const t=e.rays.sort((e,t)=>e.angle-t.angle||e.length-t.length||e.halfDepth-t.halfDepth),i=[];for(const e of t){const t=i[i.length-1];t&&Math.abs(e.angle-t.angle)<=1e-9?t.supports.push({halfDepth:e.halfDepth,length:e.length}):i.push({u:[...e.u],angle:e.angle,supports:[{halfDepth:e.halfDepth,length:e.length}]})}if(i.length>1&&2*Math.PI-i[i.length-1].angle+i[0].angle<=1e-9){const e=i.pop();i[0].supports.push(...e.supports)}if(i.length<3)continue;const n=i.map(t=>{const i=p(t.supports),n=new Set,o=[];for(const a of i){const i=[e.point[0]+t.u[0]*a.length,e.point[1]+t.u[1]*a.length];for(const t of mc(l,i,s)){if("shared"!==t.kind||Math.hypot(t.point[0]-i[0],t.point[1]-i[1])>s)continue;const a=t.other[0]-t.point[0],r=t.other[1]-t.point[1],l=Math.hypot(a,r);if(!(l>s))continue;const c=a/l,h=r/l;if(Math.hypot(t.other[0]-e.point[0],t.other[1]-e.point[1])<=s)continue;const d=`${t.key}|${t.point[0]}|${t.point[1]}|${t.other[0]}|${t.other[1]}|${t.halfDepth}`;n.has(d)||(n.add(d),o.push({start:[t.point[0],t.point[1]],u:[c,h],length:l,halfDepth:t.halfDepth}))}}return o.sort((e,t)=>e.start[0]-t.start[0]||e.start[1]-t.start[1]||e.u[0]-t.u[0]||e.u[1]-t.u[1]||e.length-t.length||e.halfDepth-t.halfDepth),{u:[...t.u],halfDepth:Math.max(...i.map(e=>e.halfDepth)),length:Math.max(...i.map(e=>e.length)),supports:i,continuations:o}}).filter(e=>Number.isFinite(e.halfDepth)&&e.halfDepth>0&&Number.isFinite(e.length)&&e.length>s);if(n.length<3)continue;const o=Math.max(...n.map(e=>e.halfDepth));o>0&&Number.isFinite(o)&&d.push({point:[...e.point],rays:n,halfDepth:o,limit:1.25*o})}d.sort((e,t)=>e.point[0]-t.point[0]||e.point[1]-t.point[1]);const u=new Map;for(const e of d){const[t,i]=uc(e.point,s),n=_c(t,i),o=u.get(n)||[];o.push(e),u.set(n,o)}return{epsilon:s,coordinateScale:n,nodes:d,index:u}}function fc(e){const t={fans:[],supports:[]};if(!e?.nodes?.length)return t;const i=Math.max(e.epsilon,1e-9)**2;for(const s of e.nodes){const e=s.rays.filter(e=>Number.isFinite(e.halfDepth)&&e.halfDepth>0).map(e=>({...e,thickLength:Math.max(...e.supports.filter(t=>t.halfDepth>=e.halfDepth-1e-12).map(e=>e.length),0),angle:(()=>{const t=Math.atan2(e.u[1],e.u[0]);return t<0?t+2*Math.PI:t})()})).sort((e,t)=>e.angle-t.angle);if(e.length<2)continue;const n=s.point;for(const i of e)for(const e of i.supports){if(!(e.halfDepth>0&&e.length>0))continue;const s=-i.u[1]*e.halfDepth,o=i.u[0]*e.halfDepth,a=[n[0]+i.u[0]*e.length,n[1]+i.u[1]*e.length];t.supports.push([[n[0]+s,n[1]+o],[a[0]+s,a[1]+o],[a[0]-s,a[1]-o],[n[0]-s,n[1]-o]])}for(let s=0;s{const e=a.angle-o.angle;return e>0?e:e+2*Math.PI})();if(r<1e-9)continue;const l=r>Math.PI+1e-9,c=4*Math.max(o.halfDepth,a.halfDepth),h=[n[0]-o.u[1]*o.halfDepth,n[1]+o.u[0]*o.halfDepth],d=[n[0]+a.u[1]*a.halfDepth,n[1]-a.u[0]*a.halfDepth],p=o.u[0]*a.u[1]-o.u[1]*a.u[0],u=e=>{let t=Math.atan2(e[1]-n[1],e[0]-n[0])-o.angle;for(;t<0;)t+=2*Math.PI;return t<=r+1e-9};let _=null;if(Math.abs(p)>1e-9){const e=((d[0]-h[0])*a.u[1]-(d[1]-h[1])*a.u[0])/p,t=((d[0]-h[0])*o.u[1]-(d[1]-h[1])*o.u[0])/p,i=[h[0]+o.u[0]*e,h[1]+o.u[1]*e];(l?e<=1e-9&&t<=1e-9:e>1e-9&&e<=o.thickLength&&t<=a.thickLength)&&Math.hypot(i[0]-n[0],i[1]-n[1])<=c&&u(i)&&(_=i)}const m=e=>{Math.abs(nc(e))>i&&t.fans.push(e)};if(_){const e=1.5*Math.max(o.halfDepth,a.halfDepth);m(bl([n[0],n[1]],h,_,d,e)??[[n[0],n[1]],h,_,d]);continue}if(l){m([[n[0],n[1]],h,d]);continue}const g=(e,t)=>Math.min(t,Math.sqrt(Math.max(c**2-e**2,0)),2*Math.max(o.halfDepth,a.halfDepth)),f=[h[0]+o.u[0]*g(o.halfDepth,o.thickLength),h[1]+o.u[1]*g(o.halfDepth,o.thickLength)],v=[d[0]+a.u[0]*g(a.halfDepth,a.thickLength),d[1]+a.u[1]*g(a.halfDepth,a.thickLength)];m([[n[0],n[1]],h,f,v,d])}}return t}function vc(e,t){return!e||!Array.isArray(t)||t.length<2||!t.slice(0,2).every(Number.isFinite)?null:mc(e.index,t,e.epsilon).filter(i=>Math.hypot(i.point[0]-t[0],i.point[1]-t[1])<=e.epsilon).sort((e,i)=>Math.hypot(e.point[0]-t[0],e.point[1]-t[1])-Math.hypot(i.point[0]-t[0],i.point[1]-t[1])||e.point[0]-i.point[0]||e.point[1]-i.point[1])[0]||null}function bc(e,t,i,s,n,o,a){return gc(wc(e,t,i,s,n,o,a),4*sc(s,a),a)}function yc(e,t,i,s,n,o,a,r=1){const l=dc(e,t,s,n,r,i);if(!l)return null;const c=function(e,t,i){const s=(e||[]).find(e=>e?.id===t),n=hi(s);if(!n)return[];const o=[];for(const s of e||[]){if(!s||s.id===t)continue;const e=hi(s);if(e)for(const t of Cs(n,e,i))o.push(t)}return o}(e,t,sc(n,r)),h=function(e,t,i,s,n){const o=sc(s,n),a=[];for(let r=0;rSc(h,d,e[0],e[1],e[2],e[3])<=o);a.push(p?"shared":"outer")}return a}(l.poly,c,s,n,r),d=pc(i,l,n,r),p=d.map((e,t)=>h[t]&&e>0?Ml(e,o,a)/2:0);return{...l,kinds:h,cms:d,offsets:p}}function wc(e,t,i,s,n,o,a=1){const r=[];for(const l of e||[]){if(!l?.id)continue;const c=yc(e,l.id,t,i,s,n,o,a);if(c)for(let e=0;e0&&(r=Ul(r,e.a,e.b,e.cm,s,a));return r}function xc(e,t,i,s,n,o,a=1){if(!t?.length)return[];const r=wc(e,t,i,s,n,o,a),l=new Map;for(const e of r){if(e.open||!e.kind||!e.roomId)continue;const t=l.get(e.key)||new Set;t.add(e.roomId),l.set(e.key,t)}const c=e=>{const t=[...l.get(e)||[]].sort();return 1!==t.length&&2!==t.length?`ambiguous:${e}`:`${1===t.length?"outer":"shared"}:${t.join("|")}`},h=[],d=new Set;for(const e of r)!e.open&&e.cm>0&&!d.has(e.key)&&(d.add(e.key),h.push({...e,ownerSignature:c(e.key)}));const p=[];for(const r of e||[]){if(!r?.id)continue;const l=yc(e,r.id,t,i,s,n,o,a);if(l)for(let e=0;e0)||null===l.kinds[i]){e++;continue}const o=c(Rl(l.poly[i],l.poly[(i+1)%l.poly.length],s,a));let r=e;for(;r+10&&p.push({a:[d[0],d[1]],b:[u[0],u[1]],key:Rl(d,u,s,a),cm:n,len:_,ownerSignature:o}),e=r+1}}}p.sort((e,t)=>t.len-e.len||e.key.localeCompare(t.key));const u=[],_=new Set,m=new Set,g=4*sc(s,a);for(const e of p){const t=h.filter(t=>!m.has(t.key)&&t.cm===e.cm&&t.ownerSignature===e.ownerSignature&&El(Nl(t.a,t.b),Nl(e.a,e.b))&&Sc(t.a[0],t.a[1],e.a[0],e.a[1],e.b[0],e.b[1])<=g&&Sc(t.b[0],t.b[1],e.a[0],e.a[1],e.b[0],e.b[1])<=g);if(t.length){for(const e of t)m.add(e.key);_.has(e.key)||(_.add(e.key),u.push(zl(e.a,e.b,e.cm,s,a)))}}for(const e of h)m.has(e.key)||_.has(e.key)||(_.add(e.key),u.push(zl(e.a,e.b,e.cm,s,a)));return u}function $c(e,t,i,s,n,o,a,r=1){const l=sc(n,r),c=(s[0]+s[2])/2,h=(s[1]+s[3])/2,d=Nl([s[0],s[1]],[s[2],s[3]]);let p=null;for(const s of wc(e,t,i,n,o,a,r)){if(!El(Nl(s.a,s.b),d))continue;const e=Sc(c,h,s.a[0],s.a[1],s.b[0],s.b[1]);e>4*l||(!p||e[e[0],e[1]]),o=Math.abs(nc(n));n.length>=3&&o>i&&(t=n,i=o)}return t}function Cc(e,t,i,s,n,o,a,r=1,l,c){const h=(e||[]).find(e=>e?.id===t),d=hi(h);if(!d||d.length<3)return null;if(!i?.length)return d.map(e=>[e[0],e[1]]);const p=yc(e,t,i,s,n,o,a,r);if(!p||!p.offsets.some(e=>e>0))return d.map(e=>[e[0],e[1]]);const u=c||bc(e,i,s,n,o,a,r),_=lc(p.poly,p.offsets,u);if(!_)return d.map(e=>[e[0],e[1]]);if(!u.nodes.length)return _;const m=void 0===l?qc(e,i,s,[],n,o,a,r):null,g=l??("ok"===m?.status||"degraded-extra"===m?.status?m.roomGeom:void 0);if(g)try{const e=Mc(oi(Dc(p.poly),g));if(e)return e}catch{}return function(e,t){try{return Mc(ni(Dc(e),Dc(t)))}catch{return null}}(_,p.poly)||d.map(e=>[e[0],e[1]])}function Dc(e){const t=e.map(e=>[e[0],e[1]]);return t.push([e[0][0],e[0][1]]),[t]}function Pc(e){return!(!Array.isArray(e)||!e.length)&&e.every(e=>Array.isArray(e)&&e.length&&e.every(e=>Array.isArray(e)&&e.length>=4&&e.every(e=>Array.isArray(e)&&e.length>=2&&Number.isFinite(e[0])&&Number.isFinite(e[1])))&&Math.abs(Ti(e[0]))>1e-9)}function Tc(e,t,i,s){const n=s?new Set(s):null;let o=null;for(let s=0;st.epsilon))continue;const l=Fc([[e.point[0]+r[0]*s.halfDepth,e.point[1]+r[1]*s.halfDepth],[e.point[0]+a.u[0]*n+r[0]*s.halfDepth,e.point[1]+a.u[1]*n+r[1]*s.halfDepth],[e.point[0]+a.u[0]*n-r[0]*s.halfDepth,e.point[1]+a.u[1]*n-r[1]*s.halfDepth],[e.point[0]-r[0]*s.halfDepth,e.point[1]-r[1]*s.halfDepth]],t.coordinateScale);if(!l)continue;const c=Dc(l);o=o?si(o,c):c}}return o}function Ic(e,t,i){let s=null;for(const n of e.rays)for(const e of n.continuations){const n=[-e.u[1],e.u[0]],o=[e.start[0]+e.u[0]*e.length,e.start[1]+e.u[1]*e.length],a=Fc([[e.start[0]+n[0]*e.halfDepth,e.start[1]+n[1]*e.halfDepth],[o[0]+n[0]*e.halfDepth,o[1]+n[1]*e.halfDepth],[o[0]-n[0]*e.halfDepth,o[1]-n[1]*e.halfDepth],[e.start[0]-n[0]*e.halfDepth,e.start[1]-n[1]*e.halfDepth]],t.coordinateScale);if(!a)continue;const r=ni(Dc(a),i);Array.isArray(r)&&0!==r.length&&(s=s?si(s,r):r)}return s}function Rc(e,t,i=2*(4*e.halfDepth+2*t.epsilon)){const s=function(e,t=yl){const i=new Set,s=Number.isFinite(t)&&t>=0?t:yl;for(let t=0;te-t)}(e);return s.length?Tc(e,t,i,s):null}function Ac(e,t,i,s,n){const o=function(e){let t=null;for(const i of e){const e=Dc(i);try{t=t?si(t,e):e}catch{}}return t}(function(e,t,i=!1){if(!e)return[];const s=[];for(const n of e.nodes)for(let o=0;o1e-9)||h>=Math.PI-1e-9)continue;const d=[-a.u[1],a.u[0]],p=[-r.u[1],r.u[0]],u=[n.point[0]+d[0]*a.halfDepth,n.point[1]+d[1]*a.halfDepth],_=[n.point[0]-p[0]*r.halfDepth,n.point[1]-p[1]*r.halfDepth],m=rc(u,a.u,_,r.u);if(!m)continue;const g=Math.hypot(m[0]-n.point[0],m[1]-n.point[1]);if(!Number.isFinite(g)||g<=n.limit)continue;const f=t?Math.sqrt(Math.max(0,n.limit*n.limit-a.halfDepth*a.halfDepth)):0,v=t?Math.sqrt(Math.max(0,n.limit*n.limit-r.halfDepth*r.halfDepth)):0,b=Fc([[u[0]+a.u[0]*f,u[1]+a.u[1]*f],[_[0]+r.u[0]*v,_[1]+r.u[1]*v],m],e.coordinateScale);if(b&&s.push(b),i){const t=m[0]-n.point[0],i=m[1]-n.point[1],o=Math.hypot(t,i),a=g-n.limit;if(o>e.epsilon&&a>e.epsilon){const r=Math.min(Math.max(8*e.epsilon,.05*n.halfDepth),.25*a),l=t/o,c=i/o,h=-c,d=l,p=Fc([[m[0]-l*r+h*r,m[1]-c*r+d*r],[m[0]-l*r-h*r,m[1]-c*r-d*r],[m[0]+l*r,m[1]+c*r]],e.coordinateScale);p&&s.push(p)}}}return s}({...t,nodes:[e]},i,s));return o&&n?oi(o,n):o}function zc(e,t,i,s){if(!e||!t.nodes.length)return e;let n=null;try{n=function(e){let t=null;for(const i of e.nodes){const s=Rc(i,e);s&&(t=t?si(t,s):s)}return t}(t)}catch{return e}let o=e;for(const e of t.nodes){const a=4*e.halfDepth+2*t.epsilon,r=2*a,l=[[e.point[0]-a,e.point[1]-a],[e.point[0]+a,e.point[1]-a],[e.point[0]+a,e.point[1]+a],[e.point[0]-a,e.point[1]+a]];try{let a=o;const c=Ac(e,t,!1,!0,n);c&&(a=oi(a,c));let h=Tc(e,t,r);const d=Ac(e,t,!0,!0,n);d&&(h=oi(h,d)),n&&(h=si(h,n));const p=.02*Math.min(...e.rays.map(e=>e.halfDepth));if(h=si(h,Dc([[e.point[0]-p,e.point[1]-p],[e.point[0]+p,e.point[1]-p],[e.point[0]+p,e.point[1]+p],[e.point[0]-p,e.point[1]+p]])),!h)continue;let u=ni(h,Dc(l));s?u=ni(u,s):i&&(u=ni(u,i));const _=Dc(l),m=oi(a,_),g=i?oi(ni(a,_),i):null,f=Ic(e,t,_);o=si(m,...g?[g]:[],...f?[f]:[],u)}catch{}}if(n)try{let e=n;s?e=ni(e,s):i&&(e=ni(e,i)),o=si(o,e)}catch{}return o}function Fc(e,t=1){if(!Array.isArray(e)||e.length<3)return null;const i=Number.isFinite(t)&&t>0?t:1,s=1e-12*Math.max(1,i),n=[];for(const t of e){if(!Array.isArray(t)||t.length<2)return null;const e=Number(t[0]),i=Number(t[1]);if(!Number.isFinite(e)||!Number.isFinite(i))return null;const o=Math.round(e/s)*s,a=Math.round(i/s)*s;if(!Number.isFinite(o)||!Number.isFinite(a))return null;n.push([Object.is(o,-0)?0:o,Object.is(a,-0)?0:a])}return Math.abs(nc(n))>s*s?n:null}function Nc(e,t,i,s){if(Sc(e[0],e[1],t[0],t[1],i[0],i[1])>s)return!1;const n=i[0]-t[0],o=i[1]-t[1],a=(e[0]-t[0])*n+(e[1]-t[1])*o,r=n*n+o*o,l=s*Math.sqrt(r);return a>=-l&&a<=r+l}function Ec(e,t,i){const s=[],n=[];for(let o=0;oi*i))continue;const d=i/Math.sqrt(h),p=[0,1];for(const e of t)for(const t of[e.a,e.b]){if(!Nc(t,a,r,i))continue;const e=((t[0]-a[0])*l+(t[1]-a[1])*c)/h;e>d&&e<1-d&&p.push(e)}p.sort((e,t)=>e-t);const u=p.filter((e,t)=>0===t||Math.abs(e-p[t-1])>d);for(let e=0;e=3&&n.length===s.length?{poly:s,offsets:n}:null}function Oc(e,t,i,s,n,o,a,r){const l=(e||[]).map(hi).filter(e=>!!e&&e.length>=3);if(!l.length)return null;let c=si(Dc(l[0]));for(let e=1;e"outer"===e.kind&&e.half>0),p=4*sc(s,a),u=r||gc(h,p,a);let _=null;for(const e of function(e){const t=[];for(const i of Array.isArray(e)?e:[])if(Array.isArray(i))for(const e of i){if(!Array.isArray(e)||e.length<4)continue;const i=e.slice(0,-1).map(e=>[e[0],e[1]]);i.length>=3&&t.push(i)}return t}(c)){const t=Ec(e,d,p);if(!t||!t.offsets.some(e=>e>0))continue;const i=Vc(t.poly,t.offsets,u),s=lc(t.poly,t.offsets,u);if(!i||!s)continue;const n=oi(Dc(i),Dc(s));_=_?si(_,n):n}return{centre:c,shell:_||[]}}function Hc(e,t,i,s,n,o,a=1){try{const r=Oc(e,t,i,s,n,o,a,bc(e,t,i,s,n,o,a));if(!r)return[];return r.shell?.length?si(r.centre,r.shell):r.centre}catch{return null}}function Lc(e){if(!e)return"";let t="";for(const i of e)if(Array.isArray(i))for(const e of i){if(!Array.isArray(e)||e.length<4)continue;const i=e.slice(0,e.length-1);i.length<3||(t+=(t?" ":"")+cc(i.map(e=>[e[0],e[1]])))}return t}const Bc=15;function jc(e,t,i){const s=e?.length||0;if(s<3||t?.length!==s)return!1;const n=e[(i-1+s)%s],o=e[i],a=e[(i+1)%s],r=[n[0]-o[0],n[1]-o[1]],l=[a[0]-o[0],a[1]-o[1]],c=Math.hypot(r[0],r[1]),h=Math.hypot(l[0],l[1]);if(!(c>1e-9&&h>1e-9))return!1;const d=Math.max(-1,Math.min(1,(r[0]*l[0]+r[1]*l[1])/(c*h))),p=Math.acos(d);if(!(p>1e-9))return!1;if(p>=Bc*Math.PI/180)return!1;const u=Math.max(Math.max(0,t[(i-1+s)%s]),Math.max(0,t[i]));if(!(u>0))return!1;const _=u/Math.tan(p/2);return Number.isFinite(_)&&_>0&&_e>0))continue;for(const e of l.offsets)e>0&&(p=Math.max(p,2*e));const c=Vc(l.poly,l.offsets,d),u=lc(l.poly,l.offsets,d);c&&h.push({outset:c,inset:u})}for(const e of l){const t=e.map(e=>e[0]),i=e.map(e=>e[1]);if(t.length){const s=Math.min(Math.max(...t)-Math.min(...t),Math.max(...i)-Math.min(...i)),n=Math.min(...e.map((t,i)=>{const s=e[(i+1)%e.length];return Math.hypot(s[0]-t[0],s[1]-t[1])}));p=Math.max(p,e.length>16?s:n)}}const u=function(e,t,i,s,n,o,a,r){if(!t?.length||!i?.length)return[];const l=4*sc(s,a),c=new Map;for(const r of wc(e,t,i,s,n,o,a))!r.open&&r.half>0&&!c.has(r.key)&&c.set(r.key,r);const h=[...c.values()];if(h.length<2)return[];const d=r||gc(h,l),p=[];for(const e of i)for(const t of[[e[0],e[1]],[e[2],e[3]]])p.some(e=>Math.hypot(e[0]-t[0],e[1]-t[1])<=l)||p.push(t);const u=[],_=(e,t)=>{let i=0,s=0;if(Math.hypot(e.a[0]-t[0],e.a[1]-t[1])<=l)i=e.b[0]-e.a[0],s=e.b[1]-e.a[1];else{if(!(Math.hypot(e.b[0]-t[0],e.b[1]-t[1])<=l))return null;i=e.a[0]-e.b[0],s=e.a[1]-e.b[1]}const n=Math.hypot(i,s);return n>l?[i/n,s/n]:null};for(const e of p){const t=h.map(t=>({iv:t,u:_(t,e)})).filter(e=>!!e.u);for(let i=0;i0?[e.slice(),p,m,_]:[e.slice(),_,m,p];else{if(!f)continue;{const t=[-n.u[1],n.u[0]],i=[-o.u[1],o.u[0]],s=a<0?1:-1,r=[e[0]+t[0]*n.iv.half*s,e[1]+t[1]*n.iv.half*s],l=[e[0]-i[0]*o.iv.half*s,e[1]-i[1]*o.iv.half*s];b=a>0?[e.slice(),r,l]:[e.slice(),l,r]}}Math.abs(nc(b))>l*l&&u.push(b)}}return u}(e,t,i,n,o,a,r,d),_=s.length?Kc(e,t,i,n,o,a,r):null;let m="exterior";try{const v=Oc(e,t,i,n,o,a,r,d);m="paper";const b=v?v.shell?.length?si(v.centre,v.shell):v.centre:[],y=e=>{const t=Dc(e.outset);if(!e.inset)return t;const i=Dc(e.inset);return oi(t,i)};m="room-rings";let w=null;for(const e of h)try{const t=y(e);w=w?si(w,t):t}catch{}if(m="edge-bodies",v)for(const s of Gc(e,t,i,n,o,a,r))try{const e=ni(Dc(s.quad),v.centre);w=w?si(w,e):e}catch{}m="junctions",w=function(e,t,i=1,s=si){let n=e;for(const e of t||[]){const t=Fc(e,i);if(t)try{const e=Dc(t);n=n?s(n,e):e}catch{}}return n}(w,u,r),m="facade-clip",w&&v&&(w=ni(w,v.centre)),m="exterior-shell";const k=[];let x=0;if(v?.shell?.length)if(w)try{const e=si(w,v.shell);if(!Pc(e))throw new Error("invalid shell union");w=e}catch{if(!Pc(w)||!Pc(v.shell))throw new Error("invalid shell");k.push({id:"exterior-shell",geom:v.shell}),x++}else w=v.shell;if(m="multi-wall-trim",w&&d.nodes.length){const e=e=>e.rays.some(e=>e.supports.some(e=>e.length<2*e.halfDepth)),t=d.nodes.filter(e);if(t.length){w=zc(w,{...d,nodes:t},v?.centre,b)}}if(m="junction-corners",d.nodes.length){const s=fc(d),l=function(e,t,i,s,n,o,a,r){try{const l=Oc(e,t,i,s,n,o,a,{epsilon:r.epsilon,coordinateScale:r.coordinateScale,nodes:[],index:new Map});return l?l.shell?.length?si(l.centre,l.shell):l.centre:null}catch{return null}}(e,t,i,n,o,a,r,d);for(const e of s.fans)try{let t=[Dc(e)];if(l&&(t=ni(t,l)),!t?.length)continue;w=w?si(w,t):t}catch{}g=w,f=Math.max(d.epsilon,1e-9)**2,w=Array.isArray(g)?g.map(e=>{if(!Array.isArray(e)||!e.length)return e;const[t,...i]=e;return Math.abs(nc(t||[]))<=f?null:[t,...i.filter(e=>Math.abs(nc(e||[]))>f)]}).filter(e=>!!e):g}const $=w||[],S=[...Pc($)?[{id:"room-primary",geom:$}]:[],...k.map((e,t)=>({id:`room-isolated-${t}`,geom:e.geom}))];m="openings";for(const e of s){if(!(e.length>0))continue;const t=Xc(_,e,!0);if(!t.negative&&!t.positive)continue;const i=e.angle*Math.PI/180,s=Math.cos(i),o=Math.sin(i),a=-o,l=s,c=e.length/2,h=1.25*Math.max(p,n*r),d=[[e.x-s*c-a*h,e.y-o*c-l*h],[e.x+s*c-a*h,e.y+o*c-l*h],[e.x+s*c+a*h,e.y+o*c+l*h],[e.x-s*c+a*h,e.y-o*c+l*h]];w&&(w=oi(w,Dc(d)));for(const e of k)e.geom=oi(e.geom,Dc(d))}m="extras";const M=[];let C=0;const D=c.mergeExtra||((e,t)=>e?si(e,t):t);for(let e=0;ee.length>=2&&Number.isFinite(e[0])&&Number.isFinite(e[1]))||Math.abs(Ti(t))<=1e-9){C++;continue}const i=[Dc(t)];try{const t=D(w,i,e);if(!Pc(t))throw new Error("invalid extra union");w=t}catch{C++,Pc(i)&&M.push({id:`extra-${e}`,geom:i})}}M.push(...k),M.sort((e,t)=>Lc(e.geom).localeCompare(Lc(t.geom)));const P=w||[];return{status:C||x?"degraded-extra":"ok",geom:P,components:[...Pc(P)?[{id:"primary",geom:P}]:[],...M.map((e,t)=>({...e,id:`isolated-${t}`}))],roomGeom:$,roomComponents:S,paperGeom:b,depthUnits:p,openingPadUnits:1.25*Math.max(p,n*r),openingIndex:_,multiWallNodes:d,degradedExtraCount:C+x}}catch{return c.onCoreFailure?.(m),{status:"failed-core",geom:[],components:[],roomGeom:[],paperGeom:[],roomComponents:[],depthUnits:p,openingIndex:null,multiWallNodes:d,degradedExtraCount:0}}var g,f}function Wc(e,t,i,s=[],n,o,a,r=1,l=[],c={}){if(!t?.length&&!l.length)return null;return Uc(qc(e,t,i,s,n,o,a,r,l,c))}function Uc(e){if("failed-core"===e.status||"not-applicable"===e.status)return null;const t=e.components.map(e=>({id:e.id,d:Lc(e.geom),fillRule:"evenodd"})).filter(e=>!!e.d),i=t[0]?.d||"",s=Lc(e.paperGeom);if(t.length){const n={status:e.status,d:i,paths:t,components:e.components,roomGeom:e.roomGeom,multiWallNodes:e.multiWallNodes,paperD:s,depthUnits:e.depthUnits,fillRule:"evenodd"};return Object.defineProperties(n,{roomComponents:{value:e.roomComponents||[],enumerable:!1},openingIndex:{value:e.openingIndex,enumerable:!1},openingPadUnits:{value:e.openingPadUnits,enumerable:!1}}),n}return null}function Gc(e,t,i,s,n,o,a=1){if(!t?.length)return[];const r=new Set,l=[];for(const c of e||[]){if(!c?.id)continue;const h=yc(e,c.id,t,i,s,n,o,a);if(!h)continue;const d=h.poly;for(let e=0;e0))continue;const u=Rl(t,i,s,a);if(r.has(u))continue;r.add(u);const _=Ml(p,n,o),[m,g]=oc(d,e),f=-m,v=-g,b=_/2,y=[[t[0]+f*b,t[1]+v*b],[i[0]+f*b,i[1]+v*b],[i[0]+m*b,i[1]+g*b],[t[0]+m*b,t[1]+g*b]];l.push({key:u,kind:c,cm:p,quad:y,a:[t[0],t[1]],b:[i[0],i[1]],depthUnits:_})}}return l}function Vc(e,t,i){const s=e?.length||0;if(s<3||t.length!==s)return null;if(t.every(e=>!(e>0)))return e.map(e=>[e[0],e[1]]);hc(e),t.slice().reverse();const n=[];for(let o=0;o0||l>0)){n.push([e[o][0],e[o][1]]);continue}if(r>0!=l>0){const t=e[o],i=r>0?[t[0]-c*r,t[1]-h*r]:[t[0],t[1]],s=l>0?[t[0]-d*l,t[1]-p*l]:[t[0],t[1]];n.push(i),Math.hypot(s[0]-i[0],s[1]-i[1])>1e-9&&n.push(s);continue}if(ac(w,k)){const t=e[o],i=[t[0]-c*r,t[1]-h*r],s=[t[0]-d*l,t[1]-p*l];n.push(i),Math.hypot(s[0]-i[0],s[1]-i[1])>1e-9&&n.push(s);continue}const S=rc(x,w,$,k),M=Math.max(r,l,1e-9),C=vc(i,e[o])?.limit??4*M;if(S){const i=Math.hypot(S[0]-e[o][0],S[1]-e[o][1]);if(Number.isFinite(i)&&i<=C){n.push(S);continue}if(jc(e,t,o)){n.push([e[o][0],e[o][1]]);continue}}r>0&&n.push([e[o][0]-c*r,e[o][1]-h*r]),l>0&&n.push([e[o][0]-d*l,e[o][1]-p*l])}return n.length>=3?n:null}function Kc(e,t,i,s,n,o,a=1){const r=[];for(const l of e||[]){if(!l?.id)continue;const c=yc(e,l.id,t,i,s,n,o,a);if(!c)continue;const h=Math.abs(Ti(c.poly));for(let e=0;e[Math.max(t,e.x0),Math.min(i,e.x1)]).filter(e=>e[1]-e[0]>s).sort((e,t)=>e[0]-t[0]||e[1]-t[1]);if(!n.length)return{coverage:0,full:!1};let o=n[0][0],a=n[0][1],r=0,l=o<=t+s;for(let e=1;e=i-s,{coverage:r,full:l}}function Jc(e,t){return Number(t.full)-Number(e.full)||e.faceDistance-t.faceDistance||e.area-t.area||e.roomId.localeCompare(t.roomId)}function Xc(e,t,i=!1){const s=Number(t?.x),n=Number(t?.y),o=Number(t?.angle),a=Number(t?.length);if(!([s,n,o,a].every(Number.isFinite)&&a>0))return{negative:null,positive:null};const r=o*Math.PI/180,l=Math.cos(r),c=Math.sin(r),h=-c,d=l,p=a/2,u=Math.max(1e-9,e.adjacencyEps),_=new Map;let m=0;for(const t of e.edges){if(i&&!(t.half>0))continue;if(!Bl(t.a,t.b,o))continue;const[e,a]=Tl(t.a,t.b);if(Math.abs((s-t.a[0])*a-(n-t.a[1])*e)>u)continue;const r=(t.a[0]-s)*l+(t.a[1]-n)*c,g=(t.b[0]-s)*l+(t.b[1]-n)*c,f=Math.max(-p,Math.min(r,g)),v=Math.min(p,Math.max(r,g));if(v-f<=u)continue;const b=t.inward[0]*h+t.inward[1]*d>=0?1:-1,y=((t.a[0]+t.b[0])/2-s)*h+((t.a[1]+t.b[1])/2-n)*d,w=Math.abs(y+b*t.half),k=`${b}|${t.roomId}`,x={x0:f,x1:v,half:t.half,cm:t.cm,key:t.key,axis:[e,a]},$=_.get(k);$?($.pieces.push(x),$.faceDistance=Math.min($.faceDistance,w)):_.set(k,{roomId:t.roomId,side:b,order:m++,pieces:[x],faceDistance:w,area:t.area,coverage:0,full:!1})}for(const e of _.values()){const t=Yc(e.pieces,-p,p,u);e.coverage=t.coverage,e.full=t.full}const g=e=>{const t=[..._.values()].filter(t=>t.side===e&&t.coverage>u);return t.sort(Jc),t[0]||null};return{negative:g(-1),positive:g(1)}}function Zc(e,t){const i=Xc(e,t),s=[i.negative,i.positive].filter(e=>!!e);if(!s.length)return{ox:0,oy:0,cm:0,side:-1};const n=i.negative&&i.positive?-1:s[0].side,o=t.flip_v?-n:n,a=(-1===o?i.negative:i.positive)||s[0],r=[...a.pieces].sort((e,t)=>(e.x0<=0&&e.x1>=0?0:Math.min(Math.abs(e.x0),Math.abs(e.x1)))-(t.x0<=0&&t.x1>=0?0:Math.min(Math.abs(t.x0),Math.abs(t.x1)))||t.x1-t.x0-(e.x1-e.x0)||e.key.localeCompare(t.key))[0];if(!(r.half>0&&r.cm>0))return{ox:0,oy:0,cm:0,side:o};const l=t.angle*Math.PI/180,c=-Math.sin(l),h=Math.cos(l);return{ox:c*o*r.half,oy:h*o*r.half,cm:r.cm,side:o}}function Qc(e,t){const i=1e-9,s=t.filter(e=>Number.isFinite(e.x0)&&Number.isFinite(e.x1)&&Number.isFinite(e.half)&&e.x1>e.x0&&e.half>0);if(!s.length)return"";const n=s.flatMap(e=>[e.x0,e.x1]).sort((e,t)=>e-t),o=[];for(const e of n){const t=o[o.length-1];(void 0===t||e>t+i)&&o.push(e)}const a=[];for(let e=0;e+1t+i))continue;const r=(t+n)/2,l=s.reduce((e,t)=>r>=t.x0-i&&r<=t.x1+i?Math.max(e,t.half):e,0);if(!(l>0))continue;const c=a[a.length-1];c&&t<=c.x1+i&&Math.abs(l-c.half)<=i?c.x1=n:a.push({x0:t,x1:n,half:l})}const r=[];for(const e of a){const t=r[r.length-1],s=t?.[t.length-1];s&&e.x0<=s.x1+i?(e.x0=s.x1,t.push(e)):r.push([e])}return r.map(t=>{const i=t[0],s=t[t.length-1],n=Math.min(.25*Math.min(...t.map(e=>e.half)),.75),o=-e*n,a=[];if(1===e){a.push(`M ${i.x0} ${o} L ${s.x1} ${o}`);for(let e=t.length-1;e>=0;e--){const i=t[e];a.push(`L ${i.x1} ${i.half} L ${i.x0} ${i.half}`)}}else{a.push(`M ${s.x1} ${o} L ${i.x0} ${o}`);for(const e of t)a.push(`L ${e.x0} ${-e.half} L ${e.x1} ${-e.half}`)}return a.push("Z"),a.join(" ")}).join(" ")}function eh(e,t,i,s){if(!s)return i;const n=e.angle*Math.PI/180,o=Math.cos(n),a=Math.sin(n),r=[],l=1e-9;for(const n of i){const[i,c]=n.axis,h=o*i+a*c;if(Math.abs(h)<=l)continue;const d=e.x*i+e.y*c,p=d+h*n.x0,u=d+h*n.x1,_=Math.min(p,u),m=Math.max(p,u),g=`${n.key}|${t}`,f=s.get(g)||[];let v=[[_,m]];for(const[e,t]of f){const i=[];for(const[s,n]of v)t<=s+l||e>=n-l?i.push([s,n]):(e>s+l&&i.push([s,Math.min(n,e)]),te[0]-t[0]||e[1]-t[1]),y=[];for(const e of b){const t=y[y.length-1];t&&e[0]<=t[1]+l?t[1]=Math.max(t[1],e[1]):y.push([e[0],e[1]])}s.set(g,y)}return r}function th(e,t){const i=new Map;return t.map(t=>function(e,t,i){const s=Xc(e,t,!0),n=s.negative,o=s.positive;if(!n&&!o)return null;let a;if(n&&o)a=[{candidate:n,side:-1},{candidate:o,side:1}];else{const e=n||o;a=[{candidate:e,side:-1},{candidate:e,side:1}]}const r=a.map(({candidate:e,side:s})=>({candidate:e,side:s,pieces:eh(t,s,e.pieces,i)})),l=r.map(({candidate:e,side:t,pieces:i})=>({side:t,roomId:e.roomId,d:Qc(t,i)})),c=r.flatMap(({pieces:e})=>e);if(!c.length)return null;const h=Math.max(...c.map(e=>e.half));return{faces:l,minY:-h,maxY:h,wallKey:[...new Set(c.map(e=>e.key))].sort().join("|")}}(e,t,i))}const ih=150,sh=1e-6;function nh(e){return Number.isFinite(e)?Math.max(1,Math.min(ih,e)):1}function oh(e){return((Number.isFinite(Number(e))?Number(e):0)%90+90)%90}const ah=e=>{const t=e.map(e=>[e[0],e[1]]);return!t.length||t[0][0]===t[t.length-1][0]&&t[0][1]===t[t.length-1][1]||t.push([...t[0]]),[t]},rh=(e,t)=>e[0]===t[0]&&e[1]===t[1];function lh(e,t=1e-6){const i=Number.isFinite(t)&&t>0?t:sh,s=[];for(const t of e||[]){if(!Array.isArray(t)||t.length<2)return null;const e=Number(t[0]),n=Number(t[1]);if(!Number.isFinite(e)||!Number.isFinite(n))return null;const o=Math.round(e/i)*i,a=Math.round(n/i)*i;if(!Number.isFinite(o)||!Number.isFinite(a))return null;const r=[Object.is(o,-0)?0:o,Object.is(a,-0)?0:a];s.length&&rh(s[s.length-1],r)||s.push(r)}return s.length>1&&rh(s[0],s[s.length-1])&&s.pop(),s.length<3||new Set(s.map(e=>`${e[0]},${e[1]}`)).size<3?null:Ti(s)>i*i?s:null}function ch(e){const t=[];for(const i of e||[])for(const e of i||[]){const i=(e||[]).filter(e=>Array.isArray(e)&&e.length>=2);i.length<4||t.push(`M ${i.slice(0,-1).map(e=>`${e[0]} ${e[1]}`).join(" L ")} Z`)}return t.join(" ")}function hh(e,t,i,s,n){return Kl({a:e,b:t,halfDepth:Ml(i,s,n)/2})}function dh(e,t,i){const s=Number(t)>0?Number(t):5,n=nh(e.cm)/s*i,o=e.center[0],a=e.center[1];if("circle"===e.shape){const e=n/2;return Array.from({length:96},(t,i)=>{const s=i/96*Math.PI*2;return[o+Math.cos(s)*e,a+Math.sin(s)*e]})}const r=n/2,l=oh(e.angle)*Math.PI/180,c=Math.cos(l),h=Math.sin(l);return[[-r,-r],[r,-r],[r,r],[-r,r]].map(([e,t])=>[o+e*c-t*h,a+e*h+t*c])}function ph(e,t,i=1e-9){if(!t.length)return[e];let s=[ah(e)];try{for(const e of t){const t=e.b[0]-e.a[0],n=e.b[1]-e.a[1],o=Math.hypot(t,n);if(!(o>i))continue;const a=t/o,r=n/o,l=-r,c=a,h=1.25*Math.max(Number(e.depth)||0,4*i),d=Math.max(2*i,1e-9*o),p=[[e.a[0]-a*d-l*h,e.a[1]-r*d-c*h],[e.b[0]+a*d-l*h,e.b[1]+r*d-c*h],[e.b[0]+a*d+l*h,e.b[1]+r*d+c*h],[e.a[0]-a*d+l*h,e.a[1]-r*d+c*h]];s=oi(s,ah(p))}return kh(s)}catch{return[e]}}function uh(e,t){try{const i=oi([[...e.map(e=>[e[0],e[1]]),[e[0][0],e[0][1]]]],[[...t.map(e=>[e[0],e[1]]),[t[0][0],t[0][1]]]]);let s=null,n=0;for(const e of i||[]){const t=e?.[0]||[],i=Math.abs(Ti(t));t.length>=4&&i>n&&(n=i,s=t.slice(0,-1).map(e=>[e[0],e[1]]))}return s}catch{return null}}function _h(e,t,i,s=Math.max(2e-4*i,1e-9),n=[]){const o=[],a=[],r=new Map;for(const e of n){const t=r.get(e.hostId)||[];t.push(e),r.set(e.hostId,t)}const l=[],c=[],h=[];for(const s of e.room_drafts||[])for(let e=0;e+10))continue;const r={a:s.points[e],b:s.points[e+1],halfDepth:a},c=Kl(r);c&&(o.push(r),l.push(c))}const d=[];for(const s of e.partitions||[]){const e={a:s.a,b:s.b,halfDepth:Ml(s.cm,t,i)/2};if(!(e.halfDepth>0))continue;const n=Kl(e);n&&(a.push(e),c.push(n),d.push({id:s.id,body:n}))}const p=[...o,...a];for(const{segmentIndex:e,wedge:t}of Ql(p,s)){const i=e=o.length&&(d[i.at].body=s))}for(const e of d)h.push(...ph(e.body,r.get(e.id)||[],s));const u=(e.wall_columns||[]).map(e=>dh(e,t,i)),_=ec([...o,...a],s).flatMap(e=>ph(e,n,s));return{drafts:l,partitions:c,columns:u,patches:_,all:[...l,...h,..._,...u]}}function mh(e){try{const t=e.map(e=>lh(e)).filter(e=>!!e).map(e=>ah(e));return t.length?si(t[0],...t.slice(1)):null}catch{return null}}const gh=e=>`M ${e.map(e=>`${e[0]} ${e[1]}`).join(" L ")} Z`;function fh(e){const t=[];for(const i of e||[]){if(yh([i])<=1e-6)continue;const e=[];for(const t of i||[]){const i=(t||[]).filter(e=>Array.isArray(e)&&e.length>=2);i.length<4||e.push(gh(i.slice(0,-1)))}e.length&&t.push(e.join(" "))}return t}function vh(e,t,i={}){const s=mh(e.filter(e=>e.length>=3)),n=t.some(e=>!lh(e))?null:mh(t);if(!s)return[];if(n)try{return fh(ni(s,n))}catch{}return function(e,t,i){let s=null;for(let n=0;n=4&&t.push(e.slice(0,-1).map(e=>[e[0],e[1]]));return t}function kh(e){const t=[];for(const i of e||[]){const e=i?.[0];e?.length>=4&&t.push(e.slice(0,-1).map(e=>[e[0],e[1]]))}return t}function xh(e,t){let i=!1;for(let s=0,n=t.length-1;se[1]!=l>e[1]&&e[0]<(r-o)*(e[1]-a)/(l-a||1e-12)+o&&(i=!i)}return i}function $h(e,t,i){return function(e,t){for(const i of t||[]){const t=i?.[0];if(!t?.length||!xh(e,t))continue;let s=!1;for(let t=1;txh(e,t))}function Sh(e,t,i){if(Math.hypot(e.center[0]-t.center[0],e.center[1]-t.center[1])>i)return!1;if(Math.abs(nh(e.cm)-nh(t.cm))>1e-6)return!1;if(e.shape!==t.shape)return!0;if("circle"===e.shape||"circle"===t.shape)return!0;const s=Math.abs(oh(e.angle)-oh(t.angle));return Math.min(s,90-s)<=1e-6}const Mh=2.54;function Ch(e){const t="number"==typeof e?e:NaN;return!Number.isFinite(t)||t<=0||5===t?1:5/t}function Dh(e,t){return e*Ch(t)}function Ph(e){return e?Mh:1}function Th(e,t){if(!t)return String(e);const i=e/Mh;return String(Math.round(1e6*i)/1e6)}const Ih=1e3;function Rh(e,t){const i=Number(e),s=Number.isFinite(i)&&i>0?i:1,n=s>=1?t:t*s,o=s>=1?t/s:t;return{x:(t-n)/2,y:(t-o)/2,w:n,h:o}}const Ah=.01,zh=100;function Fh(e,t=1e3){const i=Rh(e?.plan_aspect,t),s=Number(e?.plan_scale),n=Number.isFinite(s)&&s>0?Math.min(zh,Math.max(Ah,s)):1,o=Number(e?.plan_scale_x),a=Number(e?.plan_scale_y),r=Number.isFinite(o)&&o>0?Math.min(zh,Math.max(Ah,o)):n,l=Number.isFinite(a)&&a>0?Math.min(zh,Math.max(Ah,a)):n,c=Number(e?.plan_x),h=Number(e?.plan_y),d=qr(e?.plan_angle);return{x:i.x+(Number.isFinite(c)?Gh(c):0)*t,y:i.y+(Number.isFinite(h)?Gh(h):0)*t,w:i.w*r,h:i.h*l,...d?{angle:d}:{}}}function Nh(e){if(null==e.x||null==e.y)return{x:e.x,y:e.y,w:e.w,h:e.h};const t=Number(e.w)||0,i=Number(e.h)||0;return{x:t<0?e.x+t:e.x,y:i<0?e.y+i:e.y,w:Math.abs(t),h:Math.abs(i)}}function Eh(e){return e&&Array.isArray(e.spaces)?e.spaces.map(e=>{const t=Ih,i=function(e){return Array.isArray(e)&&4===e.length&&e.every(e=>Number.isFinite(e))&&e[2]>1e-6&&e[3]>1e-6?e:[0,0,1,1]}(e.view_box);return{id:e.id,title:e.title,cellCm:Number.isFinite(Number(e.cell_cm))&&Number(e.cell_cm)>0?Number(e.cell_cm):5,vb:[i[0]*Ih,i[1]*t,i[2]*Ih,i[3]*t],bg:e.plan_url?{href:As(e.plan_url),...Fh(e,Ih)}:null,rooms:(e.rooms||[]).map(e=>{const i={...e,...Nh(e)};return{id:i.id,name:i.name,area:i.area??null,open_to:i.open_to||void 0,settings:i.settings||void 0,x:null!=i.x?i.x*Ih:void 0,y:null!=i.y?i.y*t:void 0,w:null!=i.w?i.w*Ih:void 0,h:null!=i.h?i.h*t:void 0,poly:i.poly?i.poly.map(e=>[e[0]*Ih,e[1]*t]):void 0,wall_ids:Array.isArray(i.wall_ids)?[...i.wall_ids]:void 0}}),wall_segments:(e.wall_segments||[]).map(e=>({...e,id:String(e.id),a:[Number(e.a?.[0])*Ih,Number(e.a?.[1])*t],b:[Number(e.b?.[0])*Ih,Number(e.b?.[1])*t],cm:Number(e.cm)})),room_drafts:(e.room_drafts||[]).map(e=>({id:e.id,points:(e.points||[]).map(e=>[e[0]*Ih,e[1]*t]),segments:(e.segments||[]).map(e=>({..."string"==typeof e.id&&e.id?{id:e.id}:{},cm:Number(e.cm)}))})),partitions:(e.partitions||[]).map(e=>({id:e.id,a:[e.a[0]*Ih,e.a[1]*t],b:[e.b[0]*Ih,e.b[1]*t],cm:Number(e.cm)})),wall_columns:(e.wall_columns||[]).map(e=>({id:e.id,shape:"circle"===e.shape?"circle":"square",center:[e.center[0]*Ih,e.center[1]*t],cm:Number(e.cm),..."circle"===e.shape?{}:{angle:oh(e.angle)}}))}}):[]}const Oh=5e3,Hh=Oh*Ih,Lh=240,Bh=Ih/Lh,jh=1/Lh;function qh(e){if(!Number.isFinite(e))return e;const t=Math.round(e*Lh/Ih)*Ih/Lh;return Math.abs(t-e)<=1e-9*Bh?e:t}function Wh(e){return{x:qh(e.x),y:qh(e.y)}}function Uh(e){return Number.isFinite(e)?Math.min(Hh,Math.max(-Hh,e)):0}function Gh(e){return Number.isFinite(e)?Math.min(Oh,Math.max(-Oh,e)):0}const Vh=1/3,Kh=200;function Yh(e){let t=1/0,i=1/0,s=-1/0,n=-1/0;for(const o of e){const e=Number(o[0]),a=Number(o[1]);Number.isFinite(e)&&Number.isFinite(a)&&(es&&(s=e),a>n&&(n=a))}return t>s?null:{minX:t,minY:i,maxX:s,maxY:n}}function Jh(e){return e.poly&&e.poly.length?Yh(e.poly):null==e.x||null==e.y?null:Yh([[e.x,e.y],[e.x+(e.w||0),e.y+(e.h||0)]])}function Xh(e,t){const i=[];for(const t of e.rooms||[]){const e=Jh(t);e&&i.push(e)}if(e.bg){const t=Yh(Yr(e.bg));t&&i.push(t)}for(const e of t||[])if(Array.isArray(e)){const t=Yh([e]);t&&i.push(t)}else i.push(e);return i}const Zh=e=>{if(!e.length)return 0;const t=[...e].sort((e,t)=>e-t),i=t.length>>1;return t.length%2?t[i]:(t[i-1]+t[i])/2},Qh=e=>{let t=1/0,i=1/0,s=-1/0,n=-1/0;for(const o of e)o.minXs&&(s=o.maxX),o.maxY>n&&(n=o.maxY);return t>s||i>n?null:{x:t,y:i,w:s-t,h:n-i}};function ed(e,t){let{x:i,y:s,w:n,h:o}=e;n<30&&(i=i+n/2-100,n=Kh),o<30&&(s=s+o/2-100,o=Kh);const a=Math.max(n,o)*t;return{x:i-a,y:s-a,w:n+2*a,h:o+2*a}}function td(e,t={}){const i=t.pad??.05,s=t.k??10,n=t.minSpread??50,o=e.filter(e=>Number.isFinite(e.minX)&&Number.isFinite(e.minY)&&Number.isFinite(e.maxX)&&Number.isFinite(e.maxY)&&Math.abs(e.minX)<=Hh&&Math.abs(e.maxX)<=Hh&&Math.abs(e.minY)<=Hh&&Math.abs(e.maxY)<=Hh);if(!o.length)return{core:null,all:null,outliers:0};const a=Qh(o);if(o.length<4){const e=ed(a,i);return{core:e,all:e,outliers:0}}const r=o.map(e=>(e.minX+e.maxX)/2),l=o.map(e=>(e.minY+e.maxY)/2),c=Zh(r),h=Zh(l),d=o.map((e,t)=>Math.max(Math.abs(r[t]-c),Math.abs(l[t]-h))),p=Math.max(((e,t)=>e.length?e[Math.min(e.length-1,Math.max(0,Math.round(t*(e.length-1))))]:0)([...d].sort((e,t)=>e-t),.75),n),u=d.map(e=>e>s*p),_=u.filter(Boolean).length,m=_&&_<=o.length*Vh?o.filter((e,t)=>!u[t]):o;return{core:ed(Qh(m)||a,i),all:ed(a,i),outliers:m===o?0:_}}function id(e,t,i=.05){const s=td(Xh(e,t),{pad:i});if(s.core)return s.core;const n=e.vb&&4===e.vb.length&&e.vb[2]>0&&e.vb[3]>0?e.vb:[0,0,Ih,Ih];return{x:n[0],y:n[1],w:n[2],h:n[3]}}function sd(e){const t=id(e);return{x:t.x+t.w/2,y:t.y+t.h/2}}function nd(e){const t=[];for(const i of e.rooms||[]){const e=Jh(i);e&&t.push(e)}const i=td(t,{pad:0}).core,s=Ih*Ch(e.cellCm??5);return i?Math.max(s,Math.min(Hh,Math.max(i.w,i.h))):s}function od(e,t,i,s=1){const n=Number(i),o=Number.isFinite(s)&&s>0?s:1;return!Number.isFinite(n)||n<=0?e*o:e*nd(t)*o/n}const ad=[1,2,5,10,20,50,100,200,500,1e3];function rd(e){if(e.poly&&e.poly.length){const t=e.poly.map(e=>e[0]),i=e.poly.map(e=>e[1]),s=Math.min(...t),n=Math.min(...i);return{x:s,y:n,w:Math.max(...t)-s,h:Math.max(...i)-n}}return{x:e.x??0,y:e.y??0,w:e.w??0,h:e.h??0}}function ld(e,t,i,s){const n=i["rl_"+(e.id||"")];if(n&&n.s===t)return{x:n.x*Ih,y:n.y*Ih};const o=function(e){if(e.poly){const t=e.poly.length;return[e.poly.reduce((e,t)=>e+t[0],0)/t,e.poly.reduce((e,t)=>e+t[1],0)/t]}return[e.x+e.w/2,e.y+.1*Math.min(e.w,e.h)]}(e);return Wh({x:o[0],y:o[1]})}const cd=["furniture","appliance","sanitary","other"],hd=[{id:"sofa",group:"furniture",w:220,h:90,g:[["r",0,0,1,1],["l",.09,.26,.91,.26],["l",.09,.26,.09,1],["l",.91,.26,.91,1],["l",.5,.26,.5,1]]},{id:"armchair",group:"furniture",w:90,h:85,g:[["r",0,0,1,1],["l",.14,.28,.86,.28],["l",.14,.28,.14,1],["l",.86,.28,.86,1]]},{id:"coffee_table",group:"furniture",w:110,h:60,g:[["r",0,0,1,1],["r",.08,.14,.84,.72]]},{id:"table_dining",group:"furniture",w:140,h:80,g:[["r",0,0,1,1],["r",.06,.11,.88,.78]]},{id:"table_round",group:"furniture",w:120,h:120,g:[["e",.5,.5,.5,.5],["e",.5,.5,.41,.41]]},{id:"chair",group:"furniture",w:45,h:45,g:[["r",0,0,1,.18],["r",.06,.18,.88,.8]]},{id:"desk",group:"furniture",w:120,h:60,g:[["r",0,0,1,1],["r",.63,.07,.31,.86],["l",.63,.5,.94,.5]]},{id:"bed_double",group:"furniture",w:160,h:200,g:[["r",0,0,1,1],["r",0,0,1,.07],["r",.06,.1,.4,.15],["r",.54,.1,.4,.15],["l",0,.33,1,.33]]},{id:"bed_single",group:"furniture",w:90,h:200,g:[["r",0,0,1,1],["r",0,0,1,.07],["r",.15,.1,.7,.15],["l",0,.33,1,.33]]},{id:"nightstand",group:"furniture",w:45,h:40,g:[["r",0,0,1,1],["r",.12,.14,.76,.33],["r",.12,.53,.76,.33]]},{id:"wardrobe",group:"furniture",w:100,h:60,g:[["r",0,0,1,1],["l",0,.72,1,.72],["l",.5,.72,.5,1]]},{id:"bookshelf",group:"furniture",w:80,h:30,g:[["r",0,0,1,1],["l",.34,0,.34,1],["l",.67,0,.67,1]]},{id:"fridge",group:"appliance",w:60,h:65,g:[["r",0,0,1,1],["l",0,.36,1,.36],["l",.83,.44,.83,.64]]},{id:"stove",group:"appliance",w:60,h:60,g:[["r",0,0,1,1],["e",.29,.31,.15,.15],["e",.71,.31,.15,.15],["e",.29,.71,.15,.15],["e",.71,.71,.15,.15]]},{id:"dishwasher",group:"appliance",w:60,h:60,g:[["r",0,0,1,1],["r",.1,.12,.8,.76],["e",.5,.5,.27,.27],["e",.5,.5,.13,.13]]},{id:"washer",group:"appliance",w:60,h:60,g:[["r",0,0,1,1],["l",.08,.17,.92,.17],["e",.5,.57,.3,.3],["e",.5,.57,.14,.14]]},{id:"dryer",group:"appliance",w:60,h:60,g:[["r",0,0,1,1],["l",.08,.17,.92,.17],["e",.5,.57,.3,.3],["p",.36,.5,.5,.64,.64,.5]]},{id:"tv",group:"appliance",w:120,h:30,g:[["r",0,0,1,.42],["l",.5,.42,.5,.72],["l",.3,.72,.7,.72]]},{id:"ac",group:"appliance",w:90,h:25,g:[["r",0,0,1,1],["l",.05,.55,.95,.55],["l",.05,.79,.95,.79]]},{id:"water_heater",group:"appliance",w:45,h:45,g:[["e",.5,.5,.5,.5],["e",.5,.5,.31,.31]]},{id:"toilet",group:"sanitary",w:40,h:70,g:[["r",.06,0,.88,.2],["e",.5,.58,.37,.35],["e",.5,.58,.22,.2]]},{id:"bathtub",group:"sanitary",w:170,h:75,g:[["r",0,0,1,1],["r",.05,.11,.77,.78],["e",.89,.5,.045,.1]]},{id:"shower",group:"sanitary",w:90,h:90,g:[["r",0,0,1,1],["l",0,0,1,1],["l",1,0,0,1],["e",.5,.5,.08,.08]]},{id:"sink",group:"sanitary",w:60,h:45,g:[["r",0,0,1,1],["e",.5,.6,.34,.3],["e",.5,.15,.07,.07]]},{id:"kitchen_sink",group:"sanitary",w:80,h:60,g:[["r",0,0,1,1],["r",.06,.24,.44,.64],["r",.54,.24,.4,.64],["e",.5,.12,.06,.06]]},{id:"bidet",group:"sanitary",w:40,h:55,g:[["e",.5,.5,.44,.5],["e",.5,.5,.26,.3]]},{id:"stairs",group:"other",w:100,h:280,g:[["r",0,0,1,1],["l",0,.111,1,.111],["l",0,.222,1,.222],["l",0,.333,1,.333],["l",0,.444,1,.444],["l",0,.556,1,.556],["l",0,.667,1,.667],["l",0,.778,1,.778],["l",0,.889,1,.889],["l",.5,.93,.5,.06],["p",.38,.16,.5,.06,.62,.16]]},{id:"fireplace",group:"other",w:120,h:40,g:[["r",0,0,1,1],["p",.22,1,.22,.42,.78,.42,.78,1]]},{id:"plant",group:"other",w:40,h:40,g:[["e",.5,.5,.22,.22],["l",.5,.28,.5,.02],["l",.5,.72,.5,.98],["l",.28,.5,.02,.5],["l",.72,.5,.98,.5],["l",.34,.34,.13,.13],["l",.66,.66,.87,.87],["l",.66,.34,.87,.13],["l",.34,.66,.13,.87]]},{id:"rug",group:"other",w:200,h:140,g:[["r",0,0,1,1],["r",.06,.09,.88,.82]]}],dd=new Map(hd.map(e=>[e.id,e]));function pd(e){return e&&dd.get(e)||null}function ud(e){return hd.filter(t=>t.group===e)}function _d(e,t,i=Bh,s=1e3){const n=Number(t)>0?Number(t):5;return(Number(e)||0)/n*i/s}const md=5e-4,gd=Oh;function fd(e){return Number.isFinite(e)?Math.max(md,Math.min(gd,e)):md}const vd=e=>{const t=Math.round(1e3*e)/1e3;return Object.is(t,-0)?"0":String(t)};function bd(e,t,i){const s=pd(e);if(!(s&&t>0&&i>0))return"";const n=e=>vd(e*t),o=e=>vd(e*i),a=[];for(const e of s.g)if("r"===e[0]){const[,t,i,s,r]=e;a.push(`M${n(t)} ${o(i)}H${n(t+s)}V${o(i+r)}H${n(t)}Z`)}else if("l"===e[0]){const[,t,i,s,r]=e;a.push(`M${n(t)} ${o(i)}L${n(s)} ${o(r)}`)}else if("e"===e[0]){const[,s,r,l,c]=e;a.push(`M${n(s-l)} ${o(r)}A${vd(l*t)} ${vd(c*i)} 0 0 1 ${n(s+l)} ${o(r)}A${vd(l*t)} ${vd(c*i)} 0 0 1 ${n(s-l)} ${o(r)}Z`)}else{const t=e.slice(1);if(t.length<4)continue;let i=`M${n(t[0])} ${o(t[1])}`;for(let e=2;e+1{let t=(e%360+360)%360;return t>180&&(t-=360),t};function wd(e,t,i,s,n,o=0){let a=null,r=n;for(const n of s){const[s,l,c,h]=n,d=c-s,p=h-l,u=d*d+p*p;if(!u)continue;const _=Math.sqrt(u);let m=((e-s)*d+(t-l)*p)/u;m=Math.max(0,Math.min(1,m));let g=s+m*d,f=l+m*p;const v=Math.hypot(e-g,t-f);if(!(v0){const e=Math.round(m*_/o)*o;g=s+e/_*d,f=l+e/_*p}a={cx:g+b*(i/2),cy:f+y*(i/2),angle:yd(180*Math.atan2(-b,y)/Math.PI),dist:v}}return a}const kd=1e-9,xd=e=>`${e[0].toFixed(6)},${e[1].toFixed(6)}`,$d=(e,t)=>Math.hypot(t[0]-e[0],t[1]-e[1]),Sd=(e,t)=>Math.atan2(t[1]-e[1],t[0]-e[0]),Md=e=>Array.isArray(e)&&e.length>=2&&e.every(e=>Number.isFinite(e)),Cd=e=>(e||[]).filter(e=>Md(e?.a)&&Md(e?.b)&&$d(e.a,e.b)>kd);function Dd(e,{minAngleDeg:t=15,maxValence:i=6}={}){const s=new Map;for(const t of Cd(e))for(const[e,i]of[[t.a,t.b],[t.b,t.a]]){const t=s.get(xd(e))||[];t.push(Sd(e,i)),s.set(xd(e),t)}const n=[];for(const[e,o]of s){if(o.length>i&&n.push({rule:"valence",subject:e,actual:o.length,limit:i}),o.length<2)continue;const s=[...o].sort((e,t)=>e-t);let a=1/0;for(let e=0;ekd&&i(180*Math.atan2(e.b[1]-e.a[1],e.b[0]-e.a[0])/Math.PI%180+180)%180,Td=e=>{const t=new Map;for(const i of e)for(const e of[i.a,i.b]){const s=t.get(xd(e));s?s.push(i):t.set(xd(e),[i])}return t};function Id(e,t,i){const s=Cd(t),n=i??Td(s),o=new Set([e]);let a=$d(e.a,e.b);const r=(e,t)=>{const i=(n.get(xd(t))||[]).find(t=>!o.has(t)&&((e,t,i=1)=>{const s=Math.abs(Pd(e)-Pd(t));return Math.min(s,180-s)<=i})(t,e)&&Number(t.cm||0)===Number(e.cm||0));i&&(o.add(i),a+=$d(i.a,i.b),r(i,xd(i.a)===xd(t)?i.b:i.a))};return r(e,e.a),r(e,e.b),a}function Rd(e,t,i,{minLengthCm:s=20}={}){const n=[],o=Cd(e),a=Td(o);for(const e of o){const r=Id(e,o,a)/i*(t||1),l=Math.max(s,Number(e.cm)>0?Number(e.cm):0);r{const s=i[0]-t[0],n=i[1]-t[1],o=s*s+n*n,a=o<=kd?0:Math.max(0,Math.min(1,((e[0]-t[0])*s+(e[1]-t[1])*n)/o));return Math.hypot(e[0]-(t[0]+s*a),e[1]-(t[1]+n*a))};function zd(e,t,i,{minDistanceCm:s=5}={}){const n=Cd(e),o=new Map;for(const e of n)o.set(xd(e.a),e.a),o.set(xd(e.b),e.b);const a=((e,t,i)=>e/(t||1)*i)(s,t,i),r=a>kd?a:1,l=(e,t)=>`${Math.floor(e/r)},${Math.floor(t/r)}`,c=new Map;for(const[e,t]of o){const i=l(t[0],t[1]),s=c.get(i);s?s.push([e,t]):c.set(i,[[e,t]])}const h=new Map;for(const e of n){const t=Math.min(e.a[0],e.b[0])-a,i=Math.max(e.a[0],e.b[0])+a,s=Math.min(e.a[1],e.b[1])-a,n=Math.max(e.a[1],e.b[1])+a;for(let o=Math.floor(t/r);o<=Math.floor(i/r);o++)for(let t=Math.floor(s/r);t<=Math.floor(n/r);t++){const i=`${o},${t}`,s=h.get(i);s?s.push(e):h.set(i,[e])}}const d=[];for(const[e,n]of o){const o=Math.floor(n[0]/r),l=Math.floor(n[1]/r);for(let r=-1;r<=1;r++)for(let h=-1;h<=1;h++)for(const[p,u]of c.get(`${o+r},${l+h}`)||[]){if(e>=p)continue;const o=$d(n,u);o{const s=o[(i+1)%o.length];return e+(t[0]*s[1]-s[0]*t[1])},0))/2,r=(i||1)/s,l=a*r*r;return l0?i:1;return{a:[e[0]/s,e[1]/s],b:[t[0]/s,t[1]/s]}}function Ed(e,t){const i=t>0?t:1;return[e.a[0]*i,e.a[1]*i,e.b[0]*i,e.b[1]*i]}function Od(e){return Array.isArray(e)&&e.length>=2&&Number.isFinite(Number(e[0]))&&Number.isFinite(Number(e[1]))}function Hd(e){if(!Array.isArray(e))return[];const t=[];for(const i of e){if(!i||"object"!=typeof i)continue;const e=i;if(!Od(e.a)||!Od(e.b))continue;const s=[Number(e.a[0]),Number(e.a[1])],n=[Number(e.b[0]),Number(e.b[1])];Math.hypot(n[0]-s[0],n[1]-s[1])<.001||t.push({a:s,b:n})}return t}function Ld(e,t,i,s,n=!0){const o=(e||[]).filter(e=>e?.id),a=Hd(t);if(a.length)return function(e,t,i,s){const n=Hd(e);if(!n.length)return[];const o=function(e,t){const i=[],s=(e||[]).filter(e=>e?.id);for(let e=0;e4*s||o>4*s)continue;const a=(e[0]-n)*p+(e[1]-l)*u,c=(e[2]-n)*p+(e[3]-l)*u,h=Math.max(0,Math.min(a,c)),m=Math.min(d,Math.max(a,c));if(m-he.lo-t.lo||e.hi-t.hi);const i=[];for(const e of t){const t=i[i.length-1];t&&e.lo<=t.hi+r?t.hi=Math.max(t.hi,e.hi):i.push({...e})}for(const t of i){const i=[n+p*t.lo,l+u*t.lo],s=[n+p*t.hi,l+u*t.hi];Math.hypot(s[0]-i[0],s[1]-i[1])i.pair===e&&Math.abs(i.ux*a-i.uy*o)<=1e-6&&Math.abs((t[0]-i.origin[0])*i.uy-(t[1]-i.origin[1])*i.ux)<=c&&Math.abs((t[2]-i.origin[0])*i.uy-(t[3]-i.origin[1])*i.ux)<=c);h||(h={pair:e,origin:[t[0],t[1]],ux:o,uy:a,ranges:[]},l.push(h));const d=(t[0]-h.origin[0])*h.ux+(t[1]-h.origin[1])*h.uy,p=(t[2]-h.origin[0])*h.ux+(t[3]-h.origin[1])*h.uy;h.ranges.push({lo:Math.min(d,p),hi:Math.max(d,p)})}const h=[];for(const e of l){e.ranges.sort((e,t)=>e.lo-t.lo||e.hi-t.hi);const t=[];for(const i of e.ranges){const e=t[t.length-1];e&&i.lo<=e.hi+r?e.hi=Math.max(e.hi,i.hi):t.push({...i})}for(const s of t){const t=[e.origin[0]+e.ux*s.lo,e.origin[1]+e.uy*s.lo],n=[e.origin[0]+e.ux*s.hi,e.origin[1]+e.uy*s.hi];Math.hypot(n[0]-t[0],n[1]-t[1])>=r&&h.push(Nd(t,n,i))}}return h}(a,e,i,s).map(e=>Ed(e,i));if(!n)return[];const r=[],l=(e,t)=>(e.open_to||[]).includes(t.id)||(t.open_to||[]).includes(e.id);for(let e=0;e{const t=qd.get(e);if(!t)return;const i=Date.now();if("hidden"===e.visibilityState){t.hiddenAt||(t.hiddenAt=i);const e={kind:"hidden",token:t.token,at:i,hiddenFor:0,long:!1};for(const i of[...t.subscribers])i(e);return}const s=t.hiddenAt?Math.max(0,i-t.hiddenAt):0;t.hiddenAt=0,t.token++;const n={kind:"visible",token:t.token,at:i,hiddenFor:s,long:s>=Bd};for(const e of[...t.subscribers])e(n)},onPageShow:t=>{const i=qd.get(e);if(!i)return;const s=Date.now();i.token++;const n={kind:"pageshow",token:i.token,at:s,hiddenFor:0,long:!!t.persisted,persisted:!!t.persisted};for(const e of[...i.subscribers])e(n)}},qd.set(e,i),e.addEventListener("visibilitychange",i.onVisibility),e.defaultView?.addEventListener("pageshow",i.onPageShow)}return i.subscribers.add(t),()=>{const i=qd.get(e);i&&(i.subscribers.delete(t),i.subscribers.size||(e.removeEventListener("visibilitychange",i.onVisibility),e.defaultView?.removeEventListener("pageshow",i.onPageShow),qd.delete(e)))}}const Ud={now:()=>Date.now(),setTimeout:(e,t)=>window.setTimeout(e,t),clearTimeout:e=>window.clearTimeout(e),requestAnimationFrame:e=>window.requestAnimationFrame(e),cancelAnimationFrame:e=>window.cancelAnimationFrame(e)};class Gd{constructor(e,t=Ud){this.onChange=e,this.clock=t,this._state="steady",this._token=0,this._frameFingerprint="",this._hasCompleteFrame=!1,this._overlayPhase="none",this._recoveryReason=null,this._overlayTimer=0,this._overlayRaf=0,this._overlayOpaqueAt=0,this._barrierRafs=new Set,this._trace=[],this._disposed=!1}get state(){return this._state}get token(){return this._token}get frameFingerprint(){return this._frameFingerprint}get hasCompleteFrame(){return this._hasCompleteFrame}get overlayPhase(){return this._overlayPhase}get overlayVisible(){return"none"!==this._overlayPhase}get overlayBlocksInteraction(){return this.overlayVisible}get recoveryReason(){return this._recoveryReason}get trace(){return this._trace.map(e=>({...e,...e.stage?{stage:[...e.stage]}:{}}))}note(e,t={}){this.record(e,void 0,t)}record(e,t,i={}){this._trace.push({at:this.clock.now(),token:this._token,event:e,state:this._state,...t?{reason:t}:{},...i}),this._trace.length>80&&this._trace.splice(0,this._trace.length-80)}changed(){this._disposed||this.onChange()}adoptCompleteFrame(e){e&&(this._hasCompleteFrame=!0,this._frameFingerprint=e,this._state="steady",this._recoveryReason=null,this.clearOverlay(),this.record("frame-adopted"),this.changed())}markCompleteFrame(e){e&&(this._hasCompleteFrame=!0,this._frameFingerprint=e,this._state="steady",this._recoveryReason=null,this.clearOverlay(),this.record("frame-complete"),this.changed())}refreshCompleteFrame(e){!this._disposed&&this._hasCompleteFrame&&"steady"===this._state&&e&&e!==this._frameFingerprint&&(this._frameFingerprint=e,this.record("frame-refreshed"))}visibility(e){return"hidden"===e.kind?(this.record("visibility-hidden"),this._token):e.long||"visible"!==e.kind&&"pageshow"!==e.kind?this.beginCandidate("pageshow"===e.kind?"pageshow":"long-resume"):(this.record("pageshow"===e.kind?"pageshow-noop":"visibility-visible-quick"),this._token)}beginCandidate(e,t="plan"){return this._token++,this._recoveryReason=t,this._hasCompleteFrame?(this._state="connection"===t?"offline-stale":"holding",this.clearOverlay()):this.overlayVisible?this._state="overlay-visible":(this._state="overlay-pending",this.scheduleOverlay(t)),this.record("candidate-start",e),this.changed(),this._token}connectionLost(){return this.beginCandidate("connection-lost","connection")}candidateReady(e){return!this._disposed&&e===this._token&&(this._state="candidate-ready",this.record("candidate-ready"),this.changed(),!0)}async commitAfterPaint(e,t){if(this._disposed||e!==this._token)return!1;let i=!0;const s=(async()=>{for(await t.updateComplete();i&&!this._disposed&&e===this._token;)if(t.stageValid()&&t.assetsReady()){if(await this.nextFrame(),e!==this._token||!t.stageValid()||!t.assetsReady())continue;if(await this.nextFrame(),e===this._token&&t.stageValid()&&t.assetsReady())return!0}else await this.nextFrame();return!1})();let n=0;const o=new Promise(e=>{n=this.clock.setTimeout(()=>e({ready:!1,timedOut:!0}),jd)}),a=await Promise.race([s.then(e=>({ready:e,timedOut:!1})),o]);return i=!1,this.clock.clearTimeout(n),!this._disposed&&e===this._token&&(!(!a.ready&&!a.timedOut)&&(a.ready?(this._hasCompleteFrame=!0,this._frameFingerprint=t.frameFingerprint(),this.record("paint-barrier"),this.finishOverlayAfterCommit(),!0):(this.record("paint-barrier-timeout"),this._hasCompleteFrame?(this._state="connection"===this._recoveryReason?"offline-stale":"steady",this.clearOverlay()):(this._state="recovery-error","opaque"!==this._overlayPhase&&this.showOverlayNow()),this.changed(),!1)))}retry(e=this._recoveryReason||"plan"){return this.beginCandidate("retry",e)}nextFrame(){return new Promise(e=>{const t=this.clock.requestAnimationFrame(()=>{this._barrierRafs.delete(t),e()});this._barrierRafs.add(t)})}scheduleOverlay(e){this.clearOverlayTimer(),this._recoveryReason=e,this._overlayTimer=this.clock.setTimeout(()=>{this._overlayTimer=0,this._hasCompleteFrame||"overlay-pending"!==this._state&&"candidate-ready"!==this._state||(this._state="overlay-visible",this._overlayPhase="entering",this.record("overlay-enter"),this.changed(),this._overlayRaf=this.clock.requestAnimationFrame(()=>{this._overlayRaf=0,"entering"===this._overlayPhase&&(this._overlayPhase="fading-in",this.changed(),this._overlayTimer=this.clock.setTimeout(()=>{this._overlayTimer=0,"fading-in"===this._overlayPhase&&(this._overlayPhase="opaque",this._overlayOpaqueAt=this.clock.now(),this.record("overlay-opaque"),this.changed())},150))}))},150)}showOverlayNow(){this.clearOverlayTimer(),this._overlayPhase="opaque",this._overlayOpaqueAt=this.clock.now(),this.record("overlay-error")}finishOverlayAfterCommit(){if(this.clearOverlayTimer(),"none"===this._overlayPhase||"entering"===this._overlayPhase||"fading-in"===this._overlayPhase)return this.clearOverlay(),this._state="steady",this._recoveryReason=null,this.record("candidate-committed"),void this.changed();const e=Math.max(0,this._overlayOpaqueAt+250-this.clock.now());this._overlayTimer=this.clock.setTimeout(()=>{this._overlayTimer=0,this._overlayPhase="leaving",this.record("overlay-leave"),this.changed(),this._overlayTimer=this.clock.setTimeout(()=>{this._overlayTimer=0,this._overlayPhase="none",this._state="steady",this._recoveryReason=null,this.record("candidate-committed"),this.changed()},180)},e)}clearOverlayTimer(){this._overlayTimer&&this.clock.clearTimeout(this._overlayTimer),this._overlayTimer=0}clearOverlay(){this.clearOverlayTimer(),this._overlayRaf&&this.clock.cancelAnimationFrame(this._overlayRaf),this._overlayRaf=0,this._overlayPhase="none",this._overlayOpaqueAt=0}dispose(){this._disposed=!0,this._token++,this.clearOverlay();for(const e of this._barrierRafs)this.clock.cancelAnimationFrame(e);this._barrierRafs.clear()}}function Vd(e){let t=2166136261,i=2654435769;const s=new WeakSet,n=e=>{for(let s=0;s>>0)+(i>>>2)}},o=e=>{if(null===e)return void n("n");const t=typeof e;if("string"===t)return void n(`s${e.length}:${e}`);if("number"===t)return void n(`d${Number.isNaN(e)?"NaN":String(e)}`);if("boolean"===t)return void n(e?"t":"f");if("undefined"===t)return void n("u");if("object"!==t)return void n(`${t}:${String(e)}`);const i=e;if(s.has(i))n("[cycle]");else{if(s.add(i),Array.isArray(e)){n("[");for(const t of e)o(t);return n("]"),void s.delete(i)}n("{");for(const t of Object.keys(e).sort())n(t),o(e[t]);n("}"),s.delete(i)}};return o(e),`${(t>>>0).toString(16).padStart(8,"0")}${(i>>>0).toString(16).padStart(8,"0")}`}function Kd(e){return Vd(e)}const Yd=new WeakMap;class Jd{constructor(e,t=()=>Date.now()){this.onUpdate=e,this.now=t,this.fallbackAuthority={},this.referenceOwner={},this.referenced=new Set,this.queued=new Set,this.disposed=!1,this.sharedUpdate=()=>{this.disposed||this.onUpdate()}}bind(e){const t=((e,t)=>{const i=e?.connection||e?.callWS||t;return!i||"object"!=typeof i&&"function"!=typeof i?t:i})(e,this.fallbackAuthority);return this.shared&&this.authority===t||(this.shared&&(this.shared.listeners.delete(this.sharedUpdate),this.shared.references.delete(this.referenceOwner)),this.authority=t,this.shared=(e=>{let t=Yd.get(e);return t||(t={signed:{},queued:new Set,inFlight:new Map,retry:new Map,listeners:new Set,settlers:new Set,references:new Map},Yd.set(e,t)),t})(t),this.disposed||(this.shared.listeners.add(this.sharedUpdate),this.shared.references.set(this.referenceOwner,new Set(this.referenced)))),this.shared}start(e,t){this.disposed=!1,this.referenced=new Set(t());const i=this.bind(e());i.listeners.add(this.sharedUpdate),i.references.set(this.referenceOwner,new Set(this.referenced)),this.stopTimer(),this.resignTimer=setInterval(()=>this.resign(e(),t()),288e5)}dispose(){if(this.disposed=!0,this.stopTimer(),clearTimeout(this.batchTimer),this.shared){this.shared.listeners.delete(this.sharedUpdate),this.shared.references.delete(this.referenceOwner);for(const e of this.queued)this.shared.queued.delete(e)}this.queued.clear()}invalidate(e){const t=this.bind(e);clearTimeout(this.batchTimer),this.queued.clear(),t.queued.clear(),t.inFlight.clear(),t.retry.clear(),t.signed={}}stopTimer(){void 0!==this.resignTimer&&clearInterval(this.resignTimer),this.resignTimer=void 0}display(e,t){const i=As(t);if(!i.startsWith("/api/houseplan/content/"))return i;const s=this.bind(e);this.referenced.add(i),s.references.set(this.referenceOwner,new Set(this.referenced));const n=s.signed[i],o=n?this.now()-n.at:1/0;return o{const t=[...this.queued];this.queued.clear();for(const e of t)i.queued.delete(e);this.sign(e,t)},30))}sign(e,t){if(!t.length||!e?.callWS)return;const i=this.bind(e);for(const s of function(e,t){const i=Math.max(1,Math.floor(t)),s=[];for(let t=0;t{const s=i.inFlight.get(e);return!(void 0!==s&&t-s<15e3)&&(i.inFlight.set(e,t),!0)});n.length&&e.callWS({type:"houseplan/content/sign",paths:n}).then(e=>{const t=this.now();let s=0,o=!1;for(const a of n){const n=e?.urls?.[a];if("string"==typeof n&&n){const e=i.signed[a];e?.loaded&&e.url!==n?(e.pending={url:n,at:t},this.preloadReplacement(i,a,n,t)):(i.signed[a]={url:n,at:t,loaded:e?.url===n&&!!e.loaded},o=!0),i.retry.delete(a),s++}else this.backOff(i,a)}if(s&&(this.trimShared(i),o))for(const e of[...i.listeners])e()}).catch(()=>{for(const e of n)this.backOff(i,e)}).finally(()=>{for(const e of n)i.inFlight.get(e)===t&&i.inFlight.delete(e);for(const e of[...i.settlers])e()})}}preloadReplacement(e,t,i,s){const n=()=>{const n=e.signed[t];if(n?.pending?.url===i){e.signed[t]={url:i,at:s,loaded:!0},e.retry.delete(t),this.trimShared(e);for(const t of[...e.listeners])t()}},o=()=>{const s=e.signed[t];s?.pending?.url===i&&(delete s.pending,this.backOff(e,t))};if("undefined"==typeof Image)return void n();const a=new Image;a.onload=()=>{("function"==typeof a.decode?a.decode():Promise.resolve()).then(n).catch(o)},a.onerror=o,a.src=i}preloadCurrentImage(e,t,i){if(i.loaded)return Promise.resolve(!0);if(i.preload)return i.preload;if("undefined"==typeof Image)return i.loaded=!0,Promise.resolve(!0);const s=i.url;return i.preload=new Promise(n=>{const o=new Image;let a=!1;const r=o=>{if(a)return;a=!0,clearTimeout(l);const r=e.signed[t];if(r===i&&delete r.preload,o&&r===i&&r.url===s){r.loaded=!0;for(const t of[...e.listeners])t();n(!0)}else o||r!==i||this.backOff(e,t),n(!1)};o.onload=()=>{("function"==typeof o.decode?o.decode():Promise.resolve()).then(()=>r(!0)).catch(()=>r(!1))},o.onerror=()=>r(!1);const l=setTimeout(()=>r(!1),jd);o.src=s}),i.preload}prepareImage(e,t){const i=As(t);if(!i.startsWith("/api/houseplan/content/"))return Promise.resolve(!0);const s=this.bind(e),n=()=>{const t=s.signed[i];if(t&&this.now()-t.atthis.now()&&!s.inFlight.has(i)&&!s.queued.has(i)?Promise.resolve(!1):null},o=n();return o?(a=o,new Promise(e=>{let t=!1;const i=i=>{t||(t=!0,clearTimeout(s),e(i))},s=setTimeout(()=>i(!1),jd);a.then(i).catch(()=>i(!1))})):new Promise(e=>{let t=!1,i=null;const o=i=>{t||(t=!0,clearTimeout(r),s.settlers.delete(a),e(i))},a=()=>{t||i||(i=n(),i&&i.then(o).catch(()=>o(!1)))},r=setTimeout(()=>o(!1),jd);s.settlers.add(a),a()});var a}backOff(e,t){const i=e.retry.get(t)?.delay||0,s=Math.min(6e4,i?2*i:2e3);e.retry.set(t,{notBefore:this.now()+s,delay:s})}trimShared(e){const t=Object.entries(e.signed);if(t.length<=512)return;const i=new Set(e.inFlight.keys());for(const t of e.references.values())for(const e of t)i.add(e);for(const[e,s]of t)(s.pending||s.preload)&&i.add(e);t.sort((e,t)=>t[1].at-e[1].at);const s=t.filter(([e])=>i.has(e));for(const e of t){if(s.length>=512)break;i.has(e[0])||s.push(e)}e.signed=Object.fromEntries(s)}resign(e,t){const i=this.bind(e);this.referenced=new Set(t),i.references.set(this.referenceOwner,new Set(this.referenced));const s=this.now(),n=new Set;for(const e of i.references.values())for(const t of e)n.add(t);const o={};for(const[e,t]of Object.entries(i.signed))n.has(e)&&s-t.at!!o[e]&&!o[e].pending))}markLoaded(e,t,i){const s=As(t);if(!s.startsWith("/api/houseplan/content/"))return;const n=this.bind(e).signed[s];if(n&&(!i||n.url===i)&&!n.loaded){n.loaded=!0;for(const t of[...this.bind(e).listeners])t()}}isReady(e,t){const i=As(t);if(!i.startsWith("/api/houseplan/content/"))return!0;const s=this.bind(e).signed[i];return!!s&&this.now()-s.ate.id===t)}function Zd(e="file"){const t="draw"===e;return{source:e,showBorders:t,showNames:t,displayTouched:!1}}function Qd(e,t){if(e.displayTouched)return{...e,source:t};const i="draw"===t;return{...e,source:t,showBorders:i,showNames:i}}function ep(e,t,i){return{...e,[t]:i,displayTouched:!0}}function tp(e,t,i){return[e[0]*t+e[1]*i+e[2],e[3]*t+e[4]*i+e[5]]}function ip(e,t){let i=0;for(const[s,n]of t){const t=tp(e,s[0],s[1]);i=Math.max(i,Math.hypot(t[0]-n[0],t[1]-n[1]))}return i}const sp=e=>{if(null==e||""===e)return null;const t=Number(e);return Number.isFinite(t)?t:null},np=e=>{const t=e,i=sp(Array.isArray(t)?t[0]:t?.x),s=sp(Array.isArray(t)?t[1]:t?.y);return null==i||null==s?null:[i,s]};function op(e){if(!Array.isArray(e))return null;const t=[];for(const i of e){const e=np(i);if(!e)return null;t.push(e)}if(t.length>1){const e=t[0],i=t[t.length-1];e[0]===i[0]&&e[1]===i[1]&&t.pop()}if(t.length<3)return null;let i=0,s=0,n=0;for(let e=0;ee+t[0],0)/t.length,t.reduce((e,t)=>e+t[1],0)/t.length]:[s/(3*i),n/(3*i)]}function ap(e){if(!Array.isArray(e))return null;const t=[];for(const i of e){const e=np(i);if(!e)return null;t.push(e)}if(t.length>1){const e=t[0],i=t[t.length-1];e[0]===i[0]&&e[1]===i[1]&&t.pop()}const i=op(t);if(!i)return null;const s=t.map(e=>e[0]),n=t.map(e=>e[1]);return{centroid:i,bbox:[Math.min(...s),Math.min(...n),Math.max(...s),Math.max(...n)]}}function rp(e){let t=e;if(t&&"object"==typeof t&&!Array.isArray(t)){const e=t;t=e.path??e.points??t}if(!Array.isArray(t)||!t.length)return[];let i=(t.some(e=>(e=>Array.isArray(e)?e.length>=2&&!Array.isArray(e[0])&&("object"!=typeof e[0]||null==e[0]):!!e&&"object"==typeof e&&("x"in e||"y"in e))(e))?[t]:t.filter(Array.isArray)).map(e=>e.map(np).filter(e=>null!=e)).filter(e=>e.length>=2);i.length>64&&(i=i.slice(-64));const s=i.reduce((e,t)=>e+t.length,0);if(s<=4e3)return i.map(e=>e.slice());const n=4e3-2*i.length,o=i.map(e=>e.length-2),a=o.reduce((e,t)=>e+t,0),r=o.map(e=>n*e/a),l=r.map(Math.floor);let c=n-l.reduce((e,t)=>e+t,0);const h=r.map((e,t)=>({index:t,fraction:e-Math.floor(e)})).sort((e,t)=>t.fraction-e.fraction||e.index-t.index);for(let e=0;efunction(e,t){if(t>=e.length)return e.slice();if(t<=2)return[e[0],e[e.length-1]];const i=[];for(let s=0;se.slice()),i=t[t.length-1];return i?(i.length>2?i.pop():t.pop(),t):[]}function hp(e){if(!e)return null;const t=e.vacuum_position||e.robot_position||null,i=t&&null!=sp(t.x)&&null!=sp(t.y)?{x:sp(t.x),y:sp(t.y),a:sp(t.a??t.angle??t.theta)}:null,s=rp(e.path?.path??e.path?.points??e.path),n=[],o=e.rooms,a=Array.isArray(o)?o.map((e,t)=>[String(e?.id??t),e]):o&&"object"==typeof o?Object.entries(o):[];for(const[e,t]of a){if(!t||"object"!=typeof t)continue;const i=String(t.name??t.label??"").trim(),s=[[sp(t.cx),sp(t.cy)],[sp(t.center?.x),sp(t.center?.y)],[sp(t.x),sp(t.y)]].find(([e,t])=>null!=e&&null!=t);let o=s?.[0]??null,a=s?.[1]??null;const r=ap(t.outline),l=sp(t.x0),c=sp(t.y0),h=sp(t.x1),d=sp(t.y1),p=(null!=l&&null!=c&&null!=h&&null!=d?[Math.min(l,h),Math.min(c,d),Math.max(l,h),Math.max(c,d)]:null)||r?.bbox||null;if(null!=o&&null!=a||!r||([o,a]=r.centroid),null!=o&&null!=a||!p||(o=(p[0]+p[2])/2,a=(p[1]+p[3])/2),i&&null!=o&&null!=a){const t={id:e,name:i,cx:o,cy:a};p&&([t.x0,t.y0,t.x1,t.y1]=p),n.push(t)}}const r=function(e){return String(e.map_name??e.current_map??e.map_index??e.selected_map??"default")}(e);return i||n.length||s.length?{pos:i,path:s,rooms:n,mapId:r}:null}function dp(e,t,i){if(!e||!t)return null;const s=t.attributes||{},n=e.split(".")[0]||"",o=null!=i?.platform?String(i.platform):null,a=!!np(s.vacuum_position??s.robot_position),r=!(!s.rooms||"object"!=typeof s.rooms),l=rp(s.path?.path??s.path?.points??s.path).length>0,c=[s.map_name,s.current_map,s.map_index,s.selected_map].some(e=>null!=e),h="xiaomi_cloud_map_extractor"===o,d=r||l||c;let p=null;if(a?p="compatible":h?p="known_xcme_incomplete":d?p="partial":"camera"===n&&(p="camera"),!p)return null;const u=a?"camera"===n?300:200:h?100:d?50:0;return{entityId:e,name:String(s.friendly_name||e),platform:o,category:p,hasPosition:a,hasRooms:r,hasPath:l,hasMapId:c,score:u}}const pp=e=>e.toLowerCase().replace(/[\s_\-.,]+/g,"");function up(e,t){const i=new Map(t.map(e=>[pp(e.name),e])),s=[],n=[];for(const t of e){const e=i.get(pp(t.name));e&&(s.push([[t.cx,t.cy],[e.cx,e.cy]]),n.push(t.name))}if(s.length<3)return null;const o=function(e){if(e.length<3)return null;let t=0,i=0,s=0,n=0,o=0,a=0,r=0,l=0,c=0,h=0,d=0,p=0;for(const[[u,_],[m,g]]of e){if(![u,_,m,g].every(Number.isFinite))return null;t+=u*u,i+=u*_,s+=u,n+=_*_,o+=_,a+=1,r+=u*m,l+=_*m,c+=m,h+=u*g,d+=_*g,p+=g}const u=[t,i,s,i,n,o,s,o,a],_=e=>{const[t,i,s,n,o,a,r,l,c]=u,h=t*(o*c-a*l)-i*(n*c-a*r)+s*(n*l-o*r);if(!Number.isFinite(h)||Math.abs(h)<1e-9)return null;const d=[(o*c-a*l)/h,(s*l-i*c)/h,(i*a-s*o)/h,(a*r-n*c)/h,(t*c-s*r)/h,(s*n-t*a)/h,(n*l-o*r)/h,(i*r-t*l)/h,(t*o-i*n)/h];return[d[0]*e[0]+d[1]*e[1]+d[2]*e[2],d[3]*e[0]+d[4]*e[1]+d[5]*e[2],d[6]*e[0]+d[7]*e[1]+d[8]*e[2]]},m=_([r,l,c]),g=_([h,d,p]);if(!m||!g)return null;const f=[m[0],m[1],m[2],g[0],g[1],g[2]];return f.every(Number.isFinite)?f:null}(s);return o?{matrix:o,matched:n,residual:ip(o,s)}:null}function _p(e,t,i){const s=e[e.length-1];if(s&&s[0]===t[0]&&s[1]===t[1])return e;if(e.push(t),e.length<=600)return e;let n=function(e,t){if(e.length<3)return e.slice();const i=new Uint8Array(e.length);i[0]=i[e.length-1]=1;const s=[[0,e.length-1]];for(;s.length;){const[n,o]=s.pop(),[a,r]=e[n],[l,c]=e[o],h=l-a,d=c-r,p=Math.hypot(h,d)||1e-9;let u=0,_=-1;for(let t=n+1;tu&&(u=i,_=t)}_>0&&u>t&&(i[_]=1,s.push([n,_],[_,o]))}const n=[];for(let t=0;t600&&(n=n.filter((e,t)=>t%2==0||t===n.length-1)),n}function mp(e){return"cleaning"===e||"returning"===e||"on"===e}const gp={0:[1,0],90:[0,1],180:[-1,0],270:[0,-1]};function fp(e){const[t,i]=gp[e.rot]||[1,0],s=e.mir?-1:1;return[e.s*t*s,-e.s*i,e.ox,e.s*i*s,e.s*t,e.oy]}function vp(e){const t=e[0]*e[4]-e[1]*e[3];if(!Number.isFinite(t)||Math.abs(t)<1e-12)return null;const i=t<0,s=Math.sqrt(Math.abs(t));let n=180*Math.atan2(-e[1],e[4])/Math.PI;return n=(90*Math.round(n/90)%360+360)%360,{ox:e[2],oy:e[5],s:s,rot:n,mir:i}}function bp(e,t,i,s){const[n,o]=tp(fp(t),i,s),a=fp({...e,ox:0,oy:0}),[r,l]=tp(a,i,s);return{...e,ox:n-r,oy:o-l}}function yp(e){const t=e?.trail_mode;return"never"===t||"cleaning"===t||"always"===t?t:!1===e?.trail?"never":"cleaning"}const wp=new Set(["group","template","derivative","min_max","threshold","integration","statistics","trend","utility_meter","tod","switch_as_x","schedule"]);function kp(e){const{hass:t,devices:i,markers:s,showEntities:n,currentBinding:o,currentDeviceId:a,labels:r}=e,l=wo(s),c=new Set(s.filter(e=>e.removed).map(e=>e.binding)),h=new Set;for(const e of i)e.id!==a&&("device"===e.bindingKind&&e.bindingRef&&h.add(`device:${e.bindingRef}`),"entity"===e.bindingKind&&e.bindingRef&&h.add(`entity:${e.bindingRef}`));const d=new Set;for(const e of i)"device"===e.bindingKind&&e.name&&d.add(`${e.name.trim()}|${e.area||""}`);const p=[];for(const e of Object.values(t?.devices||{})){if(!e||"service"===e.entry_type)continue;const t=`device:${e.id}`;if(h.has(t))continue;const i=String(e.name_by_user||e.name||e.id).trim();t!==o&&!c.has(t)&&d.has(`${i}|${e.area_id||""}`)||p.push({value:t,label:i,sub:(e.model||r.device)+("Group"===e.model?r.z2mGroup:""),kind:"device",ref:e.id,areaId:e.area_id||"",model:e.model||""})}for(const[e,i]of Object.entries(t?.entities||{})){const s=`entity:${e}`;if(h.has(s))continue;if(ko(t,e,l)&&!c.has(s))continue;const n=wp.has(i?.platform),o="group"===i?.platform;if(!n&&!o)continue;if(i?.hidden&&!c.has(s))continue;const a=t?.states?.[e];p.push({value:s,label:i?.name||a?.attributes?.friendly_name||e,sub:`${e.split(".")[0]} · ${o?r.group:r.helper}`,kind:"entity",ref:e,areaId:i?.area_id||i?.device_id&&t?.devices?.[i.device_id]?.area_id||"",model:"",parentDeviceId:i?.device_id||void 0})}if(n){const e=new Set(p.map(e=>e.value));for(const[i,s]of Object.entries(t?.entities||{})){const n=`entity:${i}`;if(h.has(n)||e.has(n)||s?.hidden&&!c.has(n))continue;const o=!!s?.device_id&&l.devices.has(s.device_id);if(ko(t,i,l)&&!c.has(n)&&!o)continue;const a=t?.states?.[i],d=s?.device_id?t?.devices?.[s.device_id]:null,u=d?String(d.name_by_user||d.name||""):"";p.push({value:n,label:s?.name||a?.attributes?.friendly_name||i,sub:`${i.split(".")[0]} · ${r.entity}${u?` · ${u}`:""}`,kind:"entity",ref:i,areaId:s?.area_id||d?.area_id||"",model:"",parentDeviceId:s?.device_id||void 0})}}return p.sort((e,t)=>e.label.localeCompare(t.label)||e.value.localeCompare(t.value))}const xp={kind:"active",enabledEntityIds:[],allEntityIds:[]};function $p(e){return e.startsWith("entity:")?"entity":"device"}function Sp(e){const t=e.binding.indexOf(":"),i=t>=0?e.binding.slice(t+1):"",s=Object.keys(e).filter(e=>!["id","binding","hidden"].includes(e));return e.id===`h${i}`&&0===s.length}const Mp={offStates:["off"],unknownUsesToggle:!0},Cp={light:Mp,switch:Mp,fan:Mp,humidifier:Mp,input_boolean:Mp,automation:Mp,remote:Mp,group:Mp,climate:{...Mp,featureMasks:{turn_on:256,turn_off:128,toggle:384}},media_player:{...Mp,featureMasks:{turn_on:128,turn_off:256,toggle:384}},siren:{...Mp,featureMasks:{turn_on:1,turn_off:2,toggle:3}},vacuum:{...Mp,featureMasks:{turn_on:1,turn_off:2,toggle:3}},water_heater:{...Mp,featureMasks:{turn_on:8,turn_off:8,toggle:8}},camera:{...Mp,featureMasks:{turn_on:1,turn_off:1,toggle:1}}};function Dp(e){return e.slice(0,e.indexOf("."))}function Pp(e,t,i){if(!e?.services||"object"!=typeof e.services)return!1;const s=e.services?.[t];return!!s&&Object.prototype.hasOwnProperty.call(s,i)}function Tp(e,t,i){return Pp(e,t,i)?{domain:t,service:i}:Pp(e,"homeassistant",i)?{domain:"homeassistant",service:i}:null}function Ip(e,t){return e?.entities?.[t]||null}function Rp(e,t,i){const s=e?.states?.[i],n=Ip(t,i);return s?.attributes?.friendly_name||n?.name||n?.original_name||i}function Ap(e,t){const i=Ip(e,t);if(null!=i?.disabled_by)return!0;const s=i?.device_id?e?.devices?.[i.device_id]:null;return null!=s?.disabled_by}function zp(e,t){const i=e?.attributes?.supported_features;if(null==i||""===i)return!1;const s=Number(i);return Number.isFinite(s)&&(s&t)===t}function Fp(e,t,i){const s=Dp(i);if("lock"===s||"alarm_control_panel"===s)return!0;if("cover"!==s)return!1;const n=e?.states?.[i],o=Ip(t,i),a=String(n?.attributes?.device_class||o?.device_class||o?.original_device_class||"");return Ui.has(a)}function Np(e,t,i,s,n){return{ref:i,entityId:s,name:s?Rp(e,t,s):null,reason:n}}function Ep(e,t,i,s,n,o=null){return{target:null,skipped:Np(e,t,i,s,n),semantics:o,nextEffect:null,command:null}}function Op(e,t,i,s,n=i){const o=Dp(i);if("cover"!==o&&"valve"!==o)return function(e,t,i,s,n=i){const o=Dp(i),a=e?.states?.[i];if(Ap(t,i))return Ep(e,t,n,i,"ha-disabled","power");if(Fp(e,t,i))return Ep(e,t,n,i,"secure");if(!a)return Ep(e,t,n,i,"missing","power");if("unavailable"===a.state)return Ep(e,t,n,i,"unavailable","power");const r=Cp[o];if(!r)return Ep(e,t,n,i,"unsupported");let l,c;if("unknown"===a.state||""===a.state){if(!r.unknownUsesToggle)return Ep(e,t,n,i,"unsupported","power");l="toggle",c="toggle"}else r.offStates.includes(String(a.state))?(l="turn-on",c="turn_on"):(l="turn-off",c="turn_off");const h=r.featureMasks?.[c];if(h&&!zp(a,h))return Ep(e,t,n,i,"unsupported","power");const d=Tp(e,o,c);return d?{target:{entityId:i,name:Rp(e,t,i),state:String(a.state||""),via:s},skipped:null,semantics:"power",nextEffect:l,command:{...d,data:{entity_id:i}}}:Ep(e,t,n,i,"unsupported","power")}(e,t,i,s,n);if(Ap(t,i))return Ep(e,t,n,i,"ha-disabled",o);if(Fp(e,t,i))return Ep(e,t,n,i,"secure",o);const a=e?.states?.[i];if(!a)return Ep(e,t,n,i,"missing",o);if("unavailable"===a.state)return Ep(e,t,n,i,"unavailable",o);const r=function(e,t,i){const s=String(i?.state||""),n="closed"===s?{service:`open_${t}`,effect:"open",feature:1}:"open"===s?{service:`close_${t}`,effect:"close",feature:2}:"opening"===s||"closing"===s?{service:`stop_${t}`,effect:"stop",feature:8}:null;return n&&zp(i,n.feature)&&Pp(e,t,n.service)?n:zp(i,3)&&Pp(e,t,"toggle")?{service:"toggle",effect:"toggle"}:null}(e,o,a);if(!r)return Ep(e,t,n,i,"unsupported",o);return{target:{entityId:i,name:Rp(e,t,i),state:String(a.state||""),via:s},skipped:null,semantics:o,nextEffect:r.effect,command:{domain:o,service:r.service,data:{entity_id:i}}}}function Hp(e){return"entity"===e.bindingKind?e.bindingRef&&Ms(e.bindingRef)?[e.bindingRef]:[]:"virtual"===e.bindingKind?[]:eo(e)}function Lp(e){const t=e.marker?.toggle_entity;return t&&Hp(e).includes(t)?t:null}function Bp(e,t,i){const s=function(e,t){if("entity"===e.bindingKind&&e.bindingRef){const t=e.marker?.light_entity?to(e):null;return[...new Set([t,e.bindingRef].filter(e=>!!e))]}const i=e.entities.length?e.entities:e.allEntities||[],s=e.marker?.light_entity||e.primary&&Ms(e.primary)?to(e):null;return[...new Set([s,...Yn(t,i)].filter(e=>!!e))]}(i,t);if(!s.length)return null;const n="entity"===i.bindingKind?"binding":"device-role";if("binding"===n)return Op(e,t,s[0],n);let o=null,a=null;for(const i of s){const s=Op(e,t,i,n);if(s.command)return s;const r=s.skipped?.reason;if("missing"===r||"unavailable"===r||"secure"===r)return s;"ha-disabled"!==r?o||=s:a||=s}return o||a}function jp(e){const t=e.skipped?.reason;return"missing"===t?"unavailable":t||"unsupported"}function qp(e,t){return{origin:e,kind:"none",semantics:null,targets:[],skippedTargets:[],noneReason:t,nextEffect:null,command:null}}function Wp(e,t){return"cover"===e||"toggle"===e?"toggle":"more-info"===e||"run"===e||"info"===e?e:(null==e||""===e)&&"light"===t?"toggle":"info"}function Up(e,t){return{origin:e,kind:"single",semantics:t.semantics,targets:t.target?[t.target]:[],skippedTargets:t.skipped?[t.skipped]:[],noneReason:t.command?null:jp(t),nextEffect:t.nextEffect,command:t.command}}function Gp(e,t,i,s=[]){const n=new Map,o=[],a=new Set,r=e=>{const t=`${e.ref}\n${e.entityId||""}\n${e.reason}`;a.has(t)||(a.add(t),o.push(e))};for(const e of s)r(e);for(const s of i){const i=Op(e,t,s.entityId,s.via,s.ref);i.target?n.set(s.entityId,n.get(s.entityId)||i.target):i.skipped&&r(i.skipped)}const l=[...n.values()];if(!l.length)return{origin:"explicit-toggle",kind:"group",semantics:"group-power",targets:l,skippedTargets:o,noneReason:o.length&&o.every(e=>"secure"===e.reason)?"secure":"configured-targets-missing",nextEffect:null,command:null};const c=l.some(e=>"on"===e.state)?"turn_off":"turn_on",h=Tp(e,"homeassistant",c);return h?{origin:"explicit-toggle",kind:"group",semantics:"group-power",targets:l,skippedTargets:o,noneReason:null,nextEffect:"turn_on"===c?"turn-on":"turn-off",command:{...h,data:{entity_id:l.map(e=>e.entityId)}}}:{origin:"explicit-toggle",kind:"group",semantics:"group-power",targets:[],skippedTargets:[...o,...l.map(i=>Np(e,t,i.entityId,i.entityId,"unsupported"))],noneReason:"unsupported",nextEffect:null,command:null}}function Vp(e){return String(e.marker?.id||e.id||"")}function Kp(e){const{hass:t,device:i}=e,s=e.registryHass||t,n=function(e){return"toggle"===e.tapAction?"explicit-toggle":"cover"===e.tapAction?"legacy-cover":!e.tapAction&&e.primary?.startsWith("light.")?"default-light":null}(i);if(!n)return null;const o=i.marker;if("explicit-toggle"===n&&bn(o)){const t=String(o?.id||i.id||""),s=ro(e.devices).get(t);if(s)return function(e,t){const i=e.registryHass||e.hass;return Gp(e.hass,i,t.driverEids.map(e=>({entityId:e,via:"control-marker-driver",ref:`marker:${t.markerId}`})))}(e,s);const a=yn(o,e.virtualLights);return{origin:n,kind:"single",semantics:"power",targets:[{entityId:"",name:i.name,state:a?"on":"off",via:"virtual-light"}],skippedTargets:[],noneReason:null,nextEffect:a?"turn-off":"turn-on",command:null,operation:{kind:"virtual-light",markerId:o.id}}}if("explicit-toggle"===n){if(Zn(i.marker?.binding,i.marker?.controls??i.controls,i.entities).length)return function(e,t=null){const{hass:i,device:s,devices:n}=e,o=e.registryHass||i,a=Zn(s.marker?.binding,s.marker?.controls??s.controls,s.entities),r=e.lightSources||ho(i,n,null,e.virtualLights),l=new Map;for(const e of r){if(!e.key.startsWith("marker:"))continue;const t=l.get(e.key)||[];t.push(e),l.set(e.key,t)}const c=ro(n),h=new Map;for(const e of n){const t=String(e.marker?.id||e.id||"");t&&h.set(t,e)}const d=[],p=[];t&&d.push({entityId:t,via:"entity"===s.bindingKind?"binding":"device-role",ref:t});for(const e of a){if(!e.startsWith("marker:")){Ms(e)?d.push({entityId:e,via:"control-entity",ref:e}):p.push(Np(i,o,e,e.includes(".")?e:null,"unsupported"));continue}const t=l.get(e)||[];if(!t.length){const t=h.get(e.slice(7));if("ha_disabled"===t?.bindingStatus?.kind){const s=t.bindingStatus.allEntityIds[0]||null;p.push({ref:e,entityId:s,name:t.name||(s?Rp(i,o,s):null),reason:"ha-disabled"})}else p.push(Np(i,o,e,null,"missing"));continue}const n=[...new Set(t.flatMap(e=>e.serviceEids))];if(n.length){for(const t of n)d.push({entityId:t,via:"control-entity",ref:e});continue}const a=t.some(e=>e.passive),r=e.slice(7),u=Vp(s),_=c.get(r)?.controllers.find(e=>Vp(e.device)===u);if(a&&_?.driverEids.length)for(const t of _.driverEids)d.push({entityId:t,via:"control-marker-driver",ref:e});else p.push(Np(i,o,e,null,a?"missing":"unsupported"))}return Gp(i,o,d,p)}(e,Lp(i))}if("legacy-cover"===n){const e=i.entities.find(e=>e.startsWith("cover."))||i.allEntities?.find(e=>e.startsWith("cover."));return e?Up(n,Op(t,s,e,"device-role")):qp(n,"no-actionable-entity")}const a=Lp(i),r=a?Op(t,s,a,"entity"===i.bindingKind?"binding":"device-role"):Bp(t,s,i);return r?Up(n,r):qp(n,i.virtual||"virtual"===i.bindingKind?"no-actionable-entity":"no-binding")}function Yp(e){if(!e)return[];const t=Array.isArray(e.data.entity_id)?e.data.entity_id:[e.data.entity_id];return[...new Set(t)].sort()}function Jp(e){return e?e.operation?e.operation:e.command?{kind:"ha-service",command:e.command}:null:null}const Xp=new Set(["missing","ha-disabled","unavailable"]);function Zp(e,t){const i=Jp(e),s=Jp(t);return!(!i||!s||i.kind!==s.kind)&&("virtual-light"===i.kind&&"virtual-light"===s.kind?i.markerId===s.markerId:"ha-service"===i.kind&&"ha-service"===s.kind&&function(e,t){const i=Yp(e),s=Yp(t);return i.length===s.length&&i.every((e,t)=>e===s[t])}(i.command,s.command))}const Qp=e=>!!e&&e.length>=2&&Number.isFinite(e[0])&&Number.isFinite(e[1]);function eu(e,t=5,i=5){return Ml(e.cm,t,i)/2}function tu(e,t,i=1,s=5,n=5,o=0){const a=e.host;if(!a||"partition"!==a.kind||"string"!=typeof a.id||!a.id)return{resolved:null,reason:"invalid-host"};const r=t.find(e=>e.id===a.id);if(!r)return{resolved:null,reason:"missing-partition"};if(!Qp(r.a)||!Qp(r.b)||!Number.isFinite(a.t)||a.t<0||a.t>1)return{resolved:null,reason:"invalid-position"};const l=r.b[0]-r.a[0],c=r.b[1]-r.a[1],h=Math.hypot(l,c),d=Number(e.length)*i;if(!(h>1e-9&&d>0&&Number.isFinite(d)))return{resolved:null,reason:"invalid-length"};const p=a.t*h;if(p-d/2h-o+1e-9)return{resolved:null,reason:"does-not-fit"};const u=l/h,_=c/h;let m=180*Math.atan2(c,l)/Math.PI;return m>=90?m-=180:m<-90&&(m+=180),{reason:null,resolved:{opening:e,host:a,partition:r,center:[r.a[0]+l*a.t,r.a[1]+c*a.t],angle:m,length:d,depth:Ml(r.cm,s,n),t:a.t,axis:{a:[r.a[0],r.a[1]],b:[r.b[0],r.b[1]],ux:u,uy:_,length:h}}}}function iu(e,t,i=1,s=5,n=5){return tu(e,t,i,s,n,0)}function su(e,t,i=1,s=5,n=5){const o=e.host,a="partition"===o?.kind?t.find(e=>e.id===o.id):void 0;if(!a)return iu(e,t,i,s,n);const r=tu(e,t,i,s,n,eu(a,s,n));return"does-not-fit"===r.reason?{resolved:null,reason:"does-not-fit-jamb"}:r}function nu(e,t){return!e||(e.length!==t.length||e.host?.kind!==t.host?.kind||e.host?.id!==t.host?.id||e.host?.t!==t.host?.t)}function ou(e){const{center:t,length:i,axis:s,host:n}=e,o=i/2;return{hostId:n.id,a:[t[0]-s.ux*o,t[1]-s.uy*o],b:[t[0]+s.ux*o,t[1]+s.uy*o],depth:e.depth}}function au(e,t=!1){const i=t?1:-1,s=e.depth/2;return{ox:-e.axis.uy*i*s,oy:e.axis.ux*i*s,cm:e.partition.cm,side:i}}function ru(e,t,i){return e.flatMap(e=>!Qp(e.a)||!Qp(e.b)||Math.hypot(e.b[0]-e.a[0],e.b[1]-e.a[1])<=1e-9?[]:[{roomId:"",a:[e.a[0],e.a[1]],b:[e.b[0],e.b[1]],key:`partition:${e.id}`,kind:"outer",cm:e.cm,open:!1,half:Ml(e.cm,t,i)/2,partitionHost:{kind:"partition",id:e.id}}])}function lu(e,t,i){const{center:s,length:n,axis:o}=e,a=n/2,r=t.flatMap(e=>{if(!e.kind||e.open)return[];const t=e.b[0]-e.a[0],n=e.b[1]-e.a[1],r=Math.hypot(t,n);if(!(r>i))return[];const l=t/r,c=n/r;if(Math.abs(o.ux*c-o.uy*l)>1e-6)return[];if(Math.abs((s[0]-e.a[0])*c-(s[1]-e.a[1])*l)>i)return[];const h=e=>(e[0]-s[0])*o.ux+(e[1]-s[1])*o.uy,d=h(e.a),p=h(e.b),u=Math.max(-a,Math.min(d,p)),_=Math.min(a,Math.max(d,p));return _>=u-i?[[u,_]]:[]});if(!r.length)return!1;r.sort((e,t)=>e[0]-t[0]||e[1]-t[1]);let l=-a;for(const[e,t]of r){if(e>l+i)return!1;if(l=Math.max(l,t),l>=a-i)return!0}return!1}function cu(e,t,i){return{...e,x:t.center[0]/i,y:t.center[1]/i,angle:t.angle}}const hu=.001;function du(e){return!!e&&e.length>=2&&Number.isFinite(e[0])&&Number.isFinite(e[1])}function pu(e){return`${e[0].toFixed(6)},${e[1].toFixed(6)}`}function uu(e,t,i){return Math.abs(e[0]-t[0])"room"!==e.kind&&i.some(i=>i!==e&&function(e,t,i){const s=e.b[0]-e.a[0],n=e.b[1]-e.a[1],o=Math.hypot(s,n);if(!(o>i))return!1;const a=s/o,r=n/o,l=t=>Math.abs((t[0]-e.a[0])*r-(t[1]-e.a[1])*a);if(l(t.a)>i||l(t.b)>i)return!1;const c=(t.a[0]-e.a[0])*a+(t.a[1]-e.a[1])*r,h=(t.b[0]-e.a[0])*a+(t.b[1]-e.a[1])*r;return Math.min(o,Math.max(c,h))-Math.max(0,Math.min(c,h))>i}(e,i,t))),n=s.map(e=>{const[t,i]=_u(e.a,e.b);return{a:t,b:i,key:`hidden|${gu(e,t,i)}`,sourceKind:e.kind,sourceId:e.id}}).sort((e,t)=>e.key.localeCompare(t.key)),o=s.flatMap(e=>[e.a,e.b].map((t,i)=>({point:[t[0],t[1]],key:`hidden|${mu(e)}|endpoint-${i}`,sourceKind:e.kind,sourceId:e.id}))).sort((e,t)=>e.key.localeCompare(t.key));return{segments:n,endpoints:o}}function yu(e){const t=e.epsilon??hu,i=e.roomCuts||[],s=new Map;for(const t of e.partitionCuts||[]){if("string"!=typeof t.hostId||!t.hostId||!du(t.a)||!du(t.b))continue;const e=s.get(t.hostId)||[];e.push([t.a[0],t.a[1],t.b[0],t.b[1]]),s.set(t.hostId,e)}const n=[];for(const[t,s]of pi(e.space.rooms).entries())s.length<4||n.push({a:[s[0],s[1]],b:[s[2],s[3]],kind:"room",id:`room-edge-${t}`,cuts:i});for(const t of e.space.room_drafts||[])if(t.id!==e.activeDraftId)for(let e=0;e+1vu(s,e,t)))continue;const e=pu(s);a.has(e)||a.set(e,{point:[s[0],s[1]],key:e})}}}return{segments:[...o.values()].sort((e,t)=>e.key.localeCompare(t.key)),endpoints:[...a.values()].sort((e,t)=>e.key.localeCompare(t.key))}}function wu(e,t,i){return t.some(t=>du(t)&&uu(e,t,i))}function ku(e,t,i){if(!i)return!0;const s=e-i.distance;return s<-1e-9||Math.abs(s)<=1e-9&&t.localeCompare(i.key)<0}function xu(e,t,i){const s=i.epsilon??hu,n=i.excludePoints||[],o=[...e.endpoints,...(i.extraEndpoints||[]).filter(e=>du(e.point)).map(e=>({point:[e.point[0],e.point[1]],key:e.key}))],a=new Map;for(const e of o){if(wu(e.point,n,s))continue;const t=pu(e.point),i=a.get(t);(!i||e.key.localeCompare(i.key)<0)&&a.set(t,e)}return[...a.values()].map(e=>({kind:"endpoint",point:[...e.point],key:e.key,distance:Math.hypot(t[0]-e.point[0],t[1]-e.point[1])})).filter(e=>e.distance<=i.tolerance).sort((e,t)=>e.distance-t.distance||e.key.localeCompare(t.key))}function $u(e,t){if(!e.length)return null;if(t>0){const i=new Set;for(let s=0;s1)return{kind:"ambiguous",candidate:null,conflicts:e.filter(e=>i.has(e.key)).map(e=>({point:[...e.point],key:e.key}))}}return{kind:"resolved",candidate:e[0],conflicts:[]}}function Su(e,t,i){const s=e.b[0]-e.a[0],n=e.b[1]-e.a[1],o=Math.hypot(s,n);if(!(o>0))return[...e.a];const a=s/o,r=n/o,l=Math.max(0,Math.min(o,(t[0]-e.a[0])*a+(t[1]-e.a[1])*r)),c=i>0?Math.max(0,Math.min(o,Math.round(l/i)*i)):l;return[e.a[0]+a*c,e.a[1]+r*c]}function Mu(e,t,i){if(!(du(t)&&du(i.anchor)&&i.tolerance>=0))return{kind:"none",candidate:null,conflicts:[]};const s=i.epsilon??hu,n=function(e,t){const i=t[0]-e[0],s=t[1]-e[1];if(!(Math.hypot(i,s)>Number.EPSILON))return null;const n=Math.round(Math.atan2(s,i)/(Math.PI/4))*(Math.PI/4);return[Math.cos(n),Math.sin(n)]}(i.anchor,t);if(!n)return{kind:"none",candidate:null,conflicts:[]};const o=xu(e,t,i).filter(e=>function(e,t,i,s){const n=e[0]-t[0],o=e[1]-t[1];return n*i[0]+o*i[1]>s&&Math.abs(n*i[1]-o*i[0])<=s*Math.max(Math.hypot(n,o),1)}(e.point,i.anchor,n,s)),a=$u(o,i.distinguishTolerance||0);if(a)return a;let r=null;for(const o of e.segments){const e=o.b[0]-o.a[0],a=o.b[1]-o.a[1],l=o.a[0]-i.anchor[0],c=o.a[1]-i.anchor[1],h=n[0]*a-n[1]*e;let d=null;if(Math.abs(h)<=s*Math.max(Math.hypot(e,a),1)){if(Math.abs(l*n[1]-c*n[0])>s*Math.max(Math.hypot(l,c),1))continue;const e=[o.a,o.b].map(e=>({point:e,along:(e[0]-i.anchor[0])*n[0]+(e[1]-i.anchor[1])*n[1]})).filter(e=>e.along>s).sort((e,t)=>e.along-t.along);e.length&&(d=[...e[0].point])}else{const t=(l*a-c*e)/h,o=(l*n[1]-c*n[0])/h;t>s&&o>=-s&&o<=1+s&&(d=[i.anchor[0]+n[0]*t,i.anchor[1]+n[1]*t])}if(!d)continue;const p=Math.hypot(t[0]-d[0],t[1]-d[1]);p>i.tolerance||wu(d,i.excludePoints||[],s)||!ku(p,o.key,r)||(r={kind:"line",point:d,key:o.key,distance:p,segment:o})}return r?{kind:"resolved",candidate:r,conflicts:[]}:{kind:"none",candidate:null,conflicts:[]}}const Cu=.001;function Du(e,t,i,s){const n=Number.isFinite(e)&&e>0?Math.floor(e):0,o=e=>"number"==typeof e&&Number.isFinite(e)&&e>=0?e:null,a=o(i),r=o(s)??0,l=[];let c=null;for(let e=0;e=2&&Number.isFinite(e[0])&&Number.isFinite(e[1])}function Iu(e,t,i,s){return e*s-t*i}function Ru(e){let t=0;for(let i=0;ie.localeCompare(t)),t[0]}function Eu(e,t,i){const s=[...e];for(let e=!0;e&&s.length>=3;){e=!1;for(let n=0;n=0){s.splice(n,1),e=!0;break}}}return s}function Ou(e,t){const i=e.map(e=>Math.max(0,Math.min(1,e))).sort((e,t)=>e-t),s=[];for(const e of i)(!s.length||Math.abs(e-s[s.length-1])>t)&&s.push(e);return s}function Hu(e,t){return[e.a[0]+(e.b[0]-e.a[0])*t,e.a[1]+(e.b[1]-e.a[1])*t]}function Lu(e,t,i){const s=function(e,t){const i=t.b[0]-t.a[0],s=t.b[1]-t.a[1],n=i*i+s*s;return n>0?((e[0]-t.a[0])*i+(e[1]-t.a[1])*s)/n:0}(e,t);if(s<-i||s>1+i)return null;const n=Hu(t,s);return Math.hypot(n[0]-e[0],n[1]-e[1])<=i?Math.max(0,Math.min(1,s)):null}function Bu(e,t,i,s,n){const o=e.b[0]-e.a[0],a=e.b[1]-e.a[1],r=t.b[0]-t.a[0],l=t.b[1]-t.a[1],c=t.a[0]-e.a[0],h=t.a[1]-e.a[1],d=Iu(o,a,r,l),p=Math.max(Math.hypot(o,a),Math.hypot(r,l),1);if(Math.abs(d)>n*p){const e=Iu(c,h,r,l)/d,t=Iu(c,h,o,a)/d;return void(e>=-n&&e<=1+n&&t>=-n&&t<=1+n&&(i.push(Math.max(0,Math.min(1,e))),s.push(Math.max(0,Math.min(1,t)))))}if(!(Math.abs(Iu(c,h,o,a))>n*p)){for(const s of[t.a,t.b]){const t=Lu(s,e,n);null!=t&&i.push(t)}for(const i of[e.a,e.b]){const e=Lu(i,t,n);null!=e&&s.push(e)}}}function ju(e){let t=e+1|0;return t^=t<<13,t^=t>>>17,t^=t<<5,t>>>0}function qu(e,t){return e.minY-t.minY||e.index-t.index}function Wu(e){return e.subtreeMaxY=Math.max(e.item.maxY,e.left?.subtreeMaxY??-1/0,e.right?.subtreeMaxY??-1/0),e}function Uu(e){const t=e.right;return e.right=t.left,t.left=Wu(e),Wu(t)}function Gu(e){const t=e.left;return e.left=t.right,t.right=Wu(e),Wu(t)}function Vu(e,t){return e?(qu(t,e.item)<0?(e.left=Vu(e.left,t),e.left.priority0)e.right=Ku(e.right,t);else{if(!e.left)return e.right;if(!e.right)return e.left;e.left.priority=t&&Yu(e.left,t,i,s),e.item.minY<=i&&e.item.maxY>=t&&s.push(e.item),e.item.minY<=i&&Yu(e.right,t,i,s))}function Ju(e,t=.001){const i=Number.isFinite(t)&&t>0?t:Cu,s=e.filter(e=>Tu(e.a)&&Tu(e.b)&&"string"==typeof e.key&&e.key.length>0&&Math.hypot(e.b[0]-e.a[0],e.b[1]-e.a[1])>i),n=s.map(()=>[0,1]);!function(e,t,i){const s=e.map((e,t)=>({index:t,minX:Math.min(e.a[0],e.b[0])-i,maxX:Math.max(e.a[0],e.b[0])+i,minY:Math.min(e.a[1],e.b[1])-i,maxY:Math.max(e.a[1],e.b[1])+i})),n=[...s].sort((e,t)=>e.minX-t.minX||e.minY-t.minY||e.index-t.index),o=[...s].sort((e,t)=>e.maxX-t.maxX||e.index-t.index),a=new Set;let r=null,l=0;for(const s of n){for(;le.index-t.index);for(const o of n)Bu(e[o.index],e[s.index],t[o.index],t[s.index],i);a.add(s.index),r=Vu(r,s)}}(s,n,i);const o=new Map;for(let e=0;e({key:e,a:t.a,b:t.b,sourceKeys:[...t.sourceKeys].sort((e,t)=>e.localeCompare(t))})).sort((e,t)=>e.key.localeCompare(t.key))}function Xu(e,t=.001){const i=Number.isFinite(t)&&t>0?t:Cu,s=Ju(e,i),n=new Map,o=new Map,a=new Map(s.map(e=>[e.key,e]));for(const e of s){const t=zu(e.a,i),s=zu(e.b,i);n.set(t,e.a),n.set(s,e.b),o.has(t)||o.set(t,new Set),o.has(s)||o.set(s,new Set),o.get(t).add(s),o.get(s).add(t)}const r=new Map;for(const[e,t]of o){const i=n.get(e);r.set(e,[...t].sort((e,t)=>{const s=n.get(e),o=n.get(t);return Math.atan2(s[1]-i[1],s[0]-i[0])-Math.atan2(o[1]-i[1],o[0]-i[0])||e.localeCompare(t)}))}const l=new Set,c=new Map,h=(e,t)=>`${e}>${t}`;for(const e of s){const t=[zu(e.a,i),zu(e.b,i)];for(const[e,o]of[t,[t[1],t[0]]]){if(l.has(h(e,o)))continue;const t=[],d=[];let p=e,u=o,_=!1;for(let i=0;i<=2*s.length+2;i++){const i=h(p,u);if(l.has(i)){_=p===e&&u===o;break}l.add(i),t.push(p),d.push(Fu(p,u));const s=r.get(u)||[],n=s.indexOf(p);if(n<0||!s.length)break;if(p=u,u=s[(n-1+s.length)%s.length],p===e&&u===o){_=!0;break}}if(!_||new Set(t).size<3||new Set(t).size!==t.length)continue;const m=t.map(e=>n.get(e)),g=Ru(m);if(!(g>i*i))continue;const f=Nu(Eu(t,n,i)),v=new Set;for(const e of d)for(const t of a.get(e)?.sourceKeys||[])v.add(t);const b={ring:m,key:f,area:g,atomKeys:[...d],sourceKeys:[...v].sort((e,t)=>e.localeCompare(t))};c.has(f)||c.set(f,b)}}return{atoms:s,faces:[...c.values()].sort((e,t)=>e.area-t.area||e.key.localeCompare(t.key))}}function Zu(e,t,i=.001){if(!Tu(t))return null;const s=e.faces.filter(e=>{if(e.ring.some((s,n)=>function(e,t,i,s){const n=i[0]-t[0],o=i[1]-t[1],a=n*n+o*o;if(!(a>0))return Math.hypot(e[0]-t[0],e[1]-t[1])<=s;const r=((e[0]-t[0])*n+(e[1]-t[1])*o)/a;return!(r<0||r>1)&&Math.hypot(t[0]+n*r-e[0],t[1]+o*r-e[1])<=s}(t,s,e.ring[(n+1)%e.ring.length],i)))return!1;let s=!1;for(let i=0,n=e.ring.length-1;it[1]!=a[1]>t[1]&&t[0]<(a[0]-o[0])*(t[1]-o[1])/(a[1]-o[1])+o[0]&&(s=!s)}return s});return[...s].sort((e,t)=>e.area-t.area||e.key.localeCompare(t.key))[0]||null}function Qu(e,t,i){const s=i[0]-t[0],n=i[1]-t[1],o=s*s+n*n,a=o>0?Math.max(0,Math.min(1,((e[0]-t[0])*s+(e[1]-t[1])*n)/o)):0;return Math.hypot(t[0]+s*a-e[0],t[1]+n*a-e[1])}function e_(e,t,i=.5){let s=Math.abs(e-t)%180;return s>90&&(s=180-s),s<=i}function t_(e,t,i,s){const n=e.filter(e=>"outer"===e.kind&&!e.open&&e.cm>0).map(e=>({interval:e,reusePartitionId:t.find(t=>function(e,t,i){return!(Math.abs(e.cm-t.cm)>1e-6)&&(e_(180*Math.atan2(e.b[1]-e.a[1],e.b[0]-e.a[0])/Math.PI,180*Math.atan2(t.b[1]-t.a[1],t.b[0]-t.a[0])/Math.PI,.001)&&Qu(t.a,e.a,e.b)<=i&&Qu(t.b,e.a,e.b)<=i)}(t,e,s))?.id||null})),o=new Map;for(const t of i){if("partition"===t.host?.kind)continue;const i=e.map(e=>{const i=180*Math.atan2(e.b[1]-e.a[1],e.b[0]-e.a[0])/Math.PI;return{interval:e,distance:e_(t.angle,i)?Qu([t.x,t.y],e.a,e.b):1/0}}).filter(e=>e.distance<=s).sort((e,t)=>e.distance-t.distance||e.interval.key.localeCompare(t.interval.key)),n=i[0]?.interval;"outer"===n?.kind&&!n.open&&n.cm>0&&o.set(t.id,n.key)}return{materialize:n,openingIntervals:o,removeOpeningIds:[...o.keys()].sort((e,t)=>e.localeCompare(t))}}function i_(e,t){const i=t.b[0]-t.a[0],s=t.b[1]-t.a[1],n=i*i+s*s;return n>0?Math.max(0,Math.min(1,((e[0]-t.a[0])*i+(e[1]-t.a[1])*s)/n)):0}const s_=e=>!e.key.startsWith("static:room|");function n_(e,t){const i=t.b[0]-t.a[0],s=t.b[1]-t.a[1],n=i*i+s*s;if(!(n>0))return null;const o=((e[0]-t.a[0])*i+(e[1]-t.a[1])*s)/n,a=[t.a[0]+i*o,t.a[1]+s*o];return{point:a,t:o,distance:Math.hypot(a[0]-e[0],a[1]-e[1])}}function o_(e,t){return t>0?Math.hypot(e[0]-Math.round(e[0]/t)*t,e[1]-Math.round(e[1]/t)*t):0}function a_(e,t,i){if(s_(e.source)!==s_(t.source))return s_(e.source)?e:t;const s=o_(e.point,i),n=o_(t.point,i);return Math.abs(s-n)>1e-9?s>n?e:t:function(e,t){return e[0]-t[0]||e[1]-t[1]}(e.point,t.point)>0?e:t}function r_(e){return[e.from[0],e.from[1],e.to[0],e.to[1],e.targetKind].map(e=>"number"==typeof e?e.toFixed(6):e).join("|")}function l_(e,t){return e.map(e=>e.key!==t.sourceKey?e:{...e,[t.endpoint]:[...t.to]})}function c_(e,t){const i=t.epsilon??.001;if(!(t.maxDistance>=0)||!t.point&&!t.requiredSourceKey)return{kind:"none"};const s=new Map,n=e.flatMap(e=>[{source:e,endpoint:"a",point:e.a},{source:e,endpoint:"b",point:e.b}]);for(let e=0;ei)||l>t.maxDistance)continue;const c=a_(a,r,t.gridStep||0),h=c===a?r:a;if(!s_(c.source))continue;const d={sourceKey:c.source.key,endpoint:c.endpoint,from:[c.point[0],c.point[1]],to:[h.point[0],h.point[1]],targetSourceKey:h.source.key,targetKind:"endpoint",distance:l};s.set(r_(d),d)}for(const o of n)if(s_(o.source))for(const n of e){if(n===o.source)continue;const e=n_(o.point,n);if(!e||e.t<=i||e.t>=1-i||!(e.distance>i)||e.distance>t.maxDistance)continue;const a={sourceKey:o.source.key,endpoint:o.endpoint,from:[o.point[0],o.point[1]],to:e.point,targetSourceKey:n.key,targetKind:"line",distance:e.distance};s.set(r_(a),a)}const o=[];for(const n of s.values()){const s=Xu(l_(e,n),i),a=t.point?Zu(s,t.point,i):s.faces.find(e=>!t.requiredSourceKey||e.sourceKeys.includes(t.requiredSourceKey))||null;a&&o.push({proposal:n,face:a})}if(o.sort((e,t)=>e.proposal.distance-t.proposal.distance||r_(e.proposal).localeCompare(r_(t.proposal))),!o.length)return{kind:"none"};return new Set(o.map(e=>`${r_(e.proposal)}|${e.face.key}`)).size>1?{kind:"ambiguous",proposals:o.map(e=>e.proposal)}:{kind:"repair",...o[0]}}const h_=1e-5;function d_(e){const t=e.map(()=>[]);for(let i=0;i=1-1e-9||p<=1e-9||p>=1-1e-9||(t[i].push(d),t[a].push(p))}}const i=[];for(let s=0;se-t),1];for(let e=1;e{const i=t[2]-t[0],s=t[3]-t[1],n=i*i+s*s;if(!(n>0))return Math.hypot(e[0]-t[0],e[1]-t[1]);const o=Math.max(0,Math.min(1,((e[0]-t[0])*i+(e[1]-t[1])*s)/n));return Math.hypot(e[0]-(t[0]+o*i),e[1]-(t[1]+o*s))},__=(e,t,i,s)=>{const n=s[2]-s[0],o=s[3]-s[1],a=t*o-i*n;if(Math.abs(a)<1e-12)return 1/0;const r=s[0]-e[0],l=s[1]-e[1],c=(r*o-l*n)/a;if(!(c>1e-9))return 1/0;const h=(r*i-l*t)/a;return h<-1e-9||h>1+1e-9?1/0:c};function m_(e,t,i,s=96){if(!(t>0&&Number.isFinite(e[0])&&Number.isFinite(e[1])))return[];const n=[];for(const s of i){if(!s||s.length<4)continue;if(![s[0],s[1],s[2],s[3]].every(Number.isFinite))continue;const i=u_(e,s);if(i<1e-7)return[];i>t||n.push(s)}const o=[],a=Math.max(12,Math.round(s));for(let e=0;ee-t);const l=[];let c=Number.NEGATIVE_INFINITY;for(const i of o){if(i-c<1e-9)continue;c=i;const s=Math.cos(i),o=Math.sin(i);let a=t;for(const t of n){const i=__(e,s,o,t);i=3?l:[]}class g_ extends he{constructor(){super(...arguments),this._spaces=null,this._spacesLoading=!1,this._spacesAuthoritative=!1}setConfig(e){this._config=e}async _loadSpaces(){if(!this._spaces&&!this._spacesLoading&&this.hass){this._spacesLoading=!0;try{const e=await this.hass.callWS({type:"houseplan/config/get"});this._spaces=(e?.config?.spaces||[]).map(e=>({value:e.id,label:e.title||e.id})),this._spacesAuthoritative=!0}catch{this._spaces=[],this._spacesAuthoritative=!1}finally{this._spacesLoading=!1}}}get _lang(){return pa(this.hass,this._config?.language)}get _floorToken(){const e=this._config?.floor;return"number"==typeof e?`__houseplan_yaml_floor_index__:${String(e)}`:null}get _formData(){const e={...this._config},t=this._floorToken;return t?e.floor=t:Object.prototype.hasOwnProperty.call(e,"floor")||(e.floor=""),e}get _schema(){const e=this._spaces||[],t=this._lang,i=[{value:"",label:ua(t,"editor.floor_none")}],s=this._floorToken;s&&i.push({value:s,label:ua(t,"editor.floor_index",{index:String(this._config?.floor)})});const n="string"==typeof this._config?.floor?this._config.floor:"";n&&!e.some(e=>e.value===n)&&i.push({value:n,label:n}),i.push(...e);const o="string"==typeof this._config?.default_floor?this._config.default_floor:"",a=[...e];return o&&!e.some(e=>e.value===o)&&a.unshift({value:o,label:o}),[{name:"title",selector:{text:{}}},{name:"floor",selector:{select:{mode:"dropdown",options:i}}},e.length?{name:"default_floor",selector:{select:{mode:"dropdown",options:a}}}:{name:"default_floor",selector:{text:{}}},{name:"language",selector:{select:{mode:"dropdown",options:da(ua(t,"editor.lang_auto"),this._config?.language)}}},{name:"icon_size",selector:{number:{min:1,max:6,step:.1,mode:"box"}}},{name:"show_temperature",selector:{boolean:{}}},{name:"live_states",selector:{boolean:{}}},{name:"show_signal",selector:{boolean:{}}},{name:"kiosk",selector:{boolean:{}}},{name:"cycle",selector:{number:{min:0,max:3600,step:5,mode:"box"}}}]}render(){if(!this.hass||!this._config)return G;this._loadSpaces();const e=this._lang,t={title:ua(e,"editor.title"),floor:ua(e,"editor.floor"),default_floor:ua(e,"editor.default_floor"),language:ua(e,"editor.language"),icon_size:ua(e,"editor.icon_size"),show_temperature:ua(e,"editor.show_temperature"),live_states:ua(e,"editor.live_states"),show_signal:ua(e,"editor.show_signal"),kiosk:ua(e,"editor.kiosk"),cycle:ua(e,"editor.cycle")},i=this._schema,s=function(e,t,i){if(!i||null===t)return null;const s="string"==typeof e?.default_floor?e.default_floor:"";return!s||t.some(e=>e.value===s)?null:s}(this._config,this._spaces,this._spacesAuthoritative),n=e=>q``:G} ${n(i.slice(3))} - `}_valueChanged(e){const t={...this._config,...e.detail.value};""===t.floor?delete t.floor:t.floor===this._floorToken&&(t.floor=this._config?.floor);const i=new Event("config-changed",{bubbles:!0,composed:!0});i.detail={config:t},this.dispatchEvent(i)}}function g_(e){const t=e.length/2,i=e.face.cm>0?e.face.cm/e.cellCm*e.gridPitch/2:Dh(4,e.cellCm),s="gate"===e.type?Math.sin(10*Math.PI/180)*t:0;return{half:t,jambHalf:i,gateDepth:s,outlineHalf:Math.max(Dh(16,e.cellCm),i+Dh(8,e.cellCm),s+Dh(8,e.cellCm)),hitHalf:Math.max(Dh(20,e.cellCm),i+Dh(10,e.cellCm),s+Dh(12,e.cellCm))}}function f_(e){if("passage"===e.type)return W``;const t=Math.max(0,Math.min(1,e.amount)),{half:i,jambHalf:s}=g_(e),n=Ch(e.cellCm),o=1.75*n,a=e.flipH?-1:1,r=e.flipV?-1:1,l="gate"===e.type?1:r;e.type,e.flipV,e.angle,e.face;let c;if("window"===e.type){const o=Math.PI/2*i,a=e.face.cm>0?W`0?e.face.cm/e.cellCm*e.gridPitch/2:Dh(4,e.cellCm),s="gate"===e.type?Math.sin(10*Math.PI/180)*t:0;return{half:t,jambHalf:i,gateDepth:s,outlineHalf:Math.max(Dh(16,e.cellCm),i+Dh(8,e.cellCm),s+Dh(8,e.cellCm)),hitHalf:Math.max(Dh(20,e.cellCm),i+Dh(10,e.cellCm),s+Dh(12,e.cellCm))}}function v_(e){if("passage"===e.type)return W``;const t=Math.max(0,Math.min(1,e.amount)),{half:i,jambHalf:s}=f_(e),n=Ch(e.cellCm),o=1.75*n,a=e.flipH?-1:1,r=e.flipV?-1:1,l="gate"===e.type?1:r;e.type,e.flipV,e.angle,e.face;let c;if("window"===e.type){const o=Math.PI/2*i,a=e.face.cm>0?W``:W``;c=W` ${c} - `}m_.properties={hass:{attribute:!1},_config:{state:!0},_spaces:{state:!0}},customElements.get("houseplan-card-editor")||customElements.define("houseplan-card-editor",m_);const v_={availability:"available",status:"neutral",activity:"none"};function b_(e){return e<=40?"low":e<180?"mid":"high"}function y_(e){return ai(e)}function w_(e){return"static_icon"===e.display?"neutral":"alarm"===e.visual.status?"alarm":"unavailable"===e.visual.availability?"unavailable":e.lockState?e.lockState:"working"===e.visual.status?"working":"open"===e.visual.status?"open":"neutral"}const k_={sourceKind:"none",decisionIds:["source.skipped_static_fast_path"],visualSources:[],criticalSources:[],samples:[]};function x_(e,t){const i=e?.entities?.[t],s=e?.states?.[t];return String(i?.name||i?.original_name||s?.attributes?.friendly_name||t)}function $_(e,t){const i=e?.states?.[t];if(!i)return"";if("function"==typeof e?.formatEntityState)try{const t=e.formatEntityState(i);if("string"==typeof t&&t)return t}catch{}return String(i.state??"")}function S_(e,t){if(t.virtual||"virtual"===t.bindingKind||"virtual"===t.marker?.binding)return"available";return(t.entities||[]).some(t=>{const i=String(e?.states?.[t]?.state??"").trim().toLowerCase();return""!==i&&"unknown"!==i&&"unavailable"!==i})?"available":"unavailable"}function M_(e,t,i,s){return{eid:t,role:i,name:x_(e,t),state:String(e?.states?.[t]?.state??""),stateText:$_(e,t),integrationDomain:e?.entities?.[t]?.platform||null,sample:s||cn(e,t)}}function C_(e,t,i=[t],s,n=e){const o=t.hidden&&t.userHidden?{...t,hidden:!1}:t;let a="none",r=[];const l=[],c=[...o.entities,...o.allEntities||[]].some(e=>e.startsWith("cover."))?{...o,tapAction:"cover"}:o,h=(d=Vp({hass:e,devices:i,device:c,lightSources:s,registryHass:n}),"cover"!==d?.semantics?null:d.targets[0]?.entityId||d.skippedTargets[0]?.entityId||null);var d;const p=ho(e,[o]),u=Zn(o.marker?.binding,o.marker?.controls??o.controls,o.entities),_=new Set(u.filter(e=>e.startsWith("marker:"))),m=!0===o.marker?.is_light||_.size>0?s||ho(e,i):p,g=m.filter(e=>e.device.id===o.id&&"controls"!==e.via),f=p.filter(e=>"controls"!==e.via),v=g.length?g:f,b=bn(o.marker),y=b?[...v]:[...p.filter(e=>"controls"===e.via),...v];if(_.size)for(const e of m){if(!_.has(e.key))continue;e.stateEids.length>0&&y.some(t=>t.stateEids.some(t=>e.stateEids.includes(t)))||y.some(t=>t.key===e.key)||y.push({...e,via:"controls",castsGlow:!1})}const w=Yn(n,o.entities),k=!!h&&("cover"===o.tapAction||o.primary?.startsWith("cover.")||w.some(e=>e.startsWith("cover.")));if(h&&!k&&l.push("source.cover_capability_bypassed"),k)a="cover",l.push("source.cover"),r=[M_(e,h,"cover")];else if(y.length)a=!b&&y.some(e=>"controls"===e.via)?"controls":"light",b?l.push("source.manual_virtual_light"):l.push("controls"===a?"source.controls":"source.owned_light"),"controls"!==a||!o.virtual&&"virtual"!==o.bindingKind||l.push("source.virtual_controller"),r=y.map(i=>{const s="controls"===i.via?"control":"forced"===i.via?"forced_light":"light";if(!i.passive)return M_(e,i.eid,s);const n=i.on?"on":"off";return{eid:i.key,role:s,name:t.name,state:n,stateText:n,integrationDomain:null,sample:{eid:i.key,state:n,availability:"available",status:i.on?"working":"neutral",activity:"none",edge:"none"}}});else{const t=Yn(n,o.entities),i=t.length?t:o.entities.filter(t=>!!e?.states?.[t]);if(i.length){a="device_role",l.push("source.device_role");const t=hn(n===e?e:{...n,states:e?.states||{}},i,o.entities),s=i.some(e=>an(n,e));r=t.map(t=>{const i=s?rn(n,t.eid)?"power_gate":an(n,t.eid)?"lifecycle":"device_role":"device_role";return M_(e,t.eid,i,t)})}else o.primary?(a="primary",l.push("source.primary_fallback"),r=[M_(e,o.primary,"primary")]):l.push("source.none")}u.length>0&&"controls"!==a&&"light"!==a&&"cover"!==a&&l.push("source.filtered_saved_controls");const x=[];for(const t of o.entities||[]){const i=cn(e,t);"alarm"!==i.status||r.some(e=>e.eid===t)||x.push(M_(e,t,"critical",i))}return x.length&&l.push("source.critical_sibling"),{sourceKind:a,decisionIds:l,visualSources:r,criticalSources:x,samples:[...r,...x].map(e=>e.sample)}}function D_(e,t,i,s){if(t.virtual)return{source:null,text:null,fallback:"value_virtual"};if(s){const i=function(e,t){if(!0!==t.marker?.use_climate_temp)return null;for(const i of t.entities){if(!i.startsWith("climate."))continue;const t=Number(e?.states?.[i]?.attributes?.current_temperature);if(Number.isFinite(t))return{eid:i,text:Math.round(10*t)/10+"°"}}return null}(e,t);if(i)return{source:{kind:"temperature",eid:i.eid,attribute:"current_temperature",text:i.text},text:i.text,fallback:null};const s=function(e,t){if("mdi:thermometer"!==t.icon&&"mdi:air-filter"!==t.icon)return null;for(const i of t.entities){if(!Gn(e,i))continue;const t=Number(e?.states?.[i]?.state);if(Number.isFinite(t))return{eid:i,text:Math.round(10*t)/10+"°"}}return null}(e,t);if(s)return{source:{kind:"temperature",eid:s.eid,text:s.text},text:s.text,fallback:null};const n=function(e,t){if(!t.primary||!fo(e,t.primary))return null;const i=Number(e?.states?.[t.primary]?.state);return Number.isFinite(i)?{eid:t.primary,text:`${Math.round(i)}%`}:null}(e,t);if(n)return{source:{kind:"humidity",eid:n.eid,text:n.text},text:n.text,fallback:null}}const n=i.visualSources.filter(e=>!e.eid.startsWith("marker:"));let o=n.map(e=>e.eid);const a=n.find(e=>"power_gate"===e.role);if(a&&(o=[a.eid]),!o.length&&i.visualSources.some(e=>e.eid.startsWith("marker:"))&&(o=Yn(e,t.entities),!o.length&&t.primary&&e?.states?.[t.primary]&&(o=[t.primary])),o=[...new Set(o)],1!==o.length)return{source:null,text:null,fallback:o.length?"value_ambiguous_sources":"value_no_state"};const r=o[0],l=function(e,t){const i=e?.states?.[t];if(!i||null==i.state||""===String(i.state).trim())return{text:"",fallback:"value_no_state"};const s=i.state;if(!["string","number","boolean"].includes(typeof s))return{text:"",fallback:"value_non_scalar"};const n=String(s).trim().toLowerCase();if("unknown"===n||"unavailable"===n)return{text:"",fallback:"value_no_state"};const o=Xi(e,t);return o?{text:Zi(o,String(i.attributes?.unit_of_measurement||"")),fallback:null}:{text:"",fallback:"value_no_state"}}(e,r);return l.fallback?{source:null,text:null,fallback:l.fallback}:{source:{kind:"entity",eid:r,text:l.text},text:l.text,fallback:null}}function P_(e,t,i){const s=e.marker?.binding||(e.bindingKind&&e.bindingRef?`${e.bindingKind}:${e.bindingRef}`:e.virtual?"virtual":""),n=[...t.visualSources.map(e=>`${e.role}:${e.eid}`),...t.criticalSources.map(e=>`critical:${e.eid}`)].sort(),o=i?`${i.kind}:${i.eid}:${i.attribute||""}`:"none";return[s,t.sourceKind,...n,`value:${o}`].join("\n")}function T_(e,t,i){return P_(t,i||C_(e,t),null).replace(/\nvalue:none$/,"")}function I_(e){if(e.effectiveHidden)return[];if("static_icon"===e.display)return["static-icon"];const t=[],{visual:i}=e;return"alarm"===e.pulse.kind?t.push("alarm"):"unavailable"===i.availability?t.push("unavail"):"working"===i.status?t.push("on"):"open"===i.status&&t.push("open"),e.lockState&&t.push(`lock-${e.lockState}`),"none"!==e.pulse.reason&&"alarm"!==e.pulse.reason&&t.push("activity-"+e.pulse.reason),e.pulse.generation%2==0&&(t.push("pulse-gen2"),"short"===e.pulse.kind&&t.push("activity-gen2")),t}function R_(e,t,i){const s=Bi(t.marker?.display),n="static_icon"===s,o=n&&!1===i.sourceDetails?k_:C_(e,t,i.lightDevices||[t],i.lightSources,i.registryHass||e),a=t.bindingStatus,r="ha_disabled"===a?.kind,l="orphaned"===a?.kind,c=r?"ha_disabled":l?"orphaned":"active",h=!0===t.userHidden||!0===t.marker?.hidden,d=dn(o.samples),p=o.visualSources.find(e=>e.eid.startsWith("lock.")),u=p?["unlocked","open"].includes(p.state.toLowerCase())?"unlocked":"locked"===p.state.toLowerCase()?"locked":null:null,_=!bn(t.marker)&&Zn(t.marker?.binding,t.marker?.controls??t.controls,t.entities).length>0,m="controls"===o.sourceKind||_&&"light"!==o.sourceKind&&"cover"!==o.sourceKind,g=n&&!1===i.sourceDetails?{source:null,text:null,fallback:null}:D_(e,t,o,i.showTemperature),f=P_(t,o,g.source),v=T_(e,t,o),b=i.activityRuntime,y=i.now??Date.now(),w=b?.expiresAt||(b?.flashTs?b.flashTs+3300:0),k=b?.sources===v&&b.flashTs&&b.flashKind&&w>y?b.flashKind:null,x=function(e){const t=[],i="ha_disabled"===e.bindingLifecycle||"orphaned"===e.bindingLifecycle;let s=!1;"ha_disabled"===e.bindingLifecycle?(s=!0,t.push("lifecycle.ha_disabled_hidden")):e.userHidden&&!e.designPreview?(s=!0,t.push("lifecycle.user_hidden")):e.userHidden?t.push("lifecycle.user_hidden_preview"):"orphaned"===e.bindingLifecycle?t.push("lifecycle.orphaned_diagnostic"):t.push("lifecycle.active");const n="static_icon"===e.display;let o=e.controllerFace?{...e.sourceVisual,availability:e.controllerAvailability}:e.sourceVisual;t.push(e.controllerFace?"available"===e.controllerAvailability?"availability.controller_available":"availability.controller_unavailable":"availability.source"),s?(o=v_,t.push("face.hidden")):n?(o=v_,t.push("face.static")):"alarm"===e.sourceVisual.status||e.liveStates?t.push("face.dynamic"):(o=v_,t.push("face.live_states_disabled")),!n&&!s&&e.liveStates&&"alarm"!==e.sourceVisual.status&&e.shortActivity&&(o={...o,activity:e.shortActivity},t.push(`activity.short_${e.shortActivity}`)),"alarm"===o.status?t.push("status.alarm"):"unavailable"===o.availability?t.push("status.unavailable"):"working"===o.status?t.push("status.working"):"open"===o.status?t.push("status.open"):t.push("status.neutral");const a="value"===e.display&&!s&&e.valueAvailable?"value":"icon";t.push("value"===a?"content.value":"value"===e.display?"content.value_fallback_icon":"content.icon"),"value"===e.display&&!e.valueAvailable&&e.valueFallback&&t.push(`content.${e.valueFallback}`);const r=e.liveStates&&!n&&!s,l=!n&&!s,c=!s&&!i&&!n&&"available"===o.availability&&("alarm"===o.status||e.liveStates&&"icon_ripple"===e.display),h=l&&e.vacuumLiveRequested;return t.push(r?"diagnostics.dynamic_icon":"diagnostics.base_icon"),t.push(l?"diagnostics.metrics_enabled":"diagnostics.metrics_suppressed"),t.push(c?"activity.pulse_eligible":"activity.pulse_suppressed"),t.push(h?"diagnostics.vacuum_live":"diagnostics.vacuum_static"),{effectiveHidden:s,bindingUnavailable:i,visual:o,face:a,dynamicIcon:r,metrics:l,liveColor:r,pulseEligible:c,vacuumLive:h,decisionIds:t}}({bindingLifecycle:c,userHidden:h,designPreview:!0===i.designPreview,display:s,liveStates:i.liveStates,sourceVisual:d,controllerFace:m,controllerAvailability:m?S_(e,t):"available",shortActivity:k,valueAvailable:null!=g.text,valueFallback:g.fallback,vacuumLiveRequested:!0===t.marker?.vacuum?.live}),{effectiveHidden:$,visual:S}=x,M="icon_ripple"===s&&!$&&i.liveStates&&"alarm"!==S.status?S.activity:"none",C=x.metrics&&i.showTemperature?!0===t.marker?.use_climate_temp?go(e,t.entities):"mdi:thermometer"===t.icon||"mdi:air-filter"===t.icon?mo(e,t.entities):null:null,D=x.metrics&&i.showTemperature&&t.primary&&fo(e,t.primary)?vo(e,t.entities):null,P=x.metrics&&i.showSignal&&!t.virtual?_o(e,t.entities):null,T=i.lightSources||("derived_marker_state"===t.marker?.value_badge?.source?.kind?ho(e,i.lightDevices||[t]):[]),I=function(e,t,i){const s=null!=t.marker?.value_badge;if(i.effectiveHidden||"static_icon"===i.display)return null;const n=t.marker?.value_badge;if(s)return n?.enabled?n.source?{configured:!0,enabled:!0,position:n.position||"right",...Ho(e,t,n.source,i.markerStates)}:{configured:!0,enabled:!0,source:null,sourceLabel:"",text:"—",fullText:e?.localize?.("state.default.unavailable")||"Unavailable",position:n.position||"right",availability:"missing",isLqi:!1,tone:"default"}:null;if(!i.showTemperature||"value"===i.display)return null;const o=Lo(e,t);if(!o)return null;let a=null,r="default";if("entity_attribute"===o.kind&&"current_temperature"===o.attribute){const i=go(e,t.entities);null!=i&&(a=`${i}°`),r="temperature"}else if("mdi:thermometer"===t.icon||"mdi:air-filter"===t.icon){const i=mo(e,t.entities);null!=i&&(a=`${i}°`),r="temperature"}else{const i=vo(e,t.entities);null!=i&&(a=`${i}%`),r="humidity"}return null==a?null:{configured:!1,enabled:!0,source:o,position:"right",sourceLabel:"entity_attribute"===o.kind?`${No(o.attribute)} · ${Fo(e,o.entity_id)}`:"entity_state"===o.kind?Fo(e,o.entity_id):"",text:a,fullText:a,availability:"available",isLqi:!1,tone:r}}(e,t,{showTemperature:i.showTemperature,showSignal:i.showSignal,display:s,effectiveHidden:$,markerStates:T.filter(e=>e.key.startsWith("marker:")).map(e=>({ref:e.key,on:e.on,name:e.device.name}))}),R=o.visualSources.find(e=>!e.eid.startsWith("marker:")),A="cover"===o.sourceKind?R?.eid:t.primary||R?.eid,z=A?e?.states?.[A]:null,F=x.dynamicIcon?vs(t.icon,A?.split(".")[0],z?.attributes?.device_class,z?.state,!!t.marker?.icon):t.icon,N=x.liveColor&&o.visualSources.filter(e=>!e.eid.startsWith("marker:")).map(t=>function(e){return e&&"on"===e.state?ze(e.attributes?.rgb_color):null}(e?.states?.[t.eid])).find(e=>!!e)||null,E=Number(t.marker?.size)>0?Number(t.marker.size):1,O=Number(t.marker?.angle)||0,H=Number(t.marker?.ripple_size)>0?Number(t.marker.ripple_size):1.5,L=Ie(t.marker?.ripple_color,null),B=n?null:L||N||null,j=function(e){const{display:t,visual:i,semanticActivity:s,liveStates:n,effectiveHidden:o,bindingUnavailable:a=!1,reducedMotion:r=!1}=e,l=Math.max(1,Math.trunc(e.shortGeneration||1)),c=Number.isFinite(e.diameterScale)?Math.max(1,Number(e.diameterScale)):1.5,h=e.color||function(e,t){return"presence"===t?"#1DC21D":"running"===t||"working"===e.status||"open"===e.status?"#F0A00C":"#0C82F0"}(i,s);if(o||a||"unavailable"===i.availability||"static_icon"===t)return Yo(l,h,c);if("alarm"===i.status)return{kind:"alarm",reason:"alarm",generation:l,expiresAt:null,color:"#F0410C",diameterScale:1.5,animated:!r,reducedMotionIndicator:"none"};if(!n||"icon_ripple"!==t)return Yo(l,h,c);const d=e.now??Date.now(),p=e.shortExpiresAt||null;return e.shortReason&&null!=p&&p>d?{kind:"short",reason:e.shortReason,generation:l,expiresAt:p,color:h,diameterScale:r?1:c,animated:!r,reducedMotionIndicator:r?"dot":"none"}:"presence"===s||"transition"===s||"running"===s?{kind:"continuous",reason:s,generation:l,expiresAt:null,color:h,diameterScale:r?1:c,animated:!r,reducedMotionIndicator:r?"dot":"none"}:Yo(l,h,c)}({display:s,visual:S,semanticActivity:d.activity,shortReason:b?.sources===v?b?.flashKind:null,shortGeneration:b?.gen,shortExpiresAt:b?.sources===v?w:null,now:y,liveStates:i.liveStates,effectiveHidden:$,bindingUnavailable:x.bindingUnavailable,reducedMotion:i.reducedMotion,color:B,diameterScale:H}),q="value"===x.face?g.text:null,W="ha_disabled"===a?.kind?a.reason:null,U="ha_disabled"===(G={lifecycle:c,display:s,liveStates:i.liveStates,sourceKind:o.sourceKind,primaryDomain:(t.primary||"").split(".")[0],visual:S,activity:M}).lifecycle?"ha_disabled":"orphaned"===G.lifecycle?"orphaned":"static_icon"===G.display?"static_icon":"alarm"===G.visual.status?"alarm":G.liveStates?"unavailable"===G.visual.availability?"unavailable":"cover"===G.sourceKind?"cover_icon_state":"presence"===G.activity?"presence":"event"===G.activity?"event":"transition"===G.activity?"transition":"working"===G.visual.status?"icon_ripple"===G.display&&"none"!==G.activity?"working_activity":"working":"open"===G.visual.status?"open":"media_player"===G.primaryDomain?"media_neutral":"neutral":"live_states_disabled";var G;const V=[];i.designPreview&&h&&V.push("hidden_design_preview"),n||!0!==t.marker?.vacuum?.live||V.push("vacuum_live_plan_only");const K=o.visualSources.some(t=>"power_gate"===t.role||rn(e,t.eid)),Y=t.entities.filter(t=>t.startsWith("switch.")&&!e?.entities?.[t]?.entity_category).length;K&&Y>1&&V.push("composite_power_source"),"icon_ripple"!==s&&"static_icon"!==s&&"alarm"!==d.status&&"none"!==d.activity&&V.push("activity_display_disabled");const J={binding:t.marker?.binding||(t.bindingKind&&t.bindingRef?`${t.bindingKind}:${t.bindingRef}`:t.virtual?"virtual":""),sourceKind:o.sourceKind,visualSources:o.visualSources,criticalSources:o.criticalSources,valueSource:g.source,sourceSignature:f,decisionIds:[...o.decisionIds,...x.decisionIds,...I?["diagnostics.value_badge"]:[],...null==P?[]:[`diagnostics.lqi_${b_(P)}`],`pulse.${j.kind}_${j.reason}`],visual:S,lockState:u,display:s,icon:F,valueText:q,valueFullText:q,fallbackReason:"value"!==s||q?null:g.fallback,activity:M,activityGeneration:b?.gen||1,pulse:j,classes:[],tempText:null==C?null:String(C),humText:null==D?null:String(D),valueBadge:I,lqiText:null==P||I?.isLqi?null:String(P),lqiColor:null==P?null:y_(P),lqiBand:null==P?null:b_(P),lightColor:N,scale:E,angle:O,rippleScale:H,rippleColor:B,userHidden:h,effectiveHidden:$,haDisabled:r,disabledReason:W,orphaned:l,vacuumLive:x.vacuumLive,explanation:{reason:U,notices:V}};return{...J,classes:I_(J)}}function A_(e,t=new WeakMap){if(null===e||"object"!=typeof e)return e;const i=e,s=t.get(i);if(s)return s;if(Array.isArray(e)){const s=[];t.set(i,s);for(const i of e)s.push(A_(i,t));return Object.freeze(s)}const n={};t.set(i,n);for(const[i,s]of Object.entries(e))"function"!=typeof s&&(n[i]=A_(s,t));return Object.freeze(n)}function z_(e){const t=new Map(e);let i;return i=Object.freeze({get size(){return t.size},get:e=>t.get(e),has:e=>t.has(e),entries:()=>t.entries(),keys:()=>t.keys(),values:()=>t.values(),forEach:(e,s)=>t.forEach((t,n)=>e.call(s,t,n,i)),[Symbol.iterator]:()=>t[Symbol.iterator]()}),i}function F_(e){const t=new Set(e.entityIds||[]),i=new Set(e.deviceIds||[]),s=new Set(e.areaIds||[]);for(const s of e.devices){for(const e of s.entities||[])t.add(e);s.primary&&t.add(s.primary);for(const e of s.controls||[])t.add(e);s.marker?.vacuum?.source&&t.add(s.marker.vacuum.source),"device"===s.bindingKind&&s.bindingRef&&i.add(s.bindingRef),"entity"===s.bindingKind&&s.bindingRef&&t.add(s.bindingRef)}const n={},o={};for(const[o,a]of Object.entries(e.hass?.entities||{})){const r=a?.device_id?e.hass?.devices?.[a.device_id]:null;(t.has(o)||a?.device_id&&i.has(a.device_id)||s.has(a?.area_id)||s.has(r?.area_id))&&(t.add(o),n[o]=a,a?.device_id&&i.add(a.device_id))}for(const t of i){const i=e.hass?.devices?.[t];i&&(o[t]=i)}const a={};for(const i of t){const t=e.hass?.states?.[i];t&&(a[i]=t)}const r=Object.freeze({states:A_(a),entities:A_(n),devices:A_(o),config:A_(e.hass?.config),locale:A_(e.hass?.locale),themes:A_(e.hass?.themes)});return Object.freeze({sourceSequence:e.sourceSequence,capturedAt:e.capturedAt??Date.now(),hass:r,devices:A_([...e.devices]),positions:z_([...e.positions||[]].map(([e,t])=>[e,Object.freeze({x:t.x,y:t.y})])),presentations:z_([...e.presentations].map(([e,t])=>[e,A_(t)])),facts:z_([...e.facts||[]].map(([e,t])=>[e,A_(t)]))})}const N_=(e,t)=>`${e}:${t?1:0}`;function E_(e){return!Number.isFinite(e)||e<=0?2.25:e/2.5*2.25}function O_({openings:e,geometries:t,fillsByRoomId:i,idPrefix:s="data",groupClass:n="opening-tunnels",dataLayer:o="data"}){const a=e.map((e,n)=>{const o=t[n];if(!o)return G;const a=o.faces.find(e=>-1===e.side),r=o.faces.find(e=>1===e.side);if(!a||!r)return G;const l=i.get(a.roomId)||null,c=i.get(r.roomId)||null;if(!l&&!c)return G;const h=`${a.d} ${r.d}`,d=!!l&&!!c&&l.color===c.color&&l.opacity===c.opacity,p=`translate(${e.rx} ${e.ry}) rotate(${e.angle})`;if(d)return W``}g_.properties={hass:{attribute:!1},_config:{state:!0},_spaces:{state:!0}},customElements.get("houseplan-card-editor")||customElements.define("houseplan-card-editor",g_);const b_={availability:"available",status:"neutral",activity:"none"};function y_(e){return e<=40?"low":e<180?"mid":"high"}function w_(e){return ai(e)}function k_(e){return"static_icon"===e.display?"neutral":"alarm"===e.visual.status?"alarm":"unavailable"===e.visual.availability?"unavailable":e.lockState?e.lockState:"working"===e.visual.status?"working":"open"===e.visual.status?"open":"neutral"}const x_={sourceKind:"none",decisionIds:["source.skipped_static_fast_path"],visualSources:[],criticalSources:[],samples:[]};function $_(e,t){const i=e?.entities?.[t],s=e?.states?.[t];return String(i?.name||i?.original_name||s?.attributes?.friendly_name||t)}function S_(e,t){const i=e?.states?.[t];if(!i)return"";if("function"==typeof e?.formatEntityState)try{const t=e.formatEntityState(i);if("string"==typeof t&&t)return t}catch{}return String(i.state??"")}function M_(e,t){if(t.virtual||"virtual"===t.bindingKind||"virtual"===t.marker?.binding)return"available";return(t.entities||[]).some(t=>{const i=String(e?.states?.[t]?.state??"").trim().toLowerCase();return""!==i&&"unknown"!==i&&"unavailable"!==i})?"available":"unavailable"}function C_(e,t,i,s){return{eid:t,role:i,name:$_(e,t),state:String(e?.states?.[t]?.state??""),stateText:S_(e,t),integrationDomain:e?.entities?.[t]?.platform||null,sample:s||cn(e,t)}}function D_(e,t,i=[t],s,n=e){const o=t.hidden&&t.userHidden?{...t,hidden:!1}:t;let a="none",r=[];const l=[],c=[...o.entities,...o.allEntities||[]].some(e=>e.startsWith("cover."))?{...o,tapAction:"cover"}:o,h=(d=Kp({hass:e,devices:i,device:c,lightSources:s,registryHass:n}),"cover"!==d?.semantics?null:d.targets[0]?.entityId||d.skippedTargets[0]?.entityId||null);var d;const p=ho(e,[o]),u=Zn(o.marker?.binding,o.marker?.controls??o.controls,o.entities),_=new Set(u.filter(e=>e.startsWith("marker:"))),m=!0===o.marker?.is_light||_.size>0?s||ho(e,i):p,g=m.filter(e=>e.device.id===o.id&&"controls"!==e.via),f=p.filter(e=>"controls"!==e.via),v=g.length?g:f,b=bn(o.marker),y=b?[...v]:[...p.filter(e=>"controls"===e.via),...v];if(_.size)for(const e of m){if(!_.has(e.key))continue;e.stateEids.length>0&&y.some(t=>t.stateEids.some(t=>e.stateEids.includes(t)))||y.some(t=>t.key===e.key)||y.push({...e,via:"controls",castsGlow:!1})}const w=Yn(n,o.entities),k=!!h&&("cover"===o.tapAction||o.primary?.startsWith("cover.")||w.some(e=>e.startsWith("cover.")));if(h&&!k&&l.push("source.cover_capability_bypassed"),k)a="cover",l.push("source.cover"),r=[C_(e,h,"cover")];else if(y.length)a=!b&&y.some(e=>"controls"===e.via)?"controls":"light",b?l.push("source.manual_virtual_light"):l.push("controls"===a?"source.controls":"source.owned_light"),"controls"!==a||!o.virtual&&"virtual"!==o.bindingKind||l.push("source.virtual_controller"),r=y.map(i=>{const s="controls"===i.via?"control":"forced"===i.via?"forced_light":"light";if(!i.passive)return C_(e,i.eid,s);const n=i.on?"on":"off";return{eid:i.key,role:s,name:t.name,state:n,stateText:n,integrationDomain:null,sample:{eid:i.key,state:n,availability:"available",status:i.on?"working":"neutral",activity:"none",edge:"none"}}});else{const t=Yn(n,o.entities),i=t.length?t:o.entities.filter(t=>!!e?.states?.[t]);if(i.length){a="device_role",l.push("source.device_role");const t=hn(n===e?e:{...n,states:e?.states||{}},i,o.entities),s=i.some(e=>an(n,e));r=t.map(t=>{const i=s?rn(n,t.eid)?"power_gate":an(n,t.eid)?"lifecycle":"device_role":"device_role";return C_(e,t.eid,i,t)})}else o.primary?(a="primary",l.push("source.primary_fallback"),r=[C_(e,o.primary,"primary")]):l.push("source.none")}u.length>0&&"controls"!==a&&"light"!==a&&"cover"!==a&&l.push("source.filtered_saved_controls");const x=[];for(const t of o.entities||[]){const i=cn(e,t);"alarm"!==i.status||r.some(e=>e.eid===t)||x.push(C_(e,t,"critical",i))}return x.length&&l.push("source.critical_sibling"),{sourceKind:a,decisionIds:l,visualSources:r,criticalSources:x,samples:[...r,...x].map(e=>e.sample)}}function P_(e,t,i,s){if(t.virtual)return{source:null,text:null,fallback:"value_virtual"};if(s){const i=function(e,t){if(!0!==t.marker?.use_climate_temp)return null;for(const i of t.entities){if(!i.startsWith("climate."))continue;const t=Number(e?.states?.[i]?.attributes?.current_temperature);if(Number.isFinite(t))return{eid:i,text:Math.round(10*t)/10+"°"}}return null}(e,t);if(i)return{source:{kind:"temperature",eid:i.eid,attribute:"current_temperature",text:i.text},text:i.text,fallback:null};const s=function(e,t){if("mdi:thermometer"!==t.icon&&"mdi:air-filter"!==t.icon)return null;for(const i of t.entities){if(!Gn(e,i))continue;const t=Number(e?.states?.[i]?.state);if(Number.isFinite(t))return{eid:i,text:Math.round(10*t)/10+"°"}}return null}(e,t);if(s)return{source:{kind:"temperature",eid:s.eid,text:s.text},text:s.text,fallback:null};const n=function(e,t){if(!t.primary||!fo(e,t.primary))return null;const i=Number(e?.states?.[t.primary]?.state);return Number.isFinite(i)?{eid:t.primary,text:`${Math.round(i)}%`}:null}(e,t);if(n)return{source:{kind:"humidity",eid:n.eid,text:n.text},text:n.text,fallback:null}}const n=i.visualSources.filter(e=>!e.eid.startsWith("marker:"));let o=n.map(e=>e.eid);const a=n.find(e=>"power_gate"===e.role);if(a&&(o=[a.eid]),!o.length&&i.visualSources.some(e=>e.eid.startsWith("marker:"))&&(o=Yn(e,t.entities),!o.length&&t.primary&&e?.states?.[t.primary]&&(o=[t.primary])),o=[...new Set(o)],1!==o.length)return{source:null,text:null,fallback:o.length?"value_ambiguous_sources":"value_no_state"};const r=o[0],l=function(e,t){const i=e?.states?.[t];if(!i||null==i.state||""===String(i.state).trim())return{text:"",fallback:"value_no_state"};const s=i.state;if(!["string","number","boolean"].includes(typeof s))return{text:"",fallback:"value_non_scalar"};const n=String(s).trim().toLowerCase();if("unknown"===n||"unavailable"===n)return{text:"",fallback:"value_no_state"};const o=Xi(e,t);return o?{text:Zi(o,String(i.attributes?.unit_of_measurement||"")),fallback:null}:{text:"",fallback:"value_no_state"}}(e,r);return l.fallback?{source:null,text:null,fallback:l.fallback}:{source:{kind:"entity",eid:r,text:l.text},text:l.text,fallback:null}}function T_(e,t,i){const s=e.marker?.binding||(e.bindingKind&&e.bindingRef?`${e.bindingKind}:${e.bindingRef}`:e.virtual?"virtual":""),n=[...t.visualSources.map(e=>`${e.role}:${e.eid}`),...t.criticalSources.map(e=>`critical:${e.eid}`)].sort(),o=i?`${i.kind}:${i.eid}:${i.attribute||""}`:"none";return[s,t.sourceKind,...n,`value:${o}`].join("\n")}function I_(e,t,i){return T_(t,i||D_(e,t),null).replace(/\nvalue:none$/,"")}function R_(e){if(e.effectiveHidden)return[];if("static_icon"===e.display)return["static-icon"];const t=[],{visual:i}=e;return"alarm"===e.pulse.kind?t.push("alarm"):"unavailable"===i.availability?t.push("unavail"):"working"===i.status?t.push("on"):"open"===i.status&&t.push("open"),e.lockState&&t.push(`lock-${e.lockState}`),"none"!==e.pulse.reason&&"alarm"!==e.pulse.reason&&t.push("activity-"+e.pulse.reason),e.pulse.generation%2==0&&(t.push("pulse-gen2"),"short"===e.pulse.kind&&t.push("activity-gen2")),t}function A_(e,t,i){const s=Bi(t.marker?.display),n="static_icon"===s,o=n&&!1===i.sourceDetails?x_:D_(e,t,i.lightDevices||[t],i.lightSources,i.registryHass||e),a=t.bindingStatus,r="ha_disabled"===a?.kind,l="orphaned"===a?.kind,c=r?"ha_disabled":l?"orphaned":"active",h=!0===t.userHidden||!0===t.marker?.hidden,d=dn(o.samples),p=o.visualSources.find(e=>e.eid.startsWith("lock.")),u=p?["unlocked","open"].includes(p.state.toLowerCase())?"unlocked":"locked"===p.state.toLowerCase()?"locked":null:null,_=!bn(t.marker)&&Zn(t.marker?.binding,t.marker?.controls??t.controls,t.entities).length>0,m="controls"===o.sourceKind||_&&"light"!==o.sourceKind&&"cover"!==o.sourceKind,g=n&&!1===i.sourceDetails?{source:null,text:null,fallback:null}:P_(e,t,o,i.showTemperature),f=T_(t,o,g.source),v=I_(e,t,o),b=i.activityRuntime,y=i.now??Date.now(),w=b?.expiresAt||(b?.flashTs?b.flashTs+3300:0),k=b?.sources===v&&b.flashTs&&b.flashKind&&w>y?b.flashKind:null,x=function(e){const t=[],i="ha_disabled"===e.bindingLifecycle||"orphaned"===e.bindingLifecycle;let s=!1;"ha_disabled"===e.bindingLifecycle?(s=!0,t.push("lifecycle.ha_disabled_hidden")):e.userHidden&&!e.designPreview?(s=!0,t.push("lifecycle.user_hidden")):e.userHidden?t.push("lifecycle.user_hidden_preview"):"orphaned"===e.bindingLifecycle?t.push("lifecycle.orphaned_diagnostic"):t.push("lifecycle.active");const n="static_icon"===e.display;let o=e.controllerFace?{...e.sourceVisual,availability:e.controllerAvailability}:e.sourceVisual;t.push(e.controllerFace?"available"===e.controllerAvailability?"availability.controller_available":"availability.controller_unavailable":"availability.source"),s?(o=b_,t.push("face.hidden")):n?(o=b_,t.push("face.static")):"alarm"===e.sourceVisual.status||e.liveStates?t.push("face.dynamic"):(o=b_,t.push("face.live_states_disabled")),!n&&!s&&e.liveStates&&"alarm"!==e.sourceVisual.status&&e.shortActivity&&(o={...o,activity:e.shortActivity},t.push(`activity.short_${e.shortActivity}`)),"alarm"===o.status?t.push("status.alarm"):"unavailable"===o.availability?t.push("status.unavailable"):"working"===o.status?t.push("status.working"):"open"===o.status?t.push("status.open"):t.push("status.neutral");const a="value"===e.display&&!s&&e.valueAvailable?"value":"icon";t.push("value"===a?"content.value":"value"===e.display?"content.value_fallback_icon":"content.icon"),"value"===e.display&&!e.valueAvailable&&e.valueFallback&&t.push(`content.${e.valueFallback}`);const r=e.liveStates&&!n&&!s,l=!n&&!s,c=!s&&!i&&!n&&"available"===o.availability&&("alarm"===o.status||e.liveStates&&"icon_ripple"===e.display),h=l&&e.vacuumLiveRequested;return t.push(r?"diagnostics.dynamic_icon":"diagnostics.base_icon"),t.push(l?"diagnostics.metrics_enabled":"diagnostics.metrics_suppressed"),t.push(c?"activity.pulse_eligible":"activity.pulse_suppressed"),t.push(h?"diagnostics.vacuum_live":"diagnostics.vacuum_static"),{effectiveHidden:s,bindingUnavailable:i,visual:o,face:a,dynamicIcon:r,metrics:l,liveColor:r,pulseEligible:c,vacuumLive:h,decisionIds:t}}({bindingLifecycle:c,userHidden:h,designPreview:!0===i.designPreview,display:s,liveStates:i.liveStates,sourceVisual:d,controllerFace:m,controllerAvailability:m?M_(e,t):"available",shortActivity:k,valueAvailable:null!=g.text,valueFallback:g.fallback,vacuumLiveRequested:!0===t.marker?.vacuum?.live}),{effectiveHidden:$,visual:S}=x,M="icon_ripple"===s&&!$&&i.liveStates&&"alarm"!==S.status?S.activity:"none",C=x.metrics&&i.showTemperature?!0===t.marker?.use_climate_temp?go(e,t.entities):"mdi:thermometer"===t.icon||"mdi:air-filter"===t.icon?mo(e,t.entities):null:null,D=x.metrics&&i.showTemperature&&t.primary&&fo(e,t.primary)?vo(e,t.entities):null,P=x.metrics&&i.showSignal&&!t.virtual?_o(e,t.entities):null,T=i.lightSources||("derived_marker_state"===t.marker?.value_badge?.source?.kind?ho(e,i.lightDevices||[t]):[]),I=function(e,t,i){const s=null!=t.marker?.value_badge;if(i.effectiveHidden||"static_icon"===i.display)return null;const n=t.marker?.value_badge;if(s)return n?.enabled?n.source?{configured:!0,enabled:!0,position:n.position||"right",...Ho(e,t,n.source,i.markerStates)}:{configured:!0,enabled:!0,source:null,sourceLabel:"",text:"—",fullText:e?.localize?.("state.default.unavailable")||"Unavailable",position:n.position||"right",availability:"missing",isLqi:!1,tone:"default"}:null;if(!i.showTemperature||"value"===i.display)return null;const o=Lo(e,t);if(!o)return null;let a=null,r="default";if("entity_attribute"===o.kind&&"current_temperature"===o.attribute){const i=go(e,t.entities);null!=i&&(a=`${i}°`),r="temperature"}else if("mdi:thermometer"===t.icon||"mdi:air-filter"===t.icon){const i=mo(e,t.entities);null!=i&&(a=`${i}°`),r="temperature"}else{const i=vo(e,t.entities);null!=i&&(a=`${i}%`),r="humidity"}return null==a?null:{configured:!1,enabled:!0,source:o,position:"right",sourceLabel:"entity_attribute"===o.kind?`${No(o.attribute)} · ${Fo(e,o.entity_id)}`:"entity_state"===o.kind?Fo(e,o.entity_id):"",text:a,fullText:a,availability:"available",isLqi:!1,tone:r}}(e,t,{showTemperature:i.showTemperature,showSignal:i.showSignal,display:s,effectiveHidden:$,markerStates:T.filter(e=>e.key.startsWith("marker:")).map(e=>({ref:e.key,on:e.on,name:e.device.name}))}),R=o.visualSources.find(e=>!e.eid.startsWith("marker:")),A="cover"===o.sourceKind?R?.eid:t.primary||R?.eid,z=A?e?.states?.[A]:null,F=x.dynamicIcon?vs(t.icon,A?.split(".")[0],z?.attributes?.device_class,z?.state,!!t.marker?.icon):t.icon,N=x.liveColor&&o.visualSources.filter(e=>!e.eid.startsWith("marker:")).map(t=>function(e){return e&&"on"===e.state?ze(e.attributes?.rgb_color):null}(e?.states?.[t.eid])).find(e=>!!e)||null,E=Number(t.marker?.size)>0?Number(t.marker.size):1,O=Number(t.marker?.angle)||0,H=Number(t.marker?.ripple_size)>0?Number(t.marker.ripple_size):1.5,L=Ie(t.marker?.ripple_color,null),B=n?null:L||N||null,j=function(e){const{display:t,visual:i,semanticActivity:s,liveStates:n,effectiveHidden:o,bindingUnavailable:a=!1,reducedMotion:r=!1}=e,l=Math.max(1,Math.trunc(e.shortGeneration||1)),c=Number.isFinite(e.diameterScale)?Math.max(1,Number(e.diameterScale)):1.5,h=e.color||function(e,t){return"presence"===t?"#1DC21D":"running"===t||"working"===e.status||"open"===e.status?"#F0A00C":"#0C82F0"}(i,s);if(o||a||"unavailable"===i.availability||"static_icon"===t)return Yo(l,h,c);if("alarm"===i.status)return{kind:"alarm",reason:"alarm",generation:l,expiresAt:null,color:"#F0410C",diameterScale:1.5,animated:!r,reducedMotionIndicator:"none"};if(!n||"icon_ripple"!==t)return Yo(l,h,c);const d=e.now??Date.now(),p=e.shortExpiresAt||null;return e.shortReason&&null!=p&&p>d?{kind:"short",reason:e.shortReason,generation:l,expiresAt:p,color:h,diameterScale:r?1:c,animated:!r,reducedMotionIndicator:r?"dot":"none"}:"presence"===s||"transition"===s||"running"===s?{kind:"continuous",reason:s,generation:l,expiresAt:null,color:h,diameterScale:r?1:c,animated:!r,reducedMotionIndicator:r?"dot":"none"}:Yo(l,h,c)}({display:s,visual:S,semanticActivity:d.activity,shortReason:b?.sources===v?b?.flashKind:null,shortGeneration:b?.gen,shortExpiresAt:b?.sources===v?w:null,now:y,liveStates:i.liveStates,effectiveHidden:$,bindingUnavailable:x.bindingUnavailable,reducedMotion:i.reducedMotion,color:B,diameterScale:H}),q="value"===x.face?g.text:null,W="ha_disabled"===a?.kind?a.reason:null,U="ha_disabled"===(G={lifecycle:c,display:s,liveStates:i.liveStates,sourceKind:o.sourceKind,primaryDomain:(t.primary||"").split(".")[0],visual:S,activity:M}).lifecycle?"ha_disabled":"orphaned"===G.lifecycle?"orphaned":"static_icon"===G.display?"static_icon":"alarm"===G.visual.status?"alarm":G.liveStates?"unavailable"===G.visual.availability?"unavailable":"cover"===G.sourceKind?"cover_icon_state":"presence"===G.activity?"presence":"event"===G.activity?"event":"transition"===G.activity?"transition":"working"===G.visual.status?"icon_ripple"===G.display&&"none"!==G.activity?"working_activity":"working":"open"===G.visual.status?"open":"media_player"===G.primaryDomain?"media_neutral":"neutral":"live_states_disabled";var G;const V=[];i.designPreview&&h&&V.push("hidden_design_preview"),n||!0!==t.marker?.vacuum?.live||V.push("vacuum_live_plan_only");const K=o.visualSources.some(t=>"power_gate"===t.role||rn(e,t.eid)),Y=t.entities.filter(t=>t.startsWith("switch.")&&!e?.entities?.[t]?.entity_category).length;K&&Y>1&&V.push("composite_power_source"),"icon_ripple"!==s&&"static_icon"!==s&&"alarm"!==d.status&&"none"!==d.activity&&V.push("activity_display_disabled");const J={binding:t.marker?.binding||(t.bindingKind&&t.bindingRef?`${t.bindingKind}:${t.bindingRef}`:t.virtual?"virtual":""),sourceKind:o.sourceKind,visualSources:o.visualSources,criticalSources:o.criticalSources,valueSource:g.source,sourceSignature:f,decisionIds:[...o.decisionIds,...x.decisionIds,...I?["diagnostics.value_badge"]:[],...null==P?[]:[`diagnostics.lqi_${y_(P)}`],`pulse.${j.kind}_${j.reason}`],visual:S,lockState:u,display:s,icon:F,valueText:q,valueFullText:q,fallbackReason:"value"!==s||q?null:g.fallback,activity:M,activityGeneration:b?.gen||1,pulse:j,classes:[],tempText:null==C?null:String(C),humText:null==D?null:String(D),valueBadge:I,lqiText:null==P||I?.isLqi?null:String(P),lqiColor:null==P?null:w_(P),lqiBand:null==P?null:y_(P),lightColor:N,scale:E,angle:O,rippleScale:H,rippleColor:B,userHidden:h,effectiveHidden:$,haDisabled:r,disabledReason:W,orphaned:l,vacuumLive:x.vacuumLive,explanation:{reason:U,notices:V}};return{...J,classes:R_(J)}}function z_(e,t=new WeakMap){if(null===e||"object"!=typeof e)return e;const i=e,s=t.get(i);if(s)return s;if(Array.isArray(e)){const s=[];t.set(i,s);for(const i of e)s.push(z_(i,t));return Object.freeze(s)}const n={};t.set(i,n);for(const[i,s]of Object.entries(e))"function"!=typeof s&&(n[i]=z_(s,t));return Object.freeze(n)}function F_(e){const t=new Map(e);let i;return i=Object.freeze({get size(){return t.size},get:e=>t.get(e),has:e=>t.has(e),entries:()=>t.entries(),keys:()=>t.keys(),values:()=>t.values(),forEach:(e,s)=>t.forEach((t,n)=>e.call(s,t,n,i)),[Symbol.iterator]:()=>t[Symbol.iterator]()}),i}function N_(e){const t=new Set(e.entityIds||[]),i=new Set(e.deviceIds||[]),s=new Set(e.areaIds||[]);for(const s of e.devices){for(const e of s.entities||[])t.add(e);s.primary&&t.add(s.primary);for(const e of s.controls||[])t.add(e);s.marker?.vacuum?.source&&t.add(s.marker.vacuum.source),"device"===s.bindingKind&&s.bindingRef&&i.add(s.bindingRef),"entity"===s.bindingKind&&s.bindingRef&&t.add(s.bindingRef)}const n={},o={};for(const[o,a]of Object.entries(e.hass?.entities||{})){const r=a?.device_id?e.hass?.devices?.[a.device_id]:null;(t.has(o)||a?.device_id&&i.has(a.device_id)||s.has(a?.area_id)||s.has(r?.area_id))&&(t.add(o),n[o]=a,a?.device_id&&i.add(a.device_id))}for(const t of i){const i=e.hass?.devices?.[t];i&&(o[t]=i)}const a={};for(const i of t){const t=e.hass?.states?.[i];t&&(a[i]=t)}const r=Object.freeze({states:z_(a),entities:z_(n),devices:z_(o),config:z_(e.hass?.config),locale:z_(e.hass?.locale),themes:z_(e.hass?.themes)});return Object.freeze({sourceSequence:e.sourceSequence,capturedAt:e.capturedAt??Date.now(),hass:r,devices:z_([...e.devices]),positions:F_([...e.positions||[]].map(([e,t])=>[e,Object.freeze({x:t.x,y:t.y})])),presentations:F_([...e.presentations].map(([e,t])=>[e,z_(t)])),facts:F_([...e.facts||[]].map(([e,t])=>[e,z_(t)]))})}const E_=(e,t)=>`${e}:${t?1:0}`;function O_(e){return!Number.isFinite(e)||e<=0?2.25:e/2.5*2.25}function H_({openings:e,geometries:t,fillsByRoomId:i,idPrefix:s="data",groupClass:n="opening-tunnels",dataLayer:o="data"}){const a=e.map((e,n)=>{const o=t[n];if(!o)return G;const a=o.faces.find(e=>-1===e.side),r=o.faces.find(e=>1===e.side);if(!a||!r)return G;const l=i.get(a.roomId)||null,c=i.get(r.roomId)||null;if(!l&&!c)return G;const h=`${a.d} ${r.d}`,d=!!l&&!!c&&l.color===c.color&&l.opacity===c.opacity,p=`translate(${e.rx} ${e.ry}) rotate(${e.angle})`;if(d)return W``;const u=o.maxY-o.minY;if(!(u>0))return G;const _=`${(100*Math.max(0,Math.min(1,-o.minY/u))).toFixed(6)}%`,m=l||{color:"#000000",opacity:0},g=c||{color:"#000000",opacity:0},f=`hp-opening-tunnel-${s.replace(/[^a-zA-Z0-9_-]/g,"-")}-${n}`;return W` - `});return W``}const H_=e=>Array.isArray(e)&&e.length>=2&&Number.isFinite(Number(e[0]))&&Number.isFinite(Number(e[1])),L_=(e,t,i)=>[Number(e[0])*i,Number(e[1])*i,Number(t[0])*i,Number(t[1])*i],B_=e=>{const t=`${Number(e[0]).toFixed(9)},${Number(e[1]).toFixed(9)}`,i=`${Number(e[2]).toFixed(9)},${Number(e[3]).toFixed(9)}`;return t<=i?`${t}|${i}`:`${i}|${t}`},j_=e=>{const t=new Map;for(const i of e.flat())!Array.isArray(i)||i.length<4||!i.every(Number.isFinite)||Math.hypot(i[2]-i[0],i[3]-i[1])<=1e-9||t.set(B_(i),[...i]);return[...t.values()]};function q_(e){return"solid"===e?.zero_wall_style?"solid":"dashed"}function W_(e,t=1,i){const s=[];for(const n of Array.isArray(e?.wall_segments)?e.wall_segments:[])0===Number(n?.cm)&&H_(n?.a)&&H_(n?.b)&&(i&&!i.has(String(n.id||""))||s.push(L_(n.a,n.b,t)));return j_([s])}function U_(e,t=1){const i=[];for(const s of Array.isArray(e?.partitions)?e.partitions:[])0===Number(s?.cm)&&H_(s?.a)&&H_(s?.b)&&i.push(L_(s.a,s.b,t));for(const s of Array.isArray(e?.room_drafts)?e.room_drafts:[]){const e=Array.isArray(s?.points)?s.points:[];for(let n=0;n+1e?.host?.kind===t.kind&&e.host.id===t.id)}const Y_=new WeakMap,J_=new WeakMap;function X_(e){const t=Eh(e.cfg),i={};for(const t of e.cfg.spaces||[])for(const e of t.rooms||[])e.area&&(i[e.area]=t.id);const s=e.cfg.settings?.exclude_integrations?new Set(e.cfg.settings.exclude_integrations):Ye,n=Xe(e.cfg.settings?.icon_rules?.length?e.cfg.settings.icon_rules:Je);return So({hass:e.hass,registry:e.registry,areaToSpace:i,markers:e.cfg.markers||[],settings:e.cfg.settings||{},excluded:s,showAll:!!e.cfg.settings?.show_all,firstSpaceId:t[0]?.id||"",loc:t=>ua(e.lang,t),iconRules:n})}function Z_(e){const t=Eh(e.cfg).find(t=>t.id===e.spaceId);if(!t)return null;const i=cs(e.cfg.spaces.find(t=>t.id===e.spaceId)),s=ps(e.cfg.settings),n=e.iconSize??2.5,o=n>8?2.5:n,a=E_(o),r=e.registry?En(e.hass,e.registry):e.hass,l=e.registry?On(e.hass,e.registry):e.hass,c=(e.devices||X_(e)).filter(t=>t.space===e.spaceId),h=c.filter(e=>!e.hidden),d=function(e,t,i){const s={},n=i/100*nd(t)*1.3;for(const i of t.rooms){if(!i.area)continue;const t=e.filter(e=>e.area===i.area);if(!t.length)continue;const o=rd(i),a=.1*Math.min(o.w,o.h),r=o.w-2*a,l=o.h-2*a,c=Math.max(1,Math.round(Math.sqrt(t.length*r/Math.max(l,1)))),h=r/c,d=l/Math.max(Math.ceil(t.length/c),1),p=t.map((e,t)=>({x:o.x+a+h*(t%c+.5),y:o.y+a+d*(Math.floor(t/c)+.5)}));Oi(p,o,n,.5*a),t.forEach((e,t)=>s[e.id]=Wh(p[t]))}return s}(c,t,o),p=[];for(const t of h){const i=e.layout[t.id];if(i&&i.s===e.spaceId){const e=i.x*Ih,t=i.y*Ih;p.push({minX:e,minY:t,maxX:e,maxY:t})}}const u=e.cfg.spaces.find(t=>t.id===e.spaceId)||{},_=Array.isArray(u.walls)?u.walls:[],m=Number(u.cell_cm)>0?Number(u.cell_cm):5,g=V_(u,t,Ih,.02*Bh),f=(u.openings||[]).flatMap(e=>{if("partition"!==e.host?.kind)return[];const i=tu(e,t.partitions,Ih,m,Bh).resolved;return i?[i]:[]}),v=Gd({partitions:t.partitions,roomDrafts:t.room_drafts,columns:t.wall_columns,cellCm:m,hostedOpenings:f.map(e=>({id:e.opening.id,host:e.host,length:e.length,type:e.opening.type}))}),b=function(e,t,i,s){let n=J_.get(e);n||(n=new Map,J_.set(e,n));const o=n.get(t);if(o?.fingerprint===i)return o.value;const a=s();return n.set(t,{fingerprint:i,value:a}),a}(e.cfg,t.id,v,()=>_h(t,m,Bh,2e-4*Bh,f.map(nu)).all);for(const e of b){const t=e.map(e=>e[0]),i=e.map(e=>e[1]);t.length&&p.push({minX:Math.min(...t),minY:Math.min(...i),maxX:Math.max(...t),maxY:Math.max(...i)})}for(const e of g.lines)p.push({minX:Math.min(e[0],e[2]),minY:Math.min(e[1],e[3]),maxX:Math.max(e[0],e[2]),maxY:Math.max(e[1],e[3])});const y=id(t,p),w=[y.x,y.y,y.w,y.h],k=new Map(t.rooms.map(t=>{const n=zs(i.fill,t);return[t,_s(n,"lqi"===n&&t.area?Do(r,c,t.area):null,"light"===n?uo(ho(r,c,t,e.virtualLights)):"none","temp"===n&&t.area?Po(r,c,t.area):null,i.tempMin,i.tempMax,s,ls(i.customFill,t))]})),x=new Map;for(const e of t.rooms)e.id&&x.set(e.id,k.get(e)||null);const $=function(e,t=1e3){const i=[];for(const[s,n]of(e||[]).entries()){if("passage"!==n?.type)continue;const e={...n,id:String(n.id||`passage-${s}`),type:"passage",rx:Number(n.x)*t,ry:Number(n.y)*t,rlen:Number(n.length)*t};[e.rx,e.ry,e.rlen,e.angle].every(Number.isFinite)&&e.rlen>0&&i.push(e)}return i}((u.openings||[]).flatMap(e=>{if(!e.host||"wall"===e.host.kind)return[e];const t=f.find(t=>t.opening.id===e.id);return t?[lu(e,t,Ih)]:[]}),Ih),S=wc(t.rooms,_,g.contour,jh,m,Bh,Ih),M=f.filter(e=>ru(e,S,2e-4*Bh)).map(e=>({x:e.center[0],y:e.center[1],angle:e.angle,length:e.length})),C=t.rooms.filter(e=>e.area||i.showBorders||"none"!==zs(i.fill,e)).map(e=>{let s="room "+(t.bg?"overlay":"yard"),n="";const o=zs(i.fill,e);if(i.showBorders||"none"!==o){s+=" styled";const t=[`--room-stroke:${i.color}`,`--room-stroke-op:${i.showBorders&&!g.contour.length?i.opacity:0}`],o=k.get(e)||null;o?(s+=" filled",t.push(`--room-fill:${o.color}`,`--room-fill-op:${o.opacity.toFixed(3)}`)):t.push("--room-fill:transparent","--room-fill-op:0"),n=t.join(";")}const a=e.id||G,r=e.area||G,l=e.poly?W``});return W``}const L_=e=>Array.isArray(e)&&e.length>=2&&Number.isFinite(Number(e[0]))&&Number.isFinite(Number(e[1])),B_=(e,t,i)=>[Number(e[0])*i,Number(e[1])*i,Number(t[0])*i,Number(t[1])*i],j_=e=>{const t=`${Number(e[0]).toFixed(9)},${Number(e[1]).toFixed(9)}`,i=`${Number(e[2]).toFixed(9)},${Number(e[3]).toFixed(9)}`;return t<=i?`${t}|${i}`:`${i}|${t}`},q_=e=>{const t=new Map;for(const i of e.flat())!Array.isArray(i)||i.length<4||!i.every(Number.isFinite)||Math.hypot(i[2]-i[0],i[3]-i[1])<=1e-9||t.set(j_(i),[...i]);return[...t.values()]};function W_(e){return"solid"===e?.zero_wall_style?"solid":"dashed"}function U_(e,t=1,i){const s=[];for(const n of Array.isArray(e?.wall_segments)?e.wall_segments:[])0===Number(n?.cm)&&L_(n?.a)&&L_(n?.b)&&(i&&!i.has(String(n.id||""))||s.push(B_(n.a,n.b,t)));return q_([s])}function G_(e,t=1){const i=[];for(const s of Array.isArray(e?.partitions)?e.partitions:[])0===Number(s?.cm)&&L_(s?.a)&&L_(s?.b)&&i.push(B_(s.a,s.b,t));for(const s of Array.isArray(e?.room_drafts)?e.room_drafts:[]){const e=Array.isArray(s?.points)?s.points:[];for(let n=0;n+1e?.host?.kind===t.kind&&e.host.id===t.id)}const J_=new WeakMap,X_=new WeakMap;function Z_(e){const t=Eh(e.cfg),i={};for(const t of e.cfg.spaces||[])for(const e of t.rooms||[])e.area&&(i[e.area]=t.id);const s=e.cfg.settings?.exclude_integrations?new Set(e.cfg.settings.exclude_integrations):Ye,n=Xe(e.cfg.settings?.icon_rules?.length?e.cfg.settings.icon_rules:Je);return So({hass:e.hass,registry:e.registry,areaToSpace:i,markers:e.cfg.markers||[],settings:e.cfg.settings||{},excluded:s,showAll:!!e.cfg.settings?.show_all,firstSpaceId:t[0]?.id||"",loc:t=>ua(e.lang,t),iconRules:n})}function Q_(e){const t=Eh(e.cfg).find(t=>t.id===e.spaceId);if(!t)return null;const i=cs(e.cfg.spaces.find(t=>t.id===e.spaceId)),s=ps(e.cfg.settings),n=e.iconSize??2.5,o=n>8?2.5:n,a=O_(o),r=e.registry?En(e.hass,e.registry):e.hass,l=e.registry?On(e.hass,e.registry):e.hass,c=(e.devices||Z_(e)).filter(t=>t.space===e.spaceId),h=c.filter(e=>!e.hidden),d=function(e,t,i){const s={},n=i/100*nd(t)*1.3;for(const i of t.rooms){if(!i.area)continue;const t=e.filter(e=>e.area===i.area);if(!t.length)continue;const o=rd(i),a=.1*Math.min(o.w,o.h),r=o.w-2*a,l=o.h-2*a,c=Math.max(1,Math.round(Math.sqrt(t.length*r/Math.max(l,1)))),h=r/c,d=l/Math.max(Math.ceil(t.length/c),1),p=t.map((e,t)=>({x:o.x+a+h*(t%c+.5),y:o.y+a+d*(Math.floor(t/c)+.5)}));Oi(p,o,n,.5*a),t.forEach((e,t)=>s[e.id]=Wh(p[t]))}return s}(c,t,o),p=[];for(const t of h){const i=e.layout[t.id];if(i&&i.s===e.spaceId){const e=i.x*Ih,t=i.y*Ih;p.push({minX:e,minY:t,maxX:e,maxY:t})}}const u=e.cfg.spaces.find(t=>t.id===e.spaceId)||{},_=Array.isArray(u.walls)?u.walls:[],m=Number(u.cell_cm)>0?Number(u.cell_cm):5,g=K_(u,t,Ih,.02*Bh),f=(u.openings||[]).flatMap(e=>{if("partition"!==e.host?.kind)return[];const i=iu(e,t.partitions,Ih,m,Bh).resolved;return i?[i]:[]}),v=Vd({partitions:t.partitions,roomDrafts:t.room_drafts,columns:t.wall_columns,cellCm:m,hostedOpenings:f.map(e=>({id:e.opening.id,host:e.host,length:e.length,type:e.opening.type}))}),b=function(e,t,i,s){let n=X_.get(e);n||(n=new Map,X_.set(e,n));const o=n.get(t);if(o?.fingerprint===i)return o.value;const a=s();return n.set(t,{fingerprint:i,value:a}),a}(e.cfg,t.id,v,()=>_h(t,m,Bh,2e-4*Bh,f.map(ou)).all);for(const e of b){const t=e.map(e=>e[0]),i=e.map(e=>e[1]);t.length&&p.push({minX:Math.min(...t),minY:Math.min(...i),maxX:Math.max(...t),maxY:Math.max(...i)})}for(const e of g.lines)p.push({minX:Math.min(e[0],e[2]),minY:Math.min(e[1],e[3]),maxX:Math.max(e[0],e[2]),maxY:Math.max(e[1],e[3])});const y=id(t,p),w=[y.x,y.y,y.w,y.h],k=new Map(t.rooms.map(t=>{const n=zs(i.fill,t);return[t,_s(n,"lqi"===n&&t.area?Do(r,c,t.area):null,"light"===n?uo(ho(r,c,t,e.virtualLights)):"none","temp"===n&&t.area?Po(r,c,t.area):null,i.tempMin,i.tempMax,s,ls(i.customFill,t))]})),x=new Map;for(const e of t.rooms)e.id&&x.set(e.id,k.get(e)||null);const $=function(e,t=1e3){const i=[];for(const[s,n]of(e||[]).entries()){if("passage"!==n?.type)continue;const e={...n,id:String(n.id||`passage-${s}`),type:"passage",rx:Number(n.x)*t,ry:Number(n.y)*t,rlen:Number(n.length)*t};[e.rx,e.ry,e.rlen,e.angle].every(Number.isFinite)&&e.rlen>0&&i.push(e)}return i}((u.openings||[]).flatMap(e=>{if(!e.host||"wall"===e.host.kind)return[e];const t=f.find(t=>t.opening.id===e.id);return t?[cu(e,t,Ih)]:[]}),Ih),S=wc(t.rooms,_,g.contour,jh,m,Bh,Ih),M=f.filter(e=>lu(e,S,2e-4*Bh)).map(e=>({x:e.center[0],y:e.center[1],angle:e.angle,length:e.length})),C=t.rooms.filter(e=>e.area||i.showBorders||"none"!==zs(i.fill,e)).map(e=>{let s="room "+(t.bg?"overlay":"yard"),n="";const o=zs(i.fill,e);if(i.showBorders||"none"!==o){s+=" styled";const t=[`--room-stroke:${i.color}`,`--room-stroke-op:${i.showBorders&&!g.contour.length?i.opacity:0}`],o=k.get(e)||null;o?(s+=" filled",t.push(`--room-fill:${o.color}`,`--room-fill-op:${o.opacity.toFixed(3)}`)):t.push("--room-fill:transparent","--room-fill-op:0"),n=t.join(";")}const a=e.id||G,r=e.area||G,l=e.poly?W``:W``;return l}),D=t.rooms.filter(e=>{const t=k.get(e);return Fs(i.glow,e)&&(!t||t.opacity<=0)}).map(e=>e.poly?W`