- `}export{l as F,c as a,L as c,$ as e,s as f,a as p,C as r,u as s};
+ `}export{l as F,c as a,L as c,$ as e,s as f,a as p,H as r,u as s};
diff --git a/dist/houseplan-assets/de-JnsB57l8.js b/custom_components/houseplan/frontend/houseplan-assets/de-DCJ5g8AN.js
similarity index 99%
rename from dist/houseplan-assets/de-JnsB57l8.js
rename to custom_components/houseplan/frontend/houseplan-assets/de-DCJ5g8AN.js
index cdd2c110..32b4853a 100644
--- a/dist/houseplan-assets/de-JnsB57l8.js
+++ b/custom_components/houseplan/frontend/houseplan-assets/de-DCJ5g8AN.js
@@ -1 +1 @@
-globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="34d1dbfc181acaf58842dfced0e6aa3a899aef6b8d1eeba53732ef729a63137e";var e={"editor.context_actions":"Aktionen: {object}","editor.tool_options":"Werkzeugoptionen: {tool}","editor.palette":"Palette: {tool}","editor.open_group":"Werkzeuggruppe: {group}","editor.group_active":"{group} — aktiv: {item}","editor.disabled_action":"{action} ist nicht verfügbar: {reason}","editor.loading":"Editor wird geladen…","editor.loading_aria":"Der Plan-Editor wird geladen","editor.load_failed":"Der Editor konnte nicht geladen werden.","editor.refresh_advice":"Seite aktualisieren und erneut versuchen.","editor.retry_advice":"Verbindung prüfen und erneut drücken.","version_mismatch.title":"Die House Plan-Versionen stimmen nicht überein","version_mismatch.body":"Falls Home Assistant noch neu startet, warten Sie den Abschluss ab und laden Sie dann diese Seite neu.","version_mismatch.frontend":"Karte","version_mismatch.backend":"Integration","version_mismatch.reload":"Seite neu laden","color_picker.title":"Farbwähler","color_picker.hue":"Farbton","color_picker.saturation":"Sättigung","color_picker.value":"Helligkeit","color_picker.hex":"Hex-Farbe","color_picker.invalid_hex":"Geben Sie eine 3- oder 6-stellige Hex-Farbe ein","color_picker.confirm":"OK","btn.properties":"Eigenschaften","btn.keep_as_walls":"Als Wände behalten","btn.delete_room_keep_walls":"Raum löschen, Wände behalten","btn.delete_room_with_walls":"Raum und Wände löschen","title.markup_select":"Wände und Säulen auswählen und bearbeiten","title.markup_column":"Säule: Klicken Sie auf einen Rasterpunkt, um eine quadratische Säule zu platzieren","markup.partition":"Trennwand","markup.column":"Säule","markup.hint_column":"Klicken Sie auf einen Rasterpunkt, um eine quadratische Säule zu platzieren","history.wall_segment":"Wandsegment hinzufügen","history.column_add":"Säule hinzufügen","history.physical_edit":"Physisches Objekt ändern","history.physical_delete":"Physisches Objekt löschen","history.physical_move":"Physisches Objekt verschieben","history.wall_face_batch":"Räume aus Wänden erstellen","toast.column_duplicate":"Eine Säule mit demselben Zentrum und äußerer Größe existiert bereits","physical.partition_properties":"Eigenschaften der Trennwand","physical.column_properties":"Eigenschaften der Säule","physical.shape":"Form","physical.square":"Quadrat","physical.circle":"Kreis","physical.diameter":"Durchmesser","physical.side":"Seite","physical.rotation":"Drehwinkel","physical.length":"Länge","physical.allowed_range":"Erlaubt: {min}–{max} {unit}","physical.column_size_title":"Außenmaß der per Klick platzierten quadratischen Säule (1–150 cm).","card.title":"Hausplan","count.devices":"{n} Entwicklung","empty.no_spaces":"Noch keine Bereiche.","nav.spaces":"House-Plan-Bereiche","empty.add_first":"Ersten Bereich hinzufügen und einen Grundriss hochladen.","empty.read_only":"Es sind keine Bereiche eingerichtet. Bitten Sie einen Administrator, einen hinzuzufügen.","empty.install":"Installieren Sie die House Plan-Integration und fügen Sie sie unter „Geräte & Dienste“ hinzu.","btn.add_space":"Bereich hinzufügen","btn.cancel":"Abbrechen","btn.save":"Speichern","btn.close":"Schließen","btn.delete":"Löschen","btn.copy":"Kopieren","btn.edit":"Bearbeiten","btn.open_in_ha":"In HA öffnen","btn.reset":"Zurücksetzen","btn.attach":"Anhängen…","btn.upload":"Hochladen…","btn.replace":"Ersetzen…","title.zoom_in":"Zoomen","title.zoom_out":"Herauszoomen","title.zoom_fit":"Alles anpassen","title.configure_space":"Bereich konfigurieren","title.add_space":"Bereich hinzufügen","title.markup_add":"Wände: eine durchgehende Kette zeichnen; jedes bestätigte Segment wird einzeln gespeichert. Umschalt sperrt auf 45°","title.markup_merge":"Zusammenführen: Klicken Sie auf einen Raum und dann auf den Nachbarraum, mit dem er eine Wand teilt","title.markup_split":"Raum teilen: Klicken Sie auf den Raum und dann auf zwei Punkte an seinen Wänden","title.markup_delroom":"Raum löschen: Klicken Sie in einen Raum und bestätigen Sie","title.need_plan":"Einen Grundriss hochladen","markup.add":"Wände","markup.merge":"Zusammenführen","markup.split":"Teilen","markup.resize":"Größe ändern","title.markup_resize":"Räume vergrößern/verkleinern: Ziehen Sie einen verfügbaren horizontalen oder vertikalen Wandgriff","markup.hint_resize":"Ziehen Sie einen verfügbaren Wandgriff · die Wand stoppt an der ersten unsicheren Position · Esc bricht ab · Strg+Z — rückgängig","resize.disabled.diagonal":"Diese Wand ist geneigt; Größe ändern unterstützt nur horizontale und vertikale Wände","resize.disabled.side-angle":"Eine angrenzende Wand ist geneigt; Größe ändern erfordert, dass beide angrenzenden Wände diese Wand im rechten Winkel treffen","resize.disabled.duplicate-physical-wall":"Eine separate Trennwand oder ein Pfeiler überlappt diese Wand; entfernen oder verschieben Sie sie, bevor Sie die Größe ändern","resize.disabled.partial-shared":"Ein angrenzender Raum nutzt nur einen Teil dieser Wand, daher kann sie nicht sicher als gemeinsame Wand verschoben werden","resize.disabled.unequal-shared":"Der angrenzende Raum nutzt andere Endpunkte oder Wandlängen, daher können die Wände nicht gemeinsam sicher bewegt werden","resize.disabled.multiple-rooms":"Das Verschieben dieser Wand würde mehr als zwei Räume betreffen","resize.disabled.thickness-conflict":"Die Wandstärke kann nicht sicher beibehalten werden","resize.disabled.opening-conflict":"Eine Öffnung an dieser Wand kann nicht sicher verschoben werden","resize.disabled.invalid-geometry":"Diese Wand kann nicht ohne Änderung der Planstruktur geändert werden","resize.limit_stopped":"Wand gestoppt: der nächste Schritt würde ein Anschlusslimit verletzen","resize.commit_failed":"Größenänderung wurde abgebrochen, da der endgültige Plan die Geometrieprüfung nicht bestanden hat","resize.preview_failed":"Größenänderung am letzten sicheren Punkt gestoppt, da die Plan-Geometrie nicht beibehalten werden konnte","markup.opening":"Öffnung","markup.delete_room":"Raum löschen","history.undo":"Rückgängig","history.redo":"Wiederholen","history.undo_named":"Rückgängig: {name} (Strg+Z)","history.redo_named":"Wiederholen: {name} (Strg+Shift+Z / Strg+Y)","history.undo_empty":"Nichts zu widerrufen","history.redo_empty":"Nichts zu wiederholen","history.undone":"Rückgängig gemacht: {name}","history.redone":"Wiederholt: {name}","history.add_room":"Raum erstellen","history.split_room":"Raum teilen","history.merge_rooms":"Räume zusammenführen","history.resize_room":"Raumgröße ändern","history.wall_thickness":"Wandstärke ändern","history.add_opening":"Tür- oder Fensteröffnung hinzufügen","history.edit_opening":"Öffnung bearbeiten","history.move_opening":"Öffnung verschieben","history.delete_opening":"Öffnung löschen","history.delete_room_keep_walls":"Raum löschen, Wände behalten","history.delete_room_with_walls":"Raum und Wände löschen","history.decor_add":"Dekorobjekt hinzufügen","history.decor_edit":"Dekorobjekt bearbeiten","history.decor_move":"Dekorobjekt verschieben","history.decor_transform":"Dekorobjekt transformieren","history.decor_delete":"Dekorobjekt löschen","history.backdrop_transform":"Plan-Hintergrund transformieren","history.device_move":"{name} verschieben","history.device_stale":"Der Positionsverlauf ist nicht mehr anwendbar und wurde gelöscht","opening.new":"Neue Öffnung","opening.edit":"Öffnung","opening.door":"Tür","opening.window":"Fenster","opening.gate":"Tor","opening.passage":"Offener Durchgang","opening.passage_binding_warning":"Das Speichern entfernt den Öffnungs-/Schließsensor und das Schloss.","opening.invalid_passage_fields":"Der offene Durchgang auf dem Plan „{room}“ hat nicht unterstützte Einstellungen: {fields}.","opening.type_label":"Typ","opening.length_label":"Länge, cm","opening.contact_label":"Öffnungs-/Schließsensor","opening.lock_label":"Schloss","opening.none":"— keine —","opening.search_ph":"Suche: Name oder Entitäts-ID…","opening.invert":"Geöffnet/geschlossen invertieren","opening.flip_h":"Scharnier an der anderen Zarge","opening.flip_v":"Öffnet zur anderen Seite","opening.open":"Offen","opening.closed":"Geschlossen","opening.locked":"Verriegelt","opening.unlocked":"Entriegelt","opening.state_unknown":"nicht verfügbar","opening.no_entities":"Keine Sensoren gebunden — ein statisches Symbol auf dem Plan.","toast.opening_no_wall":"Neben eine Raumwand oder eine unabhängige Wand klicken","opening.host_partition":"Unabhängige Wand","opening.partition_orphan":"Die unabhängige Wand für diese Öffnung existiert nicht mehr","opening.partition_jamb_margin":"Mindestens {distance} zwischen der Öffnung und dem Wandende lassen","opening.rebind_partition":"An eine andere unabhängige Wand anfügen","confirm.delete_partition_openings_title":"Wand und Öffnungen löschen?","confirm.delete_partition_openings_body":"Diese Wand enthält {count} Öffnung(en). Sie werden zusammen gelöscht.","confirm.delete_partition_openings_item":"• {type}, {length}","markup.hint_points":"Punkte: {n} · Shift — 45° Schritte · Esc — Kette beenden · Ctrl+Z — Punkt rückgängig machen · Schließen eines Bereichs erstellt einen Raum","markup.hint_start":"Klicken Sie auf einen Rasterpunkt, um eine Wandkette zu starten","tip.lqi":"durchschnittliches Zigbee-Signal:","tip.area":"Bereich: {value}","info.device_header":"Gerät im Plan","info.model":"Modell","info.state":"Status","info.link":"Verbindung","info.manuals":"Handbücher","info.none":"Keine zusätzlichen Informationen","marker.new_device":"Neues Gerät","marker.name_label":"Name (im Plan angezeigt)","marker.name_ph":"Name","marker.binding_label":"An ein HA-Gerät binden","marker.binding_disabled":"in Home Assistant deaktiviert","marker.virtual_option":"Virtuelles Gerät (keine Bindung)","marker.search_ph":"Gerät/Gruppe suchen…","marker.nothing_found":"Nichts gefunden","marker.room_label":"Raum","marker.room_override":" (Platzierung überschreiben)","marker.room_choose":"— Raum auswählen —","marker.room_auto":"— nach Gerätebereich (auto) —","marker.icon_label":"Symbol","marker.icon_ph":"mdi:… (leer = automatisch)","marker.display_label":"Anzeige","display.badge":"Symbol + Zustand","display.icon_ripple":"Symbol + Zustand und Aktivität","display.static_icon":"Immer statisches Symbol","display.value_static_icon":"Wert + statisches Symbol","marker.display_hint_badge":"Das Symbol und die dynamische Platte zeigen den Gerätezustand ohne den üblichen Aktivitätspuls. Rote Alarme bleiben sichtbar.","marker.display_hint_icon_ripple":"Das Symbol, die dynamische Platte und der Puls zeigen einen kurzen Puls für Ereignisse und einen kontinuierlichen Puls für Arbeit, Bewegung oder Anwesenheit. Rote Alarme haben eine separate Priorität.","marker.display_hint_value":"Ein ausgewählter oder automatisch ermittelter Home Assistant-Wert ersetzt das Symbol, während die Platte weiterhin den Zustand anzeigt. Rote Alarme bleiben sichtbar.","marker.display_hint_static_icon":"Die themenabhängige Hülle und das Symbol bleiben immer gleich. Zustand, Aktivität, Nichtverfügbarkeit und Alarme verändern nicht das Erscheinungsbild.","marker.display_hint_value_static_icon":"Der Marker zeigt den gewählten Wert, während die Hülle themenabhängig bleibt. Zustand, Aktivität, Nichtverfügbarkeit und Alarme ändern die Markerfarbe nicht.","marker.static_alarm_warning":"Dieses Gerät kann Alarme melden. Die statische Anzeige verbirgt die visuelle Alarmanzeige des Markers.","marker.preview.title":"Anzeigevorschau","marker.preview.actual":"Jetzt","marker.preview.example":"Beispiel","marker.preview.integration":"Bereitgestellt von","marker.preview.source":"Anzeigquelle","marker.preview.current_state":"Aktueller Zustand","marker.preview.result":"Auf dem Plan","marker.preview.details":"Quelldetails","marker.preview.select_source":"Ein Home-Assistant-Gerät oder eine Entität auswählen, um die tatsächliche Anzeige zu sehen.","marker.preview.unknown_provider":"Unbekannte Integration","marker.preview.virtual_provider":"House Plan · virtuelles Gerät","marker.preview.no_source":"Keine aktive Quelle","marker.preview.no_state":"Kein aktueller Zustand","marker.preview.mixed_states":"Mehrere verschiedene Zustände","marker.preview.multiple_sources":"{n}-Quellen","marker.preview.more_sources":"+{n} mehr","marker.preview.scaled":"Die Vorschau wird auf {n}% skaliert, um zu passen. Die gespeicherte Größe bleibt unverändert.","marker.preview.demo_short":"Kurze Aktivität anzeigen","marker.preview.demo_continuous":"Kontinuierliche Aktivität anzeigen","marker.preview.stop_continuous":"Kontinuierliche Aktivität stoppen","marker.preview.demo_short_notice":"Kurzes Aktivitätsbeispiel; der tatsächliche Gerätezustand bleibt unverändert.","marker.preview.demo_continuous_notice":"Kontinuierliches Aktivitätsbeispiel; der tatsächliche Gerätezustand bleibt unverändert.","marker.preview.demo_already_visible":"Der aktuelle Zustand zeigt bereits eine echte Aktivitäts- oder Alarmeffekt.","marker.preview.reduced_motion":"Systemweit reduzierte Bewegungen sind aktiviert, daher wird gewöhnliche Aktivität als Punkt angezeigt.","marker.preview.reason.neutral":"Neutrale dunkle Platte","marker.preview.reason.working":"Gelbe Platte: Das Gerät arbeitet jetzt","marker.preview.reason.working_activity":"Gelbe Platte und Aktivitätseffekt: das Gerät funktioniert jetzt","marker.preview.reason.open":"Orange Platte: physisch geöffnet oder entriegelt","marker.preview.reason.cover_icon_state":"Neutrale Platte; die Abdeckungseinheit steuert den angezeigten Zustand und das Symbol","marker.preview.reason.presence":"Aktivitätseffekt, während Präsenz erkannt wird","marker.preview.reason.event":"Kurzer Aktivitätseffekt nach einem erkannten Ereignis","marker.preview.reason.transition":"Aktivitätseffekt, während das Gerät sich bewegt oder den Zustand ändert","marker.preview.reason.media_neutral":"Mediengeräte bleiben im verfügbaren Zustand auf einer neutralen dunklen Platte","marker.preview.reason.unavailable":"Gedämpfte neutrale Platte: nicht verfügbar oder ausgeschaltet","marker.preview.reason.alarm":"Rote Alarmplatte; Alarmanzeige wird immer angezeigt","marker.preview.reason.live_states_disabled":"Live-Zustandsstil ist für diese Karte deaktiviert","marker.preview.reason.value_no_state":"Kein nutzbarer Zustandswert; stattdessen wird das Symbol angezeigt","marker.preview.reason.value_ambiguous_sources":"Mehrere mögliche Wertequellen; stattdessen wird das Symbol angezeigt","marker.preview.reason.value_non_scalar":"Die Quelle lieferte keinen einfachen Wert; stattdessen wird das Symbol angezeigt","marker.preview.reason.value_virtual":"Ein virtuelles Gerät hat keinen Home Assistant-Wert; stattdessen wird das Symbol angezeigt","marker.preview.reason.vacuum_live_plan_only":"Echtzeitposition und -spur des Staubsaugers sind nur im vollständigen Plan verfügbar","marker.preview.reason.hidden_design_preview":"Das Gerät ist im Plan ausgeblendet; diese Designvorschau bleibt sichtbar","marker.preview.reason.composite_power_source":"Der Status stammt vom Power-Entity des Geräts; Hilfsschalter werden ignoriert","marker.preview.reason.activity_display_disabled":"Der gewählte Anzeigemodus zeigt gewöhnliche Aktivitätseffekte nicht an","marker.preview.reason.ha_disabled":"Die Home Assistant-Verbindung ist deaktiviert und wird im Plan ausgeblendet","marker.preview.reason.orphaned":"Die gespeicherte Home Assistant-Verbindung konnte nicht mehr gefunden werden","marker.preview.reason.static_icon":"Statischer Modus: Der Gerätestatus ändert das Symbol nicht","marker.preview.reason.value_static_icon":"Statischer Modus mit Wert: Der Gerätestatus ändert die Markerfarbe nicht","marker.activity_color":"Aktivitätspulsfarbe","marker.ripple_size":"Aktivitätspulsgröße","marker.activity_alarm_note":"Farbe und Größe betreffen nur gewöhnliche Aktivität und ändern keine roten Alarme.","marker.pulse_a11y_alarm":"Alarm","marker.pulse_a11y_event":"Kürzliches Ereignis","marker.pulse_a11y_presence":"Anwesenheit erkannt","marker.pulse_a11y_transition":"Statusänderung","marker.pulse_a11y_running":"Arbeitet","marker.state_a11y_neutral":"Standardzustand","marker.state_a11y_working":"Funktionierend","marker.state_a11y_open":"Offen","marker.state_a11y_locked":"Verschlossen","marker.state_a11y_unlocked":"Entriegelt","marker.state_a11y_alarm":"Alarm","marker.state_a11y_unavailable":"Nicht verfügbar","marker.lqi_a11y_low":"LQI {value}, schwaches Signal","marker.lqi_a11y_mid":"LQI {value}, mittleres Signal","marker.lqi_a11y_high":"LQI {value}, starkes Signal","marker.size_label":"Symbolgröße / Drehung","marker.angle_label":"Drehen","marker.model_label":"Modell","marker.model_ph":"z.B. Aqara T&H","marker.link_label":"Link","marker.desc_label":"Beschreibung","marker.desc_ph":"Notizen, Spezifikationen…","marker.manuals_label":"Handbücher (PDF usw.)","marker.sub_device":"Gerät","marker.sub_z2m_group":"· Z2M Gruppe","marker.sub_group":"Gruppe","marker.sub_helper":"Helfer","space.new":"Neuer Bereich","space.copy_title":"Bereich kopieren","space.copy_name":"Name des neuen Bereichs","space.copy_fallback":"Bereich","space.copy_create":"Kopie erstellen","space.copy_optimize_title":"Vor dem Kopieren optimieren?","space.copy_optimize_body":"Vor dem Erstellen von „{name}“ muss House Plan den gesamten Plan einschließlich anderer Bereiche optimieren. Fortfahren?","space.copy_optimize_confirm":"Optimieren und kopieren","space.copy_error_changed":"Der Plan wurde während der Bestätigung geändert. Bitte prüfen und erneut versuchen.","space.copy_error_source_missing":"Der Quellbereich existiert nicht mehr. Öffnen Sie seine Einstellungen erneut.","space.copy_error_source_invalid":"House Plan konnte nicht alle Wände dieses Bereichs prüfen. Korrigieren Sie den Quellbereich.","space.copy_error_spaces_limit":"House Plan enthält bereits die maximale Anzahl an Bereichen.","space.copy_error_partitions_limit":"Dieser Bereich enthält zu viele Wände zum Kopieren.","space.copy_error_openings_limit":"Dieser Bereich enthält zu viele Öffnungen zum Kopieren.","space.copy_error_decor_limit":"Dieser Bereich enthält zu viele Hintergrundobjekte zum Kopieren.","space.copy_error_columns_limit":"Dieser Bereich enthält zu viele Säulen zum Kopieren.","space.copy_error_opening_host":"Eine Öffnung ist keiner Wand mehr zugeordnet. Korrigieren oder löschen Sie sie vor dem Kopieren.","space.copy_error_geometry":"Die Kopie würde eine unsichere Wandgeometrie erzeugen. Korrigieren Sie den Quellbereich.","space.copy_error_optimize_geometry":"Das Kopieren wurde gestoppt, weil die Optimierung des gesamten Plans für einen Bereich unsicher ist.","space.header":"Bereich","space.title_label":"Titel","space.title_ph":"z.B. Garage","space.plan_label":"Grundriss (Hintergrund)","space.no_plan":"Kein Planbild","space.plan_alt":"Grundriss","room.new":"Neuer Raum","room.name_label":"Anzeigename","room.name_ph":"z.B. Terrasse","room.area_label":"Home Assistant Bereich (nicht zugewiesen)","room.no_area_option":"— kein Bereich —","room.default_name":"Raum","device.unnamed":"unbenannt","device.light_group":"Lichtgruppe","device.fallback":"Gerät","device.virtual":"Virtuelles Gerät","confirm.delete_room_title":'Raum "{name}" löschen?',"confirm.delete_room_body":"Festlegen, ob die ausschließlich zu diesem Raum gehörenden physischen Wände erhalten bleiben. Mit einem anderen Raum geteilte Wände bleiben immer erhalten.","confirm.remove_marker_title":"Gerät aus dem Plan löschen?","confirm.remove_marker_body":"Das Gerät verschwindet vollständig und trägt nicht mehr zu den Plandaten bei. Es kann später erneut hinzugefügt werden.","confirm.erase_decor":"Das Objekt „{kind}“ löschen? Diese Aktion kann im Editor rückgängig gemacht werden.","confirm.delete_space_title":"Bereich löschen?","confirm.delete_space_body":"Der Bereich, alle seine Räume und die gesamte Planmarkierung werden gelöscht.","confirm.delete_space_vac_routes":"Zuordnungen von Roboterkarten werden ebenfalls entfernt: {count}.","space.delete_blocked":"Dieser Bereich wird noch von {n} Gerät(en) verwendet. Die Geräte zuerst in einen anderen Bereich verschieben oder löschen.","toast.pos_save_failed":"Position nicht gespeichert: {err}","toast.no_entity":"Das Gerät hat keine geeignete Entität","toast.ha_disabled_action":"Ein deaktiviertes Home Assistant-Objekt kann im Plan nicht verwendet werden.","toast.ha_disabled_show_device":"Ein in Home Assistant deaktiviertes Gerät kann im Plan nicht angezeigt werden. Aktivieren Sie es zuerst in Home Assistant.","toast.ha_disabled_show_entity":"Eine in Home Assistant deaktivierte Entität kann im Plan nicht angezeigt werden. Aktivieren Sie sie zuerst in Home Assistant.","toast.ha_disabled_add":"Ein deaktiviertes Home Assistant-Objekt kann nicht dem Plan hinzugefügt werden. Aktivieren Sie es zuerst in Home Assistant.","toast.ha_binding_unverified":"Der Status des Objekts konnte über das Home Assistant-Register nicht überprüft werden. Anzeige und Aktionen sind vorübergehend nicht verfügbar.","toast.markup_needs_server":"Markup ist verfügbar, nachdem die Konfiguration auf den Server verschoben wurde.","toast.space_order_changed":"Reihenfolge geändert. Wenn eine Karte ihr Stockwerk nach Nummer festlegt, überprüfen Sie diese Paneele.","toast.conflict":"Die Konfiguration wurde in einem anderen Fenster geändert — Daten aktualisiert, wiederholen Sie Ihre letzte Aktion.","toast.cfg_save_failed":"Speichern der Konfiguration fehlgeschlagen: {err}","toast.room_overlap":"Die Umrisse überlappen den Raum „{name}“ — Räume dürfen sich nicht überlappen","toast.contour_cannot_close":"Die Kontur kann nicht geschlossen werden, da sie entartet ist oder sich selbst schneidet","toast.merge_not_adjacent":"Es können nur Räume zusammengeführt werden, die eine Wand teilen","toast.rooms_merged":"Räume zu „{name}“ zusammengeführt","toast.split_pick_wall":"Beginnen Sie den Schnitt an der Wand des Raumes","toast.split_bad_cut":"Der Schnitt muss wand-zu-wand innerhalb des Raumes verlaufen, ohne Wände oder sich selbst zu kreuzen","merge.header":"Räume zusammenführen","merge.hint":"Der zusammengeführte Raum behält einen Namen und eine Fläche. Die andere Fläche wird freigegeben — ihre Geräte verlassen den Plan, bis ein anderer Raum sie beansprucht.","merge.keep":"Behalten","merge.no_area":"keine Fläche","toast.room_saved":"Raum gespeichert ({n}). Hinzugefügte Geräte: {added}. Zeichnen Sie die nächste Kontur oder verlassen Sie die Markierung.","toast.room_saved_no_area":"Raum gespeichert ({n}, keine Fläche). Zeichnen Sie die nächste Kontur oder verlassen Sie die Markierung.","toast.marker_needs_server":"Die Gerätebearbeitung ist verfügbar, nachdem die Konfiguration auf den Server verschoben wurde","toast.virtual_name_required":"Einen Namen für das virtuelle Gerät eingeben","toast.marker_saved":"Gerät gespeichert","toast.marker_removed":"Gerät aus dem Plan gelöscht","toast.integration_missing":"Die House Plan-Integration ist nicht installiert — Verwaltung nicht verfügbar","toast.plan_formats":"Unterstützte Formate: SVG, PNG, JPG, WebP","toast.plan_required":"Grundriss hochladen — erforderlich","toast.space_added_onboard":"Bereich hinzugefügt. Räume einzeichnen: Rasterpunkte anklicken und die Kontur schließen.","toast.space_added":"Bereich hinzugefügt","toast.space_copied":"Bereich „{name}“ erstellt","toast.space_saved":"Bereich gespeichert","toast.space_deleted":"Bereich gelöscht","toast.delete_failed":"Löschen fehlgeschlagen: {err}","toast.error":"Fehler: {err}","toast.toggle_target_unavailable":"Ziel „{name}“ ist nicht verfügbar — keine Aktion durchgeführt","toast.toggle_targets_unavailable":"Ziele nicht verfügbar: {names}. Keine Aktion durchgeführt","toast.file_failed":'Datei "{name}" wurde nicht hochgeladen: {err}',"toast.files_attached":"Dateien angehängt: {n}","err.unknown":"unbekannter Fehler","err.code":"Code {code}","err.too_large":"Datei größer als {mb} MB","err.bad_ext":"nicht unterstützter Typ (PDF/Bild erwartet)","err.unauthorized":"Administratorrechte erforderlich","editor.title":"Titel","editor.default_floor":"Anfangsbereich","editor.default_floor_missing":"Anfangsbereich „{id}“ existiert nicht mehr. Wählen Sie einen anderen Bereich.","editor.floor":"Fester Bereich","editor.floor_none":"— nicht fest —","editor.floor_index":"YAML-Index {index} (beibehalten)","fixed_floor.loading":"Lade den festen Bereich…","fixed_floor.invalid_title":"Der feste Bereich ist nicht verfügbar","fixed_floor.invalid_body":"Überprüfen Sie die Etage in der Kartenkonfiguration. Der konfigurierte Wert ist: {value}","editor.icon_size":"Symbolgröße, % der Planbreite","editor.show_temperature":"Temperatur anzeigen","editor.live_states":"Live-Zustände (ein/aus, offen…)","editor.light_pools":"Lichtkegel und Wandschatten","editor.show_signal":"Zigbee-Signal anzeigen (LQI)","editor.language":"Schnittstellensprache","editor.lang_auto":"Automatisch (HA-Profil)","title.icon_rules":"Symbolregeln: welche MDI-Symbole Geräte nach Namen erhalten","rules.title":"Symbolregeln","rules.hint":'Regeln werden von oben anhand von "Gerätename + Modell" (Großschreibungs-unempfindliches Regex) überprüft; das erste Match gewinnt. Wenn nichts übereinstimmt, entscheidet die Entität-Geräteklasse, dann das generische Chip-Symbol.',"rules.pattern_ph":"regex, z. B. Stecker|Steckdose","rules.icon_ph":"mdi:power-socket-de","rules.add":"Regel hinzufügen","rules.reset":"Zurücksetzen auf Standardeinstellungen","rules.test_ph":"Versuch mal einen Gerätenamen...","rules.invalid":"ungültiges regex","rules.saved":"Icon-Regeln gespeichert","btn.up":"Nach oben","btn.down":"Nach unten","tap.info":"Gerätekarte","tap.more_info":"HA Mehr-Info-Dialog","tap.toggle":"Zustand umschalten","marker.tap_label":"Tap-Aktion für dieses Gerät","tap.toggle_note":"Der aufgelöste Zustand ist unten dargestellt. Sichere Geräte werden niemals aus dem Plan umgeschaltet.","import.title":"Bereiche aus HA-Etagen erstellen","import.hint":"Home Assistant kennt diese Etagen bereits. Die Etagen auswählen, die zu Planbereichen werden sollen; anschließend für jeden Bereich einen Grundriss hochladen. Die Räume werden danach von Hand eingezeichnet.","import.start":"{n} Bereich(e) erstellen","import.manual":"Von Grund auf neu starten","import.progress":"Etage {i} von {n}","import.done":"Bereiche erstellt. Räume einzeichnen: Rasterpunkte anklicken und die Kontur schließen.","btn.skip":"Überspringen","space.scale_label":"Maßstab (Rasterzellen-Größe)","space.cell_cm.help":"Verknüpft das Raster mit realen Abmessungen: Davon hängen Längen und Flächen, Wandstärken, Öffnungsgrößen und der Leuchtradius ab. Eine spätere Änderung verändert die berechneten Abmessungen des gesamten Bereichs, verschiebt aber keine Punkte im Plan.","space.cell_cm.help.aria":"Hilfe: Maßstab des Bereichs","space.scale_unit":"cm pro Zelle","space.scale_unit_imperial":"Zoll pro Zelle","space.display_section":"Anzeige","space.show_borders":"Raumgrenzen immer anzeigen","space.zero_wall_style":"Wände ohne Dicke","space.zero_wall_style.help":"Gestrichelte Wände ohne Dicke lassen Glow und Sonnenstrahlen durch, durchgezogene blockieren sie als Barriere ohne Fläche. Die Auswahl gilt für alle solchen Wände im Bereich, auch wenn ihre Linie in der Ansicht ausgeblendet ist.","space.zero_wall_style.help.aria":"Hilfe: Darstellung der Wände ohne Dicke","space.zero_wall_dashed":"Gestrichelt","space.zero_wall_solid":"Durchgezogen","space.show_names":"Raumnamen anzeigen (zum Verschieben ziehen)","space.room_color":"Farbe der Begrenzung & des Namens","space.opacity":"Deckkraft","space.fill_label":"Raumausfüllung","space.fill_mode.help":"„Eigene Farbe“ gestaltet den Bereich; „Licht“, „Temperatur“ und „LQI“ verwenden aktuelle Daten aus Home Assistant. Glow wird separat aktiviert.","space.fill_mode.help.aria":"Hilfe: Modus der Raumausfüllung","fill.none":"Keine","fill.lqi":"Zigbee-Signal","fill.light":"Lichter","fill.custom":"Benutzerdefinierte Farbe","space.custom_fill":"Füllfarbe","space.source_file":"Ich habe einen Grundriss als Bild","space.source_draw":"Kein Bild – ich werde die Räume von Hand umreißen","fill.temp":"Temperatur","tip.temp_avg":"Durchschnittstemperatur:","tip.hum_avg":"Durchschnittliche Luftfeuchtigkeit:","space_card.button":"Grundriss öffnen","space_card.not_found":"Bereich „{id}“ nicht gefunden","space_card.loading":"Laden…","continuity.restore_plan":"Grundriss wiederherstellen…","continuity.restore_connection":"Geräteverbindung wiederherstellen…","continuity.retry":"Erneut versuchen","editor.space":"Bereich","editor.framing":"Bildausschnitt","editor.fit_content":"Alle sichtbaren Inhalte","editor.fit_house":"Eng an der Hausgeometrie","editor.show_button":"Schaltfläche anzeigen","editor.button_label":"Beschriftung der Schaltfläche","editor.button_target":"Ziel-Dashboard-Pfad","marker.sub_entity":"Entität","title.general_settings":"Allgemeine Einstellungen","title.export_pdf":"Als PDF speichern","pdf.title":"Als PDF speichern","pdf.dimensions":"Maße und Flächen anzeigen","pdf.decor":"Möbel und weitere Dekoration anzeigen","pdf.room_names":"Raumnamen anzeigen","pdf.backdrop":"Hintergrund anzeigen","pdf.save":"Speichern","pdf.saving":"Wird erstellt…","pdf.failed":"Die PDF-Datei konnte nicht erstellt werden.","pdf.too_large":"Die Bilder überschreiten das PDF-Limit von 25 MB.","pdf.asset_failed":"Ein Hintergrund- oder Dekorbild konnte nicht geladen werden.","pdf.scale":"Maßstab 1:{n}","pdf.north":"Nord","gs.title":"Allgemeine Einstellungen","gs.light_group":"Füllung: Licht","gs.light_on":"Lichter an","gs.light_off":"Alle Lichter aus","gs.temp_group":"Füllung: Temperatur","gs.temp_cold":"Kalt","gs.temp_ok":"Angenehm","gs.temp_hot":"Heiß","gs.lqi_group":"Füllung: Zigbee-Signal","gs.lqi_low":"Schwaches Signal","gs.lqi_high":"Starkes Signal","gs.reset":"Auf Standard zurücksetzen","gs.saved":"Allgemeine Einstellungen gespeichert","gs.radar_show_live":"Live-Präsenz auf dem Plan anzeigen","gs.radar_show_live_hint":"Blendet alle Live-Radarziele ein oder aus. Eine Beobachtungsaufzeichnung wird dadurch weder gestartet noch beendet.","radar.title":"Präsenz auf dem Plan","radar.help":"Verbinde diese Markierung mit exakten Home-Assistant-Radarentitäten und wähle Position sowie Koordinatenprofil. Live-Positionen werden auf den ausgewählten Raum begrenzt.","radar.help.aria":"Hilfe: Einstellungen des Präsenzradars","radar.enabled":"Dieses Präsenzradar verwenden","radar.show_live":"Live-Ziele anzeigen","radar.configure":"Radar konfigurieren","radar.configure_on_plan":"Auf dem Plan konfigurieren","radar.change_installation":"Installation ändern","radar.no_contour":"Dieser Raum hat keine Begrenzung. Radarpunkte werden nicht zugeschnitten.","radar.discard_setup_title":"Radareinrichtung verwerfen?","radar.discard_setup":"Die nicht gespeicherte Radareinrichtung geht verloren.","radar.step_place_mount":"Markieren Sie die physische Sensorposition","radar.step_place_heading":"Markieren Sie einen Punkt direkt vor dem Sensor","radar.step_reference":"Markieren Sie Referenzposition {n} und starten Sie die Messung","radar.step_check_reference":"Markieren Sie eine unabhängige Prüfposition","radar.start_measure":"Messung starten","radar.countdown":"Stellen Sie sich in {seconds} s auf die Markierung","radar.capturing":"Bleiben Sie während der Messung allein und ruhig…","radar.fit_ready":"Kalibrierung ist bereit","radar.check_third":"An einer weiteren Position prüfen","radar.check_complete":"Unabhängige Prüfung abgeschlossen","radar.error_distance":"Positionsabweichung: {distance}","radar.ambiguous_target":"Mehr als ein Ziel wurde gemeldet. Wiederholen Sie die Messung allein.","radar.insufficient_samples":"Nicht genügend aktuelle Koordinaten. Wiederholen Sie die Messung oder richten Sie sie manuell ein.","radar.bad_references":"Wählen Sie getrennte Referenzen in verschiedenen Richtungen vom Sensor.","radar.ambiguous_sources":"Die Messungen lassen zwei gleich plausible Richtungen zu. Wählen Sie Referenzpunkte, die links und rechts unterscheiden.","radar.bad_fit":"Die Messungen stimmen nicht überein. Prüfen Sie Einheiten, Sensorposition und Referenzen.","radar.desktop_hint":"Verwenden Sie für eine präzise Einrichtung einen Computer. Die Bearbeitung auf Touch-Geräten ist nur eingeschränkt verfügbar.","radar.detected":"House Plan hat Radarmetadaten erkannt. Prüfe vor dem Speichern die exakten Quellen.","radar.detected_ld2450":"House Plan hat ESPHome-LD2450-Koordinaten erkannt. Prüfe vor dem Speichern die X/Y-Quellen.","radar.additional_actions":"Weitere Aktionen","radar.declare":"Dies ist ein Präsenzradar","radar.profile":"Datenprofil","radar.profile_esphome_ld2450_v1":"ESPHome LD2450 (X/Y-Ziele)","radar.profile_cartesian_v1":"Kartesische Ziele (X/Y)","radar.profile_polar_v1":"Polares Ziel (Entfernung/Winkel)","radar.profile_range_v1":"Nur Entfernung","radar.profile_zones_v1":"Zustände von Zonen","radar.profile_presence_v1":"Nur Präsenz","radar.room":"Radarraum","radar.room_choose":"Raum auswählen","radar.target":"Ziel {n}","radar.axis_x":"Entität für X-Koordinate","radar.axis_y":"Entität für Y-Koordinate","radar.add_target":"Zielplatz hinzufügen","radar.range_channel":"Entfernungskanal {n}","radar.add_range":"Entfernungskanal hinzufügen","radar.presence_gate":"Präsenz-Entität für den Kanal","radar.swap_axes":"X- und Y-Achse vertauschen","radar.axis_x_sign":"X-Richtung","radar.axis_y_sign":"Y-Richtung","radar.distance_source":"Entfernungsentität","radar.angle_source":"Winkelentität","radar.angle_unit":"Winkeleinheit","radar.degrees":"Grad","radar.radians":"Radiant","radar.angle_zero":"Richtung des Nullwinkels","radar.angle_forward":"Vorwärts","radar.angle_right":"Rechts","radar.angle_clockwise":"Winkel wachsen im Uhrzeigersinn","radar.zone_source":"Zonenentität","radar.occupancy_source":"Präsenzentität","radar.count_source":"Entität für Zielanzahl","radar.availability_source":"Verfügbarkeitsentität","radar.source_choose":"Entität auswählen","radar.source_optional":"Optional","radar.source_missing":"derzeit nicht verfügbar","radar.saved_unsupported":"Diese gespeicherte Radar-Konfiguration wird nicht unterstützt oder ist unvollständig. Sie bleibt inaktiv; entfernen Sie sie oder aktualisieren Sie House Plan vor der erneuten Einrichtung.","radar.occupancy":"Präsenz (an/aus)","radar.count":"Anzahl","radar.mount":"Position und Richtung","radar.mount_hint":"Dies ist die physische Sensorposition. Das Verschieben des dekorativen Markers ändert sie nicht.","radar.heading":"Richtung, °","radar.range_cm":"Reichweite, cm","radar.fov_deg":"Sichtfeld, °","radar.unit":"Einheit der Quelle","radar.mirror":"Links-/Rechtsachse spiegeln","radar.remove":"Radareinstellungen entfernen","radar.invalid":"Fülle Raum, Quellen und Position des Radars vor dem Speichern aus.","radar.check_sources":"Live-Daten prüfen","radar.checking":"Wird geprüft…","radar.health":"Verbindungsstatus","radar.live_summary":"Aktuelle Ziele: {targets}; Entfernungsbögen: {ranges}","radar.health_ok":"Aktuelle Daten empfangen","radar.health_off":"Keine Ziele erkannt","radar.health_stale":"Ein Teil der Koordinaten ist veraltet","radar.health_partial":"Einige Quellen sind aktuell, andere veraltet","radar.health_restricted":"Der Zugriff auf eine oder mehrere Quellen ist eingeschränkt","radar.health_incomplete":"Der aktuelle Radarbericht ist unvollständig","radar.health_position_unavailable":"Präsenz gemeldet; aktuelle Position nicht verfügbar","radar.health_unavailable":"Sensordaten nicht verfügbar","radar.health_needs_setup":"Installation muss eingerichtet werden","radar.health_inconsistent":"Die Quellen melden widersprüchliche Daten","radar.health_unknown":"Aktueller Zustand ist unbekannt","radar.health_disabled":"Radar ist deaktiviert","radar.error_invalid_radar":"Prüfe die Radareinstellungen.","radar.error_invalid_selection":"Wähle einen vorhandenen Raum und gültige Quellen.","radar.error_source_restricted":"Du hast nicht auf alle ausgewählten Quellen Zugriff.","radar.error_rate_limited":"Zu viele Anfragen. Versuche es gleich noch einmal.","radar.error_not_ready":"Die Radarverarbeitung ist noch nicht bereit.","radar.error_conflict":"Der Plan wurde geändert. Öffnen Sie die Radareinrichtung erneut und versuchen Sie es noch einmal.","radar.error_source_unavailable":"Mindestens eine ausgewählte Radarquelle ist nicht verfügbar.","radar.error_unsupported_capability":"Diese Radarfunktion wird von der installierten Integration nicht unterstützt.","radar.report_age":"vor {seconds} s","space.show_lqi":"Zigbee-Signal (LQI) neben Geräten anzeigen","space.hide_decor":"Dekorationsschicht ausblenden","space.hide_decor_tip":"Linien, Formen, Beschriftungen und Möbel bleiben an ihrem Platz — im Hintergrundeditor sichtbar, aber nicht auf dem Plan.","space.hide_openings":"Öffnungen ausblenden","space.hide_openings_tip":"Tür-, Fenster- und Tor-Symbole werden nicht gezeichnet, aber die Öffnungen funktionieren weiterhin: Licht fällt hindurch, die Sonne kommt durch ein Fenster herein, Kontaktsensoren öffnen sie weiterhin. Der Planeditor zeigt sie immer an.","gs.light_none":"Keine Lichtquellen","mode.plan":"Planeditor","mode.devices":"Geräteeditor","display.value":"Wert + Zustand","marker.subarea":"kein Bereich, manuell","device.new":"Neues Gerät — Editor öffnen, um zu schließen","opening.unlock_action":"Entsperren","opening.lock_action":"Sperren","opening.lock_pending":"Wird ausgeführt…","title.close_editor":"Editor schließen (zur Ansicht zurück)","title.add_device":"Gerät zum Plan hinzufügen","devbar.add":"Hinzufügen","devbar.rules":"Symbolregeln","device_inbox.button":"Geräte","device_inbox.title":"Geräte auf dem Plan","device_inbox.search":"Geräte, Entitäten und Integrationen suchen…","device_inbox.add_virtual":"Virtuelles Gerät hinzufügen","device_inbox.tab_on_plan":"Auf Plan","device_inbox.tab_available":"Verfügbar","device_inbox.tab_hidden":"Versteckt","device_inbox.tab_readd":"Wieder verfügbar","device_inbox.only_new":"Nur neu","device_inbox.show_entities":"Entitäten anzeigen","device_inbox.show_hidden":"Versteckte auf Plan anzeigen","device_inbox.show_hidden.help":"Zeigt ausgeblendete und deaktivierte Marker vorübergehend als Bearbeitungs-Geister auf dem Plan. Die gespeicherte Sichtbarkeit der Geräte bleibt unverändert.","device_inbox.show_hidden.help.aria":"Hilfe: ausgeblendete Geräte auf dem Plan anzeigen","device_inbox.new":"Neu","device_inbox.find":"Auf dem Plan finden","device_inbox.edit":"Bearbeiten","device_inbox.hide":"Ausblenden","device_inbox.show":"Anzeigen","device_inbox.add":"Hinzufügen","device_inbox.readd":"Wieder hinzufügen","device_inbox.hide_available":"Aus der Liste ausblenden","device_inbox.show_more":"Mehr anzeigen","device_inbox.more_actions":"Weitere Aktionen","device_inbox.find_hidden_hint":"Zuerst „Versteckte auf Plan anzeigen“ aktivieren","device_inbox.show_disabled":"Diese Bindung in Home Assistant aktivieren, bevor sie angezeigt wird","device_inbox.empty_on_plan":"Es befinden sich noch keine passenden Geräte auf dem Plan.","device_inbox.empty_available":"Es sind keine Geräte zum Hinzufügen verfügbar.","device_inbox.empty_hidden":"Es gibt keine versteckten Geräte.","device_inbox.empty_readd":"Es sind keine entfernten Geräte verfügbar, um sie erneut hinzuzufügen.","device_inbox.reason_visible_auto":"Automatisch erkannt","device_inbox.reason_visible_explicit":"Explizit hinzugefügt","device_inbox.reason_manual_hidden":"Vom Benutzer versteckt","device_inbox.reason_automatic_hidden":"Automatisch versteckt","device_inbox.reason_service_entry":"Nur Service-Registry-Eintrag","device_inbox.reason_excluded_integration":"Integration „{integration}“ durch Erkennungsfilter ausgeschlossen","device_inbox.reason_excluded_domain":"Nicht-räumlicher Entitätstyp","device_inbox.reason_grouped_light":"Dargestellt durch eine Raumlichtgruppe","device_inbox.reason_represented_by_parent":"Dargestellt durch sein übergeordnetes Gerät","device_inbox.reason_removed":"Zuvor aus dem Plan entfernt","device_inbox.reason_available":"Zum Hinzufügen zum Plan verfügbar","device_inbox.reason_no_bound_room":"HA-Bereich ist nicht mit einem Planraum verknüpft","device_inbox.status_ha_disabled":"In Home Assistant deaktiviert","device_inbox.status_orphaned":"Bindung ist in Home Assistant nicht mehr vorhanden","device_inbox.status_unverified":"Home Assistant-Register vorübergehend nicht verfügbar","device_inbox.saved":"Geräteliste aktualisiert","device_inbox.filters_excluded":"Ausgeschlossene Integrationen","device_inbox.filters_group_lights":"Raumleuchten zu einem Marker gruppieren","device_inbox.filters_preview_appear":"erscheint: {count}","device_inbox.filters_preview_hide":"verschwindet: {count}","device_inbox.filters_preview_lights":"betroffene Leuchten: {count}","device_inbox.filters_reset":"Empfohlene wiederherstellen","device_inbox.filters_save":"Filter speichern","device_inbox.filters_search_ph":"Integration hinzufügen…","device_inbox.filters_title":"Erkennungsfilter","space.roomcard_section":"Raumkarte zeigt:","space.label_temp":"Temperatur","space.label_hum":"Luftfeuchtigkeit","space.label_lqi":"Durchschnittliches Zigbee-Signal","space.label_light":"Lichter ein/aus","roomcard.light_on":"Ein","roomcard.light_off":"Aus","roomcard.light_partial":"{on} von {total}","toast.split_pick_inside":"Zwischenliegende Schnittpunkte müssen innerhalb des Raumes liegen","mode.decor":"Hintergrundeditor","decor.select":"Auswählen","decor.line":"Linie","decor.rect":"Rechteck","decor.ellipse":"Oval","decor.text":"Text","decor.erase":"Löschen","decor.erase_confirm_title":"Objekt löschen?","decor.color":"Farbe","decor.width":"Linienbreite","decor.line_style":"Linienstil","decor.line_style_solid":"Durchgehend","decor.line_style_dashed":"Gepunktet","decor.fill":"Füllen","decor.fill_color":"Füllfarbe","decor.length":"Länge","decor.size":"Größe","decor.flip_h":"Horizontal spiegeln","decor.flip_v":"Vertikal spiegeln","decor.angle":"Rotationswinkel, °","decor.text_size":"Textgröße","decor.backdrop_properties":"Eigenschaften des Planhintergrunds","decor.text_title":"Textbeschriftung","decor.object_title":"{kind} bearbeiten","decor.text_label":"Text","decor.live_group":"HA-Variable einfügen","decor.live_entity":"Entität","decor.live_entity_ph":"Wählen Sie eine Entität","decor.live_attr":"Wert","decor.live_attr_ph":"Wählen Sie Status oder Attribut","decor.live_state":"Status","decor.backdrop":"Hintergrundbild","decor.backdrop_hint":"Ziehen zum Verschieben; eine Ecke ziehen zum Größenändern; den oberen Griff zum Drehen verwenden. Shift ändert das Verhältnis oder befreit den Winkel.","decor.backdrop_reset":"Bild zurücksetzen","decor.backdrop_reset_done":"Das Bild ist wieder an seinem ursprünglichen Platz und in seiner ursprünglichen Größe","marker.icon_auto":"Auto: {icon} (nach Symbolregeln; wählen Sie eines zur Überschreibung)","marker.icon_pin_auto":"Anheften","mode.plan_tip":"Planungseditor — die Geometrie des Hauses: Räume zeichnen und teilen/zusammenführen, sie mit HA-Bereichen verbinden, Türen, Fenster und Tore platzieren, Raumkarten verschieben, Maßstab festlegen","mode.devices_tip":"Geräteeditor — alles über Symbole: ziehen zum Positionieren, klicken zum Bearbeiten von Bindung/Symbol/Anzeige, virtuelle Geräte hinzufügen, Symbolregeln","mode.decor_tip":"Hintergrundeditor — rein visuelle Dekoration unter dem Plan: Linien, Rechtecke, Ellipsen und Textbeschriftungen, die niemals auf Klicks reagieren","space.glow_enabled":"Lichtquellen-Glühen","gs.glow_group":"Glow von Lichtquellen","gs.glow_base":"Grunddunkelheit des Hauses","gs.glow_light":"Standardlichtfarbe / Intensität","gs.wall_group":"Wände","gs.wall_fill":"Wandfüllung","gs.glow_radius":"Glow-Radius","gs.glow_radius.help":"Legt den allgemeinen Radius des Lichtscheins in Metern oder Fuß fest; ein gerätespezifischer Radius überschreibt diesen Wert.","gs.glow_radius.help.aria":"Hilfe: allgemeiner Glow-Radius","gs.unit_m":"m","gs.unit_ft":"ft","marker.controls_label":"Steuert andere Lichtquellen","marker.controls.help":"Mit der Aktion „Zustand umschalten“ werden die aufgeführten Quellen zusammen mit diesem Marker umgeschaltet. Ihr Glow bleibt an ihren eigenen Markern, und die Verknüpfung allein macht den steuernden Marker nicht zur Lichtquelle.","marker.controls.help.aria":"Hilfe: andere Lichtquellen steuern","marker.controls_filter":"Suchlichter und Schalter…","info.controls":"Steuerungen","marker.glow_radius_label":"Leuchtradius","marker.glow_radius.help":"Legt den Leuchtradius in Metern oder Fuß fest; ein leerer Wert verwendet den Radius aus den allgemeinen Einstellungen.","marker.glow_radius.help.aria":"Hilfe: Leuchtradius","markup.wallthick":"Dicke","markup.select":"Auswählen","title.markup_wallthick":"Dicke — klicken Sie auf eine Wand, um ihre Dicke von 0 bis 100 cm festzulegen.","markup.hint_wallthick":"klicken Sie auf eine Wand · Esc schließt ohne Anwendung","wallthick.field":"Dicke","wallthick.unit_cm":"cm","wallthick.unit_in":"in","wallthick.apply_room":"Auf alle Wände dieses Raums anwenden","markup.draw_wall_title":"Dicke jedes neuen Wandsegments (0–100 cm). Gemeinsame Wände behalten den bestehenden Wert.","room.queue_progress":"Raum {current} von {total}","toast.wall_rooms_saved":"Erstellte Räume: {n}","toast.wall_chain_saved":"Wandkette gespeichert","toast.wallthick_pick":"Eine Wand anklicken","toast.wallthick_set":"Wandstärke eingestellt","toast.wallthick_cleared":"Wandstärke entfernt","toast.physical_range":"Einen Wert von {min} bis {max} {unit} eingeben","toast.zero_wall_opening_conflict":"Entfernen Sie zuerst die Öffnung an diesem Wandsegment.","toast.zero_wall_ambiguous":"Das Wandsegment ist mehrdeutig. Vereinfachen oder passen Sie den Anschluss an.","toast.zero_wall_migration_blocked":"Der Bereich wurde nicht konvertiert: {reason}. Es wurden keine Daten geändert.","toast.physical_angle":"Einen Drehwinkel von 0° bis unter 90° eingeben","toast.physical_limit":"Der Bereich hat das Limit für diesen Geometrietyp erreicht","toast.geometry_unsafe":"Änderung abgebrochen: Wandgeometrie konnte nicht sicher erstellt werden.","junction.limit_angle":"Der Winkel zwischen den Wänden ist zu spitz: {actual}°, mindestens {limit}°.","junction.limit_valence":"Zu viele Wände treffen in einem Knoten aufeinander: {actual}, maximal {limit}.","junction.limit_length":"Das Wandsegment ist zu kurz: {actual} cm, mindestens {limit} cm.","junction.limit_distance":"Wände und Knoten sind zu dicht beieinander: {actual} cm, Minimum {limit} cm.","junction.limit_clearance":"Kein Wohnbereich ist übrig: {actual} cm², Minimum {limit} cm².","junction.limit_check_failed":"Die Überprüfung der Verbindungen konnte nicht durchgeführt werden — die Änderung wurde nicht gespeichert.","toast.wall_model_migration_blocked":"Das Wandmodell konnte nicht aktualisiert werden: {reason}. Der Plan wurde nicht geändert. Führen Sie „Pläne optimieren“ aus; wenn der Fehler erneut auftritt, beheben Sie die widersprüchliche Wandgeometrie.","toast.wall_model_client_outdated":"Aktualisieren Sie die Karte und laden Sie die Seite neu, bevor Sie den Plan bearbeiten.","wall_model.reason.invalid-room":"ungültiger Raumkontur","wall_model.reason.zero-length":"Wandsegment mit null Länge","wall_model.reason.third-owner":"Wand, die von mehr als zwei Räumen geteilt wird","wall_model.reason.duplicate-id":"widersprüchliche Wandkennungen","wall_model.reason.thickness-conflict":"widersprüchliche Wandstärkenwerte","wall_model.reason.opening-host":"Öffnung kann nicht einer Wand zugewiesen werden","toast.delete_room_pick":"Klicken Sie in den Raum, den Sie löschen möchten","toast.plan_snap_ambiguous":"Zoomen Sie hinein, um den Wandknoten auszuwählen","toast.wall_repair_ambiguous":"Der Raumumriss hat mehr als eine mögliche Verbindung. Zoomen Sie hinein und verbinden Sie ihn explizit.","toast.wall_repair_too_large":"Die Lücke ist größer als 2 cm. Verbinden Sie die Wände, bevor Sie den Raum erstellen.","toast.wall_repair_changed":"Die Wandgeometrie hat sich geändert. Versuchen Sie erneut, den Raum zu erstellen.","toast.opening_on_zero_wall":"Öffnungen können nicht auf einer Wand mit null Dicke sitzen.","marker.from_ha_option":"Wählen Sie aus der HA-Liste.","marker.show_entities":"Entitäten anzeigen.","marker.show_entities_tip":"Fügt nicht nur Geräte zur Liste hinzu, sondern auch alle ihre Entitäten.","marker.pick_ph":"Wählen Sie ein Gerät…","room.open_area":"Öffnen Sie den HA-Bereich.","room.fit_action":"Raum {name} einpassen","view.volumetric":"Volumetrische Ansicht.","view.flat":"Flache Ansicht.","kiosk.title":"Die Größen dieses Bildschirms.","kiosk.hint":"Nur auf diesem Gerät gespeichert – jedes Wandtablet oder TV kann seine eigenen komfortablen Größen haben.","kiosk.icon_scale":"Gerätesymbolgröße.","kiosk.font_scale":"Textgröße der Raumkarte.","editor.kiosk":"Wandgeräte- (Kiosk-)Modus.","editor.cycle":"Bereiche automatisch alle N Sekunden wechseln (Kiosk, 0 = aus)","room.settings_title":"Raumeinstellungen.","room.settings_section":"Raumeinstellungen (überschreibt den Bereich)","room.fill_label":"Diesen Raum ausfüllen","fill.inherit":"Als den Bereich","room.custom_fill_space":"Bereichsfarbe","room.custom_fill_own":"Raumfarbe","room.temp_range_label":"Komfortbereich","room.temp_range_min":"Untere Grenze der Komforttemperatur","room.temp_range_max":"Obere Grenze der Komforttemperatur","room.temp_range_reset":"Wie im Bereich","room.temp_range.help":"Dieser Bereich gilt nur für diesen Raum. Leere Felder übernehmen die jeweilige Grenze des Bereichs; sind die Grenzen vertauscht, verwendet House Plan den kleineren Wert als Untergrenze und den größeren als Obergrenze.","room.temp_range.help.aria":"Informationen zum Komfortbereich des Raums","room.temp_src_label":"Temperaturquelle","room.hum_src_label":"Luftfeuchtigkeitsquelle","room.src_average":"Durchschnitt über die Sensoren des Raums (Standard)","room.src_pick":"Ein bestimmtes HA-Gerät oder Entität","room.src_ph":"Quelle wählen…","toast.room_updated":"Raum aktualisiert","space.card_font":"Schriftgröße der Raumkarte (gesamter Bereich)","room.sizes_section":"Schriftgrößen","room.name_scale":"Raumname Größe","room.label_scale":"Metrikgröße","preview.room_name":"Wohnzimmer","toast.cfg_reload_failed":"Der Plan konnte nicht vom Server neu geladen werden: {err}","toast.locale_load_failed":"Das Sprachpaket konnte nicht geladen werden. Bis zum Neuladen der Seite wird Englisch verwendet.","toast.furniture_art_load_failed":"Die Möbelzeichnungen konnten nicht geladen werden. Laden Sie die Seite neu, um sie anzuzeigen.","room.settings_short":"Raumeinstellungen","room.unnamed":"Unbenannter Raum","marker.use_climate_temp":"Geräte-Temperatur im Raum berücksichtigen","marker.use_climate_temp_tip":"Fügt die aktuelle Temperatur einer Klimaanlage oder eines Thermostats zum Raumdurchschnitt hinzu. Das externe Wert-Label unten separat konfigurieren.","marker.value_badge_title":"Wert-Label","marker.value_badge.help":"Zeigt einen ausgewählten Wert neben dem Symbol an. Dies beeinflusst nicht die Raumkennzahlen, Licht, Glanz oder die Tippaktion.","marker.value_badge.help.aria":"Hilfe: Gerätewert-Badge","marker.value_badge_enabled":"Zeige ein Wert-Badge","marker.value_badge_source":"Wert","marker.value_badge_source.help":"Wählen Sie einen bestimmten Zustand, ein unterstütztes Attribut oder einen abgeleiteten Wert dieses Geräts.","marker.value_badge_source.help.aria":"Hilfe: Quelle des Wert-Badges","marker.value_badge_position":"Position","marker.value_badge_position.help":"Die gewählte Seite bleibt fest und dreht sich nicht automatisch an einem Planrand.","marker.value_badge_position.help.aria":"Hilfe: Position des Wert-Badges","marker.value_badge_right":"Rechts","marker.value_badge_bottom":"Unten","marker.value_badge_left":"Links","marker.value_badge_top":"Oben","marker.value_badge_empty":"Für dieses Gerät stehen keine Werte zur Verfügung","marker.value_badge_static":"Ein statisches Symbol zeigt keine Live-Werte an. Die Einstellung wird beibehalten.","marker.value_badge_missing":"Quelle nicht verfügbar","marker.value_badge_missing_hint":"Die gespeicherte Quelle ist derzeit nicht verfügbar. Behalten Sie sie bei, deaktivieren Sie das Badge oder wählen Sie einen anderen Wert.","marker.value_badge_duplicate":"Derselbe Wert wird bereits im Symbol angezeigt.","marker.value_badge_state":"Status · {name}","marker.value_badge_marker_state":"Lichtquellstatus · {name}","marker.value_badge_lqi":"Durchschnittliche Zigbee-Signalqualität","marker.value_badge_attr_current_temperature":"Aktuelle Temperatur · {name}","marker.value_badge_attr_temperature":"Zieltemperatur · {name}","marker.value_badge_attr_current_humidity":"Aktuelle Luftfeuchtigkeit · {name}","marker.value_badge_attr_humidity":"Luftfeuchtigkeit · {name}","marker.value_badge_attr_current_position":"Position · {name}","marker.value_badge_attr_percentage":"Geschwindigkeit · {name}","marker.value_badge_attr_brightness":"Helligkeit · {name}","marker.value_badge_attr_volume_level":"Lautstärke · {name}","marker.value_badge_attr_battery_level":"Batterie · {name}","marker.value_badge_attr_fan_speed":"Lüftergeschwindigkeit · {name}","marker.value_source":"Wertquelle","marker.value_source.help":"Wähle den Wert, der das Symbol ersetzt. Die Tipp-Aktion bleibt unverändert.","marker.value_source.help.aria":"Hilfe: Wertquelle in der Gerätefläche","marker.value_source_auto":"Automatisch (wie bisher)","marker.value_source_missing_hint":"Die gespeicherte Quelle ist derzeit nicht verfügbar. Bis sie wieder verfügbar ist oder ein anderer Wert gewählt wird, zeigt die Fläche —.","marker.light_role_label":"Ist dieses Gerät eine Lichtquelle?","marker.light_role.help":"„Auto“ verwendet die ermittelte Rolle des verknüpften Geräts, „Immer“ erzwingt eine eigene Quelle und „Nie“ schließt sie aus; oben verknüpfte Lichter bleiben unabhängig.","marker.light_role.help.aria":"Hilfe: ob dieses Gerät eine Lichtquelle ist","marker.light_role_auto_yes":"Automatisch (Lichtquelle)","marker.light_role_auto_no":"Automatisch (keine Lichtquelle)","marker.light_role_always":"Immer eine Lichtquelle","marker.light_role_never":"Nie eine Lichtquelle","marker.light_entity_label":"Führende Lichtereinheit","marker.light_entity.help":"Für ein Verbundgerät wählen Sie die Entität, deren Zustand, Farbe und Helligkeit diese Planquelle darstellen. Der automatische Rückgriff bleibt mit älteren Plänen kompatibel.","marker.light_entity.help.aria":"Hilfe: führende Lichtentität","marker.light_entity_auto":"Automatisch ({entity})","marker.light_entity_none":"keine steuerbare Entität","marker.light_entity_missing":"Die gespeicherte Entität {entity} ist nicht verfügbar. House Plan verwendet vorübergehend {fallback}; die gespeicherte Auswahl wird wiederhergestellt, wenn sie zurückkehrt.","marker.toggle_entity_label":"Zu toggelnde Entität","marker.toggle_entity.help":"Für ein Verbundgerät wählen Sie das genaue eigene Licht oder den Schalter, der durch Tippen bedient wird. Automatisch behält die vorherigen Zielregeln bei und ist unabhängig von der führenden Lichtentität.","marker.toggle_entity.help.aria":"Hilfe: zu toggelnde Entität","marker.toggle_entity_auto":"Automatisch ({entity})","marker.toggle_entity_none":"keine eigene steuerbare Entität","marker.toggle_entity_missing":"Die gespeicherte Entität {entity} ist nicht mehr unter den auswählbaren Kanälen dieses Markers. House Plan verwendet vorübergehend {fallback}; die gespeicherte Auswahl wird wiederhergestellt, wenn sie zurückkehrt.","marker.glow_color_label":"Leuchtfarbe und Helligkeit","marker.glow_mode.help":"Verwenden Sie Live-Quellwerte, überschreiben Sie nur deren Farbe oder fixieren Sie sowohl Farbe als auch Helligkeit. Das Minimum beträgt 1 %; um die Quelle zu deaktivieren, wählen Sie „Nie“.","marker.glow_mode.help.aria":"Hilfe: Leuchtfarbe und Helligkeit","marker.glow_mode_auto":"Von Quelle","marker.glow_mode_color":"Farbe einstellen","marker.glow_mode_fixed":"Farbe und Helligkeit einstellen","marker.glow_color":"Leuchtfarbe","marker.glow_brightness":"Helligkeit","marker.glow_disabled_never":"Leuchteinstellungen sind nicht verfügbar, da dieser Marker ausdrücklich keine Lichtquelle ist.","marker.glow_disabled_auto":"Im Automatikmodus wurde keine räumliche Lichtquelle für diesen Marker gefunden.","marker.glow_disabled_no_entity":"Keine aktive steuerbare Home Assistant-Entität ist für diese räumliche Quelle verfügbar.","marker.glow_passive_hint":"Diese Quelle hat keine eigenen Home Assistant-Daten. Stellen Sie ihre Farbe und Helligkeit manuell ein; ihr Radius bleibt verfügbar.","marker.control_broken":"Gespeicherte Quelle fehlt oder ist nicht mehr als Licht markiert","marker.control_missing_label":"Fehlendes Planlicht","marker.control_passive":"passive Quelle","toast.marker_control_cycle":"Dieser Link würde eine kreisförmige Kette von Lichtsteuerungen erzeugen.","toast.marker_binding_required":"Wählen Sie ein Home Assistant-Gerät, bevor Sie eine andere Lichtquelle verlinken.","confirm.unlock_title":"Schloss öffnen?","confirm.unlock_body":"House Plan sendet einen Befehl zum Öffnen an dieses Schloss.","toast.files_migrate_failed":"Anhänge konnten nicht zur neuen Bindung verschoben werden, Links zeigen weiterhin auf die alten Dateien: {err}","space.pick_saved":"Bereits hochgeladen","space.pick_saved_hint":"Auf dem Server gespeicherte Pläne, einschließlich solcher, die Sie zuvor getrennt haben","space.no_saved":"Noch keine Pläne auf dem Server gespeichert.","space.loading":"Laden…","space.used_by":"in Benutzung: {list}","space.in_use":"Ein Bereich verwendet diesen Plan noch — zuerst die Verknüpfung lösen","btn.use":"Verwenden","confirm.delete_plan_title":"Plandatei löschen?","confirm.delete_plan_body":"Die Datei wird vom Server gelöscht. Dieser Vorgang kann nicht rückgängig gemacht werden.","toast.plans_list_failed":"Konnte die gespeicherten Pläne nicht auflisten: {err}","toast.plan_delete_failed":"Konnte den Plan nicht löschen: {err}","marker.hide":"Ausblenden","marker.hide_tip":'Das Gerät wird nach dem Speichern aus dem Plan verschwinden, aber weiterhin zum Signalsignal des Raums zählen. Stellen Sie es über den Katalog "Geräte" im Geräte-Editor wieder her.',"marker.show":"Anzeigen","marker.show_tip":"Das Gerät wird nach dem Speichern wieder im Plan erscheinen.","marker.hidden_ghost":"Vom Benutzer ausgeblendetes Gerät","marker.ha_disabled_device":"Das Gerät ist in Home Assistant deaktiviert und im Plan ausgeblendet.","marker.ha_disabled_entity":"Die Entität ist in Home Assistant deaktiviert und im Plan ausgeblendet.","marker.ha_disabled_all_entities":"Das Gerät hat keine aktiven Home Assistant-Entitäten, daher ist es im Plan ausgeblendet.","marker.ha_registry_limited":"Das vollständige Home Assistant-Register ist für diesen Benutzer nicht verfügbar. Das nicht verifizierte Objekt kann vorerst nicht angezeigt oder verwendet werden.","marker.delete_tip":"Löschen Sie das Gerät vollständig aus dem Plan und allen Aggregaten. Sie können es später wieder hinzufügen.","tap.run":"Führen Sie Automation/Skript/Szene aus","tap.none":"Nichts tun","marker.run_target_label":"Was ausführen","marker.run_search_ph":"Suchen: Automation, Skript oder Szene…","marker.run_target_gone":"Ziel {id} nicht gefunden — erneut auswählen","marker.tap_confirm":"Um Bestätigung bitten","marker.tap_confirm_tip":"Vor der Ausführung ein Bestätigungsdialogfeld anzeigen — eine Vorsichtsmaßnahme gegen versehentliche Berührungen.","marker.toggle_hint_single":"Ziel: {name} ({id}).","marker.virtual_light_target":"Virtuelles Licht: {name}.","marker.virtual_light_current":"Manueller Zustand: {state} → {effect}.","marker.virtual_light_state_on":"ein","marker.virtual_light_state_off":"aus","marker.toggle_hint_group":"Wird {count}-Quelle(n) umschalten: {names}.","marker.toggle_hint_current":"Jetzt: {state} → {effect}.","marker.toggle_hint_group_current":"Derzeit an: {on} von {count} → {effect}.","marker.toggle_hint_skipped":"Wird übersprungen ({count}): {targets}.","marker.toggle_effect_turn_on":"wird eingeschaltet","marker.toggle_effect_turn_off":"wird ausgeschaltet","marker.toggle_effect_open":"wird geöffnet","marker.toggle_effect_close":"wird geschlossen","marker.toggle_effect_stop":"wird gestoppt","marker.toggle_effect_toggle":"Zustand wird umgeschaltet","marker.toggle_skip_missing":"nicht gefunden","marker.toggle_skip_ha_disabled":"in HA deaktiviert","marker.toggle_skip_unavailable":"nicht verfügbar","marker.toggle_skip_unsupported":"Umschalten wird nicht unterstützt","marker.toggle_skip_secure":"aus Sicherheitsgründen blockiert","marker.toggle_none_no_binding":"Dieses Gerät hat keine Bindung, daher gibt es keinen Zustand, der umgeschaltet werden könnte. Tippen bewirkt nichts.","marker.toggle_none_no_actionable_entity":"Dieses Gerät hat keinen Zustand, der umgeschaltet werden könnte. Tippen bewirkt nichts.","marker.toggle_none_configured_targets_missing":"Die konfigurierten Ziele sind nicht verfügbar. Die eigene Entität des Geräts wird nicht ersetzt.","marker.toggle_none_ha_disabled":"Das Ziel ist in Home Assistant deaktiviert und kann im Plan nicht verwendet werden.","marker.toggle_none_unavailable":"Das Ziel ist derzeit nicht verfügbar. Tippen bewirkt nichts.","marker.toggle_none_unsupported":"Home Assistant bietet keine sichere Umschaltfunktion für dieses Gerät. Tippen bewirkt nichts.","marker.toggle_none_secure":"Das Umschalten von Schlössern, Alarmen und gesicherten Toren über den Plan ist aus Sicherheitsgründen gesperrt.","run.automation":"Automatisierung","run.script":"Skript","run.scene":"Szene","confirm.tap_run":'"{name}" ausführen?',"confirm.tap_toggle":'"{name}" umschalten?',"confirm.current_state":"Aktueller Zustand: {state}","confirm.expected_state":"Nach dem Umschalten: {state}","confirm.group_current":"an {on} von {total}","confirm.group_all_on":"alle sind eingeschaltet","confirm.group_all_off":"alle sind ausgeschaltet","confirm.unavailable_targets":"Nicht verfügbar: {count}","confirm.expected_by_ha":"Home Assistant ermittelt den Zustand","confirm.state_on":"Ein","confirm.state_off":"Aus","confirm.state_open":"Offen","confirm.state_closed":"Geschlossen","confirm.state_opening":"Wird geöffnet","confirm.state_closing":"Wird geschlossen","confirm.state_stopped":"Gestoppt","confirm.state_unknown":"Unbekannt","toast.run_started":"Gestartet: {name}","toast.run_target_missing":"Ausführungsziel nicht gefunden — überprüfen Sie die Geräteeinstellungen","toast.run_target_required":"Wählen Sie eine Automatisierung, ein Skript oder eine Szene aus","toast.tap_target_changed":"Das Ziel der Aktion hat sich geändert. Versuchen Sie es erneut.","toast.virtual_light_toggle_failed":"Das virtuelle Licht konnte nicht umgeschaltet werden: {err}","toast.value_badge_source_required":"Einen Wert für den Badge auswählen","btn.run":"Ausführen","vac.section":"Roboterstaubsauger: aktuelle Position","vac.autocal":"Automatisch einrichten","vac.live":"Aktuelle Position im Plan","vac.trail":"Roboterpfad anzeigen","vac.autocal_no_rooms":'Die Integration meldet keine Raumliste — öffnen Sie "Manuell anpassen"',"vac.route_warn_unmapped":"Der Roboter reinigt eine Karte, die keiner Etage zugeordnet ist","vac.route_warn_needs_calibration":"Die Karte ist einer Etage zugeordnet, aber nicht kalibriert","vac.route_warn_ambiguous":"Zwei Karten sind nicht unterscheidbar — keine Etage gewählt","vac.route_warn_missing_space":"Der Raum dieser Karte wurde gelöscht","vac.autocal_no_match":'Raumnamen stimmten nicht überein (mindestens 3 müssen übereinstimmen) — öffnen Sie "Manuell anpassen"',"vac.autocal_done":"Fertig: über {rooms} Räume zugeordnet. Eine Reinigung starten und das Ergebnis prüfen.","vac.cal_need_pos":"Der Roboter meldet keine Koordinaten — starten Sie eine Reinigung und pausieren Sie sie","vac.cal_done":"Kalibrierung gespeichert. Eine Reinigung starten und das Ergebnis prüfen.","vac.cal_cancelled":"Kalibrierung abgebrochen","vac.fit":"Manuell anpassen","vac.fit_hint":"Roboterkarte an die richtige Position ziehen und an den Ecken skalieren","vac.fit_rotate":"90° drehen","vac.fit_mirror":"Spiegeln","vac.trail_never":"Nie","vac.trail_cleaning":"Beim Reinigen","vac.trail_always":"Immer","gs.bg_group":"Bühnenhintergrund","gs.bg_color":"Hintergrund um den Plan","gs.bg_default":"Standardthema","gs.bg_theme":"Standardthema","gs.bg_mode":"Planhintergrund","gs.bg_mode.help":"„Folgt der Sonne“ verwendet sun.sun und ersatzweise die lokale Browserzeit; „Statische Farbe“ zeigt immer die ausgewählte Farbe.","gs.bg_mode.help.aria":"Hilfe: allgemeiner Planhintergrund","gs.bg_static":"Statische Farbe","gs.bg_daynight":"Folgt der Sonne","gs.sun_group":"Sonne","gs.sun_missing":"Die sun.sun-Entität wurde nicht gefunden — der Hintergrund folgt Ihrer lokalen Uhr; Fensterstrahlen sind nicht verfügbar.","gs.north":"Norden auf dem Plan","gs.north.help":"Der Winkel wird im Uhrzeigersinn von der oberen Vertikalen des Plans gemessen; Norden wird für Fensterstrahlen benötigt, nicht für den Hintergrund „Folgt der Sonne“.","gs.north.help.aria":"Hilfe: allgemeine Nordrichtung","gs.north_ph":"nicht gesetzt","gs.north_clear":"Löschen","gs.north_letter":"N","gs.sun_rays":"Sonnenlicht durch Fenster","gs.sun_ray_origin":"Sonnenstrahlen","gs.sun_ray_origin.inner":"Von den inneren Fensterecken","gs.sun_ray_origin.outer":"Von den äußeren Fensterecken","gs.about_version":"House Plan Card v{v}","gs.about_github":"GitHub · Dokumentation & Probleme","gs.about_telegram":"Telegram-Chat","support.title":"Hilfe & Feedback","space.bg_color":"Hintergrund rund um den Plan","space.bg_inherit":"Allgemein erben","space.bg_inherited":"erbt allgemeine Einstellungen","space.bg_mode":"Planhintergrund","space.bg_mode.help":"Übernehmen Sie den allgemeinen Hintergrund oder überschreiben Sie diesen Bereich mit einer statischen Farbe oder „Folgt der Sonne“.","space.bg_mode.help.aria":"Hilfe: Hintergrund des Bereichs","space.north":"Norden auf dem Plan (überschreiben)","space.north.help":"Überschreibt die allgemeine Nordrichtung für diesen Bereich; der Winkel wird im Uhrzeigersinn von der oberen Vertikalen des Plans gemessen und für Fensterstrahlen verwendet.","space.north.help.aria":"Hilfe: Norden für diesen Bereich","space.north_inherited":"geerbt: {v}","space.sun_rays":"Sonnenlicht durch Fenster","space.sun_inherit":"Allgemein erben","space.sun_on":"Ein","space.sun_off":"Aus","canvas.far_objects":"{n} Objekt(e) weit vom Plan entfernt","canvas.show_far":"Anzeigen","canvas.home_tip":"Der Plan ist dort drüben — klicken, um ihn anzupassen","gs.grid_group":"Planwartung","gs.grid_hint":"Aktualisiert Datenmodelle, richtet Planelemente am Raster aus und fasst redundante Wandfragmente zusammen. Ein exakter Bericht wird angezeigt, bevor etwas gespeichert wird.","gs.align_all":"Pläne optimieren","gs.align_title":"Pläne optimieren","gs.align_none":"Alle Pläne verwenden bereits das aktuelle optimierte Datenmodell.","gs.optimize_no_automatic_changes":"Es gibt keine automatischen Änderungen, die angewendet werden müssen. Überprüfen Sie die unten stehenden Punkte.","gs.align_count":"{n} von {total} Elementen werden sich um höchstens {cm} cm bewegen.","gs.align_where":"Die größte Verschiebung ist in „{s}“.","gs.align_turned":"Öffnungen, deren Winkel korrigiert wurde: {n}.","gs.align_preflight_failed":"Die Geometrie der folgenden Bereiche konnte nicht sicher überprüft werden: {spaces}{more}.","gs.align_preflight_hint":"Pläne wurden nicht geändert. Kopieren Sie die Diagnosen mit dem untenstehenden Button und fügen Sie sie zusammen mit einem Raumexport dem Fehlerbericht bei.","gs.preflight_reason_prepare-exception":"Die Bereichsgeometrie konnte nicht vorbereitet werden (Ausnahme beim Erstellen des Modells)","gs.preflight_reason_wall-null":"Der Wandkörper wurde nicht erstellt (die Vereinigung lieferte leer zurück)","gs.preflight_reason_wall-degraded-extra":"Der Wandkörper wurde mit zusätzlicher Geometrie beschädigt","gs.preflight_reason_wall-failed-core":"Der Kern des Wandkörpers konnte nicht zusammengesetzt werden","gs.preflight_reason_wall-exception":"Die Wandkonstruktion warf eine Ausnahme","gs.preflight_reason_floor-null":"Der Fußbodenumriss wurde nicht erstellt","gs.preflight_reason_floor-exception":"Bodenaufbau hat eine Ausnahme ausgelöst","gs.preflight_copy":"Diagnosen kopieren","gs.preflight_copied":"Diagnosen kopiert","gs.preflight_update_hint":"Die Karten- und Integrationsversionen unterscheiden sich — Hausplan aktualisieren und erneut versuchen.","gs.align_preflight_space":"Bereich {n}","gs.align_preflight_more":", und {n} mehr","gs.optimize_changes":"Modellmigrationen: {m}; aktualisierte Bereiche: {c}; entfernte verrauschte Koordinatenwerte: {p}; zusammengeführte Fragmente realer Wände: {w}; zusammengeführte Fragmente von Wänden ohne Dicke: {s}; unabhängige Wände: {i}.","gs.zero_walls_migrated":"Virtuelle Wandspannweiten konvertiert: {n}.","gs.wall_segments_migrated":"Wandsegmente stabilisiert: {n}.","gs.room_drafts_migrated":"Unvollständige Konturen wurden in normale Wände umgewandelt: {drafts}; Wandsegmente: {segments}.","gs.optimize_lattice_summary":"Rauschen in den Koordinatenwerten kanonisiert: {n}; maximale Bewegung: {cm} cm.","gs.optimize_lattice_space":"{space}: Koordinatenwerte kanonisiert: {n}; außerhalb des Rasters liegende Werte unverändert gelassen: {far}.","gs.optimize_coincident_partitions":"Versteckte unabhängige Wandabschnitte in Raumwände integriert: {n}.","gs.optimize_openings_rehosted":"Öffnungen wieder an Raumwände angebracht: {n}.","gs.optimize_walls_straightened":"Wände begradigt: {n}; maximale Bewegung: {cm} cm.","gs.optimize_walls_straightened_where":"Größte Wandkorrektur: {s}.","gs.optimize_walls_straighten_skipped":"Nahe Achsenwände unverändert gelassen, da sie nicht sicher repariert werden konnten: {n}.","gs.optimize_glow_migration":"Legacy Glow: {spaces} Bereiche → keine Datenfüllung + unabhängiges Glow; {rooms} Räume → geerbte Datenfüllung + unabhängiges Glow.","gs.optimize_references":"Referenzen repariert: Bereiche — {spaces}; Räume — {rooms}; Positionen — {positions}; Geräte aus fehlenden Bereichen gelöst — {detached}.","gs.optimize_reference_more":", und {n} mehr","gs.optimize_orphans_removed":"Vergessene Einträge entfernt: {total} — Raumbezeichnungen: {rooms}; Geräte: {devices}; Gruppenmarkierungen: {groups}. Sie gehörten zu zuvor gelöschten Bereichen.","gs.optimize_live_positions":"Alte Positionen in gelöschten Bereichen gehören zu vorhandenen Objekten: {n}{names}. Sie werden beibehalten.","gs.optimize_live_positions_remove":"Alte Positionen in gelöschten Bereichen gehören zu vorhandenen Objekten: {n}{names}. Sie sind zur Entfernung ausgewählt.","gs.optimize_live_names":": {names}{more}","gs.optimize_live_remove":"Alte Positionen entfernen","gs.optimize_live_keep":"Alte Positionen beibehalten","gs.optimize_live_selected":"Alte Positionen werden nach der Anwendung von Optimieren entfernt.","gs.optimize_unverified":"Positionen konnten nicht sicher überprüft werden: {n}. Sie wurden unverändert belassen.","gs.optimize_registry_limited":"Voller Administratorzugriff auf die Home Assistant-Registries ist für eine sichere Überprüfung erforderlich.","gs.optimize_vacuum_warning":"Raumzuordnungen, die noch überprüft werden müssen: {n}.","gs.optimize_details":"Details","gs.optimize_details_more":"Und {n} weitere Einträge.","gs.optimize_detail_removed":"wird entfernt","gs.optimize_detail_live":"wird beibehalten","gs.optimize_detail_unverified":"nicht überprüft","gs.optimize_detail_room_label":"Raumkennzeichnung","gs.optimize_detail_device":"Gerät","gs.optimize_detail_group":"Gruppenkennzeichen","gs.optimize_detail_unknown":"unbekannter Eigentümer","gs.optimize_detail_item":"{status}: {kind} {id}; alter Bereich {space}","gs.align_warn":"Absichtlich zwischen Rasterknoten platzierte Elemente werden sich bewegen. Nach der Operation ist nur eine Rückgängig-Funktion verfügbar, und zwar nur bis zur nächsten Planbearbeitung.","gs.align_run":"Optimieren","gs.align_done":"Pläne optimiert: {n} Elemente bewegt, {m} Datensätze beibehalten, {r} Verweise repariert","gs.optimize_undo":"Letzte Optimierung rückgängig machen","gs.optimize_undone":"Die letzte Optimierung wurde rückgängig gemacht","decor.furniture":"Möbel","decor.image":"Bild","decor.image_title":"Eigene Bilder","decor.image_upload":"Bild hochladen","decor.image_replace":"Bild ersetzen","decor.image_uploading":"Wird hochgeladen…","decor.image_asset":"Bilddatei","decor.image_pick_hint":"Ein Bild hochladen oder ein vorhandenes auswählen.","decor.image_place_hint":"Auf den Plan klicken, um das Bild zu platzieren.","decor.image_none":"Noch keine Bilder hochgeladen.","decor.image_unavailable":"Bild nicht verfügbar","decor.image_used":"In {n} Objekten verwendet","decor.image_upload_failed":"Bild konnte nicht hochgeladen werden: {err}","decor.image_error_capacity":"Der Speicher für benutzerdefinierte Bilder ist voll.","decor.image_in_use":"Vor dem Löschen alle platzierten Kopien entfernen.","decor.image_delete_title":"Bilddatei löschen?","decor.image_delete_message":"„{name}“ aus House Plan löschen? Dies kann nicht rückgängig gemacht werden.","furn.title":"Möbelbibliothek","furn.symbol":"Symbol","furn.group_furniture":"Möbel","furn.group_appliance":"Geräte","furn.group_sanitary":"Sanitär","furn.group_other":"Sonstiges","furn.width":"Breite","furn.depth":"Tiefe","furn.back_to_categories":"Alle Kategorien","furn.pick_hint":"Wählen Sie eine Kategorie und dann ein Symbol.","furn.place_hint":"Klicken Sie auf den Plan — das Element wird an der nächsten Wand platziert. Mit Shift wird es frei platziert.","furn.cat_air_conditioner":"Klimaanlagen","furn.cat_armchair":"Sessel","furn.cat_bathtub":"Badewannen","furn.cat_bed":"Betten","furn.cat_bidet":"Bidets","furn.cat_boiler":"Warmwasserbereiter","furn.cat_chair":"Stühle","furn.cat_coffee_table":"Couchtische","furn.cat_cooktop":"Kochfelder","furn.cat_dining_table":"Esstische","furn.cat_dishwasher":"Geschirrspüler","furn.cat_dryer":"Wäschetrockner","furn.cat_fireplace":"Kamine","furn.cat_fridge":"Kühlschränke","furn.cat_kitchen_cabinet":"Küchenschränke","furn.cat_kitchen_sink":"Küchenspülen","furn.cat_nightstand":"Schränke","furn.cat_plant":"Pflanzen","furn.cat_rug":"Teppiche","furn.cat_shelving":"Regale","furn.cat_shower":"Duschen","furn.cat_sink":"Waschbecken","furn.cat_sofa":"Sofas","furn.cat_stairs":"Treppen","furn.cat_toilet":"Toiletten","furn.cat_tv":"Fernseher","furn.cat_wardrobe":"Kleiderschränke","furn.cat_washer":"Waschmaschinen","furn.cat_work_table":"Schreibtische","furn.sym_sofa":"Zweisitzer-Sofa","furn.sym_sofa_three_seat":"Dreisitzer-Sofa","furn.sym_sofa_corner_right":"Ecksofa rechts","furn.sym_armchair":"Polstersessel","furn.sym_armchair_office":"Bürostuhl","furn.sym_coffee_table":"Rechteckiger Couchtisch","furn.sym_coffee_table_round":"Runder Couchtisch","furn.sym_coffee_table_oval":"Ovaler Couchtisch","furn.sym_coffee_table_rounded":"Abgerundeter Couchtisch","furn.sym_table_dining":"Rechteckiger Esstisch","furn.sym_table_round":"Rundtisch","furn.sym_table_dining_oval":"Ovaler Esstisch","furn.sym_table_dining_rounded":"Abgerundeter Esstisch","furn.sym_chair":"Stuhl","furn.sym_chair_bar":"Barhocker","furn.sym_desk":"Rechteckiger Schreibtisch","furn.sym_desk_corner":"Eckschreibtisch","furn.sym_bed_double":"Doppelbett","furn.sym_bed_single":"Einzelbett","furn.sym_nightstand":"Nachttisch","furn.sym_cabinet_tv":"TV-Schrank","furn.sym_cabinet_shoe":"Schuhschrank","furn.sym_cabinet_sink":"Waschtischunterschrank","furn.sym_wardrobe":"Kleiderschrank","furn.sym_bookshelf":"Bücherschrank","furn.sym_wall_unit":"Schrankwand","furn.sym_kitchen_floor":"Küchen-Unterschrank","furn.sym_kitchen_floor_corner":"Küchen-Eckunterschrank","furn.sym_kitchen_wall":"Küchen-Hängeschrank","furn.sym_kitchen_wall_corner":"Küchen-Eckhängeschrank","furn.sym_shelf_floor":"Standregal","furn.sym_shelf_wall":"Wandregal","furn.sym_fridge":"Kühlschrank","furn.sym_stove":"Vierflammiges Kochfeld","furn.sym_cooktop_two":"Zweiflammiges Kochfeld","furn.sym_dishwasher":"Geschirrspüler","furn.sym_washer":"Waschmaschine","furn.sym_dryer":"Wäschetrockner","furn.sym_tv":"Fernseher mit Standfuß","furn.sym_tv_wall":"Wandfernseher","furn.sym_ac":"Klimaanlage","furn.sym_water_heater":"Wassererhitzer","furn.sym_toilet":"Stand-WC","furn.sym_toilet_built_in":"Wand-WC","furn.sym_bathtub":"Rechteckige Badewanne","furn.sym_bathtub_corner":"Eckbadewanne","furn.sym_shower":"Dusche","furn.sym_sink":"Waschbecken","furn.sym_kitchen_sink":"Einzel-Küchenspüle","furn.sym_kitchen_sink_double":"Doppel-Küchenspüle","furn.sym_bidet":"Stand-Bidet","furn.sym_bidet_built_in":"Wand-Bidet","furn.sym_stairs":"Treppe","furn.sym_fireplace":"Kamin","furn.sym_plant":"Pflanze","furn.sym_rug":"Teppich","common.yes":"Ja","common.no":"Nein","vac.diag_source":"Quelle","vac.diag_platform":"Integration","vac.diag_status":"Status","vac.diag_position":"Position","vac.diag_rooms":"Räume","vac.diag_rooms_value":"{total} · {matched} Namen stimmen überein · {readiness}","vac.autocal_ready":"Auto-Kalibrierung verfügbar","vac.autocal_not_ready":"3 übereinstimmende Namen erforderlich","vac.diag_path":"Integrationspfad","vac.diag_map":"Karten-ID","vac.source_none":"nicht ausgewählt","vac.source_status_ok":"Bereit","vac.source_status_missing":"Fehlend","vac.source_status_disabled":"In Home Assistant deaktiviert","vac.source_status_unavailable":"Nicht verfügbar","vac.source_status_unverified":"Kann mit den aktuellen Berechtigungen nicht verifizieren","vac.source_status_unsupported":"Keine Positionsdaten","vac.source_status_none":"Keine Quelle","vac.source_banner_missing":"Die gespeicherte Quelle existiert nicht mehr. Sie wurde nicht automatisch ersetzt; wählen Sie eine andere Quelle oder stellen Sie sie in Home Assistant wieder her.","vac.source_banner_disabled":"Die gespeicherte Quelle ist in Home Assistant deaktiviert. Aktivieren Sie sie dort oder wählen Sie eine andere Quelle.","vac.source_banner_unverified":"Die aktuellen Home Assistant-Berechtigungen können diese gespeicherte Quelle nicht verifizieren. Sie bleibt angepinnt und wird nicht automatisch ersetzt.","vac.choose_source":"Quelle wählen","vac.source_auto":"Automatisch","vac.source_auto_hint":"Verwenden Sie eine kompatible Entität von diesem Gerät","vac.all_cameras":"Alle Kameras","vac.all_cameras_warn":"Eine Kamera liefert möglicherweise keine Roboter-Daten. Wählen Sie eine nur, wenn es Ihre Saugroboter-Karte ist.","vac.all_cameras_empty":"Keine anderen Kamera-Entitäten gefunden.","vac.platform_unknown":"unbekannte Integration","vac.cap_position":"Position","vac.cap_rooms_short":"Räume","vac.cap_path":"Pfad","vac.cap_map":"Karten-ID","vac.cap_none":"Keine Roboter-Daten erkannt","vac.xcme_hint":"Aktivieren Sie diese Xiaomi Cloud Map Extractor-Attribute:","vac.documentation":"Dokumentation","vac.residual_title":"Automatische Kalibrierung überprüfen","vac.residual_message":"Die zugeordneten Räume weichen um bis zu {error} voneinander ab. Diese ungefähre Kalibrierung anwenden, manuell verfeinern oder ohne Änderung der gespeicherten Einrichtung abbrechen.","vac.apply_proposal":"Anwenden","gs.backup_group":"Sichern und übertragen","gs.backup_hint":"Laden Sie ein tragbares JSON-Backup herunter oder sehen Sie eine Vorschau und importieren Sie ein Backup, das mit House Plan erstellt wurde.","backup.export_open":"Exportieren","backup.import_open":"Importieren","backup.export_title":"House Plan exportieren","backup.import_title":"House Plan importieren","backup.export_hint":"Wählen Sie, ob das Backup die gesamte House Plan-Konfiguration oder nur den aktuellen Bereich enthalten soll.","backup.full":"Vollständiges Backup","backup.current_space":"Aktueller Bereich","backup.current_space_title":"Aktueller Bereich: {title}","backup.no_current_space":"Kein aktueller Bereich","backup.plan_only":"Nur Plan","backup.plan_only_hint":"Räume, Wände, Öffnungen, Dekor und Raumbezeichnungspositionen ohne Geräte oder Home Assistant-Bindungen beibehalten.","backup.plan_only_preview":"Diese Datei enthält nur den Plan.","backup.privacy_warning":"Das Archiv enthält Namen, Home Assistant-Kennungen und genaue Koordinaten. Interne Pläne und Anhänge werden referenziert, nicht eingebettet; Laufzeitzustände und Staubsaugerspuren sind nicht enthalten.","backup.download":"JSON herunterladen","backup.export_done":"Backup heruntergeladen","backup.reading":"Überprüfe das Backup…","backup.revalidated":"Der Plan wurde nach dieser Vorschau geändert. Die Zusammenfassung wurde aktualisiert; überprüfen Sie sie und bestätigen Sie erneut.","backup.error.support_invalid_message":"Prüfen Sie die Supportnachricht und versuchen Sie es erneut.","backup.error.support_package_too_large":"Das anonymisierte Supportpaket überschreitet das Limit von 8 MiB.","backup.error.support_preview_expired":"Die Vorschau des Supportanhangs ist abgelaufen oder nicht mehr verfügbar.","backup.error.support_rate_limited":"Zu viele Supportberichte oder Vorschauen wurden angefordert. Versuchen Sie es später erneut.","backup.error.support_rejected":"Der Bericht hat die Prüfung des Supportdienstes nicht bestanden.","backup.error.support_unavailable":"Der private Supportdienst ist vorübergehend nicht verfügbar.","backup.error.unauthorized":"Sie haben keine Berechtigung, diesen Plan zu exportieren oder zu importieren.","backup.error.not_ready":"Der Hausplan ist noch nicht fertig. Versuchen Sie es in einem Moment erneut.","backup.error.too_large":"Das Backup überschreitet das 8-MiB-Limit.","backup.error.invalid_json":"Die ausgewählte Datei ist kein gültiges JSON.","backup.error.invalid_format":"Die ausgewählte Datei ist kein House Plan-Backup.","backup.error.invalid_image":"Das Bild ist beschädigt oder entspricht nicht seinem Format.","backup.error.unsupported_export_version":"Dieses Backup-Format wird von der installierten Version nicht unterstützt.","backup.error.unsupported_image":"Verwenden Sie ein unterstütztes PNG-, JPEG-, WebP- oder SVG-Bild.","backup.error.future_model":"Das Backup wurde mit einem neueren House-Plan-Datenmodell erstellt.","backup.error.invalid_config":"Das Backup enthält eine ungültige House-Plan-Konfiguration.","backup.error.wall_model_migration_blocked":"Das Backup-Wandmodell konnte nicht sicher aktualisiert werden. Optimieren Sie zuerst den Quellplan und exportieren Sie ihn dann erneut.","backup.error.invalid_layout":"Das Backup enthält ungültige Objektpositionen.","backup.error.invalid_content":"Das Backup enthält ungültige oder inkonsistente Inhaltsreferenzen.","backup.error.space_not_found":"Der ausgewählte Bereich existiert nicht mehr.","backup.error.capacity_exceeded":"Durch das Hinzufügen dieses Backups würden die Planlimits überschritten.","backup.error.preview_expired":"Die Vorschau ist abgelaufen. Wählen Sie die Backup-Datei erneut aus.","backup.error.preview_owner_mismatch":"Diese Vorschau gehört zu einem anderen Home-Assistant-Benutzer.","backup.error.conflict":"Der Plan hat sich nach der Vorschau geändert. Überprüfen Sie die aktualisierte Zusammenfassung.","backup.error.content_confirmation_required":"Bestätigen Sie, dass nicht verfügbare lokale Inhalte getrennt werden können.","backup.error.commit_failed":"Das Backup konnte nicht sicher angewendet werden. Der vorherige Plan wurde wiederhergestellt oder wartet auf die Wiederherstellung.","backup.error.missing_plan":"Eine referenzierte Plan-Datei ist nach der Vorschau verschwunden. Überprüfen Sie das Backup erneut.","backup.error.missing_content":"Ein referenziertes lokales Anhangselement ist nach der Vorschau verschwunden. Überprüfen Sie das Backup erneut.","backup.error.marker_control_missing":"Ein verknüpftes Planlicht fehlt im Backup.","backup.error.marker_control_not_light":"Ein verknüpftes Planziel ist nicht mehr als Lichtquelle markiert.","backup.error.marker_control_self":"Eine Lichtquelle kann sich nicht selbst steuern.","backup.error.marker_control_cycle":"Das Backup enthält eine kreisförmige Kette von Lichtsteuerungen.","backup.error.duplicate_marker_control":"Das Backup enthält eine doppelte Plan-Licht-Verknüpfung.","backup.error.no_backup":"Es gibt keinen Import- oder Optimierungssnapshot zur Wiederherstellung.","backup.error.in_use":"Das Element wird noch verwendet","backup.error.invalid_data":"Die Anfrage enthält ungültige Daten","backup.error.invalid_light_entity":"Das führende Licht muss eine light.*- oder switch.*-Entität sein","backup.error.invalid_marker_control":"Ungültige Marker-Steuerungsreferenz","backup.error.invalid_name":"Der Name ist ungültig","backup.error.invalid_partition_opening_host":"Die Öffnung muss ihren Trennwand-Träger behalten","backup.error.invalid_partition_opening_jamb_margin":"Die Öffnung lässt keinen physischen Pfosten am Wandende","backup.error.invalid_passage_fields":"Ein offener Durchgang kann keine Tür-Einstellungen tragen","backup.error.invalid_space_id":"Unbekannter Raumbereich","backup.error.invalid_toggle_entity":"Die Schalt-Entität muss light.* oder switch.* sein","backup.error.invalid_value_badge":"Ungültige Wert-Badge-Einstellungen","backup.error.invalid_value_badge_attribute":"Ungültiges Wert-Badge-Attribut","backup.error.invalid_value_badge_position":"Ungültige Wert-Badge-Position","backup.error.invalid_value_badge_source":"Ungültige Wert-Badge-Quelle","backup.error.invalid_vacuum_map_route":"Prüfen Sie die Zuordnung der Roboterkarten zu Räumen.","backup.error.invalid_value_source":"Ungültige Wertquelle","backup.error.invalid_value_source_attribute":"Ungültiges Wertquellen-Attribut","backup.error.io_error":"Eine Dateioperation auf dem Server ist fehlgeschlagen","backup.error.not_toggleable":"Dieses Gerät kann nicht geschaltet werden","backup.error.nothing_to_repair":"Nichts zu reparieren","backup.error.space_in_use":"Der Raumbereich wird noch referenziert","backup.error.value_badge_source_required":"Das Wert-Badge braucht eine Quelle","backup.error.wall_model_client_outdated":"Der Plan wurde anderswo aktualisiert — Seite neu laden","backup.same_source":"Erstellt auf dieser Home Assistant-Instanz","backup.foreign_source":"Erstellt auf einer anderen Home Assistant-Instanz","backup.created":"Erstellt: {value}","backup.versions":"Karte {card}; Integration {integration}; Datenmodell {model}","backup.count_spaces":"Bereiche: {n}","backup.count_rooms":"Räume: {n}","backup.count_walls":"Wände: {n}","backup.count_openings":"Öffnungen: {n}","backup.count_decor":"Dekorationsobjekte: {n}","backup.count_markers":"Geräte: {n}","backup.count_layout":"Positionen: {n}","backup.bindings":"Verknüpfungen — Geräte: {device}, Entitäten: {entity}, virtuell: {virtual}; Positionen ohne Bereich: {legacy}","backup.binding_status":"Zielstatus — aktiv: {active}, deaktiviert: {disabled}, fehlt: {missing}","backup.missing_areas":"Auf dem Ziel fehlende Bereiche: {areas}","backup.dropped_marker_links":"Planlicht-Verknüpfungen außerhalb dieses übertragenen Bereichs wurden ausgelassen: {n}.","backup.room_drafts_migrated":"Alte unvollständige Konturen wurden in normale Wände umgewandelt: {drafts}; Wandsegmente: {segments}.","backup.repaired_target_refs":"Durch den Import dieses Bereichs wiederhergestellte vorhandene Referenzen: {n}.","backup.preserved_unresolved_refs":"Referenzen, die nicht eindeutig wiederhergestellt werden konnten, wurden beibehalten: {n}.","backup.preserved_unresolved_hint":"Es wurden keine Daten geraten oder gelöscht. Führen Sie nach dem Import Optimierungspläne aus, um die verbleibenden Referenzen zu überprüfen.","backup.import_details":"Importieren von Referenzdetails","backup.import_detail.incoming_remapped":"Referenzen innerhalb der importierten Kopie aktualisiert: {n}","backup.import_detail.target_repaired":"Vorhandene Referenzen wiederhergestellt: {n}","backup.import_detail.preserved_unresolved":"Unaufgelöste Referenzen beibehalten: {n}","backup.import_detail.collisions":"Zielkonflikte sicher beibehalten: {n}","backup.import_detail.dropped_links":"Eingehende Links durch Übertragungsregeln ausgelassen: {n}","backup.import_detail.bounded_lineages":"Übermäßig verschachtelte Kennungen begrenzt belassen: {n}","backup.replace_warning":"Dies ersetzt die aktuelle Konfiguration und das Layout. Hochgeladene Dateien werden niemals gelöscht. Eine Rückgängig-Möglichkeit bleibt bis zur nächsten Planbearbeitung verfügbar.","backup.foreign_bookkeeping":"Instanzspezifische bekannte/neue Gerätebuchführung wird nicht importiert.","backup.final_name":"Name des neuen Bereichs","backup.target_settings":"Die globalen Einstellungen der Zielinstanz bleiben unverändert.","backup.duplicates":"Bindungen bereits vorhanden: {n}","backup.skip":"Doppelte Geräte überspringen","backup.virtual_copy":"Sichere statische virtuelle Kopien hinzufügen","backup.content":"Referenzierter Inhalt","backup.decor_images_summary":"Eigene Bilder: {objects} Objekte, {assets} Dateien; fehlende Dateien: {missing}.","backup.content_available":"lokal verfügbar","backup.content_external":"externer Link","backup.content_detach_required":"wird getrennt","backup.confirm_detach":"Ich verstehe, dass nicht verfügbare interne Pläne und Anhänge von der importierten Konfiguration getrennt werden.","backup.confirm_missing_images":"Ich verstehe, dass fehlende eigene Bilder als reparierbare Platzhalter erhalten bleiben und andere nicht verfügbare lokale Dateien getrennt werden.","backup.replace":"Ersetzen","backup.add":"Bereich hinzufügen","backup.space_done":"Bereich importiert: {rooms} Räume, {markers} Geräte, {refs} bestehende Referenzen wiederhergestellt","backup.full_done":"Backup wiederhergestellt: {spaces} Bereiche, {rooms} Räume, {markers} Geräte","backup.undo_import":"Letzten vollständigen Import rückgängig machen","backup.import_undone":"Vollständiger Import rückgängig gemacht","backdrop.large_title":"Großes Bild","backdrop.large_body":"Dieses Bild ist {w}×{h} ({fileMb} MB Datei) und benötigt etwa {decodedMb} MB Speicher zur Anzeige. Auf Tablets kann das die Seite zum Absturz bringen.","backdrop.unknown_body":"Die Bildabmessungen konnten nicht gelesen werden — die Datei ist möglicherweise beschädigt. Fortfahren kann die Seite auf Tablets zum Absturz bringen.","backdrop.reduced_dimensions":"Verkleinerte Kopie: {w}×{h} px.","backdrop.use_downscaled":"Verkleinerte Kopie hochladen","backdrop.reducing":"Wird verkleinert…","backdrop.keep_original":"Original behalten","backdrop.too_large_title":"Bild ist zu groß","backdrop.too_large_body":"Dieses Bild überschreitet die Anzeigegrenzen des Browsers ({w}×{h}, Limit {limit} px pro Seite). Bitte verkleinern Sie es in einem Desktop-Editor und laden Sie es erneut hoch.","backdrop.downscale_failed":"Die verkleinerte Kopie konnte nicht erstellt werden. Der aktuelle Plan wurde nicht geändert."};const n="34d1dbfc181acaf58842dfced0e6aa3a899aef6b8d1eeba53732ef729a63137e";export{e as dictionary,n as fingerprint};
+globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="4da0d706a85c3f1c08ab6de960deb5feb08baaf9055265234e7bd1b554332653";var e={"editor.context_actions":"Aktionen: {object}","editor.tool_options":"Werkzeugoptionen: {tool}","editor.palette":"Palette: {tool}","editor.open_group":"Werkzeuggruppe: {group}","editor.group_active":"{group} — aktiv: {item}","editor.disabled_action":"{action} ist nicht verfügbar: {reason}","editor.loading":"Editor wird geladen…","editor.loading_aria":"Der Plan-Editor wird geladen","editor.load_failed":"Der Editor konnte nicht geladen werden.","editor.refresh_advice":"Seite aktualisieren und erneut versuchen.","editor.retry_advice":"Verbindung prüfen und erneut drücken.","version_mismatch.title":"Die House Plan-Versionen stimmen nicht überein","version_mismatch.body":"Falls Home Assistant noch neu startet, warten Sie den Abschluss ab und laden Sie dann diese Seite neu.","version_mismatch.frontend":"Karte","version_mismatch.backend":"Integration","version_mismatch.reload":"Seite neu laden","color_picker.title":"Farbwähler","color_picker.hue":"Farbton","color_picker.saturation":"Sättigung","color_picker.value":"Helligkeit","color_picker.hex":"Hex-Farbe","color_picker.invalid_hex":"Geben Sie eine 3- oder 6-stellige Hex-Farbe ein","color_picker.confirm":"OK","btn.properties":"Eigenschaften","btn.keep_as_walls":"Als Wände behalten","btn.delete_room_keep_walls":"Raum löschen, Wände behalten","btn.delete_room_with_walls":"Raum und Wände löschen","title.markup_select":"Wände und Säulen auswählen und bearbeiten","title.markup_column":"Säule: Klicken Sie auf einen Rasterpunkt, um eine quadratische Säule zu platzieren","markup.partition":"Trennwand","markup.column":"Säule","markup.hint_column":"Klicken Sie auf einen Rasterpunkt, um eine quadratische Säule zu platzieren","history.wall_segment":"Wandsegment hinzufügen","history.column_add":"Säule hinzufügen","history.physical_edit":"Physisches Objekt ändern","history.physical_delete":"Physisches Objekt löschen","history.physical_move":"Physisches Objekt verschieben","history.wall_face_batch":"Räume aus Wänden erstellen","toast.column_duplicate":"Eine Säule mit demselben Zentrum und äußerer Größe existiert bereits","physical.partition_properties":"Eigenschaften der Trennwand","physical.column_properties":"Eigenschaften der Säule","physical.shape":"Form","physical.square":"Quadrat","physical.circle":"Kreis","physical.diameter":"Durchmesser","physical.side":"Seite","physical.rotation":"Drehwinkel","physical.length":"Länge","physical.allowed_range":"Erlaubt: {min}–{max} {unit}","physical.column_size_title":"Außenmaß der per Klick platzierten quadratischen Säule (1–150 cm).","card.title":"Hausplan","count.devices":"{n} Entwicklung","empty.no_spaces":"Noch keine Bereiche.","nav.spaces":"House-Plan-Bereiche","empty.add_first":"Ersten Bereich hinzufügen und einen Grundriss hochladen.","empty.read_only":"Es sind keine Bereiche eingerichtet. Bitten Sie einen Administrator, einen hinzuzufügen.","empty.install":"Installieren Sie die House Plan-Integration und fügen Sie sie unter „Geräte & Dienste“ hinzu.","btn.add_space":"Bereich hinzufügen","btn.cancel":"Abbrechen","btn.save":"Speichern","btn.close":"Schließen","btn.delete":"Löschen","btn.copy":"Kopieren","btn.edit":"Bearbeiten","btn.open_in_ha":"In HA öffnen","btn.reset":"Zurücksetzen","btn.attach":"Anhängen…","btn.upload":"Hochladen…","btn.replace":"Ersetzen…","title.zoom_in":"Zoomen","title.zoom_out":"Herauszoomen","title.zoom_fit":"Alles anpassen","title.configure_space":"Bereich konfigurieren","title.add_space":"Bereich hinzufügen","title.markup_add":"Wände: eine durchgehende Kette zeichnen; jedes bestätigte Segment wird einzeln gespeichert. Umschalt sperrt auf 45°","title.markup_merge":"Zusammenführen: Klicken Sie auf einen Raum und dann auf den Nachbarraum, mit dem er eine Wand teilt","title.markup_split":"Raum teilen: Klicken Sie auf den Raum und dann auf zwei Punkte an seinen Wänden","title.markup_delroom":"Raum löschen: Klicken Sie in einen Raum und bestätigen Sie","title.need_plan":"Einen Grundriss hochladen","markup.add":"Wände","markup.merge":"Zusammenführen","markup.split":"Teilen","markup.resize":"Größe ändern","title.markup_resize":"Räume vergrößern/verkleinern: Ziehen Sie einen verfügbaren horizontalen oder vertikalen Wandgriff","markup.hint_resize":"Ziehen Sie einen verfügbaren Wandgriff · die Wand stoppt an der ersten unsicheren Position · Esc bricht ab · Strg+Z — rückgängig","resize.disabled.diagonal":"Diese Wand ist geneigt; Größe ändern unterstützt nur horizontale und vertikale Wände","resize.disabled.side-angle":"Eine angrenzende Wand ist geneigt; Größe ändern erfordert, dass beide angrenzenden Wände diese Wand im rechten Winkel treffen","resize.disabled.duplicate-physical-wall":"Eine separate Trennwand oder ein Pfeiler überlappt diese Wand; entfernen oder verschieben Sie sie, bevor Sie die Größe ändern","resize.disabled.partial-shared":"Ein angrenzender Raum nutzt nur einen Teil dieser Wand, daher kann sie nicht sicher als gemeinsame Wand verschoben werden","resize.disabled.unequal-shared":"Der angrenzende Raum nutzt andere Endpunkte oder Wandlängen, daher können die Wände nicht gemeinsam sicher bewegt werden","resize.disabled.multiple-rooms":"Das Verschieben dieser Wand würde mehr als zwei Räume betreffen","resize.disabled.thickness-conflict":"Die Wandstärke kann nicht sicher beibehalten werden","resize.disabled.opening-conflict":"Eine Öffnung an dieser Wand kann nicht sicher verschoben werden","resize.disabled.invalid-geometry":"Diese Wand kann nicht ohne Änderung der Planstruktur geändert werden","resize.limit_stopped":"Wand gestoppt: der nächste Schritt würde ein Anschlusslimit verletzen","resize.commit_failed":"Größenänderung wurde abgebrochen, da der endgültige Plan die Geometrieprüfung nicht bestanden hat","resize.preview_failed":"Größenänderung am letzten sicheren Punkt gestoppt, da die Plan-Geometrie nicht beibehalten werden konnte","markup.opening":"Öffnung","markup.delete_room":"Raum löschen","history.undo":"Rückgängig","history.redo":"Wiederholen","history.undo_named":"Rückgängig: {name} (Strg+Z)","history.redo_named":"Wiederholen: {name} (Strg+Shift+Z / Strg+Y)","history.undo_empty":"Nichts zu widerrufen","history.redo_empty":"Nichts zu wiederholen","history.undone":"Rückgängig gemacht: {name}","history.redone":"Wiederholt: {name}","history.add_room":"Raum erstellen","history.split_room":"Raum teilen","history.merge_rooms":"Räume zusammenführen","history.resize_room":"Raumgröße ändern","history.wall_thickness":"Wandstärke ändern","history.add_opening":"Tür- oder Fensteröffnung hinzufügen","history.edit_opening":"Öffnung bearbeiten","history.move_opening":"Öffnung verschieben","history.delete_opening":"Öffnung löschen","history.delete_room_keep_walls":"Raum löschen, Wände behalten","history.delete_room_with_walls":"Raum und Wände löschen","history.decor_add":"Dekorobjekt hinzufügen","history.decor_edit":"Dekorobjekt bearbeiten","history.decor_move":"Dekorobjekt verschieben","history.decor_transform":"Dekorobjekt transformieren","history.decor_delete":"Dekorobjekt löschen","history.backdrop_transform":"Plan-Hintergrund transformieren","history.device_move":"{name} verschieben","history.device_stale":"Der Positionsverlauf ist nicht mehr anwendbar und wurde gelöscht","opening.new":"Neue Öffnung","opening.edit":"Öffnung","opening.door":"Tür","opening.window":"Fenster","opening.gate":"Tor","opening.passage":"Offener Durchgang","opening.passage_binding_warning":"Das Speichern entfernt den Öffnungs-/Schließsensor und das Schloss.","opening.invalid_passage_fields":"Der offene Durchgang auf dem Plan „{room}“ hat nicht unterstützte Einstellungen: {fields}.","opening.type_label":"Typ","opening.length_label":"Länge, cm","opening.contact_label":"Öffnungs-/Schließsensor","opening.lock_label":"Schloss","opening.none":"— keine —","opening.search_ph":"Suche: Name oder Entitäts-ID…","opening.invert":"Geöffnet/geschlossen invertieren","opening.flip_h":"Scharnier an der anderen Zarge","opening.flip_v":"Öffnet zur anderen Seite","opening.open":"Offen","opening.closed":"Geschlossen","opening.locked":"Verriegelt","opening.unlocked":"Entriegelt","opening.state_unknown":"nicht verfügbar","opening.no_entities":"Keine Sensoren gebunden — ein statisches Symbol auf dem Plan.","toast.opening_no_wall":"Neben eine Raumwand oder eine unabhängige Wand klicken","opening.host_partition":"Unabhängige Wand","opening.partition_orphan":"Die unabhängige Wand für diese Öffnung existiert nicht mehr","opening.partition_jamb_margin":"Mindestens {distance} zwischen der Öffnung und dem Wandende lassen","opening.rebind_partition":"An eine andere unabhängige Wand anfügen","confirm.delete_partition_openings_title":"Wand und Öffnungen löschen?","confirm.delete_partition_openings_body":"Diese Wand enthält {count} Öffnung(en). Sie werden zusammen gelöscht.","confirm.delete_partition_openings_item":"• {type}, {length}","markup.hint_points":"Punkte: {n} · Shift — 45° Schritte · Esc — Kette beenden · Ctrl+Z — Punkt rückgängig machen · Schließen eines Bereichs erstellt einen Raum","markup.hint_start":"Klicken Sie auf einen Rasterpunkt, um eine Wandkette zu starten","tip.lqi":"durchschnittliches Zigbee-Signal:","tip.area":"Bereich: {value}","info.device_header":"Gerät im Plan","info.model":"Modell","info.state":"Status","info.link":"Verbindung","info.manuals":"Handbücher","info.none":"Keine zusätzlichen Informationen","marker.new_device":"Neues Gerät","marker.name_label":"Name (im Plan angezeigt)","marker.name_ph":"Name","marker.binding_label":"An ein HA-Gerät binden","marker.binding_disabled":"in Home Assistant deaktiviert","marker.virtual_option":"Virtuelles Gerät (keine Bindung)","marker.search_ph":"Gerät/Gruppe suchen…","marker.nothing_found":"Nichts gefunden","marker.room_label":"Raum","marker.room_override":" (Platzierung überschreiben)","marker.room_choose":"— Raum auswählen —","marker.room_auto":"— nach Gerätebereich (auto) —","marker.icon_label":"Symbol","marker.icon_ph":"mdi:… (leer = automatisch)","marker.display_label":"Anzeige","display.badge":"Symbol + Zustand","display.icon_ripple":"Symbol + Zustand und Aktivität","display.static_icon":"Immer statisches Symbol","display.value_static_icon":"Wert + statisches Symbol","marker.display_hint_badge":"Das Symbol und die dynamische Platte zeigen den Gerätezustand ohne den üblichen Aktivitätspuls. Rote Alarme bleiben sichtbar.","marker.display_hint_icon_ripple":"Das Symbol, die dynamische Platte und der Puls zeigen einen kurzen Puls für Ereignisse und einen kontinuierlichen Puls für Arbeit, Bewegung oder Anwesenheit. Rote Alarme haben eine separate Priorität.","marker.display_hint_value":"Ein ausgewählter oder automatisch ermittelter Home Assistant-Wert ersetzt das Symbol, während die Platte weiterhin den Zustand anzeigt. Rote Alarme bleiben sichtbar.","marker.display_hint_static_icon":"Die themenabhängige Hülle und das Symbol bleiben immer gleich. Zustand, Aktivität, Nichtverfügbarkeit und Alarme verändern nicht das Erscheinungsbild.","marker.display_hint_value_static_icon":"Der Marker zeigt den gewählten Wert, während die Hülle themenabhängig bleibt. Zustand, Aktivität, Nichtverfügbarkeit und Alarme ändern die Markerfarbe nicht.","marker.static_alarm_warning":"Dieses Gerät kann Alarme melden. Die statische Anzeige verbirgt die visuelle Alarmanzeige des Markers.","marker.preview.title":"Anzeigevorschau","marker.preview.actual":"Jetzt","marker.preview.example":"Beispiel","marker.preview.integration":"Bereitgestellt von","marker.preview.source":"Anzeigquelle","marker.preview.current_state":"Aktueller Zustand","marker.preview.result":"Auf dem Plan","marker.preview.details":"Quelldetails","marker.preview.select_source":"Ein Home-Assistant-Gerät oder eine Entität auswählen, um die tatsächliche Anzeige zu sehen.","marker.preview.unknown_provider":"Unbekannte Integration","marker.preview.virtual_provider":"House Plan · virtuelles Gerät","marker.preview.no_source":"Keine aktive Quelle","marker.preview.no_state":"Kein aktueller Zustand","marker.preview.mixed_states":"Mehrere verschiedene Zustände","marker.preview.multiple_sources":"{n}-Quellen","marker.preview.more_sources":"+{n} mehr","marker.preview.scaled":"Die Vorschau wird auf {n}% skaliert, um zu passen. Die gespeicherte Größe bleibt unverändert.","marker.preview.demo_short":"Kurze Aktivität anzeigen","marker.preview.demo_continuous":"Kontinuierliche Aktivität anzeigen","marker.preview.stop_continuous":"Kontinuierliche Aktivität stoppen","marker.preview.demo_short_notice":"Kurzes Aktivitätsbeispiel; der tatsächliche Gerätezustand bleibt unverändert.","marker.preview.demo_continuous_notice":"Kontinuierliches Aktivitätsbeispiel; der tatsächliche Gerätezustand bleibt unverändert.","marker.preview.demo_already_visible":"Der aktuelle Zustand zeigt bereits eine echte Aktivitäts- oder Alarmeffekt.","marker.preview.reduced_motion":"Systemweit reduzierte Bewegungen sind aktiviert, daher wird gewöhnliche Aktivität als Punkt angezeigt.","marker.preview.reason.neutral":"Neutrale dunkle Platte","marker.preview.reason.working":"Gelbe Platte: Das Gerät arbeitet jetzt","marker.preview.reason.working_activity":"Gelbe Platte und Aktivitätseffekt: das Gerät funktioniert jetzt","marker.preview.reason.open":"Orange Platte: physisch geöffnet oder entriegelt","marker.preview.reason.cover_icon_state":"Neutrale Platte; die Abdeckungseinheit steuert den angezeigten Zustand und das Symbol","marker.preview.reason.presence":"Aktivitätseffekt, während Präsenz erkannt wird","marker.preview.reason.event":"Kurzer Aktivitätseffekt nach einem erkannten Ereignis","marker.preview.reason.transition":"Aktivitätseffekt, während das Gerät sich bewegt oder den Zustand ändert","marker.preview.reason.media_neutral":"Mediengeräte bleiben im verfügbaren Zustand auf einer neutralen dunklen Platte","marker.preview.reason.unavailable":"Gedämpfte neutrale Platte: nicht verfügbar oder ausgeschaltet","marker.preview.reason.alarm":"Rote Alarmplatte; Alarmanzeige wird immer angezeigt","marker.preview.reason.live_states_disabled":"Live-Zustandsstil ist für diese Karte deaktiviert","marker.preview.reason.value_no_state":"Kein nutzbarer Zustandswert; stattdessen wird das Symbol angezeigt","marker.preview.reason.value_ambiguous_sources":"Mehrere mögliche Wertequellen; stattdessen wird das Symbol angezeigt","marker.preview.reason.value_non_scalar":"Die Quelle lieferte keinen einfachen Wert; stattdessen wird das Symbol angezeigt","marker.preview.reason.value_virtual":"Ein virtuelles Gerät hat keinen Home Assistant-Wert; stattdessen wird das Symbol angezeigt","marker.preview.reason.vacuum_live_plan_only":"Echtzeitposition und -spur des Staubsaugers sind nur im vollständigen Plan verfügbar","marker.preview.reason.hidden_design_preview":"Das Gerät ist im Plan ausgeblendet; diese Designvorschau bleibt sichtbar","marker.preview.reason.composite_power_source":"Der Status stammt vom Power-Entity des Geräts; Hilfsschalter werden ignoriert","marker.preview.reason.activity_display_disabled":"Der gewählte Anzeigemodus zeigt gewöhnliche Aktivitätseffekte nicht an","marker.preview.reason.ha_disabled":"Die Home Assistant-Verbindung ist deaktiviert und wird im Plan ausgeblendet","marker.preview.reason.orphaned":"Die gespeicherte Home Assistant-Verbindung konnte nicht mehr gefunden werden","marker.preview.reason.static_icon":"Statischer Modus: Der Gerätestatus ändert das Symbol nicht","marker.preview.reason.value_static_icon":"Statischer Modus mit Wert: Der Gerätestatus ändert die Markerfarbe nicht","marker.activity_color":"Aktivitätspulsfarbe","marker.ripple_size":"Aktivitätspulsgröße","marker.activity_alarm_note":"Farbe und Größe betreffen nur gewöhnliche Aktivität und ändern keine roten Alarme.","marker.pulse_a11y_alarm":"Alarm","marker.pulse_a11y_event":"Kürzliches Ereignis","marker.pulse_a11y_presence":"Anwesenheit erkannt","marker.pulse_a11y_transition":"Statusänderung","marker.pulse_a11y_running":"Arbeitet","marker.state_a11y_neutral":"Standardzustand","marker.state_a11y_working":"Funktionierend","marker.state_a11y_open":"Offen","marker.state_a11y_locked":"Verschlossen","marker.state_a11y_unlocked":"Entriegelt","marker.state_a11y_alarm":"Alarm","marker.state_a11y_unavailable":"Nicht verfügbar","marker.lqi_a11y_low":"LQI {value}, schwaches Signal","marker.lqi_a11y_mid":"LQI {value}, mittleres Signal","marker.lqi_a11y_high":"LQI {value}, starkes Signal","marker.size_label":"Symbolgröße / Drehung","marker.angle_label":"Drehen","marker.model_label":"Modell","marker.model_ph":"z.B. Aqara T&H","marker.link_label":"Link","marker.desc_label":"Beschreibung","marker.desc_ph":"Notizen, Spezifikationen…","marker.manuals_label":"Handbücher (PDF usw.)","marker.sub_device":"Gerät","marker.sub_z2m_group":"· Z2M Gruppe","marker.sub_group":"Gruppe","marker.sub_helper":"Helfer","space.new":"Neuer Bereich","space.copy_title":"Bereich kopieren","space.copy_name":"Name des neuen Bereichs","space.copy_fallback":"Bereich","space.copy_create":"Kopie erstellen","space.copy_optimize_title":"Vor dem Kopieren optimieren?","space.copy_optimize_body":"Vor dem Erstellen von „{name}“ muss House Plan den gesamten Plan einschließlich anderer Bereiche optimieren. Fortfahren?","space.copy_optimize_confirm":"Optimieren und kopieren","space.copy_error_changed":"Der Plan wurde während der Bestätigung geändert. Bitte prüfen und erneut versuchen.","space.copy_error_source_missing":"Der Quellbereich existiert nicht mehr. Öffnen Sie seine Einstellungen erneut.","space.copy_error_source_invalid":"House Plan konnte nicht alle Wände dieses Bereichs prüfen. Korrigieren Sie den Quellbereich.","space.copy_error_spaces_limit":"House Plan enthält bereits die maximale Anzahl an Bereichen.","space.copy_error_partitions_limit":"Dieser Bereich enthält zu viele Wände zum Kopieren.","space.copy_error_openings_limit":"Dieser Bereich enthält zu viele Öffnungen zum Kopieren.","space.copy_error_decor_limit":"Dieser Bereich enthält zu viele Hintergrundobjekte zum Kopieren.","space.copy_error_columns_limit":"Dieser Bereich enthält zu viele Säulen zum Kopieren.","space.copy_error_opening_host":"Eine Öffnung ist keiner Wand mehr zugeordnet. Korrigieren oder löschen Sie sie vor dem Kopieren.","space.copy_error_geometry":"Die Kopie würde eine unsichere Wandgeometrie erzeugen. Korrigieren Sie den Quellbereich.","space.copy_error_optimize_geometry":"Das Kopieren wurde gestoppt, weil die Optimierung des gesamten Plans für einen Bereich unsicher ist.","space.header":"Bereich","space.title_label":"Titel","space.title_ph":"z.B. Garage","space.plan_label":"Grundriss (Hintergrund)","space.no_plan":"Kein Planbild","space.plan_alt":"Grundriss","room.new":"Neuer Raum","room.name_label":"Anzeigename","room.name_ph":"z.B. Terrasse","room.area_label":"Home Assistant Bereich (nicht zugewiesen)","room.no_area_option":"— kein Bereich —","room.default_name":"Raum","device.unnamed":"unbenannt","device.light_group":"Lichtgruppe","device.fallback":"Gerät","device.virtual":"Virtuelles Gerät","confirm.delete_room_title":'Raum "{name}" löschen?',"confirm.delete_room_body":"Festlegen, ob die ausschließlich zu diesem Raum gehörenden physischen Wände erhalten bleiben. Mit einem anderen Raum geteilte Wände bleiben immer erhalten.","confirm.remove_marker_title":"Gerät aus dem Plan löschen?","confirm.remove_marker_body":"Das Gerät verschwindet vollständig und trägt nicht mehr zu den Plandaten bei. Es kann später erneut hinzugefügt werden.","confirm.erase_decor":"Das Objekt „{kind}“ löschen? Diese Aktion kann im Editor rückgängig gemacht werden.","confirm.delete_space_title":"Bereich löschen?","confirm.delete_space_body":"Der Bereich, alle seine Räume und die gesamte Planmarkierung werden gelöscht.","confirm.delete_space_vac_routes":"Zuordnungen von Roboterkarten werden ebenfalls entfernt: {count}.","space.delete_blocked":"Dieser Bereich wird noch von {n} Gerät(en) verwendet. Die Geräte zuerst in einen anderen Bereich verschieben oder löschen.","toast.pos_save_failed":"Position nicht gespeichert: {err}","toast.no_entity":"Das Gerät hat keine geeignete Entität","toast.ha_disabled_action":"Ein deaktiviertes Home Assistant-Objekt kann im Plan nicht verwendet werden.","toast.ha_disabled_show_device":"Ein in Home Assistant deaktiviertes Gerät kann im Plan nicht angezeigt werden. Aktivieren Sie es zuerst in Home Assistant.","toast.ha_disabled_show_entity":"Eine in Home Assistant deaktivierte Entität kann im Plan nicht angezeigt werden. Aktivieren Sie sie zuerst in Home Assistant.","toast.ha_disabled_add":"Ein deaktiviertes Home Assistant-Objekt kann nicht dem Plan hinzugefügt werden. Aktivieren Sie es zuerst in Home Assistant.","toast.ha_binding_unverified":"Der Status des Objekts konnte über das Home Assistant-Register nicht überprüft werden. Anzeige und Aktionen sind vorübergehend nicht verfügbar.","toast.markup_needs_server":"Markup ist verfügbar, nachdem die Konfiguration auf den Server verschoben wurde.","toast.space_order_changed":"Reihenfolge geändert. Wenn eine Karte ihr Stockwerk nach Nummer festlegt, überprüfen Sie diese Paneele.","toast.conflict":"Die Konfiguration wurde in einem anderen Fenster geändert — Daten aktualisiert, wiederholen Sie Ihre letzte Aktion.","toast.cfg_save_failed":"Speichern der Konfiguration fehlgeschlagen: {err}","toast.room_overlap":"Die Umrisse überlappen den Raum „{name}“ — Räume dürfen sich nicht überlappen","toast.contour_cannot_close":"Die Kontur kann nicht geschlossen werden, da sie entartet ist oder sich selbst schneidet","toast.merge_not_adjacent":"Es können nur Räume zusammengeführt werden, die eine Wand teilen","toast.rooms_merged":"Räume zu „{name}“ zusammengeführt","toast.split_pick_wall":"Beginnen Sie den Schnitt an der Wand des Raumes","toast.split_bad_cut":"Der Schnitt muss wand-zu-wand innerhalb des Raumes verlaufen, ohne Wände oder sich selbst zu kreuzen","merge.header":"Räume zusammenführen","merge.hint":"Der zusammengeführte Raum behält einen Namen und eine Fläche. Die andere Fläche wird freigegeben — ihre Geräte verlassen den Plan, bis ein anderer Raum sie beansprucht.","merge.keep":"Behalten","merge.no_area":"keine Fläche","toast.room_saved":"Raum gespeichert ({n}). Hinzugefügte Geräte: {added}. Zeichnen Sie die nächste Kontur oder verlassen Sie die Markierung.","toast.room_saved_no_area":"Raum gespeichert ({n}, keine Fläche). Zeichnen Sie die nächste Kontur oder verlassen Sie die Markierung.","toast.marker_needs_server":"Die Gerätebearbeitung ist verfügbar, nachdem die Konfiguration auf den Server verschoben wurde","toast.virtual_name_required":"Einen Namen für das virtuelle Gerät eingeben","toast.marker_saved":"Gerät gespeichert","toast.marker_removed":"Gerät aus dem Plan gelöscht","toast.integration_missing":"Die House Plan-Integration ist nicht installiert — Verwaltung nicht verfügbar","toast.plan_formats":"Unterstützte Formate: SVG, PNG, JPG, WebP","toast.plan_required":"Grundriss hochladen — erforderlich","toast.space_added_onboard":"Bereich hinzugefügt. Räume einzeichnen: Rasterpunkte anklicken und die Kontur schließen.","toast.space_added":"Bereich hinzugefügt","toast.space_copied":"Bereich „{name}“ erstellt","toast.space_saved":"Bereich gespeichert","toast.space_deleted":"Bereich gelöscht","toast.delete_failed":"Löschen fehlgeschlagen: {err}","toast.error":"Fehler: {err}","toast.toggle_target_unavailable":"Ziel „{name}“ ist nicht verfügbar — keine Aktion durchgeführt","toast.toggle_targets_unavailable":"Ziele nicht verfügbar: {names}. Keine Aktion durchgeführt","toast.file_failed":'Datei "{name}" wurde nicht hochgeladen: {err}',"toast.files_attached":"Dateien angehängt: {n}","err.unknown":"unbekannter Fehler","err.code":"Code {code}","err.too_large":"Datei größer als {mb} MB","err.bad_ext":"nicht unterstützter Typ (PDF/Bild erwartet)","err.unauthorized":"Administratorrechte erforderlich","editor.title":"Titel","editor.default_floor":"Anfangsbereich","editor.default_floor_missing":"Anfangsbereich „{id}“ existiert nicht mehr. Wählen Sie einen anderen Bereich.","editor.floor":"Fester Bereich","editor.floor_none":"— nicht fest —","editor.floor_index":"YAML-Index {index} (beibehalten)","fixed_floor.loading":"Lade den festen Bereich…","fixed_floor.invalid_title":"Der feste Bereich ist nicht verfügbar","fixed_floor.invalid_body":"Überprüfen Sie die Etage in der Kartenkonfiguration. Der konfigurierte Wert ist: {value}","editor.icon_size":"Symbolgröße, % der Planbreite","editor.show_temperature":"Temperatur anzeigen","editor.live_states":"Live-Zustände (ein/aus, offen…)","editor.light_pools":"Lichtkegel und Wandschatten","editor.show_signal":"Zigbee-Signal anzeigen (LQI)","editor.language":"Schnittstellensprache","editor.lang_auto":"Automatisch (HA-Profil)","title.icon_rules":"Symbolregeln: welche MDI-Symbole Geräte nach Namen erhalten","rules.title":"Symbolregeln","rules.hint":'Regeln werden von oben anhand von "Gerätename + Modell" (Großschreibungs-unempfindliches Regex) überprüft; das erste Match gewinnt. Wenn nichts übereinstimmt, entscheidet die Entität-Geräteklasse, dann das generische Chip-Symbol.',"rules.pattern_ph":"regex, z. B. Stecker|Steckdose","rules.icon_ph":"mdi:power-socket-de","rules.add":"Regel hinzufügen","rules.reset":"Zurücksetzen auf Standardeinstellungen","rules.test_ph":"Versuch mal einen Gerätenamen...","rules.invalid":"ungültiges regex","rules.saved":"Icon-Regeln gespeichert","btn.up":"Nach oben","btn.down":"Nach unten","tap.info":"Gerätekarte","tap.more_info":"HA Mehr-Info-Dialog","tap.toggle":"Zustand umschalten","marker.tap_label":"Tap-Aktion für dieses Gerät","tap.toggle_note":"Der aufgelöste Zustand ist unten dargestellt. Sichere Geräte werden niemals aus dem Plan umgeschaltet.","import.title":"Bereiche aus HA-Etagen erstellen","import.hint":"Home Assistant kennt diese Etagen bereits. Die Etagen auswählen, die zu Planbereichen werden sollen; anschließend für jeden Bereich einen Grundriss hochladen. Die Räume werden danach von Hand eingezeichnet.","import.start":"{n} Bereich(e) erstellen","import.manual":"Von Grund auf neu starten","import.progress":"Etage {i} von {n}","import.done":"Bereiche erstellt. Räume einzeichnen: Rasterpunkte anklicken und die Kontur schließen.","btn.skip":"Überspringen","space.scale_label":"Maßstab (Rasterzellen-Größe)","space.cell_cm.help":"Verknüpft das Raster mit realen Abmessungen: Davon hängen Längen und Flächen, Wandstärken, Öffnungsgrößen und der Leuchtradius ab. Eine spätere Änderung verändert die berechneten Abmessungen des gesamten Bereichs, verschiebt aber keine Punkte im Plan.","space.cell_cm.help.aria":"Hilfe: Maßstab des Bereichs","space.scale_unit":"cm pro Zelle","space.scale_unit_imperial":"Zoll pro Zelle","space.display_section":"Anzeige","space.show_borders":"Raumgrenzen immer anzeigen","space.zero_wall_style":"Wände ohne Dicke","space.zero_wall_style.help":"Gestrichelte Wände ohne Dicke lassen Glow und Sonnenstrahlen durch, durchgezogene blockieren sie als Barriere ohne Fläche. Die Auswahl gilt für alle solchen Wände im Bereich, auch wenn ihre Linie in der Ansicht ausgeblendet ist.","space.zero_wall_style.help.aria":"Hilfe: Darstellung der Wände ohne Dicke","space.zero_wall_dashed":"Gestrichelt","space.zero_wall_solid":"Durchgezogen","space.show_names":"Raumnamen anzeigen (zum Verschieben ziehen)","space.room_color":"Farbe der Begrenzung & des Namens","space.opacity":"Deckkraft","space.fill_label":"Raumausfüllung","space.fill_mode.help":"„Eigene Farbe“ gestaltet den Bereich; „Licht“, „Temperatur“ und „LQI“ verwenden aktuelle Daten aus Home Assistant. Glow wird separat aktiviert.","space.fill_mode.help.aria":"Hilfe: Modus der Raumausfüllung","fill.none":"Keine","fill.lqi":"Zigbee-Signal","fill.light":"Lichter","fill.custom":"Benutzerdefinierte Farbe","space.custom_fill":"Füllfarbe","space.source_file":"Ich habe einen Grundriss als Bild","space.source_draw":"Kein Bild – ich werde die Räume von Hand umreißen","fill.temp":"Temperatur","tip.temp_avg":"Durchschnittstemperatur:","tip.hum_avg":"Durchschnittliche Luftfeuchtigkeit:","space_card.button":"Grundriss öffnen","space_card.not_found":"Bereich „{id}“ nicht gefunden","space_card.loading":"Laden…","continuity.restore_plan":"Grundriss wiederherstellen…","continuity.restore_connection":"Geräteverbindung wiederherstellen…","continuity.retry":"Erneut versuchen","editor.space":"Bereich","editor.framing":"Bildausschnitt","editor.fit_content":"Alle sichtbaren Inhalte","editor.fit_house":"Eng an der Hausgeometrie","editor.show_button":"Schaltfläche anzeigen","editor.button_label":"Beschriftung der Schaltfläche","editor.button_target":"Ziel-Dashboard-Pfad","marker.sub_entity":"Entität","title.general_settings":"Allgemeine Einstellungen","title.export_pdf":"Als PDF speichern","pdf.title":"Als PDF speichern","pdf.dimensions":"Maße und Flächen anzeigen","pdf.decor":"Möbel und weitere Dekoration anzeigen","pdf.room_names":"Raumnamen anzeigen","pdf.backdrop":"Hintergrund anzeigen","pdf.save":"Speichern","pdf.saving":"Wird erstellt…","pdf.failed":"Die PDF-Datei konnte nicht erstellt werden.","pdf.too_large":"Die Bilder überschreiten das PDF-Limit von 25 MB.","pdf.asset_failed":"Ein Hintergrund- oder Dekorbild konnte nicht geladen werden.","pdf.scale":"Maßstab 1:{n}","pdf.north":"Nord","gs.title":"Allgemeine Einstellungen","gs.light_group":"Füllung: Licht","gs.light_on":"Lichter an","gs.light_off":"Alle Lichter aus","gs.temp_group":"Füllung: Temperatur","gs.temp_cold":"Kalt","gs.temp_ok":"Angenehm","gs.temp_hot":"Heiß","gs.lqi_group":"Füllung: Zigbee-Signal","gs.lqi_low":"Schwaches Signal","gs.lqi_high":"Starkes Signal","gs.reset":"Auf Standard zurücksetzen","gs.saved":"Allgemeine Einstellungen gespeichert","gs.radar_show_live":"Live-Präsenz auf dem Plan anzeigen","gs.radar_show_live_hint":"Blendet alle Live-Radarziele ein oder aus. Eine Beobachtungsaufzeichnung wird dadurch weder gestartet noch beendet.","radar.title":"Präsenz auf dem Plan","radar.help":"Verbinde diese Markierung mit exakten Home-Assistant-Radarentitäten und wähle Position sowie Koordinatenprofil. Live-Positionen werden auf den ausgewählten Raum begrenzt.","radar.help.aria":"Hilfe: Einstellungen des Präsenzradars","radar.enabled":"Dieses Präsenzradar verwenden","radar.show_live":"Live-Ziele anzeigen","radar.configure":"Radar konfigurieren","radar.configure_on_plan":"Auf dem Plan konfigurieren","radar.change_installation":"Installation ändern","radar.no_contour":"Dieser Raum hat keine Begrenzung. Radarpunkte werden nicht zugeschnitten.","radar.discard_setup_title":"Radareinrichtung verwerfen?","radar.discard_setup":"Die nicht gespeicherte Radareinrichtung geht verloren.","radar.step_place_mount":"Markieren Sie die physische Sensorposition","radar.step_place_heading":"Markieren Sie einen Punkt direkt vor dem Sensor","radar.step_reference":"Markieren Sie Referenzposition {n} und starten Sie die Messung","radar.step_check_reference":"Markieren Sie eine unabhängige Prüfposition","radar.start_measure":"Messung starten","radar.countdown":"Stellen Sie sich in {seconds} s auf die Markierung","radar.capturing":"Bleiben Sie während der Messung allein und ruhig…","radar.fit_ready":"Kalibrierung ist bereit","radar.check_third":"An einer weiteren Position prüfen","radar.check_complete":"Unabhängige Prüfung abgeschlossen","radar.error_distance":"Positionsabweichung: {distance}","radar.ambiguous_target":"Mehr als ein Ziel wurde gemeldet. Wiederholen Sie die Messung allein.","radar.insufficient_samples":"Nicht genügend aktuelle Koordinaten. Wiederholen Sie die Messung oder richten Sie sie manuell ein.","radar.bad_references":"Wählen Sie getrennte Referenzen in verschiedenen Richtungen vom Sensor.","radar.ambiguous_sources":"Die Messungen lassen zwei gleich plausible Richtungen zu. Wählen Sie Referenzpunkte, die links und rechts unterscheiden.","radar.bad_fit":"Die Messungen stimmen nicht überein. Prüfen Sie Einheiten, Sensorposition und Referenzen.","radar.desktop_hint":"Verwenden Sie für eine präzise Einrichtung einen Computer. Die Bearbeitung auf Touch-Geräten ist nur eingeschränkt verfügbar.","radar.detected":"House Plan hat Radarmetadaten erkannt. Prüfe vor dem Speichern die exakten Quellen.","radar.detected_ld2450":"House Plan hat ESPHome-LD2450-Koordinaten erkannt. Prüfe vor dem Speichern die X/Y-Quellen.","radar.additional_actions":"Weitere Aktionen","radar.declare":"Dies ist ein Präsenzradar","radar.profile":"Datenprofil","radar.profile_esphome_ld2450_v1":"ESPHome LD2450 (X/Y-Ziele)","radar.profile_cartesian_v1":"Kartesische Ziele (X/Y)","radar.profile_polar_v1":"Polares Ziel (Entfernung/Winkel)","radar.profile_range_v1":"Nur Entfernung","radar.profile_zones_v1":"Zustände von Zonen","radar.profile_presence_v1":"Nur Präsenz","radar.room":"Radarraum","radar.room_choose":"Raum auswählen","radar.target":"Ziel {n}","radar.axis_x":"Entität für X-Koordinate","radar.axis_y":"Entität für Y-Koordinate","radar.add_target":"Zielplatz hinzufügen","radar.range_channel":"Entfernungskanal {n}","radar.add_range":"Entfernungskanal hinzufügen","radar.presence_gate":"Präsenz-Entität für den Kanal","radar.swap_axes":"X- und Y-Achse vertauschen","radar.axis_x_sign":"X-Richtung","radar.axis_y_sign":"Y-Richtung","radar.distance_source":"Entfernungsentität","radar.angle_source":"Winkelentität","radar.angle_unit":"Winkeleinheit","radar.degrees":"Grad","radar.radians":"Radiant","radar.angle_zero":"Richtung des Nullwinkels","radar.angle_forward":"Vorwärts","radar.angle_right":"Rechts","radar.angle_clockwise":"Winkel wachsen im Uhrzeigersinn","radar.zone_source":"Zonenentität","radar.occupancy_source":"Präsenzentität","radar.count_source":"Entität für Zielanzahl","radar.availability_source":"Verfügbarkeitsentität","radar.source_choose":"Entität auswählen","radar.source_optional":"Optional","radar.source_missing":"derzeit nicht verfügbar","radar.saved_unsupported":"Diese gespeicherte Radar-Konfiguration wird nicht unterstützt oder ist unvollständig. Sie bleibt inaktiv; entfernen Sie sie oder aktualisieren Sie House Plan vor der erneuten Einrichtung.","radar.occupancy":"Präsenz (an/aus)","radar.count":"Anzahl","radar.mount":"Position und Richtung","radar.mount_hint":"Dies ist die physische Sensorposition. Das Verschieben des dekorativen Markers ändert sie nicht.","radar.heading":"Richtung, °","radar.range_cm":"Reichweite, cm","radar.fov_deg":"Sichtfeld, °","radar.unit":"Einheit der Quelle","radar.mirror":"Links-/Rechtsachse spiegeln","radar.remove":"Radareinstellungen entfernen","radar.invalid":"Fülle Raum, Quellen und Position des Radars vor dem Speichern aus.","radar.check_sources":"Live-Daten prüfen","radar.checking":"Wird geprüft…","radar.health":"Verbindungsstatus","radar.live_summary":"Aktuelle Ziele: {targets}; Entfernungsbögen: {ranges}","radar.health_ok":"Aktuelle Daten empfangen","radar.health_off":"Keine Ziele erkannt","radar.health_stale":"Ein Teil der Koordinaten ist veraltet","radar.health_partial":"Einige Quellen sind aktuell, andere veraltet","radar.health_restricted":"Der Zugriff auf eine oder mehrere Quellen ist eingeschränkt","radar.health_incomplete":"Der aktuelle Radarbericht ist unvollständig","radar.health_position_unavailable":"Präsenz gemeldet; aktuelle Position nicht verfügbar","radar.health_unavailable":"Sensordaten nicht verfügbar","radar.health_needs_setup":"Installation muss eingerichtet werden","radar.health_inconsistent":"Die Quellen melden widersprüchliche Daten","radar.health_unknown":"Aktueller Zustand ist unbekannt","radar.health_disabled":"Radar ist deaktiviert","radar.error_invalid_radar":"Prüfe die Radareinstellungen.","radar.error_invalid_selection":"Wähle einen vorhandenen Raum und gültige Quellen.","radar.error_source_restricted":"Du hast nicht auf alle ausgewählten Quellen Zugriff.","radar.error_rate_limited":"Zu viele Anfragen. Versuche es gleich noch einmal.","radar.error_not_ready":"Die Radarverarbeitung ist noch nicht bereit.","radar.error_conflict":"Der Plan wurde geändert. Öffnen Sie die Radareinrichtung erneut und versuchen Sie es noch einmal.","radar.error_source_unavailable":"Mindestens eine ausgewählte Radarquelle ist nicht verfügbar.","radar.error_unsupported_capability":"Diese Radarfunktion wird von der installierten Integration nicht unterstützt.","radar.report_age":"vor {seconds} s","space.show_lqi":"Zigbee-Signal (LQI) neben Geräten anzeigen","space.hide_decor":"Dekorationsschicht ausblenden","space.hide_decor_tip":"Linien, Formen, Beschriftungen und Möbel bleiben an ihrem Platz — im Hintergrundeditor sichtbar, aber nicht auf dem Plan.","space.hide_openings":"Öffnungen ausblenden","space.hide_openings_tip":"Tür-, Fenster- und Tor-Symbole werden nicht gezeichnet, aber die Öffnungen funktionieren weiterhin: Licht fällt hindurch, die Sonne kommt durch ein Fenster herein, Kontaktsensoren öffnen sie weiterhin. Der Planeditor zeigt sie immer an.","gs.light_none":"Keine Lichtquellen","mode.plan":"Planeditor","mode.devices":"Geräteeditor","display.value":"Wert + Zustand","marker.subarea":"kein Bereich, manuell","device.new":"Neues Gerät — Editor öffnen, um zu schließen","opening.unlock_action":"Entsperren","opening.lock_action":"Sperren","opening.lock_pending":"Wird ausgeführt…","title.close_editor":"Editor schließen (zur Ansicht zurück)","title.add_device":"Gerät zum Plan hinzufügen","devbar.add":"Hinzufügen","devbar.rules":"Symbolregeln","device_inbox.button":"Geräte","device_inbox.title":"Geräte auf dem Plan","device_inbox.search":"Geräte, Entitäten und Integrationen suchen…","device_inbox.add_virtual":"Virtuelles Gerät hinzufügen","device_inbox.tab_on_plan":"Auf Plan","device_inbox.tab_available":"Verfügbar","device_inbox.tab_hidden":"Versteckt","device_inbox.tab_readd":"Wieder verfügbar","device_inbox.only_new":"Nur neu","device_inbox.show_entities":"Entitäten anzeigen","device_inbox.show_hidden":"Versteckte auf Plan anzeigen","device_inbox.show_hidden.help":"Zeigt ausgeblendete und deaktivierte Marker vorübergehend als Bearbeitungs-Geister auf dem Plan. Die gespeicherte Sichtbarkeit der Geräte bleibt unverändert.","device_inbox.show_hidden.help.aria":"Hilfe: ausgeblendete Geräte auf dem Plan anzeigen","device_inbox.new":"Neu","device_inbox.find":"Auf dem Plan finden","device_inbox.edit":"Bearbeiten","device_inbox.hide":"Ausblenden","device_inbox.show":"Anzeigen","device_inbox.add":"Hinzufügen","device_inbox.readd":"Wieder hinzufügen","device_inbox.hide_available":"Aus der Liste ausblenden","device_inbox.show_more":"Mehr anzeigen","device_inbox.more_actions":"Weitere Aktionen","device_inbox.find_hidden_hint":"Zuerst „Versteckte auf Plan anzeigen“ aktivieren","device_inbox.show_disabled":"Diese Bindung in Home Assistant aktivieren, bevor sie angezeigt wird","device_inbox.empty_on_plan":"Es befinden sich noch keine passenden Geräte auf dem Plan.","device_inbox.empty_available":"Es sind keine Geräte zum Hinzufügen verfügbar.","device_inbox.empty_hidden":"Es gibt keine versteckten Geräte.","device_inbox.empty_readd":"Es sind keine entfernten Geräte verfügbar, um sie erneut hinzuzufügen.","device_inbox.reason_visible_auto":"Automatisch erkannt","device_inbox.reason_visible_explicit":"Explizit hinzugefügt","device_inbox.reason_manual_hidden":"Vom Benutzer versteckt","device_inbox.reason_automatic_hidden":"Automatisch versteckt","device_inbox.reason_service_entry":"Nur Service-Registry-Eintrag","device_inbox.reason_excluded_integration":"Integration „{integration}“ durch Erkennungsfilter ausgeschlossen","device_inbox.reason_excluded_domain":"Nicht-räumlicher Entitätstyp","device_inbox.reason_grouped_light":"Dargestellt durch eine Raumlichtgruppe","device_inbox.reason_represented_by_parent":"Dargestellt durch sein übergeordnetes Gerät","device_inbox.reason_removed":"Zuvor aus dem Plan entfernt","device_inbox.reason_available":"Zum Hinzufügen zum Plan verfügbar","device_inbox.reason_no_bound_room":"HA-Bereich ist nicht mit einem Planraum verknüpft","device_inbox.status_ha_disabled":"In Home Assistant deaktiviert","device_inbox.status_orphaned":"Bindung ist in Home Assistant nicht mehr vorhanden","device_inbox.status_unverified":"Home Assistant-Register vorübergehend nicht verfügbar","device_inbox.saved":"Geräteliste aktualisiert","device_inbox.filters_excluded":"Ausgeschlossene Integrationen","device_inbox.filters_group_lights":"Raumleuchten zu einem Marker gruppieren","device_inbox.filters_preview_appear":"erscheint: {count}","device_inbox.filters_preview_hide":"verschwindet: {count}","device_inbox.filters_preview_lights":"betroffene Leuchten: {count}","device_inbox.filters_reset":"Empfohlene wiederherstellen","device_inbox.filters_save":"Filter speichern","device_inbox.filters_search_ph":"Integration hinzufügen…","device_inbox.filters_title":"Erkennungsfilter","space.roomcard_section":"Raumkarte zeigt:","space.label_temp":"Temperatur","space.label_hum":"Luftfeuchtigkeit","space.label_lqi":"Durchschnittliches Zigbee-Signal","space.label_light":"Lichter ein/aus","roomcard.light_on":"Ein","roomcard.light_off":"Aus","roomcard.light_partial":"{on} von {total}","toast.split_pick_inside":"Zwischenliegende Schnittpunkte müssen innerhalb des Raumes liegen","mode.decor":"Hintergrundeditor","decor.select":"Auswählen","decor.line":"Linie","decor.rect":"Rechteck","decor.ellipse":"Oval","decor.text":"Text","decor.erase":"Löschen","decor.erase_confirm_title":"Objekt löschen?","decor.color":"Farbe","decor.width":"Linienbreite","decor.line_style":"Linienstil","decor.line_style_solid":"Durchgehend","decor.line_style_dashed":"Gepunktet","decor.fill":"Füllen","decor.fill_color":"Füllfarbe","decor.length":"Länge","decor.size":"Größe","decor.flip_h":"Horizontal spiegeln","decor.flip_v":"Vertikal spiegeln","decor.angle":"Rotationswinkel, °","decor.text_size":"Textgröße","decor.backdrop_properties":"Eigenschaften des Planhintergrunds","decor.text_title":"Textbeschriftung","decor.object_title":"{kind} bearbeiten","decor.text_label":"Text","decor.live_group":"HA-Variable einfügen","decor.live_entity":"Entität","decor.live_entity_ph":"Wählen Sie eine Entität","decor.live_attr":"Wert","decor.live_attr_ph":"Wählen Sie Status oder Attribut","decor.live_state":"Status","decor.backdrop":"Hintergrundbild","decor.backdrop_hint":"Ziehen zum Verschieben; eine Ecke ziehen zum Größenändern; den oberen Griff zum Drehen verwenden. Shift ändert das Verhältnis oder befreit den Winkel.","decor.backdrop_reset":"Bild zurücksetzen","decor.backdrop_reset_done":"Das Bild ist wieder an seinem ursprünglichen Platz und in seiner ursprünglichen Größe","marker.icon_auto":"Auto: {icon} (nach Symbolregeln; wählen Sie eines zur Überschreibung)","marker.icon_pin_auto":"Anheften","mode.plan_tip":"Planungseditor — die Geometrie des Hauses: Räume zeichnen und teilen/zusammenführen, sie mit HA-Bereichen verbinden, Türen, Fenster und Tore platzieren, Raumkarten verschieben, Maßstab festlegen","mode.devices_tip":"Geräteeditor — alles über Symbole: ziehen zum Positionieren, klicken zum Bearbeiten von Bindung/Symbol/Anzeige, virtuelle Geräte hinzufügen, Symbolregeln","mode.decor_tip":"Hintergrundeditor — rein visuelle Dekoration unter dem Plan: Linien, Rechtecke, Ellipsen und Textbeschriftungen, die niemals auf Klicks reagieren","space.glow_enabled":"Lichtquellen-Glühen","gs.glow_group":"Glow von Lichtquellen","gs.glow_base":"Grunddunkelheit des Hauses","gs.glow_light":"Standardlichtfarbe / Intensität","gs.wall_group":"Wände","gs.wall_fill":"Wandfüllung","gs.glow_radius":"Glow-Radius","gs.glow_radius.help":"Legt den allgemeinen Radius des Lichtscheins in Metern oder Fuß fest; ein gerätespezifischer Radius überschreibt diesen Wert.","gs.glow_radius.help.aria":"Hilfe: allgemeiner Glow-Radius","gs.unit_m":"m","gs.unit_ft":"ft","marker.controls_label":"Steuert andere Lichtquellen","marker.controls.help":"Mit der Aktion „Zustand umschalten“ werden die aufgeführten Quellen zusammen mit diesem Marker umgeschaltet. Ihr Glow bleibt an ihren eigenen Markern, und die Verknüpfung allein macht den steuernden Marker nicht zur Lichtquelle.","marker.controls.help.aria":"Hilfe: andere Lichtquellen steuern","marker.controls_filter":"Suchlichter und Schalter…","info.controls":"Steuerungen","marker.glow_radius_label":"Leuchtradius","marker.glow_radius.help":"Legt den Leuchtradius in Metern oder Fuß fest; ein leerer Wert verwendet den Radius aus den allgemeinen Einstellungen.","marker.glow_radius.help.aria":"Hilfe: Leuchtradius","markup.wallthick":"Dicke","markup.select":"Auswählen","title.markup_wallthick":"Dicke — klicken Sie auf eine Wand, um ihre Dicke von 0 bis 100 cm festzulegen.","markup.hint_wallthick":"klicken Sie auf eine Wand · Esc schließt ohne Anwendung","wallthick.field":"Dicke","wallthick.unit_cm":"cm","wallthick.unit_in":"in","wallthick.apply_room":"Auf alle Wände dieses Raums anwenden","markup.draw_wall_title":"Dicke jedes neuen Wandsegments (0–100 cm). Gemeinsame Wände behalten den bestehenden Wert.","room.queue_progress":"Raum {current} von {total}","toast.wall_rooms_saved":"Erstellte Räume: {n}","toast.wall_chain_saved":"Wandkette gespeichert","toast.wallthick_pick":"Eine Wand anklicken","toast.wallthick_set":"Wandstärke eingestellt","toast.wallthick_cleared":"Wandstärke entfernt","toast.physical_range":"Einen Wert von {min} bis {max} {unit} eingeben","toast.zero_wall_opening_conflict":"Entfernen Sie zuerst die Öffnung an diesem Wandsegment.","toast.zero_wall_ambiguous":"Das Wandsegment ist mehrdeutig. Vereinfachen oder passen Sie den Anschluss an.","toast.zero_wall_migration_blocked":"Der Bereich wurde nicht konvertiert: {reason}. Es wurden keine Daten geändert.","toast.physical_angle":"Einen Drehwinkel von 0° bis unter 90° eingeben","toast.physical_limit":"Der Bereich hat das Limit für diesen Geometrietyp erreicht","toast.geometry_unsafe":"Änderung abgebrochen: Wandgeometrie konnte nicht sicher erstellt werden.","junction.limit_angle":"Der Winkel zwischen den Wänden ist zu spitz: {actual}°, mindestens {limit}°.","junction.limit_valence":"Zu viele Wände treffen in einem Knoten aufeinander: {actual}, maximal {limit}.","junction.limit_length":"Das Wandsegment ist zu kurz: {actual} cm, mindestens {limit} cm.","junction.limit_distance":"Wände und Knoten sind zu dicht beieinander: {actual} cm, Minimum {limit} cm.","junction.limit_clearance":"Kein Wohnbereich ist übrig: {actual} cm², Minimum {limit} cm².","junction.limit_check_failed":"Die Überprüfung der Verbindungen konnte nicht durchgeführt werden — die Änderung wurde nicht gespeichert.","toast.wall_model_migration_blocked":"Das Wandmodell konnte nicht aktualisiert werden: {reason}. Der Plan wurde nicht geändert. Führen Sie „Pläne optimieren“ aus; wenn der Fehler erneut auftritt, beheben Sie die widersprüchliche Wandgeometrie.","toast.wall_model_client_outdated":"Aktualisieren Sie die Karte und laden Sie die Seite neu, bevor Sie den Plan bearbeiten.","wall_model.reason.invalid-room":"ungültiger Raumkontur","wall_model.reason.zero-length":"Wandsegment mit null Länge","wall_model.reason.third-owner":"Wand, die von mehr als zwei Räumen geteilt wird","wall_model.reason.duplicate-id":"widersprüchliche Wandkennungen","wall_model.reason.thickness-conflict":"widersprüchliche Wandstärkenwerte","wall_model.reason.opening-host":"Öffnung kann nicht einer Wand zugewiesen werden","toast.delete_room_pick":"Klicken Sie in den Raum, den Sie löschen möchten","toast.plan_snap_ambiguous":"Zoomen Sie hinein, um den Wandknoten auszuwählen","toast.wall_repair_ambiguous":"Der Raumumriss hat mehr als eine mögliche Verbindung. Zoomen Sie hinein und verbinden Sie ihn explizit.","toast.wall_repair_too_large":"Die Lücke ist größer als 2 cm. Verbinden Sie die Wände, bevor Sie den Raum erstellen.","toast.wall_repair_changed":"Die Wandgeometrie hat sich geändert. Versuchen Sie erneut, den Raum zu erstellen.","toast.opening_on_zero_wall":"Öffnungen können nicht auf einer Wand mit null Dicke sitzen.","marker.from_ha_option":"Wählen Sie aus der HA-Liste.","marker.show_entities":"Entitäten anzeigen.","marker.show_entities_tip":"Fügt nicht nur Geräte zur Liste hinzu, sondern auch alle ihre Entitäten.","marker.pick_ph":"Wählen Sie ein Gerät…","room.open_area":"Öffnen Sie den HA-Bereich.","room.fit_action":"Raum {name} einpassen","view.volumetric":"Volumetrische Ansicht.","view.flat":"Flache Ansicht.","kiosk.title":"Die Größen dieses Bildschirms.","kiosk.hint":"Nur auf diesem Gerät gespeichert – jedes Wandtablet oder TV kann seine eigenen komfortablen Größen haben.","kiosk.icon_scale":"Gerätesymbolgröße.","kiosk.font_scale":"Textgröße der Raumkarte.","editor.kiosk":"Wandgeräte- (Kiosk-)Modus.","editor.cycle":"Bereiche automatisch alle N Sekunden wechseln (Kiosk, 0 = aus)","room.settings_title":"Raumeinstellungen.","room.settings_section":"Raumeinstellungen (überschreibt den Bereich)","room.fill_label":"Diesen Raum ausfüllen","fill.inherit":"Als den Bereich","room.custom_fill_space":"Bereichsfarbe","room.custom_fill_own":"Raumfarbe","room.temp_range_label":"Komfortbereich","room.temp_range_min":"Untere Grenze der Komforttemperatur","room.temp_range_max":"Obere Grenze der Komforttemperatur","room.temp_range_reset":"Wie im Bereich","room.temp_range.help":"Dieser Bereich gilt nur für diesen Raum. Leere Felder übernehmen die jeweilige Grenze des Bereichs; sind die Grenzen vertauscht, verwendet House Plan den kleineren Wert als Untergrenze und den größeren als Obergrenze.","room.temp_range.help.aria":"Informationen zum Komfortbereich des Raums","room.temp_src_label":"Temperaturquelle","room.hum_src_label":"Luftfeuchtigkeitsquelle","room.src_average":"Durchschnitt über die Sensoren des Raums (Standard)","room.src_pick":"Ein bestimmtes HA-Gerät oder Entität","room.src_ph":"Quelle wählen…","toast.room_updated":"Raum aktualisiert","space.card_font":"Schriftgröße der Raumkarte (gesamter Bereich)","room.sizes_section":"Schriftgrößen","room.name_scale":"Raumname Größe","room.label_scale":"Metrikgröße","preview.room_name":"Wohnzimmer","toast.cfg_reload_failed":"Der Plan konnte nicht vom Server neu geladen werden: {err}","toast.locale_load_failed":"Das Sprachpaket konnte nicht geladen werden. Bis zum Neuladen der Seite wird Englisch verwendet.","toast.furniture_art_load_failed":"Die Möbelzeichnungen konnten nicht geladen werden. Laden Sie die Seite neu, um sie anzuzeigen.","room.settings_short":"Raumeinstellungen","room.unnamed":"Unbenannter Raum","marker.use_climate_temp":"Geräte-Temperatur im Raum berücksichtigen","marker.use_climate_temp_tip":"Fügt die aktuelle Temperatur einer Klimaanlage oder eines Thermostats zum Raumdurchschnitt hinzu. Das externe Wert-Label unten separat konfigurieren.","marker.value_badge_title":"Wert-Label","marker.value_badge.help":"Zeigt einen ausgewählten Wert neben dem Symbol an. Dies beeinflusst nicht die Raumkennzahlen, Licht, Glanz oder die Tippaktion.","marker.value_badge.help.aria":"Hilfe: Gerätewert-Badge","marker.value_badge_enabled":"Zeige ein Wert-Badge","marker.value_badge_source":"Wert","marker.value_badge_source.help":"Wählen Sie einen bestimmten Zustand, ein unterstütztes Attribut oder einen abgeleiteten Wert dieses Geräts.","marker.value_badge_source.help.aria":"Hilfe: Quelle des Wert-Badges","marker.value_badge_position":"Position","marker.value_badge_position.help":"Die gewählte Seite bleibt fest und dreht sich nicht automatisch an einem Planrand.","marker.value_badge_position.help.aria":"Hilfe: Position des Wert-Badges","marker.value_badge_right":"Rechts","marker.value_badge_bottom":"Unten","marker.value_badge_left":"Links","marker.value_badge_top":"Oben","marker.value_badge_empty":"Für dieses Gerät stehen keine Werte zur Verfügung","marker.value_badge_static":"Ein statisches Symbol zeigt keine Live-Werte an. Die Einstellung wird beibehalten.","marker.value_badge_missing":"Quelle nicht verfügbar","marker.value_badge_missing_hint":"Die gespeicherte Quelle ist derzeit nicht verfügbar. Behalten Sie sie bei, deaktivieren Sie das Badge oder wählen Sie einen anderen Wert.","marker.value_badge_duplicate":"Derselbe Wert wird bereits im Symbol angezeigt.","marker.value_badge_state":"Status · {name}","marker.value_badge_marker_state":"Lichtquellstatus · {name}","marker.value_badge_lqi":"Durchschnittliche Zigbee-Signalqualität","marker.value_badge_attr_current_temperature":"Aktuelle Temperatur · {name}","marker.value_badge_attr_temperature":"Zieltemperatur · {name}","marker.value_badge_attr_current_humidity":"Aktuelle Luftfeuchtigkeit · {name}","marker.value_badge_attr_humidity":"Luftfeuchtigkeit · {name}","marker.value_badge_attr_current_position":"Position · {name}","marker.value_badge_attr_percentage":"Geschwindigkeit · {name}","marker.value_badge_attr_brightness":"Helligkeit · {name}","marker.value_badge_attr_volume_level":"Lautstärke · {name}","marker.value_badge_attr_battery_level":"Batterie · {name}","marker.value_badge_attr_fan_speed":"Lüftergeschwindigkeit · {name}","marker.value_source":"Wertquelle","marker.value_source.help":"Wähle den Wert, der das Symbol ersetzt. Die Tipp-Aktion bleibt unverändert.","marker.value_source.help.aria":"Hilfe: Wertquelle in der Gerätefläche","marker.value_source_auto":"Automatisch (wie bisher)","marker.value_source_missing_hint":"Die gespeicherte Quelle ist derzeit nicht verfügbar. Bis sie wieder verfügbar ist oder ein anderer Wert gewählt wird, zeigt die Fläche —.","marker.light_role_label":"Ist dieses Gerät eine Lichtquelle?","marker.light_role.help":"„Auto“ verwendet die ermittelte Rolle des verknüpften Geräts, „Immer“ erzwingt eine eigene Quelle und „Nie“ schließt sie aus; oben verknüpfte Lichter bleiben unabhängig.","marker.light_role.help.aria":"Hilfe: ob dieses Gerät eine Lichtquelle ist","marker.light_role_auto_yes":"Automatisch (Lichtquelle)","marker.light_role_auto_no":"Automatisch (keine Lichtquelle)","marker.light_role_always":"Immer eine Lichtquelle","marker.light_role_never":"Nie eine Lichtquelle","marker.light_entity_label":"Führende Lichtereinheit","marker.light_entity.help":"Für ein Verbundgerät wählen Sie die Entität, deren Zustand, Farbe und Helligkeit diese Planquelle darstellen. Der automatische Rückgriff bleibt mit älteren Plänen kompatibel.","marker.light_entity.help.aria":"Hilfe: führende Lichtentität","marker.light_entity_auto":"Automatisch ({entity})","marker.light_entity_none":"keine steuerbare Entität","marker.light_entity_missing":"Die gespeicherte Entität {entity} ist nicht verfügbar. House Plan verwendet vorübergehend {fallback}; die gespeicherte Auswahl wird wiederhergestellt, wenn sie zurückkehrt.","marker.toggle_entity_label":"Zu toggelnde Entität","marker.toggle_entity.help":"Für ein Verbundgerät wählen Sie das genaue eigene Licht oder den Schalter, der durch Tippen bedient wird. Automatisch behält die vorherigen Zielregeln bei und ist unabhängig von der führenden Lichtentität.","marker.toggle_entity.help.aria":"Hilfe: zu toggelnde Entität","marker.toggle_entity_auto":"Automatisch ({entity})","marker.toggle_entity_none":"keine eigene steuerbare Entität","marker.toggle_entity_missing":"Die gespeicherte Entität {entity} ist nicht mehr unter den auswählbaren Kanälen dieses Markers. House Plan verwendet vorübergehend {fallback}; die gespeicherte Auswahl wird wiederhergestellt, wenn sie zurückkehrt.","marker.glow_color_label":"Leuchtfarbe und Helligkeit","marker.glow_mode.help":"Verwenden Sie Live-Quellwerte, überschreiben Sie nur deren Farbe oder fixieren Sie sowohl Farbe als auch Helligkeit. Das Minimum beträgt 1 %; um die Quelle zu deaktivieren, wählen Sie „Nie“.","marker.glow_mode.help.aria":"Hilfe: Leuchtfarbe und Helligkeit","marker.glow_mode_auto":"Von Quelle","marker.glow_mode_color":"Farbe einstellen","marker.glow_mode_fixed":"Farbe und Helligkeit einstellen","marker.glow_color":"Leuchtfarbe","marker.glow_brightness":"Helligkeit","marker.glow_disabled_never":"Leuchteinstellungen sind nicht verfügbar, da dieser Marker ausdrücklich keine Lichtquelle ist.","marker.glow_disabled_auto":"Im Automatikmodus wurde keine räumliche Lichtquelle für diesen Marker gefunden.","marker.glow_disabled_no_entity":"Keine aktive steuerbare Home Assistant-Entität ist für diese räumliche Quelle verfügbar.","marker.glow_passive_hint":"Diese Quelle hat keine eigenen Home Assistant-Daten. Stellen Sie ihre Farbe und Helligkeit manuell ein; ihr Radius bleibt verfügbar.","marker.control_broken":"Gespeicherte Quelle fehlt oder ist nicht mehr als Licht markiert","marker.control_missing_label":"Fehlendes Planlicht","marker.control_passive":"passive Quelle","toast.marker_control_cycle":"Dieser Link würde eine kreisförmige Kette von Lichtsteuerungen erzeugen.","toast.marker_binding_required":"Wählen Sie ein Home Assistant-Gerät, bevor Sie eine andere Lichtquelle verlinken.","confirm.unlock_title":"Schloss öffnen?","confirm.unlock_body":"House Plan sendet einen Befehl zum Öffnen an dieses Schloss.","toast.files_migrate_failed":"Anhänge konnten nicht zur neuen Bindung verschoben werden, Links zeigen weiterhin auf die alten Dateien: {err}","space.pick_saved":"Bereits hochgeladen","space.pick_saved_hint":"Auf dem Server gespeicherte Pläne, einschließlich solcher, die Sie zuvor getrennt haben","space.no_saved":"Noch keine Pläne auf dem Server gespeichert.","space.loading":"Laden…","space.used_by":"in Benutzung: {list}","space.in_use":"Ein Bereich verwendet diesen Plan noch — zuerst die Verknüpfung lösen","btn.use":"Verwenden","confirm.delete_plan_title":"Plandatei löschen?","confirm.delete_plan_body":"Die Datei wird vom Server gelöscht. Dieser Vorgang kann nicht rückgängig gemacht werden.","toast.plans_list_failed":"Konnte die gespeicherten Pläne nicht auflisten: {err}","toast.plan_delete_failed":"Konnte den Plan nicht löschen: {err}","marker.hide":"Ausblenden","marker.hide_tip":'Das Gerät wird nach dem Speichern aus dem Plan verschwinden, aber weiterhin zum Signalsignal des Raums zählen. Stellen Sie es über den Katalog "Geräte" im Geräte-Editor wieder her.',"marker.show":"Anzeigen","marker.show_tip":"Das Gerät wird nach dem Speichern wieder im Plan erscheinen.","marker.hidden_ghost":"Vom Benutzer ausgeblendetes Gerät","marker.ha_disabled_device":"Das Gerät ist in Home Assistant deaktiviert und im Plan ausgeblendet.","marker.ha_disabled_entity":"Die Entität ist in Home Assistant deaktiviert und im Plan ausgeblendet.","marker.ha_disabled_all_entities":"Das Gerät hat keine aktiven Home Assistant-Entitäten, daher ist es im Plan ausgeblendet.","marker.ha_registry_limited":"Das vollständige Home Assistant-Register ist für diesen Benutzer nicht verfügbar. Das nicht verifizierte Objekt kann vorerst nicht angezeigt oder verwendet werden.","marker.delete_tip":"Löschen Sie das Gerät vollständig aus dem Plan und allen Aggregaten. Sie können es später wieder hinzufügen.","tap.run":"Führen Sie Automation/Skript/Szene aus","tap.none":"Nichts tun","marker.run_target_label":"Was ausführen","marker.run_search_ph":"Suchen: Automation, Skript oder Szene…","marker.run_target_gone":"Ziel {id} nicht gefunden — erneut auswählen","marker.tap_confirm":"Um Bestätigung bitten","marker.tap_confirm_tip":"Vor der Ausführung ein Bestätigungsdialogfeld anzeigen — eine Vorsichtsmaßnahme gegen versehentliche Berührungen.","marker.toggle_hint_single":"Ziel: {name} ({id}).","marker.virtual_light_target":"Virtuelles Licht: {name}.","marker.virtual_light_current":"Manueller Zustand: {state} → {effect}.","marker.virtual_light_state_on":"ein","marker.virtual_light_state_off":"aus","marker.toggle_hint_group":"Wird {count}-Quelle(n) umschalten: {names}.","marker.toggle_hint_current":"Jetzt: {state} → {effect}.","marker.toggle_hint_group_current":"Derzeit an: {on} von {count} → {effect}.","marker.toggle_hint_skipped":"Wird übersprungen ({count}): {targets}.","marker.toggle_effect_turn_on":"wird eingeschaltet","marker.toggle_effect_turn_off":"wird ausgeschaltet","marker.toggle_effect_open":"wird geöffnet","marker.toggle_effect_close":"wird geschlossen","marker.toggle_effect_stop":"wird gestoppt","marker.toggle_effect_toggle":"Zustand wird umgeschaltet","marker.toggle_skip_missing":"nicht gefunden","marker.toggle_skip_ha_disabled":"in HA deaktiviert","marker.toggle_skip_unavailable":"nicht verfügbar","marker.toggle_skip_unsupported":"Umschalten wird nicht unterstützt","marker.toggle_skip_secure":"aus Sicherheitsgründen blockiert","marker.toggle_none_no_binding":"Dieses Gerät hat keine Bindung, daher gibt es keinen Zustand, der umgeschaltet werden könnte. Tippen bewirkt nichts.","marker.toggle_none_no_actionable_entity":"Dieses Gerät hat keinen Zustand, der umgeschaltet werden könnte. Tippen bewirkt nichts.","marker.toggle_none_configured_targets_missing":"Die konfigurierten Ziele sind nicht verfügbar. Die eigene Entität des Geräts wird nicht ersetzt.","marker.toggle_none_ha_disabled":"Das Ziel ist in Home Assistant deaktiviert und kann im Plan nicht verwendet werden.","marker.toggle_none_unavailable":"Das Ziel ist derzeit nicht verfügbar. Tippen bewirkt nichts.","marker.toggle_none_unsupported":"Home Assistant bietet keine sichere Umschaltfunktion für dieses Gerät. Tippen bewirkt nichts.","marker.toggle_none_secure":"Das Umschalten von Schlössern, Alarmen und gesicherten Toren über den Plan ist aus Sicherheitsgründen gesperrt.","run.automation":"Automatisierung","run.script":"Skript","run.scene":"Szene","confirm.tap_run":'"{name}" ausführen?',"confirm.tap_toggle":'"{name}" umschalten?',"confirm.current_state":"Aktueller Zustand: {state}","confirm.expected_state":"Nach dem Umschalten: {state}","confirm.group_current":"an {on} von {total}","confirm.group_all_on":"alle sind eingeschaltet","confirm.group_all_off":"alle sind ausgeschaltet","confirm.unavailable_targets":"Nicht verfügbar: {count}","confirm.expected_by_ha":"Home Assistant ermittelt den Zustand","confirm.state_on":"Ein","confirm.state_off":"Aus","confirm.state_open":"Offen","confirm.state_closed":"Geschlossen","confirm.state_opening":"Wird geöffnet","confirm.state_closing":"Wird geschlossen","confirm.state_stopped":"Gestoppt","confirm.state_unknown":"Unbekannt","toast.run_started":"Gestartet: {name}","toast.run_target_missing":"Ausführungsziel nicht gefunden — überprüfen Sie die Geräteeinstellungen","toast.run_target_required":"Wählen Sie eine Automatisierung, ein Skript oder eine Szene aus","toast.tap_target_changed":"Das Ziel der Aktion hat sich geändert. Versuchen Sie es erneut.","toast.virtual_light_toggle_failed":"Das virtuelle Licht konnte nicht umgeschaltet werden: {err}","toast.value_badge_source_required":"Einen Wert für den Badge auswählen","btn.run":"Ausführen","vac.section":"Roboterstaubsauger: aktuelle Position","vac.autocal":"Automatisch einrichten","vac.live":"Aktuelle Position im Plan","vac.trail":"Roboterpfad anzeigen","vac.autocal_no_rooms":'Die Integration meldet keine Raumliste — öffnen Sie "Manuell anpassen"',"vac.route_warn_unmapped":"Der Roboter reinigt eine Karte, die keiner Etage zugeordnet ist","vac.route_warn_needs_calibration":"Die Karte ist einer Etage zugeordnet, aber nicht kalibriert","vac.route_warn_ambiguous":"Zwei Karten sind nicht unterscheidbar — keine Etage gewählt","vac.route_warn_missing_space":"Der Raum dieser Karte wurde gelöscht","vac.autocal_no_match":'Raumnamen stimmten nicht überein (mindestens 3 müssen übereinstimmen) — öffnen Sie "Manuell anpassen"',"vac.autocal_done":"Fertig: über {rooms} Räume zugeordnet. Eine Reinigung starten und das Ergebnis prüfen.","vac.cal_need_pos":"Der Roboter meldet keine Koordinaten — starten Sie eine Reinigung und pausieren Sie sie","vac.cal_done":"Kalibrierung gespeichert. Eine Reinigung starten und das Ergebnis prüfen.","vac.cal_cancelled":"Kalibrierung abgebrochen","vac.fit":"Manuell anpassen","vac.fit_hint":"Roboterkarte an die richtige Position ziehen und an den Ecken skalieren","vac.fit_rotate":"90° drehen","vac.fit_mirror":"Spiegeln","vac.trail_never":"Nie","vac.trail_cleaning":"Beim Reinigen","vac.trail_always":"Immer","gs.bg_group":"Bühnenhintergrund","gs.bg_color":"Hintergrund um den Plan","gs.bg_default":"Standardthema","gs.bg_theme":"Standardthema","gs.bg_mode":"Planhintergrund","gs.bg_mode.help":"„Folgt der Sonne“ verwendet sun.sun und ersatzweise die lokale Browserzeit; „Statische Farbe“ zeigt immer die ausgewählte Farbe.","gs.bg_mode.help.aria":"Hilfe: allgemeiner Planhintergrund","gs.bg_static":"Statische Farbe","gs.bg_daynight":"Folgt der Sonne","gs.sun_group":"Sonne","gs.sun_missing":"Die sun.sun-Entität wurde nicht gefunden — der Hintergrund folgt Ihrer lokalen Uhr; Fensterstrahlen sind nicht verfügbar.","gs.north":"Norden auf dem Plan","gs.north.help":"Der Winkel wird im Uhrzeigersinn von der oberen Vertikalen des Plans gemessen; Norden wird für Fensterstrahlen benötigt, nicht für den Hintergrund „Folgt der Sonne“.","gs.north.help.aria":"Hilfe: allgemeine Nordrichtung","gs.north_ph":"nicht gesetzt","gs.north_clear":"Löschen","gs.north_letter":"N","gs.sun_rays":"Sonnenlicht durch Fenster","gs.sun_ray_origin":"Sonnenstrahlen","gs.sun_ray_origin.inner":"Von den inneren Fensterecken","gs.sun_ray_origin.outer":"Von den äußeren Fensterecken","gs.about_version":"House Plan Card v{v}","gs.about_github":"GitHub · Dokumentation & Probleme","gs.about_telegram":"Telegram-Chat","support.title":"Hilfe & Feedback","space.bg_color":"Hintergrund rund um den Plan","space.bg_inherit":"Allgemein erben","space.bg_inherited":"erbt allgemeine Einstellungen","space.bg_mode":"Planhintergrund","space.bg_mode.help":"Übernehmen Sie den allgemeinen Hintergrund oder überschreiben Sie diesen Bereich mit einer statischen Farbe oder „Folgt der Sonne“.","space.bg_mode.help.aria":"Hilfe: Hintergrund des Bereichs","space.north":"Norden auf dem Plan (überschreiben)","space.north.help":"Überschreibt die allgemeine Nordrichtung für diesen Bereich; der Winkel wird im Uhrzeigersinn von der oberen Vertikalen des Plans gemessen und für Fensterstrahlen verwendet.","space.north.help.aria":"Hilfe: Norden für diesen Bereich","space.north_inherited":"geerbt: {v}","space.sun_rays":"Sonnenlicht durch Fenster","space.sun_inherit":"Allgemein erben","space.sun_on":"Ein","space.sun_off":"Aus","canvas.far_objects":"{n} Objekt(e) weit vom Plan entfernt","canvas.show_far":"Anzeigen","canvas.home_tip":"Der Plan ist dort drüben — klicken, um ihn anzupassen","gs.grid_group":"Planwartung","gs.grid_hint":"Aktualisiert Datenmodelle, richtet Planelemente am Raster aus und fasst redundante Wandfragmente zusammen. Ein exakter Bericht wird angezeigt, bevor etwas gespeichert wird.","gs.align_all":"Pläne optimieren","gs.align_title":"Pläne optimieren","gs.align_none":"Alle Pläne verwenden bereits das aktuelle optimierte Datenmodell.","gs.optimize_no_automatic_changes":"Es gibt keine automatischen Änderungen, die angewendet werden müssen. Überprüfen Sie die unten stehenden Punkte.","gs.align_count":"{n} von {total} Elementen werden sich um höchstens {cm} cm bewegen.","gs.align_where":"Die größte Verschiebung ist in „{s}“.","gs.align_turned":"Öffnungen, deren Winkel korrigiert wurde: {n}.","gs.align_preflight_failed":"Die Geometrie der folgenden Bereiche konnte nicht sicher überprüft werden: {spaces}{more}.","gs.align_preflight_hint":"Pläne wurden nicht geändert. Kopieren Sie die Diagnosen mit dem untenstehenden Button und fügen Sie sie zusammen mit einem Raumexport dem Fehlerbericht bei.","gs.preflight_reason_prepare-exception":"Die Bereichsgeometrie konnte nicht vorbereitet werden (Ausnahme beim Erstellen des Modells)","gs.preflight_reason_wall-null":"Der Wandkörper wurde nicht erstellt (die Vereinigung lieferte leer zurück)","gs.preflight_reason_wall-degraded-extra":"Der Wandkörper wurde mit zusätzlicher Geometrie beschädigt","gs.preflight_reason_wall-failed-core":"Der Kern des Wandkörpers konnte nicht zusammengesetzt werden","gs.preflight_reason_wall-exception":"Die Wandkonstruktion warf eine Ausnahme","gs.preflight_reason_floor-null":"Der Fußbodenumriss wurde nicht erstellt","gs.preflight_reason_floor-exception":"Bodenaufbau hat eine Ausnahme ausgelöst","gs.preflight_copy":"Diagnosen kopieren","gs.preflight_copied":"Diagnosen kopiert","gs.preflight_update_hint":"Die Karten- und Integrationsversionen unterscheiden sich — Hausplan aktualisieren und erneut versuchen.","gs.align_preflight_space":"Bereich {n}","gs.align_preflight_more":", und {n} mehr","gs.optimize_changes":"Modellmigrationen: {m}; aktualisierte Bereiche: {c}; entfernte verrauschte Koordinatenwerte: {p}; zusammengeführte Fragmente realer Wände: {w}; zusammengeführte Fragmente von Wänden ohne Dicke: {s}; unabhängige Wände: {i}.","gs.zero_walls_migrated":"Virtuelle Wandspannweiten konvertiert: {n}.","gs.wall_segments_migrated":"Wandsegmente stabilisiert: {n}.","gs.room_drafts_migrated":"Unvollständige Konturen wurden in normale Wände umgewandelt: {drafts}; Wandsegmente: {segments}.","gs.optimize_lattice_summary":"Rauschen in den Koordinatenwerten kanonisiert: {n}; maximale Bewegung: {cm} cm.","gs.optimize_lattice_space":"{space}: Koordinatenwerte kanonisiert: {n}; außerhalb des Rasters liegende Werte unverändert gelassen: {far}.","gs.optimize_coincident_partitions":"Versteckte unabhängige Wandabschnitte in Raumwände integriert: {n}.","gs.optimize_openings_rehosted":"Öffnungen wieder an Raumwände angebracht: {n}.","gs.optimize_walls_straightened":"Wände begradigt: {n}; maximale Bewegung: {cm} cm.","gs.optimize_walls_straightened_where":"Größte Wandkorrektur: {s}.","gs.optimize_walls_straighten_skipped":"Nahe Achsenwände unverändert gelassen, da sie nicht sicher repariert werden konnten: {n}.","gs.optimize_glow_migration":"Legacy Glow: {spaces} Bereiche → keine Datenfüllung + unabhängiges Glow; {rooms} Räume → geerbte Datenfüllung + unabhängiges Glow.","gs.optimize_references":"Referenzen repariert: Bereiche — {spaces}; Räume — {rooms}; Positionen — {positions}; Geräte aus fehlenden Bereichen gelöst — {detached}.","gs.optimize_reference_more":", und {n} mehr","gs.optimize_orphans_removed":"Vergessene Einträge entfernt: {total} — Raumbezeichnungen: {rooms}; Geräte: {devices}; Gruppenmarkierungen: {groups}. Sie gehörten zu zuvor gelöschten Bereichen.","gs.optimize_live_positions":"Alte Positionen in gelöschten Bereichen gehören zu vorhandenen Objekten: {n}{names}. Sie werden beibehalten.","gs.optimize_live_positions_remove":"Alte Positionen in gelöschten Bereichen gehören zu vorhandenen Objekten: {n}{names}. Sie sind zur Entfernung ausgewählt.","gs.optimize_live_names":": {names}{more}","gs.optimize_live_remove":"Alte Positionen entfernen","gs.optimize_live_keep":"Alte Positionen beibehalten","gs.optimize_live_selected":"Alte Positionen werden nach der Anwendung von Optimieren entfernt.","gs.optimize_unverified":"Positionen konnten nicht sicher überprüft werden: {n}. Sie wurden unverändert belassen.","gs.optimize_registry_limited":"Voller Administratorzugriff auf die Home Assistant-Registries ist für eine sichere Überprüfung erforderlich.","gs.optimize_vacuum_warning":"Raumzuordnungen, die noch überprüft werden müssen: {n}.","gs.optimize_details":"Details","gs.optimize_details_more":"Und {n} weitere Einträge.","gs.optimize_detail_removed":"wird entfernt","gs.optimize_detail_live":"wird beibehalten","gs.optimize_detail_unverified":"nicht überprüft","gs.optimize_detail_room_label":"Raumkennzeichnung","gs.optimize_detail_device":"Gerät","gs.optimize_detail_group":"Gruppenkennzeichen","gs.optimize_detail_unknown":"unbekannter Eigentümer","gs.optimize_detail_item":"{status}: {kind} {id}; alter Bereich {space}","gs.align_warn":"Absichtlich zwischen Rasterknoten platzierte Elemente werden sich bewegen. Nach der Operation ist nur eine Rückgängig-Funktion verfügbar, und zwar nur bis zur nächsten Planbearbeitung.","gs.align_run":"Optimieren","gs.align_done":"Pläne optimiert: {n} Elemente bewegt, {m} Datensätze beibehalten, {r} Verweise repariert","gs.optimize_undo":"Letzte Optimierung rückgängig machen","gs.optimize_undone":"Die letzte Optimierung wurde rückgängig gemacht","decor.furniture":"Möbel","decor.image":"Bild","decor.image_title":"Eigene Bilder","decor.image_upload":"Bild hochladen","decor.image_replace":"Bild ersetzen","decor.image_uploading":"Wird hochgeladen…","decor.image_asset":"Bilddatei","decor.image_pick_hint":"Ein Bild hochladen oder ein vorhandenes auswählen.","decor.image_place_hint":"Auf den Plan klicken, um das Bild zu platzieren.","decor.image_none":"Noch keine Bilder hochgeladen.","decor.image_unavailable":"Bild nicht verfügbar","decor.image_used":"In {n} Objekten verwendet","decor.image_upload_failed":"Bild konnte nicht hochgeladen werden: {err}","decor.image_error_capacity":"Der Speicher für benutzerdefinierte Bilder ist voll.","decor.image_in_use":"Vor dem Löschen alle platzierten Kopien entfernen.","decor.image_delete_title":"Bilddatei löschen?","decor.image_delete_message":"„{name}“ aus House Plan löschen? Dies kann nicht rückgängig gemacht werden.","furn.title":"Möbelbibliothek","furn.symbol":"Symbol","furn.group_furniture":"Möbel","furn.group_appliance":"Geräte","furn.group_sanitary":"Sanitär","furn.group_other":"Sonstiges","furn.width":"Breite","furn.depth":"Tiefe","furn.back_to_categories":"Alle Kategorien","furn.pick_hint":"Wählen Sie eine Kategorie und dann ein Symbol.","furn.place_hint":"Klicken Sie auf den Plan — das Element wird an der nächsten Wand platziert. Mit Shift wird es frei platziert.","furn.cat_air_conditioner":"Klimaanlagen","furn.cat_armchair":"Sessel","furn.cat_bathtub":"Badewannen","furn.cat_bed":"Betten","furn.cat_bidet":"Bidets","furn.cat_boiler":"Warmwasserbereiter","furn.cat_chair":"Stühle","furn.cat_coffee_table":"Couchtische","furn.cat_cooktop":"Kochfelder","furn.cat_dining_table":"Esstische","furn.cat_dishwasher":"Geschirrspüler","furn.cat_dryer":"Wäschetrockner","furn.cat_fireplace":"Kamine","furn.cat_fridge":"Kühlschränke","furn.cat_kitchen_cabinet":"Küchenschränke","furn.cat_kitchen_sink":"Küchenspülen","furn.cat_nightstand":"Schränke","furn.cat_plant":"Pflanzen","furn.cat_rug":"Teppiche","furn.cat_shelving":"Regale","furn.cat_shower":"Duschen","furn.cat_sink":"Waschbecken","furn.cat_sofa":"Sofas","furn.cat_stairs":"Treppen","furn.cat_toilet":"Toiletten","furn.cat_tv":"Fernseher","furn.cat_wardrobe":"Kleiderschränke","furn.cat_washer":"Waschmaschinen","furn.cat_work_table":"Schreibtische","furn.sym_sofa":"Zweisitzer-Sofa","furn.sym_sofa_three_seat":"Dreisitzer-Sofa","furn.sym_sofa_corner_right":"Ecksofa rechts","furn.sym_armchair":"Polstersessel","furn.sym_armchair_office":"Bürostuhl","furn.sym_coffee_table":"Rechteckiger Couchtisch","furn.sym_coffee_table_round":"Runder Couchtisch","furn.sym_coffee_table_oval":"Ovaler Couchtisch","furn.sym_coffee_table_rounded":"Abgerundeter Couchtisch","furn.sym_table_dining":"Rechteckiger Esstisch","furn.sym_table_round":"Rundtisch","furn.sym_table_dining_oval":"Ovaler Esstisch","furn.sym_table_dining_rounded":"Abgerundeter Esstisch","furn.sym_chair":"Stuhl","furn.sym_chair_bar":"Barhocker","furn.sym_desk":"Rechteckiger Schreibtisch","furn.sym_desk_corner":"Eckschreibtisch","furn.sym_bed_double":"Doppelbett","furn.sym_bed_single":"Einzelbett","furn.sym_nightstand":"Nachttisch","furn.sym_cabinet_tv":"TV-Schrank","furn.sym_cabinet_shoe":"Schuhschrank","furn.sym_cabinet_sink":"Waschtischunterschrank","furn.sym_wardrobe":"Kleiderschrank","furn.sym_bookshelf":"Bücherschrank","furn.sym_wall_unit":"Schrankwand","furn.sym_kitchen_floor":"Küchen-Unterschrank","furn.sym_kitchen_floor_corner":"Küchen-Eckunterschrank","furn.sym_kitchen_wall":"Küchen-Hängeschrank","furn.sym_kitchen_wall_corner":"Küchen-Eckhängeschrank","furn.sym_shelf_floor":"Standregal","furn.sym_shelf_wall":"Wandregal","furn.sym_fridge":"Kühlschrank","furn.sym_stove":"Vierflammiges Kochfeld","furn.sym_cooktop_two":"Zweiflammiges Kochfeld","furn.sym_dishwasher":"Geschirrspüler","furn.sym_washer":"Waschmaschine","furn.sym_dryer":"Wäschetrockner","furn.sym_tv":"Fernseher mit Standfuß","furn.sym_tv_wall":"Wandfernseher","furn.sym_ac":"Klimaanlage","furn.sym_water_heater":"Wassererhitzer","furn.sym_toilet":"Stand-WC","furn.sym_toilet_built_in":"Wand-WC","furn.sym_bathtub":"Rechteckige Badewanne","furn.sym_bathtub_corner":"Eckbadewanne","furn.sym_shower":"Dusche","furn.sym_sink":"Waschbecken","furn.sym_kitchen_sink":"Einzel-Küchenspüle","furn.sym_kitchen_sink_double":"Doppel-Küchenspüle","furn.sym_bidet":"Stand-Bidet","furn.sym_bidet_built_in":"Wand-Bidet","furn.sym_stairs":"Treppe","furn.sym_fireplace":"Kamin","furn.sym_plant":"Pflanze","furn.sym_rug":"Teppich","common.yes":"Ja","common.no":"Nein","vac.diag_source":"Quelle","vac.diag_platform":"Integration","vac.diag_status":"Status","vac.diag_position":"Position","vac.diag_rooms":"Räume","vac.diag_rooms_value":"{total} · {matched} Namen stimmen überein · {readiness}","vac.autocal_ready":"Auto-Kalibrierung verfügbar","vac.autocal_not_ready":"3 übereinstimmende Namen erforderlich","vac.diag_path":"Integrationspfad","vac.diag_map":"Karten-ID","vac.source_none":"nicht ausgewählt","vac.source_status_ok":"Bereit","vac.source_status_missing":"Fehlend","vac.source_status_disabled":"In Home Assistant deaktiviert","vac.source_status_unavailable":"Nicht verfügbar","vac.source_status_unverified":"Kann mit den aktuellen Berechtigungen nicht verifizieren","vac.source_status_unsupported":"Keine Positionsdaten","vac.source_status_none":"Keine Quelle","vac.source_banner_missing":"Die gespeicherte Quelle existiert nicht mehr. Sie wurde nicht automatisch ersetzt; wählen Sie eine andere Quelle oder stellen Sie sie in Home Assistant wieder her.","vac.source_banner_disabled":"Die gespeicherte Quelle ist in Home Assistant deaktiviert. Aktivieren Sie sie dort oder wählen Sie eine andere Quelle.","vac.source_banner_unverified":"Die aktuellen Home Assistant-Berechtigungen können diese gespeicherte Quelle nicht verifizieren. Sie bleibt angepinnt und wird nicht automatisch ersetzt.","vac.choose_source":"Quelle wählen","vac.source_auto":"Automatisch","vac.source_auto_hint":"Verwenden Sie eine kompatible Entität von diesem Gerät","vac.all_cameras":"Alle Kameras","vac.all_cameras_warn":"Eine Kamera liefert möglicherweise keine Roboter-Daten. Wählen Sie eine nur, wenn es Ihre Saugroboter-Karte ist.","vac.all_cameras_empty":"Keine anderen Kamera-Entitäten gefunden.","vac.platform_unknown":"unbekannte Integration","vac.cap_position":"Position","vac.cap_rooms_short":"Räume","vac.cap_path":"Pfad","vac.cap_map":"Karten-ID","vac.cap_none":"Keine Roboter-Daten erkannt","vac.xcme_hint":"Aktivieren Sie diese Xiaomi Cloud Map Extractor-Attribute:","vac.documentation":"Dokumentation","vac.residual_title":"Automatische Kalibrierung überprüfen","vac.residual_message":"Die zugeordneten Räume weichen um bis zu {error} voneinander ab. Diese ungefähre Kalibrierung anwenden, manuell verfeinern oder ohne Änderung der gespeicherten Einrichtung abbrechen.","vac.apply_proposal":"Anwenden","gs.backup_group":"Sichern und übertragen","gs.backup_hint":"Laden Sie ein tragbares JSON-Backup herunter oder sehen Sie eine Vorschau und importieren Sie ein Backup, das mit House Plan erstellt wurde.","backup.export_open":"Exportieren","backup.import_open":"Importieren","backup.export_title":"House Plan exportieren","backup.import_title":"House Plan importieren","backup.export_hint":"Wählen Sie, ob das Backup die gesamte House Plan-Konfiguration oder nur den aktuellen Bereich enthalten soll.","backup.full":"Vollständiges Backup","backup.current_space":"Aktueller Bereich","backup.current_space_title":"Aktueller Bereich: {title}","backup.no_current_space":"Kein aktueller Bereich","backup.plan_only":"Nur Plan","backup.plan_only_hint":"Räume, Wände, Öffnungen, Dekor und Raumbezeichnungspositionen ohne Geräte oder Home Assistant-Bindungen beibehalten.","backup.plan_only_preview":"Diese Datei enthält nur den Plan.","backup.privacy_warning":"Das Archiv enthält Namen, Home Assistant-Kennungen und genaue Koordinaten. Interne Pläne und Anhänge werden referenziert, nicht eingebettet; Laufzeitzustände und Staubsaugerspuren sind nicht enthalten.","backup.download":"JSON herunterladen","backup.export_done":"Backup heruntergeladen","backup.reading":"Überprüfe das Backup…","backup.revalidated":"Der Plan wurde nach dieser Vorschau geändert. Die Zusammenfassung wurde aktualisiert; überprüfen Sie sie und bestätigen Sie erneut.","backup.error.support_invalid_message":"Prüfen Sie die Supportnachricht und versuchen Sie es erneut.","backup.error.support_package_too_large":"Das anonymisierte Supportpaket überschreitet das Limit von 8 MiB.","backup.error.support_preview_expired":"Die Vorschau des Supportanhangs ist abgelaufen oder nicht mehr verfügbar.","backup.error.support_rate_limited":"Zu viele Supportberichte oder Vorschauen wurden angefordert. Versuchen Sie es später erneut.","backup.error.support_rejected":"Der Bericht hat die Prüfung des Supportdienstes nicht bestanden.","backup.error.support_unavailable":"Der private Supportdienst ist vorübergehend nicht verfügbar.","backup.error.unauthorized":"Sie haben keine Berechtigung, diesen Plan zu exportieren oder zu importieren.","backup.error.not_ready":"Der Hausplan ist noch nicht fertig. Versuchen Sie es in einem Moment erneut.","backup.error.too_large":"Das Backup überschreitet das 8-MiB-Limit.","backup.error.invalid_json":"Die ausgewählte Datei ist kein gültiges JSON.","backup.error.invalid_format":"Die ausgewählte Datei ist kein House Plan-Backup.","backup.error.invalid_image":"Das Bild ist beschädigt oder entspricht nicht seinem Format.","backup.error.unsupported_export_version":"Dieses Backup-Format wird von der installierten Version nicht unterstützt.","backup.error.unsupported_image":"Verwenden Sie ein unterstütztes PNG-, JPEG-, WebP- oder SVG-Bild.","backup.error.future_model":"Das Backup wurde mit einem neueren House-Plan-Datenmodell erstellt.","backup.error.invalid_config":"Das Backup enthält eine ungültige House-Plan-Konfiguration.","backup.error.wall_model_migration_blocked":"Das Backup-Wandmodell konnte nicht sicher aktualisiert werden. Optimieren Sie zuerst den Quellplan und exportieren Sie ihn dann erneut.","backup.error.invalid_layout":"Das Backup enthält ungültige Objektpositionen.","backup.error.invalid_content":"Das Backup enthält ungültige oder inkonsistente Inhaltsreferenzen.","backup.error.space_not_found":"Der ausgewählte Bereich existiert nicht mehr.","backup.error.capacity_exceeded":"Durch das Hinzufügen dieses Backups würden die Planlimits überschritten.","backup.error.preview_expired":"Die Vorschau ist abgelaufen. Wählen Sie die Backup-Datei erneut aus.","backup.error.preview_owner_mismatch":"Diese Vorschau gehört zu einem anderen Home-Assistant-Benutzer.","backup.error.conflict":"Der Plan hat sich nach der Vorschau geändert. Überprüfen Sie die aktualisierte Zusammenfassung.","backup.error.content_confirmation_required":"Bestätigen Sie, dass nicht verfügbare lokale Inhalte getrennt werden können.","backup.error.commit_failed":"Das Backup konnte nicht sicher angewendet werden. Der vorherige Plan wurde wiederhergestellt oder wartet auf die Wiederherstellung.","backup.error.missing_plan":"Eine referenzierte Plan-Datei ist nach der Vorschau verschwunden. Überprüfen Sie das Backup erneut.","backup.error.missing_content":"Ein referenziertes lokales Anhangselement ist nach der Vorschau verschwunden. Überprüfen Sie das Backup erneut.","backup.error.marker_control_missing":"Ein verknüpftes Planlicht fehlt im Backup.","backup.error.marker_control_not_light":"Ein verknüpftes Planziel ist nicht mehr als Lichtquelle markiert.","backup.error.marker_control_self":"Eine Lichtquelle kann sich nicht selbst steuern.","backup.error.marker_control_cycle":"Das Backup enthält eine kreisförmige Kette von Lichtsteuerungen.","backup.error.duplicate_marker_control":"Das Backup enthält eine doppelte Plan-Licht-Verknüpfung.","backup.error.no_backup":"Es gibt keinen Import- oder Optimierungssnapshot zur Wiederherstellung.","backup.error.in_use":"Das Element wird noch verwendet","backup.error.invalid_data":"Die Anfrage enthält ungültige Daten","backup.error.invalid_light_entity":"Das führende Licht muss eine light.*- oder switch.*-Entität sein","backup.error.invalid_marker_control":"Ungültige Marker-Steuerungsreferenz","backup.error.invalid_name":"Der Name ist ungültig","backup.error.invalid_partition_opening_host":"Die Öffnung muss ihren Trennwand-Träger behalten","backup.error.invalid_partition_opening_jamb_margin":"Die Öffnung lässt keinen physischen Pfosten am Wandende","backup.error.invalid_passage_fields":"Ein offener Durchgang kann keine Tür-Einstellungen tragen","backup.error.invalid_space_id":"Unbekannter Raumbereich","backup.error.invalid_toggle_entity":"Die Schalt-Entität muss light.* oder switch.* sein","backup.error.invalid_value_badge":"Ungültige Wert-Badge-Einstellungen","backup.error.invalid_value_badge_attribute":"Ungültiges Wert-Badge-Attribut","backup.error.invalid_value_badge_position":"Ungültige Wert-Badge-Position","backup.error.invalid_value_badge_source":"Ungültige Wert-Badge-Quelle","backup.error.invalid_vacuum_map_route":"Prüfen Sie die Zuordnung der Roboterkarten zu Räumen.","backup.error.invalid_value_source":"Ungültige Wertquelle","backup.error.invalid_value_source_attribute":"Ungültiges Wertquellen-Attribut","backup.error.io_error":"Eine Dateioperation auf dem Server ist fehlgeschlagen","backup.error.not_toggleable":"Dieses Gerät kann nicht geschaltet werden","backup.error.nothing_to_repair":"Nichts zu reparieren","backup.error.space_in_use":"Der Raumbereich wird noch referenziert","backup.error.value_badge_source_required":"Das Wert-Badge braucht eine Quelle","backup.error.wall_model_client_outdated":"Der Plan wurde anderswo aktualisiert — Seite neu laden","backup.same_source":"Erstellt auf dieser Home Assistant-Instanz","backup.foreign_source":"Erstellt auf einer anderen Home Assistant-Instanz","backup.created":"Erstellt: {value}","backup.versions":"Karte {card}; Integration {integration}; Datenmodell {model}","backup.count_spaces":"Bereiche: {n}","backup.count_rooms":"Räume: {n}","backup.count_walls":"Wände: {n}","backup.count_openings":"Öffnungen: {n}","backup.count_decor":"Dekorationsobjekte: {n}","backup.count_markers":"Geräte: {n}","backup.count_layout":"Positionen: {n}","backup.bindings":"Verknüpfungen — Geräte: {device}, Entitäten: {entity}, virtuell: {virtual}; Positionen ohne Bereich: {legacy}","backup.binding_status":"Zielstatus — aktiv: {active}, deaktiviert: {disabled}, fehlt: {missing}","backup.missing_areas":"Auf dem Ziel fehlende Bereiche: {areas}","backup.dropped_marker_links":"Planlicht-Verknüpfungen außerhalb dieses übertragenen Bereichs wurden ausgelassen: {n}.","backup.room_drafts_migrated":"Alte unvollständige Konturen wurden in normale Wände umgewandelt: {drafts}; Wandsegmente: {segments}.","backup.repaired_target_refs":"Durch den Import dieses Bereichs wiederhergestellte vorhandene Referenzen: {n}.","backup.preserved_unresolved_refs":"Referenzen, die nicht eindeutig wiederhergestellt werden konnten, wurden beibehalten: {n}.","backup.preserved_unresolved_hint":"Es wurden keine Daten geraten oder gelöscht. Führen Sie nach dem Import Optimierungspläne aus, um die verbleibenden Referenzen zu überprüfen.","backup.import_details":"Importieren von Referenzdetails","backup.import_detail.incoming_remapped":"Referenzen innerhalb der importierten Kopie aktualisiert: {n}","backup.import_detail.target_repaired":"Vorhandene Referenzen wiederhergestellt: {n}","backup.import_detail.preserved_unresolved":"Unaufgelöste Referenzen beibehalten: {n}","backup.import_detail.collisions":"Zielkonflikte sicher beibehalten: {n}","backup.import_detail.dropped_links":"Eingehende Links durch Übertragungsregeln ausgelassen: {n}","backup.import_detail.bounded_lineages":"Übermäßig verschachtelte Kennungen begrenzt belassen: {n}","backup.replace_warning":"Dies ersetzt die aktuelle Konfiguration und das Layout. Hochgeladene Dateien werden niemals gelöscht. Eine Rückgängig-Möglichkeit bleibt bis zur nächsten Planbearbeitung verfügbar.","backup.foreign_bookkeeping":"Instanzspezifische bekannte/neue Gerätebuchführung wird nicht importiert.","backup.final_name":"Name des neuen Bereichs","backup.target_settings":"Die globalen Einstellungen der Zielinstanz bleiben unverändert.","backup.duplicates":"Bindungen bereits vorhanden: {n}","backup.skip":"Doppelte Geräte überspringen","backup.virtual_copy":"Sichere statische virtuelle Kopien hinzufügen","backup.content":"Referenzierter Inhalt","backup.decor_images_summary":"Eigene Bilder: {objects} Objekte, {assets} Dateien; fehlende Dateien: {missing}.","backup.content_available":"lokal verfügbar","backup.content_external":"externer Link","backup.content_detach_required":"wird getrennt","backup.confirm_detach":"Ich verstehe, dass nicht verfügbare interne Pläne und Anhänge von der importierten Konfiguration getrennt werden.","backup.confirm_missing_images":"Ich verstehe, dass fehlende eigene Bilder als reparierbare Platzhalter erhalten bleiben und andere nicht verfügbare lokale Dateien getrennt werden.","backup.replace":"Ersetzen","backup.add":"Bereich hinzufügen","backup.space_done":"Bereich importiert: {rooms} Räume, {markers} Geräte, {refs} bestehende Referenzen wiederhergestellt","backup.full_done":"Backup wiederhergestellt: {spaces} Bereiche, {rooms} Räume, {markers} Geräte","backup.undo_import":"Letzten vollständigen Import rückgängig machen","backup.import_undone":"Vollständiger Import rückgängig gemacht","backdrop.large_title":"Großes Bild","backdrop.large_body":"Dieses Bild ist {w}×{h} ({fileMb} MB Datei) und benötigt etwa {decodedMb} MB Speicher zur Anzeige. Auf Tablets kann das die Seite zum Absturz bringen.","backdrop.unknown_body":"Die Bildabmessungen konnten nicht gelesen werden — die Datei ist möglicherweise beschädigt. Fortfahren kann die Seite auf Tablets zum Absturz bringen.","backdrop.reduced_dimensions":"Verkleinerte Kopie: {w}×{h} px.","backdrop.use_downscaled":"Verkleinerte Kopie hochladen","backdrop.reducing":"Wird verkleinert…","backdrop.keep_original":"Original behalten","backdrop.too_large_title":"Bild ist zu groß","backdrop.too_large_body":"Dieses Bild überschreitet die Anzeigegrenzen des Browsers ({w}×{h}, Limit {limit} px pro Seite). Bitte verkleinern Sie es in einem Desktop-Editor und laden Sie es erneut hoch.","backdrop.downscale_failed":"Die verkleinerte Kopie konnte nicht erstellt werden. Der aktuelle Plan wurde nicht geändert."};const n="4da0d706a85c3f1c08ab6de960deb5feb08baaf9055265234e7bd1b554332653";export{e as dictionary,n as fingerprint};
diff --git a/custom_components/houseplan/frontend/houseplan-assets/editor-CAGtS_SG.js b/custom_components/houseplan/frontend/houseplan-assets/editor-CAGtS_SG.js
deleted file mode 100644
index 993e312e..00000000
--- a/custom_components/houseplan/frontend/houseplan-assets/editor-CAGtS_SG.js
+++ /dev/null
@@ -1,14 +0,0 @@
-globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="34d1dbfc181acaf58842dfced0e6aa3a899aef6b8d1eeba53732ef729a63137e";import{q as e,l as o,v as t,e7 as s,A as a,e8 as i,e9 as l,ea as n,E as r,c}from"./houseplan-card-BKJrmMEj.js";class h extends e{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 o(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},o=this._floorToken;return o?e.floor=o:Object.prototype.hasOwnProperty.call(e,"floor")||(e.floor=""),e}get _schema(){const e=this._spaces||[],o=this._lang,a=[{value:"",label:t(o,"editor.floor_none")}],i=this._floorToken;i&&a.push({value:i,label:t(o,"editor.floor_index",{index:String(this._config?.floor)})});const l="string"==typeof this._config?.floor?this._config.floor:"";l&&!e.some(e=>e.value===l)&&a.push({value:l,label:l}),a.push(...e);const n="string"==typeof this._config?.default_floor?this._config.default_floor:"",r=[...e];return n&&!e.some(e=>e.value===n)&&r.unshift({value:n,label:n}),[{name:"title",selector:{text:{}}},{name:"floor",selector:{select:{mode:"dropdown",options:a}}},e.length?{name:"default_floor",selector:{select:{mode:"dropdown",options:r}}}:{name:"default_floor",selector:{text:{}}},{name:"language",selector:{select:{mode:"dropdown",options:s(t(o,"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 a;const e=i(this,l,o(this.hass,this._config.language));if("cold"===e)return n();if("warm"===e)return r;this._loadSpaces();const s=this._lang,h={title:t(s,"editor.title"),floor:t(s,"editor.floor"),default_floor:t(s,"editor.default_floor"),language:t(s,"editor.language"),icon_size:t(s,"editor.icon_size"),show_temperature:t(s,"editor.show_temperature"),live_states:t(s,"editor.live_states"),show_signal:t(s,"editor.show_signal"),kiosk:t(s,"editor.kiosk"),cycle:t(s,"editor.cycle")},f=this._schema,_=function(e,o,t){if(!t||null===o)return null;const s="string"==typeof e?.default_floor?e.default_floor:"";return!s||o.some(e=>e.value===s)?null:s}(this._config,this._spaces,this._spacesAuthoritative),d=e=>c`h[e.name]||e.name}
- @value-changed=${this._valueChanged}
- >`;return c`
- ${d(f.slice(0,3))}
- ${_?c`
- ${t(s,"editor.default_floor_missing",{id:_})}
-
`:a}
- ${d(f.slice(3))}
- `}_valueChanged(e){const o={...this._config,...e.detail.value};""===o.floor?delete o.floor:o.floor===this._floorToken&&(o.floor=this._config?.floor);const t=new Event("config-changed",{bubbles:!0,composed:!0});t.detail={config:o},this.dispatchEvent(t)}}h.properties={hass:{attribute:!1},_config:{state:!0},_spaces:{state:!0}},customElements.get("houseplan-card-editor")||customElements.define("houseplan-card-editor",h);
diff --git a/custom_components/houseplan/frontend/houseplan-assets/editor-lggZMXRH.js b/custom_components/houseplan/frontend/houseplan-assets/editor-lggZMXRH.js
new file mode 100644
index 00000000..05edf67d
--- /dev/null
+++ b/custom_components/houseplan/frontend/houseplan-assets/editor-lggZMXRH.js
@@ -0,0 +1,14 @@
+globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="4da0d706a85c3f1c08ab6de960deb5feb08baaf9055265234e7bd1b554332653";import{aI as e,l as o,aL as t,e7 as s,A as a,e8 as i,e9 as l,ea as n,E as r,c}from"./houseplan-card-CAm75-22.js";class h extends e{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 o(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},o=this._floorToken;return o?e.floor=o:Object.prototype.hasOwnProperty.call(e,"floor")||(e.floor=""),e}get _schema(){const e=this._spaces||[],o=this._lang,a=[{value:"",label:t(o,"editor.floor_none")}],i=this._floorToken;i&&a.push({value:i,label:t(o,"editor.floor_index",{index:String(this._config?.floor)})});const l="string"==typeof this._config?.floor?this._config.floor:"";l&&!e.some(e=>e.value===l)&&a.push({value:l,label:l}),a.push(...e);const n="string"==typeof this._config?.default_floor?this._config.default_floor:"",r=[...e];return n&&!e.some(e=>e.value===n)&&r.unshift({value:n,label:n}),[{name:"title",selector:{text:{}}},{name:"floor",selector:{select:{mode:"dropdown",options:a}}},e.length?{name:"default_floor",selector:{select:{mode:"dropdown",options:r}}}:{name:"default_floor",selector:{text:{}}},{name:"language",selector:{select:{mode:"dropdown",options:s(t(o,"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 a;const e=i(this,l,o(this.hass,this._config.language));if("cold"===e)return n();if("warm"===e)return r;this._loadSpaces();const s=this._lang,h={title:t(s,"editor.title"),floor:t(s,"editor.floor"),default_floor:t(s,"editor.default_floor"),language:t(s,"editor.language"),icon_size:t(s,"editor.icon_size"),show_temperature:t(s,"editor.show_temperature"),live_states:t(s,"editor.live_states"),show_signal:t(s,"editor.show_signal"),kiosk:t(s,"editor.kiosk"),cycle:t(s,"editor.cycle")},f=this._schema,_=function(e,o,t){if(!t||null===o)return null;const s="string"==typeof e?.default_floor?e.default_floor:"";return!s||o.some(e=>e.value===s)?null:s}(this._config,this._spaces,this._spacesAuthoritative),d=e=>c`h[e.name]||e.name}
+ @value-changed=${this._valueChanged}
+ >`;return c`
+ ${d(f.slice(0,3))}
+ ${_?c`
+ ${t(s,"editor.default_floor_missing",{id:_})}
+
`:a}
+ ${d(f.slice(3))}
+ `}_valueChanged(e){const o={...this._config,...e.detail.value};""===o.floor?delete o.floor:o.floor===this._floorToken&&(o.floor=this._config?.floor);const t=new Event("config-changed",{bubbles:!0,composed:!0});t.detail={config:o},this.dispatchEvent(t)}}h.properties={hass:{attribute:!1},_config:{state:!0},_spaces:{state:!0}},customElements.get("houseplan-card-editor")||customElements.define("houseplan-card-editor",h);
diff --git a/dist/houseplan-assets/fr-BAV7hmLH.js b/custom_components/houseplan/frontend/houseplan-assets/fr-Y07FWZ2v.js
similarity index 99%
rename from dist/houseplan-assets/fr-BAV7hmLH.js
rename to custom_components/houseplan/frontend/houseplan-assets/fr-Y07FWZ2v.js
index 968231e2..956504aa 100644
--- a/dist/houseplan-assets/fr-BAV7hmLH.js
+++ b/custom_components/houseplan/frontend/houseplan-assets/fr-Y07FWZ2v.js
@@ -1 +1 @@
-globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="34d1dbfc181acaf58842dfced0e6aa3a899aef6b8d1eeba53732ef729a63137e";var e={"editor.context_actions":"Actions : {object}","editor.tool_options":"Options de l’outil : {tool}","editor.palette":"Palette : {tool}","editor.open_group":"Groupe d’outils : {group}","editor.group_active":"{group} — actif : {item}","editor.disabled_action":"{action} est indisponible : {reason}","editor.loading":"Chargement de l'éditeur…","editor.loading_aria":"L'éditeur de plan est en cours de chargement","editor.load_failed":"Impossible de charger l'éditeur.","editor.refresh_advice":"Actualisez la page et réessayez.","editor.retry_advice":"Vérifiez votre connexion et appuyez à nouveau.","version_mismatch.title":"Les versions de House Plan ne correspondent pas","version_mismatch.body":"Si Home Assistant redémarre encore, attendez la fin, puis rechargez cette page.","version_mismatch.frontend":"Carte","version_mismatch.backend":"Intégration","version_mismatch.reload":"Recharger la page","color_picker.title":"Sélecteur de couleur","color_picker.hue":"Teinte","color_picker.saturation":"Saturation","color_picker.value":"Luminosité","color_picker.hex":"Couleur hexadécimale","color_picker.invalid_hex":"Saisissez une couleur hexadécimale à 3 ou 6 chiffres","color_picker.confirm":"OK","btn.properties":"Propriétés","btn.keep_as_walls":"Conserver comme murs","btn.delete_room_keep_walls":"Supprimer la pièce, conserver les murs","btn.delete_room_with_walls":"Supprimer la pièce et les murs","title.markup_select":"Sélectionner et modifier les murs et les colonnes","title.markup_column":"Colonne : cliquez sur un point de la grille pour placer une colonne carrée","markup.partition":"Cloison","markup.column":"Colonne","markup.hint_column":"cliquez sur un point de la grille pour placer une colonne carrée","history.wall_segment":"Ajouter un segment de mur","history.column_add":"Ajouter une colonne","history.physical_edit":"Modifier l’objet physique","history.physical_delete":"Supprimer l’objet physique","history.physical_move":"Déplacer l’objet physique","history.wall_face_batch":"Créer des pièces à partir des murs","toast.column_duplicate":"Une colonne avec le même centre et la même dimension extérieure existe déjà","physical.partition_properties":"Propriétés de la cloison","physical.column_properties":"Propriétés de la colonne","physical.shape":"Forme","physical.square":"Carré","physical.circle":"Cercle","physical.diameter":"Diamètre","physical.side":"Côté","physical.rotation":"Angle de rotation","physical.length":"Longueur","physical.allowed_range":"Autorisé : {min}–{max} {unit}","physical.column_size_title":"Côté extérieur de la colonne carrée placée par le clic (1–150 cm).","card.title":"Plan de la maison","count.devices":"{n} app.","empty.no_spaces":"Aucun espace pour le moment.","nav.spaces":"Espaces House Plan","empty.add_first":"Ajoutez le premier espace et importez un plan.","empty.read_only":"Aucun espace n’est configuré. Demandez à un administrateur d’en ajouter un.","empty.install":"Installez l’intégration House Plan et ajoutez-la dans « Appareils et services ».","btn.add_space":"Ajouter un espace","btn.cancel":"Annuler","btn.save":"Enregistrer","btn.close":"Fermer","btn.delete":"Supprimer","btn.copy":"Copier","btn.edit":"Modifier","btn.open_in_ha":"Ouvrir dans HA","btn.reset":"Réinitialiser","btn.attach":"Joindre…","btn.upload":"Importer…","btn.replace":"Remplacer…","title.zoom_in":"Zoomer","title.zoom_out":"Dézoomer","title.zoom_fit":"Tout ajuster","title.configure_space":"Configurer l’espace","title.add_space":"Ajouter un espace","title.markup_add":"Murs : tracez une chaîne continue ; chaque segment accepté est enregistré séparément. Maj verrouille à 45°","title.markup_merge":"Fusionner : cliquez sur une pièce, puis sur la pièce voisine avec laquelle elle partage un mur","title.markup_split":"Diviser une pièce : cliquez sur la pièce, puis sur deux points de ses murs","title.markup_delroom":"Supprimer une pièce : cliquez à l’intérieur de la pièce puis confirmez","title.need_plan":"Importer une image de plan","markup.add":"Murs","markup.merge":"Fusionner","markup.split":"Diviser","markup.resize":"Redimensionner","title.markup_resize":"Redimensionner les pièces : faites glisser une poignée disponible sur un mur horizontal ou vertical","markup.hint_resize":"faites glisser une poignée de mur disponible · le mur s’arrête à la première position non sûre · Échap annule · Ctrl+Z — annuler","resize.disabled.diagonal":"Ce mur est incliné ; le redimensionnement ne prend en charge que les murs horizontaux et verticaux","resize.disabled.side-angle":"Un mur adjacent est incliné ; le redimensionnement exige que les deux murs adjacents rencontrent ce mur à angle droit","resize.disabled.duplicate-physical-wall":"Une cloison distincte ou une colonne chevauche ce mur ; supprimez-la ou déplacez-la avant de redimensionner","resize.disabled.partial-shared":"Une pièce voisine n’utilise qu’une partie de ce mur ; il ne peut donc pas être déplacé en toute sécurité comme un mur partagé unique","resize.disabled.unequal-shared":"La pièce voisine utilise des extrémités ou une longueur de mur différentes ; les murs ne peuvent donc pas être déplacés ensemble en toute sécurité","resize.disabled.multiple-rooms":"Déplacer ce mur affecterait plus de deux pièces","resize.disabled.thickness-conflict":"L’épaisseur du mur ne peut pas être conservée en toute sécurité","resize.disabled.opening-conflict":"Une ouverture sur ce mur ne peut pas être déplacée en toute sécurité","resize.disabled.invalid-geometry":"Ce mur ne peut pas être redimensionné sans modifier la structure du plan","resize.limit_stopped":"Mur arrêté : l'étape suivante enfreindrait une limite de jonction","resize.commit_failed":"Le redimensionnement a été annulé car le plan final n’a pas passé le contrôle de géométrie","resize.preview_failed":"Le redimensionnement s’est arrêté à la dernière position sûre car la géométrie du plan ne pouvait pas être préservée","markup.opening":"Ouverture","markup.delete_room":"Supprimer la pièce","history.undo":"Annuler","history.redo":"Rétablir","history.undo_named":"Annuler : {name} (Ctrl+Z)","history.redo_named":"Rétablir : {name} (Ctrl+Maj+Z / Ctrl+Y)","history.undo_empty":"Rien à annuler","history.redo_empty":"Rien à rétablir","history.undone":"Annulé : {name}","history.redone":"Rétabli : {name}","history.add_room":"Créer une pièce","history.split_room":"Diviser la pièce","history.merge_rooms":"Fusionner les pièces","history.resize_room":"Redimensionner la pièce","history.wall_thickness":"Modifier l’épaisseur du mur","history.add_opening":"Ajouter une ouverture de porte ou de fenêtre","history.edit_opening":"Modifier l’ouverture","history.move_opening":"Déplacer l’ouverture","history.delete_opening":"Supprimer l’ouverture","history.delete_room_keep_walls":"Supprimer la pièce, conserver les murs","history.delete_room_with_walls":"Supprimer la pièce et les murs","history.decor_add":"Ajouter un objet décoratif","history.decor_edit":"Modifier l’objet décoratif","history.decor_move":"Déplacer l’objet décoratif","history.decor_transform":"Transformer l’objet décoratif","history.decor_delete":"Supprimer l’objet décoratif","history.backdrop_transform":"Transformer l’arrière-plan du plan","history.device_move":"Déplacer {name}","history.device_stale":"L’historique des positions n’est plus applicable et a été effacé","opening.new":"Nouvelle ouverture","opening.edit":"Ouverture","opening.door":"Porte","opening.window":"Fenêtre","opening.gate":"Portail","opening.passage":"Passage ouvert","opening.passage_binding_warning":"L’enregistrement supprimera le capteur d’ouverture/fermeture et la serrure.","opening.invalid_passage_fields":"Le passage ouvert du plan « {room} » possède des paramètres non pris en charge : {fields}.","opening.type_label":"Type","opening.length_label":"Longueur, cm","opening.contact_label":"Capteur d’ouverture/fermeture","opening.lock_label":"Serrure","opening.none":"— aucun —","opening.search_ph":"Rechercher : nom ou ID d’entité…","opening.invert":"Inverser ouvert/fermé","opening.flip_h":"Charnière sur l’autre montant","opening.flip_v":"Ouverture de l’autre côté","opening.open":"Ouvert","opening.closed":"Fermé","opening.locked":"Verrouillé","opening.unlocked":"Déverrouillé","opening.state_unknown":"indisponible","opening.no_entities":"Aucun capteur associé — symbole statique sur le plan.","toast.opening_no_wall":"Cliquez près d’un mur de pièce ou d’un mur indépendant","opening.host_partition":"Mur indépendant","opening.partition_orphan":"Le mur indépendant de cette ouverture n’existe plus","opening.partition_jamb_margin":"Laissez au moins {distance} entre l’ouverture et l’extrémité du mur","opening.rebind_partition":"Associer à un autre mur indépendant","confirm.delete_partition_openings_title":"Supprimer le mur et les ouvertures ?","confirm.delete_partition_openings_body":"Ce mur contient {count} ouverture(s). Elles seront supprimées avec lui.","confirm.delete_partition_openings_item":"• {type}, {length}","markup.hint_points":"points : {n} · Maj — pas de 45° · Échap — terminer la chaîne · Ctrl+Z — annuler un point · fermer une zone propose de créer une pièce","markup.hint_start":"cliquez sur un point de la grille pour commencer une chaîne de murs","tip.lqi":"signal Zigbee moyen :","tip.area":"surface : {value}","info.device_header":"Appareil sur le plan","info.model":"Modèle","info.state":"État","info.link":"Lien","info.manuals":"Manuels","info.none":"Aucune information supplémentaire","marker.new_device":"Nouvel appareil","marker.name_label":"Nom (affiché sur le plan)","marker.name_ph":"Nom","marker.binding_label":"Associer à un appareil HA","marker.binding_disabled":"désactivé dans Home Assistant","marker.virtual_option":"Appareil virtuel (sans association)","marker.search_ph":"Rechercher un appareil / groupe…","marker.nothing_found":"aucun résultat","marker.room_label":"Pièce","marker.room_override":" (placement forcé)","marker.room_choose":"— sélectionner une pièce —","marker.room_auto":"— selon la zone de l’appareil (auto) —","marker.icon_label":"Icône","marker.icon_ph":"mdi:… (vide = auto)","marker.display_label":"Affichage","display.badge":"Icône + état","display.icon_ripple":"Icône + état et activité","display.static_icon":"Icône toujours statique","display.value_static_icon":"Valeur + icône statique","marker.display_hint_badge":"L’icône et le fond dynamique affichent l’état de l’appareil sans la pulsation d’activité habituelle. Les alarmes rouges restent visibles.","marker.display_hint_icon_ripple":"L’icône, le fond dynamique et la pulsation affichent une brève animation pour les événements et une animation continue pour le fonctionnement, le mouvement ou la présence. Les alarmes rouges restent prioritaires.","marker.display_hint_value":"Une valeur Home Assistant sélectionnée ou résolue automatiquement remplace l’icône tandis que le fond continue d’indiquer l’état. Les alarmes rouges restent visibles.","marker.display_hint_static_icon":"Le contour adapté au thème et l’icône restent toujours identiques. L’état, l’activité, l’indisponibilité et les alarmes ne modifient pas l’apparence.","marker.display_hint_value_static_icon":"Le marqueur affiche la valeur choisie tandis que le contour reste adapté au thème. L’état, l’activité, l’indisponibilité et les alarmes ne modifient pas la couleur du marqueur.","marker.static_alarm_warning":"Cet appareil peut signaler des alarmes. L’affichage statique masque l’indication visuelle d’alarme du marqueur.","marker.preview.title":"Aperçu de l’affichage","marker.preview.actual":"Actuel","marker.preview.example":"Exemple","marker.preview.integration":"Fourni par","marker.preview.source":"Source d’affichage","marker.preview.current_state":"État actuel","marker.preview.result":"Sur le plan","marker.preview.details":"Détails de la source","marker.preview.select_source":"Choisissez un appareil ou une entité Home Assistant pour voir son affichage réel.","marker.preview.unknown_provider":"Intégration inconnue","marker.preview.virtual_provider":"House Plan · appareil virtuel","marker.preview.no_source":"Aucune source active","marker.preview.no_state":"Aucun état actuel","marker.preview.mixed_states":"Plusieurs états différents","marker.preview.multiple_sources":"{n} sources","marker.preview.more_sources":"+{n} de plus","marker.preview.scaled":"L’aperçu est redimensionné à {n}% pour tenir dans la zone. La taille enregistrée reste inchangée.","marker.preview.demo_short":"Afficher une activité brève","marker.preview.demo_continuous":"Afficher une activité continue","marker.preview.stop_continuous":"Arrêter l’activité continue","marker.preview.demo_short_notice":"Exemple d’activité brève ; l’état réel de l’appareil reste inchangé.","marker.preview.demo_continuous_notice":"Exemple d’activité continue ; l’état réel de l’appareil reste inchangé.","marker.preview.demo_already_visible":"L’état actuel affiche déjà un véritable effet d’activité ou d’alarme.","marker.preview.reduced_motion":"La réduction des animations est activée sur le système ; l’activité normale est donc affichée sous forme de point.","marker.preview.reason.neutral":"Fond sombre neutre","marker.preview.reason.working":"Fond jaune : l’appareil fonctionne actuellement","marker.preview.reason.working_activity":"Fond jaune et effet d’activité : l’appareil fonctionne actuellement","marker.preview.reason.open":"Fond orange : physiquement ouvert ou déverrouillé","marker.preview.reason.cover_icon_state":"Fond neutre ; l’entité de volet contrôle l’état et l’icône affichés","marker.preview.reason.presence":"Effet d’activité tant qu’une présence est détectée","marker.preview.reason.event":"Effet d’activité bref après un événement détecté","marker.preview.reason.transition":"Effet d’activité pendant que l’appareil se déplace ou change d’état","marker.preview.reason.media_neutral":"Les appareils multimédias restent sur un fond sombre neutre tant qu’ils sont disponibles","marker.preview.reason.unavailable":"Fond neutre atténué : indisponible ou éteint","marker.preview.reason.alarm":"Fond d’alarme rouge ; l’indication d’alarme est toujours affichée","marker.preview.reason.live_states_disabled":"Le style selon les états en direct est désactivé pour cette carte","marker.preview.reason.value_no_state":"Aucune valeur d’état exploitable ; l’icône est affichée à la place","marker.preview.reason.value_ambiguous_sources":"Plusieurs sources de valeur possibles ; l’icône est affichée à la place","marker.preview.reason.value_non_scalar":"La source n’a pas renvoyé de valeur simple ; l’icône est affichée à la place","marker.preview.reason.value_virtual":"Un appareil virtuel n’a aucune valeur Home Assistant ; l’icône est affichée à la place","marker.preview.reason.vacuum_live_plan_only":"La position et la trajectoire en direct de l’aspirateur ne sont disponibles que sur le plan complet","marker.preview.reason.hidden_design_preview":"L’appareil est masqué sur le plan ; cet aperçu de conception reste visible","marker.preview.reason.composite_power_source":"L’état provient de l’entité d’alimentation de l’appareil ; les interrupteurs auxiliaires sont ignorés","marker.preview.reason.activity_display_disabled":"Le mode d’affichage sélectionné n’affiche pas les effets d’activité habituels","marker.preview.reason.ha_disabled":"L’association Home Assistant est désactivée et sera masquée sur le plan","marker.preview.reason.orphaned":"L’association Home Assistant enregistrée est introuvable","marker.preview.reason.static_icon":"Mode statique : l’état de l’appareil ne modifie pas l’icône","marker.preview.reason.value_static_icon":"Mode statique avec valeur : l’état de l’appareil ne modifie pas la couleur du marqueur","marker.activity_color":"Couleur de la pulsation d’activité","marker.ripple_size":"Taille de la pulsation d’activité","marker.activity_alarm_note":"La couleur et la taille n’affectent que l’activité normale et ne modifient pas les alarmes rouges.","marker.pulse_a11y_alarm":"Alarme","marker.pulse_a11y_event":"Événement récent","marker.pulse_a11y_presence":"Présence détectée","marker.pulse_a11y_transition":"Changement d’état","marker.pulse_a11y_running":"En fonctionnement","marker.state_a11y_neutral":"État par défaut","marker.state_a11y_working":"En fonctionnement","marker.state_a11y_open":"Ouvert","marker.state_a11y_locked":"Verrouillé","marker.state_a11y_unlocked":"Déverrouillé","marker.state_a11y_alarm":"Alarme","marker.state_a11y_unavailable":"Indisponible","marker.lqi_a11y_low":"LQI {value}, signal faible","marker.lqi_a11y_mid":"LQI {value}, signal moyen","marker.lqi_a11y_high":"LQI {value}, signal fort","marker.size_label":"Taille / rotation de l’icône","marker.angle_label":"Rotation","marker.model_label":"Modèle","marker.model_ph":"ex. Aqara T&H","marker.link_label":"Lien","marker.desc_label":"Description","marker.desc_ph":"Notes, caractéristiques…","marker.manuals_label":"Manuels (PDF, etc.)","marker.sub_device":"appareil","marker.sub_z2m_group":" · groupe Z2M","marker.sub_group":"groupe","marker.sub_helper":"assistant","space.new":"Nouvel espace","space.copy_title":"Copier l’espace","space.copy_name":"Nom du nouvel espace","space.copy_fallback":"Espace","space.copy_create":"Créer la copie","space.copy_optimize_title":"Optimiser avant de copier ?","space.copy_optimize_body":"Avant de créer « {name} », House Plan doit optimiser tout le plan, y compris les autres espaces. Continuer ?","space.copy_optimize_confirm":"Optimiser et copier","space.copy_error_changed":"Le plan a changé pendant la confirmation. Vérifiez-le et réessayez.","space.copy_error_source_missing":"L’espace source n’existe plus. Rouvrez ses réglages et réessayez.","space.copy_error_source_invalid":"House Plan n’a pas pu valider tous les murs de cet espace. Corrigez l’espace source.","space.copy_error_spaces_limit":"House Plan contient déjà le nombre maximal d’espaces.","space.copy_error_partitions_limit":"Cet espace contient trop de murs pour être copié.","space.copy_error_openings_limit":"Cet espace contient trop d’ouvertures pour être copié.","space.copy_error_decor_limit":"Cet espace contient trop d’objets d’arrière-plan pour être copié.","space.copy_error_columns_limit":"Cet espace contient trop de colonnes pour être copié.","space.copy_error_opening_host":"Une ouverture n’est plus rattachée à un mur. Corrigez-la ou supprimez-la avant la copie.","space.copy_error_geometry":"La copie créerait une géométrie de murs non sûre. Corrigez l’espace source.","space.copy_error_optimize_geometry":"La copie est arrêtée car l’optimisation de tout le plan n’est pas sûre pour un espace.","space.header":"Espace","space.title_label":"Titre","space.title_ph":"ex. Garage","space.plan_label":"Plan (arrière-plan)","space.no_plan":"aucune image de plan","space.plan_alt":"plan","room.new":"Nouvelle pièce","room.name_label":"Nom affiché","room.name_ph":"ex. Terrasse","room.area_label":"Zone Home Assistant (non attribuée)","room.no_area_option":"— aucune zone —","room.default_name":"Pièce","device.unnamed":"sans nom","device.light_group":"groupe de lumières","device.fallback":"appareil","device.virtual":"appareil virtuel","confirm.delete_room_title":"Supprimer la pièce « {name} » ?","confirm.delete_room_body":"Choisissez si les murs physiques propres à la pièce doivent être conservés. Les murs partagés avec une autre pièce sont toujours conservés.","confirm.remove_marker_title":"Supprimer l’appareil du plan ?","confirm.remove_marker_body":"L’appareil disparaîtra complètement et ne contribuera plus aux données du plan. Vous pourrez l’ajouter de nouveau plus tard.","confirm.erase_decor":"Effacer l’objet {kind} ? Vous pouvez annuler cette action depuis l’historique de l’éditeur.","confirm.delete_space_title":"Supprimer l’espace ?","confirm.delete_space_body":"L’espace, toutes ses pièces et tout le tracé du plan seront supprimés.","confirm.delete_space_vac_routes":"Les affectations de cartes de robots seront aussi supprimées : {count}.","space.delete_blocked":"Cet espace est encore utilisé par {n} appareil(s). Déplacez-les vers un autre espace ou supprimez-les d’abord.","toast.pos_save_failed":"Échec de l’enregistrement de la position : {err}","toast.no_entity":"L’appareil n’a aucune entité adaptée","toast.ha_disabled_action":"Un objet Home Assistant désactivé ne peut pas être utilisé sur le plan.","toast.ha_disabled_show_device":"Un appareil désactivé dans Home Assistant ne peut pas être affiché sur le plan. Activez-le d’abord dans Home Assistant.","toast.ha_disabled_show_entity":"Une entité désactivée dans Home Assistant ne peut pas être affichée sur le plan. Activez-la d’abord dans Home Assistant.","toast.ha_disabled_add":"Un objet Home Assistant désactivé ne peut pas être ajouté au plan. Activez-le d’abord dans Home Assistant.","toast.ha_binding_unverified":"L’état de l’objet n’a pas pu être vérifié via le registre Home Assistant. L’affichage et les actions sont temporairement indisponibles.","toast.markup_needs_server":"Le tracé est disponible une fois la configuration déplacée sur le serveur","toast.space_order_changed":"L’ordre a changé. Si une carte fixe son étage par numéro, vérifiez ces tableaux de bord.","toast.conflict":"La configuration a été modifiée dans une autre fenêtre — données actualisées, répétez votre dernière action","toast.cfg_save_failed":"Échec de l’enregistrement de la configuration : {err}","toast.room_overlap":"Le contour chevauche la pièce « {name} » — les pièces ne doivent pas se chevaucher","toast.contour_cannot_close":"Le contour ne peut pas être fermé car il est dégénéré ou s’auto-intersecte","toast.merge_not_adjacent":"Seules les pièces partageant un mur peuvent être fusionnées","toast.rooms_merged":"Pièces fusionnées dans « {name} »","toast.split_pick_wall":"Commencez la découpe sur le mur de la pièce","toast.split_bad_cut":"La découpe doit aller d’un mur à l’autre à l’intérieur de la pièce, sans croiser de mur ni se croiser elle-même","merge.header":"Fusionner les pièces","merge.hint":"La pièce fusionnée conserve un nom et une zone. L’autre zone est libérée — ses appareils quittent le plan jusqu’à ce qu’une autre pièce la récupère.","merge.keep":"Conserver","merge.no_area":"aucune zone","toast.room_saved":"Pièce enregistrée ({n}). Appareils ajoutés : {added}. Tracez la suivante ou quittez le mode tracé.","toast.room_saved_no_area":"Pièce enregistrée ({n}, sans zone). Tracez la suivante ou quittez le mode tracé.","toast.marker_needs_server":"La modification des appareils est disponible une fois la configuration déplacée sur le serveur","toast.virtual_name_required":"Saisissez un nom pour l’appareil virtuel","toast.marker_saved":"Appareil enregistré","toast.marker_removed":"Appareil supprimé du plan","toast.integration_missing":"L’intégration House Plan n’est pas installée — gestion indisponible","toast.plan_formats":"Formats pris en charge : SVG, PNG, JPG, WebP","toast.plan_required":"Importez un plan — il est obligatoire","toast.space_added_onboard":"Espace ajouté. Tracez les pièces : cliquez sur les points de la grille et fermez le contour.","toast.space_added":"Espace ajouté","toast.space_copied":"Espace « {name} » créé","toast.space_saved":"Espace enregistré","toast.space_deleted":"Espace supprimé","toast.delete_failed":"Échec de la suppression : {err}","toast.error":"Erreur : {err}","toast.toggle_target_unavailable":"La cible « {name} » est indisponible — aucune action n’a été effectuée","toast.toggle_targets_unavailable":"Cibles indisponibles : {names}. Aucune action n’a été effectuée","toast.file_failed":"Le fichier « {name} » n’a pas été importé : {err}","toast.files_attached":"Fichiers joints : {n}","err.unknown":"erreur inconnue","err.code":"code {code}","err.too_large":"fichier supérieur à {mb} Mo","err.bad_ext":"type non pris en charge (PDF/image attendu)","err.unauthorized":"droits administrateur requis","editor.title":"Titre","editor.default_floor":"Espace initial","editor.default_floor_missing":"L’espace initial « {id} » n’existe plus. Choisissez un autre espace.","editor.floor":"Espace fixe","editor.floor_none":"— non fixé —","editor.floor_index":"Index YAML {index} (conservé)","fixed_floor.loading":"Chargement de l’espace fixe…","fixed_floor.invalid_title":"L’espace fixe est indisponible","fixed_floor.invalid_body":"Vérifiez floor dans la configuration de la carte. Valeur configurée : {value}","editor.icon_size":"Taille des icônes, % de la largeur du plan","editor.show_temperature":"Afficher la température","editor.live_states":"États en direct (on/off, ouvert…)","editor.light_pools":"Halos lumineux et ombres des murs","editor.show_signal":"Afficher le signal Zigbee (LQI)","editor.language":"Langue de l’interface","editor.lang_auto":"Auto (profil HA)","title.icon_rules":"Règles d’icônes : quelle icône MDI attribuer aux appareils selon leur nom","rules.title":"Règles d’icônes","rules.hint":"Les règles sont testées de haut en bas sur « nom de l’appareil + modèle » (expression régulière insensible à la casse) ; la première correspondance gagne. Si rien ne correspond, la classe d’appareil de l’entité est utilisée, puis l’icône générique.","rules.pattern_ph":"regex, ex. plug|socket","rules.icon_ph":"mdi:power-socket-de","rules.add":"Ajouter une règle","rules.reset":"Réinitialiser par défaut","rules.test_ph":"Tester un nom d’appareil…","rules.invalid":"expression régulière invalide","rules.saved":"Règles d’icônes enregistrées","btn.up":"Monter","btn.down":"Descendre","tap.info":"Fiche de l’appareil","tap.more_info":"Boîte de dialogue Plus d’infos de HA","tap.toggle":"Basculer l’état","marker.tap_label":"Action au toucher pour cet appareil","tap.toggle_note":"L’état déterminé est affiché ci-dessous. Les appareils sécurisés ne sont jamais basculés depuis le plan.","import.title":"Créer des espaces à partir des étages HA","import.hint":"Votre Home Assistant connaît déjà ces étages. Sélectionnez ceux à transformer en espaces du plan — vous importerez ensuite une image de plan pour chacun. Les pièces sont ensuite tracées manuellement sur le plan.","import.start":"Créer {n} espace(s)","import.manual":"Commencer de zéro","import.progress":"Étage {i} sur {n}","import.done":"Espaces créés. Tracez les pièces : cliquez sur les points de la grille et fermez le contour.","btn.skip":"Passer","space.scale_label":"Échelle (taille d’une cellule de grille)","space.cell_cm.help":"Relie la grille aux dimensions réelles : les longueurs, les surfaces, l’épaisseur des murs, la taille des ouvertures et le rayon du halo en dépendent. Une modification ultérieure change les dimensions calculées de tout l’espace sans déplacer ses points sur le plan.","space.cell_cm.help.aria":"Aide : échelle de l’espace","space.scale_unit":"cm par cellule","space.scale_unit_imperial":"po par cellule","space.display_section":"Affichage","space.show_borders":"Toujours afficher les contours des pièces","space.zero_wall_style":"Murs d’épaisseur nulle","space.zero_wall_style.help":"Les murs d’épaisseur nulle en pointillés laissent passer le halo et les rayons du soleil, tandis que les murs pleins les bloquent comme une barrière sans surface. Ce choix s’applique à tous ces murs de l’espace, même si leur ligne est masquée en mode Vue.","space.zero_wall_style.help.aria":"Aide : style des murs d’épaisseur nulle","space.zero_wall_dashed":"Pointillés","space.zero_wall_solid":"Plein","space.show_names":"Afficher les noms des pièces (faire glisser pour déplacer)","space.room_color":"Couleur du contour et du nom","space.opacity":"Opacité","space.fill_label":"Remplissage de la pièce","space.fill_mode.help":"« Couleur personnalisée » définit le style, tandis que « Lumière », « Température » et « LQI » utilisent les données actuelles de Home Assistant. Le halo s’active séparément.","space.fill_mode.help.aria":"Aide : mode de remplissage des pièces","fill.none":"Aucun","fill.lqi":"Signal Zigbee","fill.light":"Lumières","fill.custom":"Couleur personnalisée","space.custom_fill":"Couleur de remplissage","space.source_file":"J’ai une image de plan","space.source_draw":"Aucune image — je tracerai les pièces à la main","fill.temp":"Température","tip.temp_avg":"température moyenne :","tip.hum_avg":"humidité moyenne :","space_card.button":"Ouvrir le plan de l’espace","space_card.not_found":"Espace « {id} » introuvable","space_card.loading":"Chargement…","continuity.restore_plan":"Restauration du plan…","continuity.restore_connection":"Restauration de la connexion aux appareils…","continuity.retry":"Réessayer","editor.space":"Espace","editor.framing":"Cadrage","editor.fit_content":"Tout le contenu visible","editor.fit_house":"Ajusté à la géométrie de la maison","editor.show_button":"Afficher le bouton","editor.button_label":"Libellé du bouton","editor.button_target":"Chemin du tableau de bord cible","marker.sub_entity":"entité","title.general_settings":"Paramètres généraux","title.export_pdf":"Enregistrer en PDF","pdf.title":"Enregistrement en PDF","pdf.dimensions":"Afficher les dimensions et les surfaces","pdf.decor":"Afficher les meubles et les autres éléments","pdf.room_names":"Afficher les noms des pièces","pdf.backdrop":"Afficher le fond de plan","pdf.save":"Enregistrer","pdf.saving":"Création…","pdf.failed":"Impossible de créer le PDF.","pdf.too_large":"Les images dépassent la limite PDF de 25 Mo.","pdf.asset_failed":"Impossible de charger une image de fond ou de décoration.","pdf.scale":"Échelle 1:{n}","pdf.north":"Nord","gs.title":"Paramètres généraux","gs.light_group":"Remplissage : lumières","gs.light_on":"Lumières allumées","gs.light_off":"Toutes les lumières éteintes","gs.temp_group":"Remplissage : température","gs.temp_cold":"Froid","gs.temp_ok":"Confortable","gs.temp_hot":"Chaud","gs.lqi_group":"Remplissage : signal Zigbee","gs.lqi_low":"Signal faible","gs.lqi_high":"Signal fort","gs.reset":"Réinitialiser par défaut","gs.saved":"Paramètres généraux enregistrés","gs.radar_show_live":"Afficher la présence en direct sur le plan","gs.radar_show_live_hint":"Masque ou affiche toutes les cibles radar en direct. Cela ne démarre ni n’arrête l’enregistrement des observations.","radar.title":"Présence sur le plan","radar.help":"Reliez ce marqueur aux entités radar exactes de Home Assistant, placez le capteur et choisissez son profil de coordonnées. Les positions en direct sont limitées à la pièce sélectionnée.","radar.help.aria":"Aide : paramètres du radar de présence","radar.enabled":"Utiliser ce radar de présence","radar.show_live":"Afficher les cibles en direct","radar.configure":"Configurer le radar","radar.configure_on_plan":"Configurer sur le plan","radar.change_installation":"Changer l’installation","radar.no_contour":"Cette pièce n’a pas de contour. Les points radar ne seront pas limités.","radar.discard_setup_title":"Abandonner la configuration du radar ?","radar.discard_setup":"La configuration du radar non enregistrée sera perdue.","radar.step_place_mount":"Indiquez la position physique du capteur","radar.step_place_heading":"Indiquez un point droit devant le capteur","radar.step_reference":"Indiquez la position de référence {n}, puis lancez la mesure","radar.step_check_reference":"Indiquez une position de contrôle indépendante","radar.start_measure":"Lancer la mesure","radar.countdown":"Placez-vous sur le repère dans {seconds} s","radar.capturing":"Restez immobile et seul pendant la mesure…","radar.fit_ready":"Le calibrage est prêt","radar.check_third":"Vérifier à une autre position","radar.check_complete":"Contrôle indépendant terminé","radar.error_distance":"Écart de position : {distance}","radar.ambiguous_target":"Plusieurs cibles ont été signalées. Recommencez la mesure seul.","radar.insufficient_samples":"Coordonnées actuelles insuffisantes. Réessayez ou utilisez le réglage manuel.","radar.bad_references":"Choisissez des références espacées dans des directions différentes du capteur.","radar.ambiguous_sources":"Les mesures permettent deux directions également plausibles. Choisissez des repères distinguant la gauche de la droite.","radar.bad_fit":"Les mesures ne correspondent pas. Vérifiez les unités, la position du capteur et les références.","radar.desktop_hint":"Utilisez un ordinateur pour un réglage précis. L’édition sur appareils tactiles est prise en charge au mieux.","radar.detected":"House Plan a reconnu les métadonnées radar de cet appareil. Vérifiez les sources exactes avant d’enregistrer.","radar.detected_ld2450":"House Plan a trouvé un ensemble de coordonnées ESPHome LD2450. Vérifiez les sources X/Y exactes avant d’enregistrer.","radar.additional_actions":"Actions supplémentaires","radar.declare":"Ceci est un radar de présence","radar.profile":"Profil de données","radar.profile_esphome_ld2450_v1":"ESPHome LD2450 (cibles X/Y)","radar.profile_cartesian_v1":"Cibles cartésiennes (X/Y)","radar.profile_polar_v1":"Cible polaire (distance/angle)","radar.profile_range_v1":"Distance uniquement","radar.profile_zones_v1":"États des zones","radar.profile_presence_v1":"Présence uniquement","radar.room":"Pièce observée","radar.room_choose":"Choisir une pièce","radar.target":"Cible {n}","radar.axis_x":"Entité de coordonnée X","radar.axis_y":"Entité de coordonnée Y","radar.add_target":"Ajouter un emplacement de cible","radar.range_channel":"Canal de distance {n}","radar.add_range":"Ajouter un canal de distance","radar.presence_gate":"Entité de présence du canal","radar.swap_axes":"Permuter les axes X et Y","radar.axis_x_sign":"Direction X","radar.axis_y_sign":"Direction Y","radar.distance_source":"Entité de distance","radar.angle_source":"Entité d’angle","radar.angle_unit":"Unité d’angle","radar.degrees":"Degrés","radar.radians":"Radians","radar.angle_zero":"Direction de l’angle zéro","radar.angle_forward":"Vers l’avant","radar.angle_right":"Vers la droite","radar.angle_clockwise":"Les angles augmentent dans le sens horaire","radar.zone_source":"Entité de zone","radar.occupancy_source":"Entité de présence","radar.count_source":"Entité du nombre de cibles","radar.availability_source":"Entité de disponibilité","radar.source_choose":"Choisir une entité","radar.source_optional":"Facultatif","radar.source_missing":"actuellement indisponible","radar.saved_unsupported":"Cette configuration radar enregistrée est incomplète ou non prise en charge. Elle reste inactive ; supprimez-la ou mettez House Plan à jour avant de la reconfigurer.","radar.occupancy":"Présence (activée/désactivée)","radar.count":"Nombre","radar.mount":"Position et direction","radar.mount_hint":"Il s’agit de la position physique du capteur. Déplacer son marqueur décoratif ne la modifie pas.","radar.heading":"Direction, °","radar.range_cm":"Portée, cm","radar.fov_deg":"Champ de vision, °","radar.unit":"Unité de la source","radar.mirror":"Inverser l’axe gauche/droite","radar.remove":"Supprimer les paramètres radar","radar.invalid":"Renseignez la pièce, les sources et la position du radar avant d’enregistrer.","radar.check_sources":"Vérifier les données en direct","radar.checking":"Vérification…","radar.health":"État de la connexion","radar.live_summary":"Cibles actuelles : {targets} ; arcs de distance : {ranges}","radar.health_ok":"Données actuelles reçues","radar.health_off":"Aucune cible détectée","radar.health_stale":"Certaines coordonnées sont obsolètes","radar.health_partial":"Certaines sources sont à jour, d’autres sont obsolètes","radar.health_restricted":"L’accès à une ou plusieurs sources est limité","radar.health_incomplete":"Le rapport radar actuel est incomplet","radar.health_position_unavailable":"Présence signalée ; position actuelle indisponible","radar.health_unavailable":"Données du capteur indisponibles","radar.health_needs_setup":"L’installation doit être configurée","radar.health_inconsistent":"Les sources fournissent des valeurs contradictoires","radar.health_unknown":"L’état actuel est inconnu","radar.health_disabled":"Le radar est désactivé","radar.error_invalid_radar":"Vérifiez les paramètres radar.","radar.error_invalid_selection":"Sélectionnez une pièce existante et des sources valides.","radar.error_source_restricted":"Vous n’avez pas accès à toutes les sources sélectionnées.","radar.error_rate_limited":"Trop de demandes. Réessayez dans un instant.","radar.error_not_ready":"Le traitement radar n’est pas encore prêt.","radar.error_conflict":"Le plan a changé. Rouvrez la configuration radar et réessayez.","radar.error_source_unavailable":"Une ou plusieurs sources radar sélectionnées sont indisponibles.","radar.error_unsupported_capability":"Cette fonction radar n’est pas prise en charge par l’intégration installée.","radar.report_age":"il y a {seconds} s","space.show_lqi":"Afficher le signal Zigbee (LQI) à côté des appareils","space.hide_decor":"Masquer la couche décorative","space.hide_decor_tip":"Les lignes, formes, étiquettes et meubles restent à leur place — visibles dans l’éditeur d’arrière-plan, mais pas sur le plan.","space.hide_openings":"Masquer les ouvertures","space.hide_openings_tip":"Les symboles de portes, fenêtres et portails ne sont pas dessinés, mais les ouvertures continuent de fonctionner : la lumière les traverse, le soleil entre par les fenêtres et les capteurs de contact continuent de les ouvrir. L’éditeur de plan les affiche toujours.","gs.light_none":"Aucune source lumineuse","mode.plan":"Éditeur de plan","mode.devices":"Éditeur d’appareils","display.value":"Valeur + état","marker.subarea":"aucune zone, manuel","device.new":"Nouvel appareil — ouvrez son éditeur pour fermer","opening.unlock_action":"Déverrouiller","opening.lock_action":"Verrouiller","opening.lock_pending":"En cours…","title.close_editor":"Fermer l’éditeur (retour à la vue)","title.add_device":"Ajouter un appareil au plan","devbar.add":"Ajouter","devbar.rules":"Règles d’icônes","device_inbox.button":"Appareils","device_inbox.title":"Appareils sur le plan","device_inbox.search":"Rechercher appareils, entités et intégrations…","device_inbox.add_virtual":"Ajouter un appareil virtuel","device_inbox.tab_on_plan":"Sur le plan","device_inbox.tab_available":"Disponibles","device_inbox.tab_hidden":"Masqués","device_inbox.tab_readd":"De nouveau disponibles","device_inbox.only_new":"Nouveaux uniquement","device_inbox.show_entities":"Afficher les entités","device_inbox.show_hidden":"Afficher les masqués sur le plan","device_inbox.show_hidden.help":"Affiche temporairement les marqueurs masqués et désactivés sous forme de fantômes réservés à l’éditeur. La visibilité enregistrée des appareils ne change pas.","device_inbox.show_hidden.help.aria":"Aide : afficher les appareils masqués sur le plan","device_inbox.new":"Nouveau","device_inbox.find":"Trouver sur le plan","device_inbox.edit":"Modifier","device_inbox.hide":"Masquer","device_inbox.show":"Afficher","device_inbox.add":"Ajouter","device_inbox.readd":"Ajouter à nouveau","device_inbox.hide_available":"Masquer de la liste","device_inbox.show_more":"Afficher plus","device_inbox.more_actions":"Plus d'actions","device_inbox.find_hidden_hint":"Activez d'abord « Afficher les masqués sur le plan »","device_inbox.show_disabled":"Activez cette liaison dans Home Assistant avant de l'afficher","device_inbox.empty_on_plan":"Aucun appareil correspondant n'est encore sur le plan.","device_inbox.empty_available":"Aucun appareil disponible à ajouter.","device_inbox.empty_hidden":"Il n'y a aucun appareil masqué.","device_inbox.empty_readd":"Aucun appareil supprimé n'est disponible pour un nouvel ajout.","device_inbox.reason_visible_auto":"Découvert automatiquement","device_inbox.reason_visible_explicit":"Ajouté explicitement","device_inbox.reason_manual_hidden":"Masqué par l'utilisateur","device_inbox.reason_automatic_hidden":"Masqué automatiquement","device_inbox.reason_service_entry":"Entrée de registre de service uniquement","device_inbox.reason_excluded_integration":"Intégration « {integration} » exclue par les filtres de découverte","device_inbox.reason_excluded_domain":"Type d'entité non spatial","device_inbox.reason_grouped_light":"Représenté par un groupe de lumières de la pièce","device_inbox.reason_represented_by_parent":"Représenté par son appareil parent","device_inbox.reason_removed":"Précédemment retiré du plan","device_inbox.reason_available":"Disponible pour ajout au plan","device_inbox.reason_no_bound_room":"La zone HA n'est liée à aucune pièce du plan","device_inbox.status_ha_disabled":"Désactivé dans Home Assistant","device_inbox.status_orphaned":"La liaison n'existe plus dans Home Assistant","device_inbox.status_unverified":"Le registre Home Assistant est temporairement indisponible","device_inbox.saved":"Liste des appareils mise à jour","device_inbox.filters_excluded":"Intégrations exclues","device_inbox.filters_group_lights":"Regrouper les lumières de la pièce en un marqueur","device_inbox.filters_preview_appear":"apparaîtra : {count}","device_inbox.filters_preview_hide":"disparaîtra : {count}","device_inbox.filters_preview_lights":"lumières concernées : {count}","device_inbox.filters_reset":"Rétablir les recommandées","device_inbox.filters_save":"Enregistrer les filtres","device_inbox.filters_search_ph":"Ajouter une intégration…","device_inbox.filters_title":"Filtres de découverte","space.roomcard_section":"La carte de pièce affiche :","space.label_temp":"Température","space.label_hum":"Humidité","space.label_lqi":"Signal Zigbee moyen","space.label_light":"Lumières allumées/éteintes","roomcard.light_on":"Allumé","roomcard.light_off":"Éteint","roomcard.light_partial":"{on} sur {total}","toast.split_pick_inside":"Les points intermédiaires de découpe doivent se trouver à l’intérieur de la pièce","mode.decor":"Éditeur d’arrière-plan","decor.select":"Sélectionner","decor.line":"Ligne","decor.rect":"Rectangle","decor.ellipse":"Ovale","decor.text":"Texte","decor.erase":"Effacer","decor.erase_confirm_title":"Effacer l’objet ?","decor.color":"Couleur","decor.width":"Épaisseur de ligne","decor.line_style":"Style de ligne","decor.line_style_solid":"Plein","decor.line_style_dashed":"Pointillés","decor.fill":"Remplissage","decor.fill_color":"Couleur de remplissage","decor.length":"Longueur","decor.size":"Taille","decor.flip_h":"Retourner horizontalement","decor.flip_v":"Retourner verticalement","decor.angle":"Angle de rotation, °","decor.text_size":"Taille du texte","decor.backdrop_properties":"Propriétés de l’arrière-plan du plan","decor.text_title":"Étiquette de texte","decor.object_title":"Modifier {kind}","decor.text_label":"Texte","decor.live_group":"Insérer une variable HA","decor.live_entity":"Entité","decor.live_entity_ph":"choisir une entité","decor.live_attr":"Valeur","decor.live_attr_ph":"choisir l’état ou un attribut","decor.live_state":"État","decor.backdrop":"Image d’arrière-plan","decor.backdrop_hint":"Faites glisser pour déplacer ; tirez un coin pour redimensionner ; utilisez la poignée supérieure pour faire pivoter. Maj modifie les proportions ou libère l’angle.","decor.backdrop_reset":"Réinitialiser l’image","decor.backdrop_reset_done":"L’image a retrouvé sa position et sa taille d’origine","marker.icon_auto":"Auto : {icon} (selon les règles d’icônes ; choisissez-en une pour remplacer)","marker.icon_pin_auto":"Épingle","mode.plan_tip":"Éditeur de plan — la géométrie du logement : dessiner et diviser/fusionner les pièces, les associer aux zones HA, placer portes, fenêtres et portails, déplacer les cartes de pièces, régler l’échelle","mode.devices_tip":"Éditeur d’appareils — tout ce qui concerne les icônes : faire glisser pour positionner, cliquer pour modifier l’association/l’icône/l’affichage, ajouter des appareils virtuels, règles d’icônes","mode.decor_tip":"Éditeur d’arrière-plan — décoration purement visuelle sous le plan : lignes, rectangles, ovales et étiquettes de texte qui ne réagissent jamais aux clics","space.glow_enabled":"Halo des sources lumineuses","gs.glow_group":"Halo des sources lumineuses","gs.glow_base":"Obscurité de la maison","gs.glow_light":"Couleur / intensité de lumière par défaut","gs.wall_group":"Murs","gs.wall_fill":"Remplissage des murs","gs.glow_radius":"Rayon du halo","gs.glow_radius.help":"Définit le rayon général du halo en mètres ou en pieds ; le rayon propre à un appareil remplace cette valeur.","gs.glow_radius.help.aria":"Aide : rayon général du halo","gs.unit_m":"m","gs.unit_ft":"pi","marker.controls_label":"Contrôle d’autres sources lumineuses","marker.controls.help":"Avec l’action « Basculer l’état », les sources répertoriées basculent avec ce marqueur. Leur halo reste sur leurs propres marqueurs et ce lien ne transforme pas à lui seul le marqueur de contrôle en source lumineuse.","marker.controls.help.aria":"Aide : contrôler d’autres sources lumineuses","marker.controls_filter":"Rechercher des lumières et interrupteurs…","info.controls":"Contrôle","marker.glow_radius_label":"Rayon du halo","marker.glow_radius.help":"Définit le rayon du halo en mètres ou en pieds ; une valeur vide utilise le rayon des paramètres généraux.","marker.glow_radius.help.aria":"Aide : rayon du halo","markup.wallthick":"Épaisseur","markup.select":"Sélectionner","title.markup_wallthick":"Épaisseur — cliquez sur un mur pour définir son épaisseur de 0 à 100 cm.","markup.hint_wallthick":"cliquez sur un mur · Échap ferme sans appliquer","wallthick.field":"Épaisseur","wallthick.unit_cm":"cm","wallthick.unit_in":"po","wallthick.apply_room":"Appliquer à tous les murs de cette pièce","markup.draw_wall_title":"Épaisseur de chaque nouveau segment de mur (0–100 cm). Les murs partagés conservent la valeur existante.","room.queue_progress":"Pièce {current} sur {total}","toast.wall_rooms_saved":"Pièces créées : {n}","toast.wall_chain_saved":"Chaîne de murs enregistrée","toast.wallthick_pick":"Cliquez sur un mur","toast.wallthick_set":"Épaisseur du mur définie","toast.wallthick_cleared":"Épaisseur du mur supprimée","toast.physical_range":"Saisissez une valeur comprise entre {min} et {max} {unit}","toast.zero_wall_opening_conflict":"Supprimez d’abord l’ouverture sur ce segment de mur.","toast.zero_wall_ambiguous":"Le segment de mur est ambigu. Simplifiez ou ajustez la jonction.","toast.zero_wall_migration_blocked":"L’espace n’a pas été converti : {reason}. Aucune donnée n’a été modifiée.","toast.physical_angle":"Saisissez un angle de rotation compris entre 0° inclus et 90° exclu","toast.physical_limit":"L’espace a atteint la limite pour ce type de géométrie","toast.geometry_unsafe":"Modification annulée : la géométrie des murs n’a pas pu être construite en toute sécurité.","junction.limit_angle":"L'angle entre les murs est trop aigu : {actual}°, minimum {limit}°.","junction.limit_valence":"Trop de murs se rejoignent en un nœud : {actual}, maximum {limit}.","junction.limit_length":"Le segment de mur est trop court : {actual} cm, minimum {limit} cm.","junction.limit_distance":"Les murs et les nœuds sont trop proches : {actual} cm, minimum {limit} cm.","junction.limit_clearance":"Il ne reste plus d'intérieur de pièce : {actual} cm², minimum {limit} cm².","junction.limit_check_failed":"La vérification des jonctions n'a pas pu s'exécuter — la modification n'a pas été enregistrée","toast.wall_model_migration_blocked":"Le modèle de murs n’a pas pu être mis à jour : {reason}. Le plan n’a pas été modifié. Lancez « Optimiser les plans » ; si l’erreur se reproduit, corrigez la géométrie de mur conflictuelle.","toast.wall_model_client_outdated":"Mettez à jour la carte et rechargez la page avant de modifier le plan.","wall_model.reason.invalid-room":"contour de pièce invalide","wall_model.reason.zero-length":"segment de mur de longueur nulle","wall_model.reason.third-owner":"mur partagé par plus de deux pièces","wall_model.reason.duplicate-id":"identifiants de mur en conflit","wall_model.reason.thickness-conflict":"valeurs d’épaisseur de mur en conflit","wall_model.reason.opening-host":"l’ouverture ne peut pas être attribuée à un seul mur","toast.delete_room_pick":"Cliquez à l’intérieur de la pièce que vous souhaitez supprimer","toast.plan_snap_ambiguous":"Zoomez pour choisir le nœud du mur","toast.wall_repair_ambiguous":"Le contour de la pièce possède plusieurs connexions possibles. Zoomez et reliez-le explicitement.","toast.wall_repair_too_large":"L’écart dépasse 2 cm. Reliez les murs avant de créer la pièce.","toast.wall_repair_changed":"La géométrie des murs a changé. Essayez de créer de nouveau la pièce.","toast.opening_on_zero_wall":"Les ouvertures ne peuvent pas être placées sur un mur d’épaisseur nulle","marker.from_ha_option":"Choisir dans la liste HA","marker.show_entities":"Afficher les entités","marker.show_entities_tip":"Ajoute à la liste non seulement les appareils, mais aussi toutes leurs entités","marker.pick_ph":"Choisir un appareil…","room.open_area":"Ouvrir la zone HA","room.fit_action":"Ajuster la pièce {name}","view.volumetric":"Vue volumétrique","view.flat":"Vue plane","kiosk.title":"Tailles pour cet écran","kiosk.hint":"Enregistrées uniquement sur cet appareil — chaque tablette murale ou TV peut avoir ses propres tailles confortables.","kiosk.icon_scale":"Taille des icônes d’appareils","kiosk.font_scale":"Taille du texte des cartes de pièces","editor.kiosk":"Mode appareil mural (kiosque)","editor.cycle":"Changer automatiquement d’espace toutes les N secondes (kiosque, 0 = désactivé)","room.settings_title":"Paramètres de la pièce","room.settings_section":"Paramètres de la pièce (remplacent ceux de l’espace)","room.fill_label":"Remplissage de CETTE pièce","fill.inherit":"Comme l’espace","room.custom_fill_space":"Couleur de l’espace","room.custom_fill_own":"Couleur de la pièce","room.temp_range_label":"Plage de confort","room.temp_range_min":"Limite basse de température confortable","room.temp_range_max":"Limite haute de température confortable","room.temp_range_reset":"Comme l’espace","room.temp_range.help":"Cette plage s’applique uniquement à cette pièce. Un champ vide hérite de la limite correspondante de l’espace ; si les limites sont inversées, House Plan utilise la plus petite comme limite basse et la plus grande comme limite haute.","room.temp_range.help.aria":"À propos de la plage de confort de la pièce","room.temp_src_label":"Source de température","room.hum_src_label":"Source d’humidité","room.src_average":"Moyenne des capteurs de la pièce (par défaut)","room.src_pick":"Un appareil ou une entité HA spécifique","room.src_ph":"Choisir une source…","toast.room_updated":"Pièce mise à jour","space.card_font":"Taille de police des cartes de pièces (tout l’espace)","room.sizes_section":"Tailles de police","room.name_scale":"Taille du nom de la pièce","room.label_scale":"Taille des mesures","preview.room_name":"Salon","toast.cfg_reload_failed":"Impossible de recharger le plan depuis le serveur : {err}","toast.locale_load_failed":"Impossible de charger le pack de langue. L'anglais est utilisé jusqu'au rechargement de la page.","toast.furniture_art_load_failed":"Impossible de charger les dessins de meubles. Rechargez la page pour les afficher.","room.settings_short":"Paramètres de la pièce","room.unnamed":"Pièce sans nom","marker.use_climate_temp":"Inclure la température de l’appareil dans la pièce","marker.use_climate_temp_tip":"Ajoute la valeur current_temperature d’un climatiseur ou thermostat à la moyenne de la pièce. Configurez séparément le badge de valeur externe ci-dessous.","marker.value_badge_title":"Badge de valeur","marker.value_badge.help":"Affiche une valeur sélectionnée à côté de l’icône. Cela n’affecte pas les mesures de la pièce, la lumière, le halo ni l’action au toucher.","marker.value_badge.help.aria":"Aide : badge de valeur de l’appareil","marker.value_badge_enabled":"Afficher un badge de valeur","marker.value_badge_source":"Valeur","marker.value_badge_source.help":"Choisissez un état précis, un attribut pris en charge ou une valeur dérivée de cet appareil.","marker.value_badge_source.help.aria":"Aide : source du badge de valeur","marker.value_badge_position":"Position","marker.value_badge_position.help":"Le côté choisi reste fixe et ne bascule pas automatiquement au bord du plan.","marker.value_badge_position.help.aria":"Aide : position du badge de valeur","marker.value_badge_right":"À droite","marker.value_badge_bottom":"En dessous","marker.value_badge_left":"À gauche","marker.value_badge_top":"Au-dessus","marker.value_badge_empty":"Cet appareil n’a aucune valeur disponible","marker.value_badge_static":"Une icône statique n’affiche pas de valeurs en direct. Le paramètre est conservé.","marker.value_badge_missing":"Source indisponible","marker.value_badge_missing_hint":"La source enregistrée est actuellement indisponible. Conservez-la, désactivez le badge ou choisissez une autre valeur.","marker.value_badge_duplicate":"La même valeur est déjà affichée dans l’icône.","marker.value_badge_state":"État · {name}","marker.value_badge_marker_state":"État de la source lumineuse · {name}","marker.value_badge_lqi":"Qualité moyenne du signal Zigbee","marker.value_badge_attr_current_temperature":"Température actuelle · {name}","marker.value_badge_attr_temperature":"Température cible · {name}","marker.value_badge_attr_current_humidity":"Humidité actuelle · {name}","marker.value_badge_attr_humidity":"Humidité · {name}","marker.value_badge_attr_current_position":"Position · {name}","marker.value_badge_attr_percentage":"Vitesse · {name}","marker.value_badge_attr_brightness":"Luminosité · {name}","marker.value_badge_attr_volume_level":"Volume · {name}","marker.value_badge_attr_battery_level":"Batterie · {name}","marker.value_badge_attr_fan_speed":"Vitesse du ventilateur · {name}","marker.value_source":"Source de la valeur","marker.value_source.help":"Choisissez la valeur qui remplace l’icône. L’action au toucher ne change pas.","marker.value_source.help.aria":"Aide : source de la valeur dans le marqueur","marker.value_source_auto":"Automatique (comme avant)","marker.value_source_missing_hint":"La source enregistrée est indisponible. Le marqueur affiche — jusqu’à son retour ou jusqu’au choix d’une autre valeur.","marker.light_role_label":"Cet appareil est-il une source lumineuse ?","marker.light_role.help":"« Auto » utilise le rôle déterminé de l’appareil lié, « Toujours » force sa propre source et « Jamais » l’exclut ; les lumières liées ci-dessus restent indépendantes.","marker.light_role.help.aria":"Aide : cet appareil est-il une source lumineuse","marker.light_role_auto_yes":"Auto (source lumineuse)","marker.light_role_auto_no":"Auto (pas une source lumineuse)","marker.light_role_always":"Toujours une source lumineuse","marker.light_role_never":"Jamais une source lumineuse","marker.light_entity_label":"Entité lumineuse principale","marker.light_entity.help":"Pour un appareil composite, choisissez l’entité dont l’état, la couleur et la luminosité représentent cette source sur le plan. Le choix automatique reste compatible avec les anciens plans.","marker.light_entity.help.aria":"Aide : entité lumineuse principale","marker.light_entity_auto":"Automatique ({entity})","marker.light_entity_none":"aucune entité contrôlable","marker.light_entity_missing":"L’entité enregistrée {entity} est indisponible. House Plan utilise temporairement {fallback} ; le choix enregistré sera restauré si elle revient.","marker.toggle_entity_label":"Entité à basculer","marker.toggle_entity.help":"Pour un appareil composite, choisissez précisément la lumière ou l’interrupteur propre à actionner par un toucher. Automatique conserve les règles de cible précédentes et reste indépendant de l’entité lumineuse principale.","marker.toggle_entity.help.aria":"Aide : entité à basculer","marker.toggle_entity_auto":"Automatique ({entity})","marker.toggle_entity_none":"aucune entité propre contrôlable","marker.toggle_entity_missing":"L’entité enregistrée {entity} ne fait plus partie des canaux sélectionnables de ce marqueur. House Plan utilise temporairement {fallback} ; le choix enregistré sera restauré si elle revient.","marker.glow_color_label":"Couleur et luminosité du halo","marker.glow_mode.help":"Utilisez les valeurs en direct de la source, remplacez uniquement sa couleur ou fixez à la fois la couleur et la luminosité. Le minimum est 1 % ; pour désactiver la source, choisissez « Jamais ».","marker.glow_mode.help.aria":"Aide : couleur et luminosité du halo","marker.glow_mode_auto":"Depuis la source","marker.glow_mode_color":"Définir la couleur","marker.glow_mode_fixed":"Définir la couleur et la luminosité","marker.glow_color":"Couleur du halo","marker.glow_brightness":"Luminosité","marker.glow_disabled_never":"Les paramètres du halo sont indisponibles car ce marqueur est explicitement défini comme n’étant pas une source lumineuse.","marker.glow_disabled_auto":"Le mode Auto n’a trouvé aucune source lumineuse spatiale pour ce marqueur.","marker.glow_disabled_no_entity":"Aucune entité Home Assistant contrôlable et active n’est disponible pour cette source spatiale.","marker.glow_passive_hint":"Cette source ne possède aucune donnée Home Assistant propre. Définissez manuellement sa couleur et sa luminosité ; son rayon reste disponible.","marker.control_broken":"La source enregistrée est absente ou n’est plus marquée comme lumière","marker.control_missing_label":"Lumière du plan manquante","marker.control_passive":"source passive","toast.marker_control_cycle":"Ce lien créerait une chaîne circulaire de contrôles de lumière.","toast.marker_binding_required":"Choisissez un appareil Home Assistant avant de lier une autre source lumineuse.","confirm.unlock_title":"Déverrouiller ?","confirm.unlock_body":"House Plan enverra une commande de déverrouillage à cette serrure.","toast.files_migrate_failed":"Les pièces jointes n’ont pas pu être déplacées vers la nouvelle association ; les liens continuent de pointer vers les anciens fichiers : {err}","space.pick_saved":"Déjà importé","space.pick_saved_hint":"Plans stockés sur le serveur, y compris ceux que vous avez précédemment dissociés","space.no_saved":"Aucun plan n’est encore stocké sur le serveur.","space.loading":"Chargement…","space.used_by":"utilisé par : {list}","space.in_use":"Un espace utilise encore ce plan — dissociez-le d’abord","btn.use":"Utiliser","confirm.delete_plan_title":"Supprimer le fichier du plan ?","confirm.delete_plan_body":"Le fichier sera supprimé du serveur. Cette action est irréversible.","toast.plans_list_failed":"Impossible de lister les plans stockés : {err}","toast.plan_delete_failed":"Impossible de supprimer le plan : {err}","marker.hide":"Masquer","marker.hide_tip":"L’appareil disparaîtra du plan après l’enregistrement mais continuera de compter dans le signal de la pièce. Restaurez-le via « Masqués et désactivés » dans l’éditeur d’appareils.","marker.show":"Afficher","marker.show_tip":"L’appareil apparaîtra de nouveau sur le plan après l’enregistrement.","marker.hidden_ghost":"Appareil masqué par l’utilisateur","marker.ha_disabled_device":"L’appareil est désactivé dans Home Assistant et masqué du plan.","marker.ha_disabled_entity":"L’entité est désactivée dans Home Assistant et masquée du plan.","marker.ha_disabled_all_entities":"L’appareil n’a aucune entité Home Assistant active ; il est donc masqué du plan.","marker.ha_registry_limited":"Le registre Home Assistant complet n’est pas accessible à cet utilisateur. L’objet non vérifié ne peut pas être affiché ni utilisé pour le moment.","marker.delete_tip":"Supprimer complètement l’appareil du plan et de tous les agrégats. Vous pourrez l’ajouter de nouveau plus tard.","tap.run":"Exécuter une automatisation/un script/une scène","tap.none":"Ne rien faire","marker.run_target_label":"Élément à exécuter","marker.run_search_ph":"Rechercher : automatisation, script ou scène…","marker.run_target_gone":"Cible {id} introuvable — choisissez-en une autre","marker.tap_confirm":"Demander une confirmation","marker.tap_confirm_tip":"Afficher une boîte de dialogue de confirmation avant l’action — protection contre les appuis accidentels.","marker.toggle_hint_single":"Cible : {name} ({id}).","marker.virtual_light_target":"Lumière virtuelle : {name}.","marker.virtual_light_current":"État manuel : {state} → {effect}.","marker.virtual_light_state_on":"allumé","marker.virtual_light_state_off":"éteint","marker.toggle_hint_group":"Basculera {count} source(s) : {names}.","marker.toggle_hint_current":"Actuellement : {state} → {effect}.","marker.toggle_hint_group_current":"Actuellement allumées : {on} sur {count} → {effect}.","marker.toggle_hint_skipped":"Seront ignorées ({count}) : {targets}.","marker.toggle_effect_turn_on":"sera allumé","marker.toggle_effect_turn_off":"sera éteint","marker.toggle_effect_open":"sera ouvert","marker.toggle_effect_close":"sera fermé","marker.toggle_effect_stop":"sera arrêté","marker.toggle_effect_toggle":"l’état sera basculé","marker.toggle_skip_missing":"introuvable","marker.toggle_skip_ha_disabled":"désactivé dans HA","marker.toggle_skip_unavailable":"indisponible","marker.toggle_skip_unsupported":"basculement non pris en charge","marker.toggle_skip_secure":"bloqué pour des raisons de sécurité","marker.toggle_none_no_binding":"Cet appareil n’a aucune association ; il n’y a donc aucun état à basculer. Un toucher ne fera rien.","marker.toggle_none_no_actionable_entity":"Cet appareil n’a aucun état pouvant être basculé. Un toucher ne fera rien.","marker.toggle_none_configured_targets_missing":"Les cibles configurées sont indisponibles. L’entité propre de l’appareil ne leur sera pas substituée.","marker.toggle_none_ha_disabled":"La cible est désactivée dans Home Assistant et ne peut pas être utilisée sur le plan.","marker.toggle_none_unavailable":"La cible est actuellement indisponible. Un toucher ne fera rien.","marker.toggle_none_unsupported":"Home Assistant n’expose aucune opération de basculement sûre pour cette entité. Un toucher ne fera rien.","marker.toggle_none_secure":"Le basculement des serrures, alarmes et portails sécurisés depuis le plan est bloqué pour des raisons de sécurité.","run.automation":"automatisation","run.script":"script","run.scene":"scène","confirm.tap_run":"Exécuter « {name} » ?","confirm.tap_toggle":"Basculer « {name} » ?","confirm.current_state":"État actuel : {state}","confirm.expected_state":"Après basculement : {state}","confirm.group_current":"{on} allumé(s) sur {total}","confirm.group_all_on":"tout est allumé","confirm.group_all_off":"tout est éteint","confirm.unavailable_targets":"Indisponibles : {count}","confirm.expected_by_ha":"Home Assistant déterminera l’état","confirm.state_on":"Allumé","confirm.state_off":"Éteint","confirm.state_open":"Ouvert","confirm.state_closed":"Fermé","confirm.state_opening":"Ouverture en cours","confirm.state_closing":"Fermeture en cours","confirm.state_stopped":"Arrêté","confirm.state_unknown":"Inconnu","toast.run_started":"Démarré : {name}","toast.run_target_missing":"Cible d’exécution introuvable — vérifiez les paramètres de l’appareil","toast.run_target_required":"Choisissez une automatisation, un script ou une scène","toast.tap_target_changed":"La cible de l’action a changé. Réessayez.","toast.virtual_light_toggle_failed":"Impossible de basculer la lumière virtuelle : {err}","toast.value_badge_source_required":"Choisissez une valeur pour le badge","btn.run":"Exécuter","vac.section":"Robot aspirateur : position en direct","vac.autocal":"Configurer automatiquement","vac.live":"Position en direct sur le plan","vac.trail":"Afficher le trajet du robot","vac.autocal_no_rooms":"L’intégration ne fournit aucune liste de pièces — ouvrez « Ajuster manuellement »","vac.route_warn_unmapped":"Le robot nettoie une carte qui n'est assignée à aucun étage","vac.route_warn_needs_calibration":"La carte est assignée à un étage mais n'est pas calibrée","vac.route_warn_ambiguous":"Deux cartes sont indiscernables — aucun étage choisi","vac.route_warn_missing_space":"L'espace de cette carte a été supprimé","vac.autocal_no_match":"Les noms de pièces ne correspondent pas (il en faut ≥3 en commun) — ouvrez « Ajuster manuellement »","vac.autocal_done":"Terminé : association via {rooms} pièces. Lancez un nettoyage et vérifiez","vac.cal_need_pos":"Le robot ne transmet pas de coordonnées — lancez un nettoyage puis mettez-le en pause","vac.cal_done":"Calibration enregistrée. Lancez un nettoyage et vérifiez","vac.cal_cancelled":"Calibration annulée","vac.fit":"Ajuster manuellement","vac.fit_hint":"Faites glisser la carte du robot pour la positionner, étirez-la par les coins","vac.fit_rotate":"Rotation de 90°","vac.fit_mirror":"Miroir","vac.trail_never":"Jamais","vac.trail_cleaning":"Pendant le nettoyage","vac.trail_always":"Toujours","gs.bg_group":"Arrière-plan de la scène","gs.bg_color":"Arrière-plan autour du plan","gs.bg_default":"Valeur par défaut du thème","gs.bg_theme":"valeur par défaut du thème","gs.bg_mode":"Arrière-plan du plan","gs.bg_mode.help":"« Suit le soleil » utilise sun.sun ou, à défaut, l’heure locale du navigateur ; « Couleur statique » affiche toujours la couleur choisie.","gs.bg_mode.help.aria":"Aide : arrière-plan général du plan","gs.bg_static":"Couleur statique","gs.bg_daynight":"Suit le soleil","gs.sun_group":"Soleil","gs.sun_missing":"L’entité sun.sun est introuvable — l’arrière-plan suit votre heure locale ; les rayons de soleil par les fenêtres sont indisponibles.","gs.north":"Nord sur le plan","gs.north.help":"L’angle se mesure dans le sens horaire depuis la verticale supérieure du plan ; le nord sert aux rayons des fenêtres, pas à l’arrière-plan « Suit le soleil ».","gs.north.help.aria":"Aide : direction générale du nord","gs.north_ph":"non défini","gs.north_clear":"Effacer","gs.north_letter":"N","gs.sun_rays":"Lumière du soleil à travers les fenêtres","gs.sun_ray_origin":"Rayons du soleil","gs.sun_ray_origin.inner":"Depuis les angles intérieurs des fenêtres","gs.sun_ray_origin.outer":"Depuis les angles extérieurs des fenêtres","gs.about_version":"Houseplan Card v{v}","gs.about_github":"GitHub · documentation et problèmes","gs.about_telegram":"Discussion Telegram","support.title":"Aide et commentaires","space.bg_color":"Arrière-plan autour du plan","space.bg_inherit":"Hériter des paramètres généraux","space.bg_inherited":"hérite des paramètres généraux","space.bg_mode":"Arrière-plan du plan","space.bg_mode.help":"Héritez de l’arrière-plan général ou remplacez-le pour cet espace par une couleur statique ou le mode « Suit le soleil ».","space.bg_mode.help.aria":"Aide : arrière-plan de l’espace","space.north":"Nord sur le plan (remplacement)","space.north.help":"Remplace le nord général pour cet espace ; l’angle se mesure dans le sens horaire depuis la verticale supérieure du plan et sert aux rayons des fenêtres.","space.north.help.aria":"Aide : nord de cet espace","space.north_inherited":"hérité : {v}","space.sun_rays":"Lumière du soleil à travers les fenêtres","space.sun_inherit":"Hériter des paramètres généraux","space.sun_on":"Activé","space.sun_off":"Désactivé","canvas.far_objects":"{n} objet(s) éloigné(s) du plan","canvas.show_far":"Afficher","canvas.home_tip":"Le plan est là-bas — cliquez pour l’ajuster à l’écran","gs.grid_group":"Maintenance du plan","gs.grid_hint":"Met à jour les modèles de données, aligne les éléments du plan sur la grille et fusionne les fragments de murs redondants. Un rapport précis est affiché avant tout enregistrement.","gs.align_all":"Optimiser les plans","gs.align_title":"Optimiser les plans","gs.align_none":"Tous les plans utilisent déjà le modèle de données optimisé actuel.","gs.optimize_no_automatic_changes":"Aucune modification automatique n’est à appliquer. Vérifiez les éléments ci-dessous.","gs.align_count":"{n} élément(s) sur {total} seront déplacés, de {cm} cm au maximum.","gs.align_where":"Le plus grand déplacement se trouve dans « {s} ».","gs.align_turned":"Ouvertures dont l’angle est corrigé : {n}.","gs.align_preflight_failed":"Impossible de vérifier en toute sécurité la géométrie des espaces suivants : {spaces}{more}.","gs.align_preflight_hint":"Les plans n’ont pas été modifiés. Copiez les diagnostics avec le bouton ci-dessous et joignez-les au rapport de bug avec un export de l’espace.","gs.preflight_reason_prepare-exception":"Impossible de préparer la géométrie de l’espace (exception lors de la construction du modèle)","gs.preflight_reason_wall-null":"Le corps du mur n’a pas pu être construit (l’union a renvoyé un résultat vide)","gs.preflight_reason_wall-degraded-extra":"Le corps du mur s’est dégradé avec une géométrie supplémentaire","gs.preflight_reason_wall-failed-core":"Le noyau du corps du mur n’a pas pu être assemblé","gs.preflight_reason_wall-exception":"La construction du mur a déclenché une exception","gs.preflight_reason_floor-null":"Le contour du sol n’a pas pu être construit","gs.preflight_reason_floor-exception":"La construction du sol a déclenché une exception","gs.preflight_copy":"Copier les diagnostics","gs.preflight_copied":"Diagnostics copiés","gs.preflight_update_hint":"Les versions de la carte et de l’intégration diffèrent — mettez House Plan à jour puis réessayez.","gs.align_preflight_space":"Espace {n}","gs.align_preflight_more":", et {n} de plus","gs.optimize_changes":"Migrations de modèle : {m} ; espaces mis à jour : {c} ; valeurs de coordonnées parasites supprimées : {p} ; fragments de murs réels fusionnés : {w} ; fragments de murs d’épaisseur nulle fusionnés : {s} ; murs indépendants : {i}.","gs.zero_walls_migrated":"Portions de murs virtuels converties : {n}.","gs.wall_segments_migrated":"Segments de murs stabilisés : {n}.","gs.room_drafts_migrated":"Contours inachevés convertis en murs ordinaires : {drafts} ; segments : {segments}.","gs.optimize_lattice_summary":"Valeurs de coordonnées parasites normalisées : {n} ; déplacement maximal : {cm} cm.","gs.optimize_lattice_space":"{space} : valeurs de coordonnées normalisées : {n} ; valeurs hors grille laissées inchangées : {far}.","gs.optimize_coincident_partitions":"Sections de murs indépendants masquées absorbées dans les murs des pièces : {n}.","gs.optimize_openings_rehosted":"Ouvertures rattachées aux murs des pièces : {n}.","gs.optimize_walls_straightened":"Murs redressés : {n} ; déplacement maximal : {cm} cm.","gs.optimize_walls_straightened_where":"Plus grande correction de mur : {s}.","gs.optimize_walls_straighten_skipped":"Murs proches d’un axe laissés inchangés car ils ne pouvaient pas être réparés en toute sécurité : {n}.","gs.optimize_glow_migration":"Ancien mode Glow : {spaces} espaces → aucun remplissage de données + Glow indépendant ; {rooms} pièces → remplissage de données hérité + Glow indépendant.","gs.optimize_references":"Références réparées : espaces — {spaces} ; pièces — {rooms} ; positions — {positions} ; appareils dissociés des espaces manquants — {detached}.","gs.optimize_reference_more":", et {n} de plus","gs.optimize_orphans_removed":"Enregistrements oubliés supprimés : {total} — étiquettes de pièces : {rooms} ; appareils : {devices} ; marqueurs de groupe : {groups}. Ils appartenaient à des espaces supprimés précédemment.","gs.optimize_live_positions":"Anciennes positions dans des espaces supprimés appartenant à des objets existants : {n}{names}. Elles seront conservées.","gs.optimize_live_positions_remove":"Anciennes positions dans des espaces supprimés appartenant à des objets existants : {n}{names}. Elles sont sélectionnées pour suppression.","gs.optimize_live_names":" : {names}{more}","gs.optimize_live_remove":"Supprimer les anciennes positions","gs.optimize_live_keep":"Conserver les anciennes positions","gs.optimize_live_selected":"Les anciennes positions seront supprimées après l’application de l’optimisation.","gs.optimize_unverified":"Impossible de vérifier en toute sécurité les positions : {n}. Elles ont été laissées inchangées.","gs.optimize_registry_limited":"Un accès administrateur complet aux registres Home Assistant est requis pour une vérification sûre.","gs.optimize_vacuum_warning":"Associations de pièces d’aspirateur nécessitant encore une vérification : {n}.","gs.optimize_details":"Détails","gs.optimize_details_more":"Et {n} enregistrement(s) de plus.","gs.optimize_detail_removed":"sera supprimé","gs.optimize_detail_live":"sera conservé","gs.optimize_detail_unverified":"non vérifié","gs.optimize_detail_room_label":"étiquette de pièce","gs.optimize_detail_device":"appareil","gs.optimize_detail_group":"marqueur de groupe","gs.optimize_detail_unknown":"propriétaire inconnu","gs.optimize_detail_item":"{status} : {kind} {id} ; ancien espace {space}","gs.align_warn":"Les éléments volontairement placés entre les nœuds de la grille seront déplacés. Une seule annulation est disponible après l’opération, uniquement jusqu’à la prochaine modification du plan.","gs.align_run":"Optimiser","gs.align_done":"Plans optimisés : {n} élément(s) déplacé(s), {m} enregistrement(s) maintenu(s), {r} référence(s) réparée(s)","gs.optimize_undo":"Annuler la dernière optimisation","gs.optimize_undone":"La dernière optimisation a été annulée","decor.furniture":"Mobilier","decor.image":"Image","decor.image_title":"Images personnalisées","decor.image_upload":"Importer une image","decor.image_replace":"Remplacer l’image","decor.image_uploading":"Importation…","decor.image_asset":"Fichier image","decor.image_pick_hint":"Importez une image ou choisissez-en une existante.","decor.image_place_hint":"Cliquez sur le plan pour placer l’image.","decor.image_none":"Aucune image importée pour le moment.","decor.image_unavailable":"Image indisponible","decor.image_used":"Utilisée dans {n} objets","decor.image_upload_failed":"Impossible d’importer l’image : {err}","decor.image_error_capacity":"Le stockage des images personnalisées est plein.","decor.image_in_use":"Supprimez toutes les copies placées avant ce fichier.","decor.image_delete_title":"Supprimer le fichier image ?","decor.image_delete_message":"Supprimer « {name} » de House Plan ? Cette action est irréversible.","furn.title":"Bibliothèque de mobilier","furn.symbol":"Symbole","furn.group_furniture":"Mobilier","furn.group_appliance":"Électroménager","furn.group_sanitary":"Sanitaires","furn.group_other":"Autre","furn.width":"Largeur","furn.depth":"Profondeur","furn.back_to_categories":"Toutes les catégories","furn.pick_hint":"Choisissez un symbole, puis cliquez sur le plan.","furn.place_hint":"Cliquez sur le plan — le meuble se place contre le mur le plus proche. Maj permet un placement libre.","furn.cat_air_conditioner":"Climatiseurs","furn.cat_armchair":"Fauteuils","furn.cat_bathtub":"Baignoires","furn.cat_bed":"Lits","furn.cat_bidet":"Bidets","furn.cat_boiler":"Chauffe-eau","furn.cat_chair":"Chaises","furn.cat_coffee_table":"Tables basses","furn.cat_cooktop":"Plaques de cuisson","furn.cat_dining_table":"Tables à manger","furn.cat_dishwasher":"Lave-vaisselle","furn.cat_dryer":"Sèche-linge","furn.cat_fireplace":"Cheminées","furn.cat_fridge":"Réfrigérateurs","furn.cat_kitchen_cabinet":"Meubles de cuisine","furn.cat_kitchen_sink":"Éviers de cuisine","furn.cat_nightstand":"Meubles","furn.cat_plant":"Plantes","furn.cat_rug":"Tapis","furn.cat_shelving":"Étagères","furn.cat_shower":"Douches","furn.cat_sink":"Lavabos","furn.cat_sofa":"Canapés","furn.cat_stairs":"Escaliers","furn.cat_toilet":"Toilettes","furn.cat_tv":"Téléviseurs","furn.cat_wardrobe":"Armoires","furn.cat_washer":"Lave-linge","furn.cat_work_table":"Bureaux","furn.sym_sofa":"Canapé","furn.sym_sofa_three_seat":"Canapé trois places","furn.sym_sofa_corner_right":"Canapé d'angle droit","furn.sym_armchair":"Fauteuil","furn.sym_armchair_office":"Chaise de bureau","furn.sym_coffee_table":"Table basse","furn.sym_coffee_table_round":"Table basse ronde","furn.sym_coffee_table_oval":"Table basse ovale","furn.sym_coffee_table_rounded":"Table basse arrondie","furn.sym_table_dining":"Table à manger","furn.sym_table_round":"Table ronde","furn.sym_table_dining_oval":"Table à manger ovale","furn.sym_table_dining_rounded":"Table à manger arrondie","furn.sym_chair":"Chaise","furn.sym_chair_bar":"Tabouret de bar","furn.sym_desk":"Bureau","furn.sym_desk_corner":"Bureau d'angle","furn.sym_bed_double":"Lit double","furn.sym_bed_single":"Lit simple","furn.sym_nightstand":"Table de chevet","furn.sym_cabinet_tv":"Meuble TV","furn.sym_cabinet_shoe":"Meuble à chaussures","furn.sym_cabinet_sink":"Meuble sous lavabo","furn.sym_wardrobe":"Armoire","furn.sym_bookshelf":"Bibliothèque","furn.sym_wall_unit":"Élément mural","furn.sym_kitchen_floor":"Module de cuisine bas","furn.sym_kitchen_floor_corner":"Module de cuisine bas d'angle","furn.sym_kitchen_wall":"Module de cuisine haut","furn.sym_kitchen_wall_corner":"Module de cuisine haut d'angle","furn.sym_shelf_floor":"Étagère au sol","furn.sym_shelf_wall":"Étagère murale","furn.sym_fridge":"Réfrigérateur","furn.sym_stove":"Cuisinière","furn.sym_cooktop_two":"Plaque à deux feux","furn.sym_dishwasher":"Lave-vaisselle","furn.sym_washer":"Lave-linge","furn.sym_dryer":"Sèche-linge","furn.sym_tv":"Téléviseur","furn.sym_tv_wall":"Téléviseur mural","furn.sym_ac":"Climatiseur","furn.sym_water_heater":"Chauffe-eau","furn.sym_toilet":"Toilettes","furn.sym_toilet_built_in":"Toilettes suspendues","furn.sym_bathtub":"Baignoire","furn.sym_bathtub_corner":"Baignoire d'angle","furn.sym_shower":"Douche","furn.sym_sink":"Lavabo","furn.sym_kitchen_sink":"Évier de cuisine","furn.sym_kitchen_sink_double":"Évier de cuisine double","furn.sym_bidet":"Bidet","furn.sym_bidet_built_in":"Bidet suspendu","furn.sym_stairs":"Escalier","furn.sym_fireplace":"Cheminée","furn.sym_plant":"Plante","furn.sym_rug":"Tapis","common.yes":"Oui","common.no":"Non","vac.diag_source":"Source","vac.diag_platform":"Intégration","vac.diag_status":"État","vac.diag_position":"Position","vac.diag_rooms":"Pièces","vac.diag_rooms_value":"{total} · {matched} noms correspondent · {readiness}","vac.autocal_ready":"calibration automatique disponible","vac.autocal_not_ready":"3 noms correspondants requis","vac.diag_path":"Chemin de l’intégration","vac.diag_map":"ID de carte","vac.source_none":"non sélectionné","vac.source_status_ok":"Prêt","vac.source_status_missing":"Manquant","vac.source_status_disabled":"Désactivé dans Home Assistant","vac.source_status_unavailable":"Indisponible","vac.source_status_unverified":"Impossible à vérifier avec les autorisations actuelles","vac.source_status_unsupported":"Aucune donnée de position","vac.source_status_none":"Aucune source","vac.source_banner_missing":"La source enregistrée n’existe plus. Elle n’a pas été remplacée automatiquement ; choisissez une autre source ou restaurez-la dans Home Assistant.","vac.source_banner_disabled":"La source enregistrée est désactivée dans Home Assistant. Activez-la ou choisissez une autre source.","vac.source_banner_unverified":"Les autorisations Home Assistant actuelles ne permettent pas de vérifier cette source enregistrée. Elle reste épinglée et ne sera pas remplacée automatiquement.","vac.choose_source":"Choisir la source","vac.source_auto":"Automatique","vac.source_auto_hint":"Utiliser une entité compatible de cet appareil","vac.all_cameras":"Toutes les caméras","vac.all_cameras_warn":"Une caméra peut ne pas fournir de données du robot. Choisissez-en une uniquement s’il s’agit de la carte de votre aspirateur.","vac.all_cameras_empty":"Aucune autre entité caméra trouvée.","vac.platform_unknown":"intégration inconnue","vac.cap_position":"position","vac.cap_rooms_short":"pièces","vac.cap_path":"trajet","vac.cap_map":"ID de carte","vac.cap_none":"aucune donnée de robot détectée","vac.xcme_hint":"Activez ces attributs Xiaomi Cloud Map Extractor :","vac.documentation":"Documentation","vac.residual_title":"Vérifier la calibration automatique","vac.residual_message":"Les pièces correspondantes présentent un écart maximal de {error}. Appliquez cette calibration approximative, affinez-la manuellement ou annulez sans modifier la configuration enregistrée.","vac.apply_proposal":"Appliquer","gs.backup_group":"Sauvegarde et transfert","gs.backup_hint":"Téléchargez une sauvegarde JSON portable ou prévisualisez et importez une sauvegarde créée par House Plan.","backup.export_open":"Exporter","backup.import_open":"Importer","backup.export_title":"Exporter House Plan","backup.import_title":"Importer House Plan","backup.export_hint":"Choisissez si la sauvegarde doit contenir toute la configuration House Plan ou uniquement l’espace actuel.","backup.full":"Sauvegarde complète","backup.current_space":"Espace actuel","backup.current_space_title":"Espace actuel : {title}","backup.no_current_space":"Aucun espace actuel","backup.plan_only":"Plan uniquement","backup.plan_only_hint":"Conserver les pièces, murs, ouvertures, décorations et positions des étiquettes de pièces sans les appareils ni les associations Home Assistant.","backup.plan_only_preview":"Ce fichier contient uniquement le plan","backup.privacy_warning":"L’archive conserve les noms, identifiants Home Assistant et coordonnées exactes. Les plans internes et pièces jointes sont référencés, pas intégrés ; les états d’exécution et trajets d’aspirateur ne sont pas inclus.","backup.download":"Télécharger le JSON","backup.export_done":"Sauvegarde téléchargée","backup.reading":"Vérification de la sauvegarde…","backup.revalidated":"Le plan a changé depuis cet aperçu. Le résumé a été actualisé ; vérifiez-le et confirmez de nouveau.","backup.error.support_invalid_message":"Vérifiez le message d’assistance et réessayez.","backup.error.support_package_too_large":"Le paquet d’assistance anonymisé dépasse la limite de 8 Mio.","backup.error.support_preview_expired":"L’aperçu de la pièce jointe d’assistance a expiré ou n’est plus disponible.","backup.error.support_rate_limited":"Trop de rapports ou d’aperçus d’assistance ont été demandés. Réessayez plus tard.","backup.error.support_rejected":"Le rapport n’a pas passé la validation du service d’assistance.","backup.error.support_unavailable":"Le service d’assistance privé est temporairement indisponible.","backup.error.unauthorized":"Vous n’avez pas l’autorisation d’exporter ou d’importer ce plan.","backup.error.not_ready":"House Plan n’est pas encore prêt. Réessayez dans un instant.","backup.error.too_large":"La sauvegarde dépasse la limite de 8 Mio.","backup.error.invalid_json":"Le fichier sélectionné n’est pas un JSON valide.","backup.error.invalid_format":"Le fichier sélectionné n’est pas une sauvegarde House Plan.","backup.error.invalid_image":"L’image est endommagée ou ne correspond pas à son format.","backup.error.unsupported_export_version":"Ce format de sauvegarde n’est pas pris en charge par la version installée.","backup.error.unsupported_image":"Utilisez une image PNG, JPEG, WebP ou SVG prise en charge.","backup.error.future_model":"La sauvegarde a été créée avec un modèle de données House Plan plus récent.","backup.error.invalid_config":"La sauvegarde contient une configuration House Plan invalide.","backup.error.wall_model_migration_blocked":"Le modèle de murs de la sauvegarde n’a pas pu être mis à niveau en toute sécurité. Optimisez d’abord le plan source, puis exportez-le de nouveau.","backup.error.invalid_layout":"La sauvegarde contient des positions d’objets invalides.","backup.error.invalid_content":"La sauvegarde contient des références de contenu invalides ou incohérentes.","backup.error.space_not_found":"L’espace sélectionné n’existe plus.","backup.error.capacity_exceeded":"L’ajout de cette sauvegarde dépasserait les limites du plan.","backup.error.preview_expired":"L’aperçu a expiré. Sélectionnez de nouveau le fichier de sauvegarde.","backup.error.preview_owner_mismatch":"Cet aperçu appartient à un autre utilisateur Home Assistant.","backup.error.conflict":"Le plan a changé depuis l’aperçu. Vérifiez le résumé actualisé.","backup.error.content_confirmation_required":"Confirmez que le contenu local indisponible peut être dissocié.","backup.error.commit_failed":"La sauvegarde n’a pas pu être appliquée en toute sécurité. Le plan précédent a été restauré ou est en attente de récupération.","backup.error.missing_plan":"Un fichier de plan référencé a disparu depuis l’aperçu. Vérifiez de nouveau la sauvegarde.","backup.error.missing_content":"Une pièce jointe locale référencée a disparu depuis l’aperçu. Vérifiez de nouveau la sauvegarde.","backup.error.marker_control_missing":"Une lumière liée au plan est absente de la sauvegarde.","backup.error.marker_control_not_light":"Une cible liée au plan n’est plus marquée comme source lumineuse.","backup.error.marker_control_self":"Une source lumineuse ne peut pas se contrôler elle-même.","backup.error.marker_control_cycle":"La sauvegarde contient une chaîne circulaire de contrôles de lumière.","backup.error.duplicate_marker_control":"La sauvegarde contient un lien de lumière du plan en doublon.","backup.error.no_backup":"Aucun instantané d’importation ou d’optimisation n’est disponible à restaurer.","backup.error.in_use":"L'élément est encore utilisé","backup.error.invalid_data":"La requête contient des données invalides","backup.error.invalid_light_entity":"La lumière principale doit être une entité light.* ou switch.*","backup.error.invalid_marker_control":"Référence de contrôle de marqueur invalide","backup.error.invalid_name":"Le nom est invalide","backup.error.invalid_partition_opening_host":"L'ouverture doit conserver sa cloison porteuse","backup.error.invalid_partition_opening_jamb_margin":"L'ouverture ne laisse aucun jambage physique au bout du mur","backup.error.invalid_passage_fields":"Un passage ouvert ne peut pas porter de réglages de porte","backup.error.invalid_space_id":"Espace inconnu","backup.error.invalid_toggle_entity":"L'entité de bascule doit être light.* ou switch.*","backup.error.invalid_value_badge":"Réglages de badge de valeur invalides","backup.error.invalid_value_badge_attribute":"Attribut de badge de valeur invalide","backup.error.invalid_value_badge_position":"Position de badge de valeur invalide","backup.error.invalid_value_badge_source":"Source de badge de valeur invalide","backup.error.invalid_vacuum_map_route":"Vérifiez l'affectation des cartes du robot aux espaces.","backup.error.invalid_value_source":"Source de valeur invalide","backup.error.invalid_value_source_attribute":"Attribut de source de valeur invalide","backup.error.io_error":"Une opération de fichier a échoué sur le serveur","backup.error.not_toggleable":"Cet appareil ne peut pas être basculé","backup.error.nothing_to_repair":"Rien à réparer","backup.error.space_in_use":"L'espace est encore référencé","backup.error.value_badge_source_required":"Le badge de valeur nécessite une source","backup.error.wall_model_client_outdated":"Le plan a été mis à jour ailleurs — rechargez la page","backup.same_source":"Créée sur cette instance Home Assistant","backup.foreign_source":"Créée sur une autre instance Home Assistant","backup.created":"Créée : {value}","backup.versions":"Carte {card} ; intégration {integration} ; modèle de données {model}","backup.count_spaces":"Espaces : {n}","backup.count_rooms":"Pièces : {n}","backup.count_walls":"Murs : {n}","backup.count_openings":"Ouvertures : {n}","backup.count_decor":"Objets décoratifs : {n}","backup.count_markers":"Appareils : {n}","backup.count_layout":"Positions : {n}","backup.bindings":"Associations — appareils : {device}, entités : {entity}, virtuels : {virtual} ; positions sans espace : {legacy}","backup.binding_status":"État des cibles — actives : {active}, désactivées : {disabled}, manquantes : {missing}","backup.missing_areas":"Zones absentes sur la cible : {areas}","backup.dropped_marker_links":"Liens de lumières du plan hors de cet espace transféré omis : {n}.","backup.room_drafts_migrated":"Anciens contours inachevés convertis en murs ordinaires : {drafts} ; segments : {segments}.","backup.repaired_target_refs":"Références existantes restaurées par cet import d’espace : {n}.","backup.preserved_unresolved_refs":"Références qui n’ont pas pu être restaurées sans ambiguïté conservées : {n}.","backup.preserved_unresolved_hint":"Aucune donnée n’a été devinée ni supprimée. Après l’importation, lancez « Optimiser les plans » pour examiner les références restantes.","backup.import_details":"Détails des références d’importation","backup.import_detail.incoming_remapped":"Références mises à jour dans la copie importée : {n}","backup.import_detail.target_repaired":"Références existantes restaurées : {n}","backup.import_detail.preserved_unresolved":"Références non résolues conservées : {n}","backup.import_detail.collisions":"Conflits de destination conservés en toute sécurité : {n}","backup.import_detail.dropped_links":"Liens entrants omis selon les règles de transfert : {n}","backup.import_detail.bounded_lineages":"Identifiants trop imbriqués maintenus dans les limites : {n}","backup.replace_warning":"Cela remplace la configuration et la disposition actuelles. Les fichiers importés ne sont jamais supprimés. Une seule annulation reste disponible jusqu’à la prochaine modification du plan.","backup.foreign_bookkeeping":"Les données de suivi des appareils connus/nouveaux propres à l’instance ne seront pas importées.","backup.final_name":"Nom du nouvel espace","backup.target_settings":"Les paramètres généraux de l’instance cible restent inchangés.","backup.duplicates":"Associations déjà présentes : {n}","backup.skip":"Ignorer les appareils en doublon","backup.virtual_copy":"Ajouter des copies virtuelles statiques sûres","backup.content":"Contenu référencé","backup.decor_images_summary":"Images personnalisées : {objects} objets, {assets} fichiers ; fichiers absents : {missing}.","backup.content_available":"disponible localement","backup.content_external":"lien externe","backup.content_detach_required":"sera dissocié","backup.confirm_detach":"Je comprends que les plans internes et pièces jointes indisponibles seront dissociés de la configuration importée.","backup.confirm_missing_images":"Je comprends que les images personnalisées absentes resteront des espaces réservés réparables et que les autres fichiers locaux indisponibles seront dissociés.","backup.replace":"Remplacer","backup.add":"Ajouter un espace","backup.space_done":"Espace importé : {rooms} pièces, {markers} appareils, {refs} références existantes restaurées","backup.full_done":"Sauvegarde restaurée : {spaces} espaces, {rooms} pièces, {markers} appareils","backup.undo_import":"Annuler la dernière importation complète","backup.import_undone":"Importation complète annulée","backdrop.large_title":"Grande image","backdrop.large_body":"Cette image fait {w}×{h} (fichier de {fileMb} Mo) et nécessite environ {decodedMb} Mo de mémoire pour s'afficher. Sur tablette, cela peut faire planter la page.","backdrop.unknown_body":"Les dimensions de l'image n'ont pas pu être lues — le fichier est peut-être endommagé. Continuer peut faire planter la page sur tablette.","backdrop.reduced_dimensions":"Copie réduite : {w}×{h} px.","backdrop.use_downscaled":"Téléverser une copie réduite","backdrop.reducing":"Réduction…","backdrop.keep_original":"Conserver l'original","backdrop.too_large_title":"Image trop grande","backdrop.too_large_body":"Cette image dépasse ce que les navigateurs peuvent afficher ({w}×{h}, limite {limit} px par côté). Réduisez-la dans un éditeur de bureau puis téléversez-la à nouveau.","backdrop.downscale_failed":"Impossible de créer la copie réduite. Le plan actuel n'a pas été modifié."};const r="34d1dbfc181acaf58842dfced0e6aa3a899aef6b8d1eeba53732ef729a63137e";export{e as dictionary,r as fingerprint};
+globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="4da0d706a85c3f1c08ab6de960deb5feb08baaf9055265234e7bd1b554332653";var e={"editor.context_actions":"Actions : {object}","editor.tool_options":"Options de l’outil : {tool}","editor.palette":"Palette : {tool}","editor.open_group":"Groupe d’outils : {group}","editor.group_active":"{group} — actif : {item}","editor.disabled_action":"{action} est indisponible : {reason}","editor.loading":"Chargement de l'éditeur…","editor.loading_aria":"L'éditeur de plan est en cours de chargement","editor.load_failed":"Impossible de charger l'éditeur.","editor.refresh_advice":"Actualisez la page et réessayez.","editor.retry_advice":"Vérifiez votre connexion et appuyez à nouveau.","version_mismatch.title":"Les versions de House Plan ne correspondent pas","version_mismatch.body":"Si Home Assistant redémarre encore, attendez la fin, puis rechargez cette page.","version_mismatch.frontend":"Carte","version_mismatch.backend":"Intégration","version_mismatch.reload":"Recharger la page","color_picker.title":"Sélecteur de couleur","color_picker.hue":"Teinte","color_picker.saturation":"Saturation","color_picker.value":"Luminosité","color_picker.hex":"Couleur hexadécimale","color_picker.invalid_hex":"Saisissez une couleur hexadécimale à 3 ou 6 chiffres","color_picker.confirm":"OK","btn.properties":"Propriétés","btn.keep_as_walls":"Conserver comme murs","btn.delete_room_keep_walls":"Supprimer la pièce, conserver les murs","btn.delete_room_with_walls":"Supprimer la pièce et les murs","title.markup_select":"Sélectionner et modifier les murs et les colonnes","title.markup_column":"Colonne : cliquez sur un point de la grille pour placer une colonne carrée","markup.partition":"Cloison","markup.column":"Colonne","markup.hint_column":"cliquez sur un point de la grille pour placer une colonne carrée","history.wall_segment":"Ajouter un segment de mur","history.column_add":"Ajouter une colonne","history.physical_edit":"Modifier l’objet physique","history.physical_delete":"Supprimer l’objet physique","history.physical_move":"Déplacer l’objet physique","history.wall_face_batch":"Créer des pièces à partir des murs","toast.column_duplicate":"Une colonne avec le même centre et la même dimension extérieure existe déjà","physical.partition_properties":"Propriétés de la cloison","physical.column_properties":"Propriétés de la colonne","physical.shape":"Forme","physical.square":"Carré","physical.circle":"Cercle","physical.diameter":"Diamètre","physical.side":"Côté","physical.rotation":"Angle de rotation","physical.length":"Longueur","physical.allowed_range":"Autorisé : {min}–{max} {unit}","physical.column_size_title":"Côté extérieur de la colonne carrée placée par le clic (1–150 cm).","card.title":"Plan de la maison","count.devices":"{n} app.","empty.no_spaces":"Aucun espace pour le moment.","nav.spaces":"Espaces House Plan","empty.add_first":"Ajoutez le premier espace et importez un plan.","empty.read_only":"Aucun espace n’est configuré. Demandez à un administrateur d’en ajouter un.","empty.install":"Installez l’intégration House Plan et ajoutez-la dans « Appareils et services ».","btn.add_space":"Ajouter un espace","btn.cancel":"Annuler","btn.save":"Enregistrer","btn.close":"Fermer","btn.delete":"Supprimer","btn.copy":"Copier","btn.edit":"Modifier","btn.open_in_ha":"Ouvrir dans HA","btn.reset":"Réinitialiser","btn.attach":"Joindre…","btn.upload":"Importer…","btn.replace":"Remplacer…","title.zoom_in":"Zoomer","title.zoom_out":"Dézoomer","title.zoom_fit":"Tout ajuster","title.configure_space":"Configurer l’espace","title.add_space":"Ajouter un espace","title.markup_add":"Murs : tracez une chaîne continue ; chaque segment accepté est enregistré séparément. Maj verrouille à 45°","title.markup_merge":"Fusionner : cliquez sur une pièce, puis sur la pièce voisine avec laquelle elle partage un mur","title.markup_split":"Diviser une pièce : cliquez sur la pièce, puis sur deux points de ses murs","title.markup_delroom":"Supprimer une pièce : cliquez à l’intérieur de la pièce puis confirmez","title.need_plan":"Importer une image de plan","markup.add":"Murs","markup.merge":"Fusionner","markup.split":"Diviser","markup.resize":"Redimensionner","title.markup_resize":"Redimensionner les pièces : faites glisser une poignée disponible sur un mur horizontal ou vertical","markup.hint_resize":"faites glisser une poignée de mur disponible · le mur s’arrête à la première position non sûre · Échap annule · Ctrl+Z — annuler","resize.disabled.diagonal":"Ce mur est incliné ; le redimensionnement ne prend en charge que les murs horizontaux et verticaux","resize.disabled.side-angle":"Un mur adjacent est incliné ; le redimensionnement exige que les deux murs adjacents rencontrent ce mur à angle droit","resize.disabled.duplicate-physical-wall":"Une cloison distincte ou une colonne chevauche ce mur ; supprimez-la ou déplacez-la avant de redimensionner","resize.disabled.partial-shared":"Une pièce voisine n’utilise qu’une partie de ce mur ; il ne peut donc pas être déplacé en toute sécurité comme un mur partagé unique","resize.disabled.unequal-shared":"La pièce voisine utilise des extrémités ou une longueur de mur différentes ; les murs ne peuvent donc pas être déplacés ensemble en toute sécurité","resize.disabled.multiple-rooms":"Déplacer ce mur affecterait plus de deux pièces","resize.disabled.thickness-conflict":"L’épaisseur du mur ne peut pas être conservée en toute sécurité","resize.disabled.opening-conflict":"Une ouverture sur ce mur ne peut pas être déplacée en toute sécurité","resize.disabled.invalid-geometry":"Ce mur ne peut pas être redimensionné sans modifier la structure du plan","resize.limit_stopped":"Mur arrêté : l'étape suivante enfreindrait une limite de jonction","resize.commit_failed":"Le redimensionnement a été annulé car le plan final n’a pas passé le contrôle de géométrie","resize.preview_failed":"Le redimensionnement s’est arrêté à la dernière position sûre car la géométrie du plan ne pouvait pas être préservée","markup.opening":"Ouverture","markup.delete_room":"Supprimer la pièce","history.undo":"Annuler","history.redo":"Rétablir","history.undo_named":"Annuler : {name} (Ctrl+Z)","history.redo_named":"Rétablir : {name} (Ctrl+Maj+Z / Ctrl+Y)","history.undo_empty":"Rien à annuler","history.redo_empty":"Rien à rétablir","history.undone":"Annulé : {name}","history.redone":"Rétabli : {name}","history.add_room":"Créer une pièce","history.split_room":"Diviser la pièce","history.merge_rooms":"Fusionner les pièces","history.resize_room":"Redimensionner la pièce","history.wall_thickness":"Modifier l’épaisseur du mur","history.add_opening":"Ajouter une ouverture de porte ou de fenêtre","history.edit_opening":"Modifier l’ouverture","history.move_opening":"Déplacer l’ouverture","history.delete_opening":"Supprimer l’ouverture","history.delete_room_keep_walls":"Supprimer la pièce, conserver les murs","history.delete_room_with_walls":"Supprimer la pièce et les murs","history.decor_add":"Ajouter un objet décoratif","history.decor_edit":"Modifier l’objet décoratif","history.decor_move":"Déplacer l’objet décoratif","history.decor_transform":"Transformer l’objet décoratif","history.decor_delete":"Supprimer l’objet décoratif","history.backdrop_transform":"Transformer l’arrière-plan du plan","history.device_move":"Déplacer {name}","history.device_stale":"L’historique des positions n’est plus applicable et a été effacé","opening.new":"Nouvelle ouverture","opening.edit":"Ouverture","opening.door":"Porte","opening.window":"Fenêtre","opening.gate":"Portail","opening.passage":"Passage ouvert","opening.passage_binding_warning":"L’enregistrement supprimera le capteur d’ouverture/fermeture et la serrure.","opening.invalid_passage_fields":"Le passage ouvert du plan « {room} » possède des paramètres non pris en charge : {fields}.","opening.type_label":"Type","opening.length_label":"Longueur, cm","opening.contact_label":"Capteur d’ouverture/fermeture","opening.lock_label":"Serrure","opening.none":"— aucun —","opening.search_ph":"Rechercher : nom ou ID d’entité…","opening.invert":"Inverser ouvert/fermé","opening.flip_h":"Charnière sur l’autre montant","opening.flip_v":"Ouverture de l’autre côté","opening.open":"Ouvert","opening.closed":"Fermé","opening.locked":"Verrouillé","opening.unlocked":"Déverrouillé","opening.state_unknown":"indisponible","opening.no_entities":"Aucun capteur associé — symbole statique sur le plan.","toast.opening_no_wall":"Cliquez près d’un mur de pièce ou d’un mur indépendant","opening.host_partition":"Mur indépendant","opening.partition_orphan":"Le mur indépendant de cette ouverture n’existe plus","opening.partition_jamb_margin":"Laissez au moins {distance} entre l’ouverture et l’extrémité du mur","opening.rebind_partition":"Associer à un autre mur indépendant","confirm.delete_partition_openings_title":"Supprimer le mur et les ouvertures ?","confirm.delete_partition_openings_body":"Ce mur contient {count} ouverture(s). Elles seront supprimées avec lui.","confirm.delete_partition_openings_item":"• {type}, {length}","markup.hint_points":"points : {n} · Maj — pas de 45° · Échap — terminer la chaîne · Ctrl+Z — annuler un point · fermer une zone propose de créer une pièce","markup.hint_start":"cliquez sur un point de la grille pour commencer une chaîne de murs","tip.lqi":"signal Zigbee moyen :","tip.area":"surface : {value}","info.device_header":"Appareil sur le plan","info.model":"Modèle","info.state":"État","info.link":"Lien","info.manuals":"Manuels","info.none":"Aucune information supplémentaire","marker.new_device":"Nouvel appareil","marker.name_label":"Nom (affiché sur le plan)","marker.name_ph":"Nom","marker.binding_label":"Associer à un appareil HA","marker.binding_disabled":"désactivé dans Home Assistant","marker.virtual_option":"Appareil virtuel (sans association)","marker.search_ph":"Rechercher un appareil / groupe…","marker.nothing_found":"aucun résultat","marker.room_label":"Pièce","marker.room_override":" (placement forcé)","marker.room_choose":"— sélectionner une pièce —","marker.room_auto":"— selon la zone de l’appareil (auto) —","marker.icon_label":"Icône","marker.icon_ph":"mdi:… (vide = auto)","marker.display_label":"Affichage","display.badge":"Icône + état","display.icon_ripple":"Icône + état et activité","display.static_icon":"Icône toujours statique","display.value_static_icon":"Valeur + icône statique","marker.display_hint_badge":"L’icône et le fond dynamique affichent l’état de l’appareil sans la pulsation d’activité habituelle. Les alarmes rouges restent visibles.","marker.display_hint_icon_ripple":"L’icône, le fond dynamique et la pulsation affichent une brève animation pour les événements et une animation continue pour le fonctionnement, le mouvement ou la présence. Les alarmes rouges restent prioritaires.","marker.display_hint_value":"Une valeur Home Assistant sélectionnée ou résolue automatiquement remplace l’icône tandis que le fond continue d’indiquer l’état. Les alarmes rouges restent visibles.","marker.display_hint_static_icon":"Le contour adapté au thème et l’icône restent toujours identiques. L’état, l’activité, l’indisponibilité et les alarmes ne modifient pas l’apparence.","marker.display_hint_value_static_icon":"Le marqueur affiche la valeur choisie tandis que le contour reste adapté au thème. L’état, l’activité, l’indisponibilité et les alarmes ne modifient pas la couleur du marqueur.","marker.static_alarm_warning":"Cet appareil peut signaler des alarmes. L’affichage statique masque l’indication visuelle d’alarme du marqueur.","marker.preview.title":"Aperçu de l’affichage","marker.preview.actual":"Actuel","marker.preview.example":"Exemple","marker.preview.integration":"Fourni par","marker.preview.source":"Source d’affichage","marker.preview.current_state":"État actuel","marker.preview.result":"Sur le plan","marker.preview.details":"Détails de la source","marker.preview.select_source":"Choisissez un appareil ou une entité Home Assistant pour voir son affichage réel.","marker.preview.unknown_provider":"Intégration inconnue","marker.preview.virtual_provider":"House Plan · appareil virtuel","marker.preview.no_source":"Aucune source active","marker.preview.no_state":"Aucun état actuel","marker.preview.mixed_states":"Plusieurs états différents","marker.preview.multiple_sources":"{n} sources","marker.preview.more_sources":"+{n} de plus","marker.preview.scaled":"L’aperçu est redimensionné à {n}% pour tenir dans la zone. La taille enregistrée reste inchangée.","marker.preview.demo_short":"Afficher une activité brève","marker.preview.demo_continuous":"Afficher une activité continue","marker.preview.stop_continuous":"Arrêter l’activité continue","marker.preview.demo_short_notice":"Exemple d’activité brève ; l’état réel de l’appareil reste inchangé.","marker.preview.demo_continuous_notice":"Exemple d’activité continue ; l’état réel de l’appareil reste inchangé.","marker.preview.demo_already_visible":"L’état actuel affiche déjà un véritable effet d’activité ou d’alarme.","marker.preview.reduced_motion":"La réduction des animations est activée sur le système ; l’activité normale est donc affichée sous forme de point.","marker.preview.reason.neutral":"Fond sombre neutre","marker.preview.reason.working":"Fond jaune : l’appareil fonctionne actuellement","marker.preview.reason.working_activity":"Fond jaune et effet d’activité : l’appareil fonctionne actuellement","marker.preview.reason.open":"Fond orange : physiquement ouvert ou déverrouillé","marker.preview.reason.cover_icon_state":"Fond neutre ; l’entité de volet contrôle l’état et l’icône affichés","marker.preview.reason.presence":"Effet d’activité tant qu’une présence est détectée","marker.preview.reason.event":"Effet d’activité bref après un événement détecté","marker.preview.reason.transition":"Effet d’activité pendant que l’appareil se déplace ou change d’état","marker.preview.reason.media_neutral":"Les appareils multimédias restent sur un fond sombre neutre tant qu’ils sont disponibles","marker.preview.reason.unavailable":"Fond neutre atténué : indisponible ou éteint","marker.preview.reason.alarm":"Fond d’alarme rouge ; l’indication d’alarme est toujours affichée","marker.preview.reason.live_states_disabled":"Le style selon les états en direct est désactivé pour cette carte","marker.preview.reason.value_no_state":"Aucune valeur d’état exploitable ; l’icône est affichée à la place","marker.preview.reason.value_ambiguous_sources":"Plusieurs sources de valeur possibles ; l’icône est affichée à la place","marker.preview.reason.value_non_scalar":"La source n’a pas renvoyé de valeur simple ; l’icône est affichée à la place","marker.preview.reason.value_virtual":"Un appareil virtuel n’a aucune valeur Home Assistant ; l’icône est affichée à la place","marker.preview.reason.vacuum_live_plan_only":"La position et la trajectoire en direct de l’aspirateur ne sont disponibles que sur le plan complet","marker.preview.reason.hidden_design_preview":"L’appareil est masqué sur le plan ; cet aperçu de conception reste visible","marker.preview.reason.composite_power_source":"L’état provient de l’entité d’alimentation de l’appareil ; les interrupteurs auxiliaires sont ignorés","marker.preview.reason.activity_display_disabled":"Le mode d’affichage sélectionné n’affiche pas les effets d’activité habituels","marker.preview.reason.ha_disabled":"L’association Home Assistant est désactivée et sera masquée sur le plan","marker.preview.reason.orphaned":"L’association Home Assistant enregistrée est introuvable","marker.preview.reason.static_icon":"Mode statique : l’état de l’appareil ne modifie pas l’icône","marker.preview.reason.value_static_icon":"Mode statique avec valeur : l’état de l’appareil ne modifie pas la couleur du marqueur","marker.activity_color":"Couleur de la pulsation d’activité","marker.ripple_size":"Taille de la pulsation d’activité","marker.activity_alarm_note":"La couleur et la taille n’affectent que l’activité normale et ne modifient pas les alarmes rouges.","marker.pulse_a11y_alarm":"Alarme","marker.pulse_a11y_event":"Événement récent","marker.pulse_a11y_presence":"Présence détectée","marker.pulse_a11y_transition":"Changement d’état","marker.pulse_a11y_running":"En fonctionnement","marker.state_a11y_neutral":"État par défaut","marker.state_a11y_working":"En fonctionnement","marker.state_a11y_open":"Ouvert","marker.state_a11y_locked":"Verrouillé","marker.state_a11y_unlocked":"Déverrouillé","marker.state_a11y_alarm":"Alarme","marker.state_a11y_unavailable":"Indisponible","marker.lqi_a11y_low":"LQI {value}, signal faible","marker.lqi_a11y_mid":"LQI {value}, signal moyen","marker.lqi_a11y_high":"LQI {value}, signal fort","marker.size_label":"Taille / rotation de l’icône","marker.angle_label":"Rotation","marker.model_label":"Modèle","marker.model_ph":"ex. Aqara T&H","marker.link_label":"Lien","marker.desc_label":"Description","marker.desc_ph":"Notes, caractéristiques…","marker.manuals_label":"Manuels (PDF, etc.)","marker.sub_device":"appareil","marker.sub_z2m_group":" · groupe Z2M","marker.sub_group":"groupe","marker.sub_helper":"assistant","space.new":"Nouvel espace","space.copy_title":"Copier l’espace","space.copy_name":"Nom du nouvel espace","space.copy_fallback":"Espace","space.copy_create":"Créer la copie","space.copy_optimize_title":"Optimiser avant de copier ?","space.copy_optimize_body":"Avant de créer « {name} », House Plan doit optimiser tout le plan, y compris les autres espaces. Continuer ?","space.copy_optimize_confirm":"Optimiser et copier","space.copy_error_changed":"Le plan a changé pendant la confirmation. Vérifiez-le et réessayez.","space.copy_error_source_missing":"L’espace source n’existe plus. Rouvrez ses réglages et réessayez.","space.copy_error_source_invalid":"House Plan n’a pas pu valider tous les murs de cet espace. Corrigez l’espace source.","space.copy_error_spaces_limit":"House Plan contient déjà le nombre maximal d’espaces.","space.copy_error_partitions_limit":"Cet espace contient trop de murs pour être copié.","space.copy_error_openings_limit":"Cet espace contient trop d’ouvertures pour être copié.","space.copy_error_decor_limit":"Cet espace contient trop d’objets d’arrière-plan pour être copié.","space.copy_error_columns_limit":"Cet espace contient trop de colonnes pour être copié.","space.copy_error_opening_host":"Une ouverture n’est plus rattachée à un mur. Corrigez-la ou supprimez-la avant la copie.","space.copy_error_geometry":"La copie créerait une géométrie de murs non sûre. Corrigez l’espace source.","space.copy_error_optimize_geometry":"La copie est arrêtée car l’optimisation de tout le plan n’est pas sûre pour un espace.","space.header":"Espace","space.title_label":"Titre","space.title_ph":"ex. Garage","space.plan_label":"Plan (arrière-plan)","space.no_plan":"aucune image de plan","space.plan_alt":"plan","room.new":"Nouvelle pièce","room.name_label":"Nom affiché","room.name_ph":"ex. Terrasse","room.area_label":"Zone Home Assistant (non attribuée)","room.no_area_option":"— aucune zone —","room.default_name":"Pièce","device.unnamed":"sans nom","device.light_group":"groupe de lumières","device.fallback":"appareil","device.virtual":"appareil virtuel","confirm.delete_room_title":"Supprimer la pièce « {name} » ?","confirm.delete_room_body":"Choisissez si les murs physiques propres à la pièce doivent être conservés. Les murs partagés avec une autre pièce sont toujours conservés.","confirm.remove_marker_title":"Supprimer l’appareil du plan ?","confirm.remove_marker_body":"L’appareil disparaîtra complètement et ne contribuera plus aux données du plan. Vous pourrez l’ajouter de nouveau plus tard.","confirm.erase_decor":"Effacer l’objet {kind} ? Vous pouvez annuler cette action depuis l’historique de l’éditeur.","confirm.delete_space_title":"Supprimer l’espace ?","confirm.delete_space_body":"L’espace, toutes ses pièces et tout le tracé du plan seront supprimés.","confirm.delete_space_vac_routes":"Les affectations de cartes de robots seront aussi supprimées : {count}.","space.delete_blocked":"Cet espace est encore utilisé par {n} appareil(s). Déplacez-les vers un autre espace ou supprimez-les d’abord.","toast.pos_save_failed":"Échec de l’enregistrement de la position : {err}","toast.no_entity":"L’appareil n’a aucune entité adaptée","toast.ha_disabled_action":"Un objet Home Assistant désactivé ne peut pas être utilisé sur le plan.","toast.ha_disabled_show_device":"Un appareil désactivé dans Home Assistant ne peut pas être affiché sur le plan. Activez-le d’abord dans Home Assistant.","toast.ha_disabled_show_entity":"Une entité désactivée dans Home Assistant ne peut pas être affichée sur le plan. Activez-la d’abord dans Home Assistant.","toast.ha_disabled_add":"Un objet Home Assistant désactivé ne peut pas être ajouté au plan. Activez-le d’abord dans Home Assistant.","toast.ha_binding_unverified":"L’état de l’objet n’a pas pu être vérifié via le registre Home Assistant. L’affichage et les actions sont temporairement indisponibles.","toast.markup_needs_server":"Le tracé est disponible une fois la configuration déplacée sur le serveur","toast.space_order_changed":"L’ordre a changé. Si une carte fixe son étage par numéro, vérifiez ces tableaux de bord.","toast.conflict":"La configuration a été modifiée dans une autre fenêtre — données actualisées, répétez votre dernière action","toast.cfg_save_failed":"Échec de l’enregistrement de la configuration : {err}","toast.room_overlap":"Le contour chevauche la pièce « {name} » — les pièces ne doivent pas se chevaucher","toast.contour_cannot_close":"Le contour ne peut pas être fermé car il est dégénéré ou s’auto-intersecte","toast.merge_not_adjacent":"Seules les pièces partageant un mur peuvent être fusionnées","toast.rooms_merged":"Pièces fusionnées dans « {name} »","toast.split_pick_wall":"Commencez la découpe sur le mur de la pièce","toast.split_bad_cut":"La découpe doit aller d’un mur à l’autre à l’intérieur de la pièce, sans croiser de mur ni se croiser elle-même","merge.header":"Fusionner les pièces","merge.hint":"La pièce fusionnée conserve un nom et une zone. L’autre zone est libérée — ses appareils quittent le plan jusqu’à ce qu’une autre pièce la récupère.","merge.keep":"Conserver","merge.no_area":"aucune zone","toast.room_saved":"Pièce enregistrée ({n}). Appareils ajoutés : {added}. Tracez la suivante ou quittez le mode tracé.","toast.room_saved_no_area":"Pièce enregistrée ({n}, sans zone). Tracez la suivante ou quittez le mode tracé.","toast.marker_needs_server":"La modification des appareils est disponible une fois la configuration déplacée sur le serveur","toast.virtual_name_required":"Saisissez un nom pour l’appareil virtuel","toast.marker_saved":"Appareil enregistré","toast.marker_removed":"Appareil supprimé du plan","toast.integration_missing":"L’intégration House Plan n’est pas installée — gestion indisponible","toast.plan_formats":"Formats pris en charge : SVG, PNG, JPG, WebP","toast.plan_required":"Importez un plan — il est obligatoire","toast.space_added_onboard":"Espace ajouté. Tracez les pièces : cliquez sur les points de la grille et fermez le contour.","toast.space_added":"Espace ajouté","toast.space_copied":"Espace « {name} » créé","toast.space_saved":"Espace enregistré","toast.space_deleted":"Espace supprimé","toast.delete_failed":"Échec de la suppression : {err}","toast.error":"Erreur : {err}","toast.toggle_target_unavailable":"La cible « {name} » est indisponible — aucune action n’a été effectuée","toast.toggle_targets_unavailable":"Cibles indisponibles : {names}. Aucune action n’a été effectuée","toast.file_failed":"Le fichier « {name} » n’a pas été importé : {err}","toast.files_attached":"Fichiers joints : {n}","err.unknown":"erreur inconnue","err.code":"code {code}","err.too_large":"fichier supérieur à {mb} Mo","err.bad_ext":"type non pris en charge (PDF/image attendu)","err.unauthorized":"droits administrateur requis","editor.title":"Titre","editor.default_floor":"Espace initial","editor.default_floor_missing":"L’espace initial « {id} » n’existe plus. Choisissez un autre espace.","editor.floor":"Espace fixe","editor.floor_none":"— non fixé —","editor.floor_index":"Index YAML {index} (conservé)","fixed_floor.loading":"Chargement de l’espace fixe…","fixed_floor.invalid_title":"L’espace fixe est indisponible","fixed_floor.invalid_body":"Vérifiez floor dans la configuration de la carte. Valeur configurée : {value}","editor.icon_size":"Taille des icônes, % de la largeur du plan","editor.show_temperature":"Afficher la température","editor.live_states":"États en direct (on/off, ouvert…)","editor.light_pools":"Halos lumineux et ombres des murs","editor.show_signal":"Afficher le signal Zigbee (LQI)","editor.language":"Langue de l’interface","editor.lang_auto":"Auto (profil HA)","title.icon_rules":"Règles d’icônes : quelle icône MDI attribuer aux appareils selon leur nom","rules.title":"Règles d’icônes","rules.hint":"Les règles sont testées de haut en bas sur « nom de l’appareil + modèle » (expression régulière insensible à la casse) ; la première correspondance gagne. Si rien ne correspond, la classe d’appareil de l’entité est utilisée, puis l’icône générique.","rules.pattern_ph":"regex, ex. plug|socket","rules.icon_ph":"mdi:power-socket-de","rules.add":"Ajouter une règle","rules.reset":"Réinitialiser par défaut","rules.test_ph":"Tester un nom d’appareil…","rules.invalid":"expression régulière invalide","rules.saved":"Règles d’icônes enregistrées","btn.up":"Monter","btn.down":"Descendre","tap.info":"Fiche de l’appareil","tap.more_info":"Boîte de dialogue Plus d’infos de HA","tap.toggle":"Basculer l’état","marker.tap_label":"Action au toucher pour cet appareil","tap.toggle_note":"L’état déterminé est affiché ci-dessous. Les appareils sécurisés ne sont jamais basculés depuis le plan.","import.title":"Créer des espaces à partir des étages HA","import.hint":"Votre Home Assistant connaît déjà ces étages. Sélectionnez ceux à transformer en espaces du plan — vous importerez ensuite une image de plan pour chacun. Les pièces sont ensuite tracées manuellement sur le plan.","import.start":"Créer {n} espace(s)","import.manual":"Commencer de zéro","import.progress":"Étage {i} sur {n}","import.done":"Espaces créés. Tracez les pièces : cliquez sur les points de la grille et fermez le contour.","btn.skip":"Passer","space.scale_label":"Échelle (taille d’une cellule de grille)","space.cell_cm.help":"Relie la grille aux dimensions réelles : les longueurs, les surfaces, l’épaisseur des murs, la taille des ouvertures et le rayon du halo en dépendent. Une modification ultérieure change les dimensions calculées de tout l’espace sans déplacer ses points sur le plan.","space.cell_cm.help.aria":"Aide : échelle de l’espace","space.scale_unit":"cm par cellule","space.scale_unit_imperial":"po par cellule","space.display_section":"Affichage","space.show_borders":"Toujours afficher les contours des pièces","space.zero_wall_style":"Murs d’épaisseur nulle","space.zero_wall_style.help":"Les murs d’épaisseur nulle en pointillés laissent passer le halo et les rayons du soleil, tandis que les murs pleins les bloquent comme une barrière sans surface. Ce choix s’applique à tous ces murs de l’espace, même si leur ligne est masquée en mode Vue.","space.zero_wall_style.help.aria":"Aide : style des murs d’épaisseur nulle","space.zero_wall_dashed":"Pointillés","space.zero_wall_solid":"Plein","space.show_names":"Afficher les noms des pièces (faire glisser pour déplacer)","space.room_color":"Couleur du contour et du nom","space.opacity":"Opacité","space.fill_label":"Remplissage de la pièce","space.fill_mode.help":"« Couleur personnalisée » définit le style, tandis que « Lumière », « Température » et « LQI » utilisent les données actuelles de Home Assistant. Le halo s’active séparément.","space.fill_mode.help.aria":"Aide : mode de remplissage des pièces","fill.none":"Aucun","fill.lqi":"Signal Zigbee","fill.light":"Lumières","fill.custom":"Couleur personnalisée","space.custom_fill":"Couleur de remplissage","space.source_file":"J’ai une image de plan","space.source_draw":"Aucune image — je tracerai les pièces à la main","fill.temp":"Température","tip.temp_avg":"température moyenne :","tip.hum_avg":"humidité moyenne :","space_card.button":"Ouvrir le plan de l’espace","space_card.not_found":"Espace « {id} » introuvable","space_card.loading":"Chargement…","continuity.restore_plan":"Restauration du plan…","continuity.restore_connection":"Restauration de la connexion aux appareils…","continuity.retry":"Réessayer","editor.space":"Espace","editor.framing":"Cadrage","editor.fit_content":"Tout le contenu visible","editor.fit_house":"Ajusté à la géométrie de la maison","editor.show_button":"Afficher le bouton","editor.button_label":"Libellé du bouton","editor.button_target":"Chemin du tableau de bord cible","marker.sub_entity":"entité","title.general_settings":"Paramètres généraux","title.export_pdf":"Enregistrer en PDF","pdf.title":"Enregistrement en PDF","pdf.dimensions":"Afficher les dimensions et les surfaces","pdf.decor":"Afficher les meubles et les autres éléments","pdf.room_names":"Afficher les noms des pièces","pdf.backdrop":"Afficher le fond de plan","pdf.save":"Enregistrer","pdf.saving":"Création…","pdf.failed":"Impossible de créer le PDF.","pdf.too_large":"Les images dépassent la limite PDF de 25 Mo.","pdf.asset_failed":"Impossible de charger une image de fond ou de décoration.","pdf.scale":"Échelle 1:{n}","pdf.north":"Nord","gs.title":"Paramètres généraux","gs.light_group":"Remplissage : lumières","gs.light_on":"Lumières allumées","gs.light_off":"Toutes les lumières éteintes","gs.temp_group":"Remplissage : température","gs.temp_cold":"Froid","gs.temp_ok":"Confortable","gs.temp_hot":"Chaud","gs.lqi_group":"Remplissage : signal Zigbee","gs.lqi_low":"Signal faible","gs.lqi_high":"Signal fort","gs.reset":"Réinitialiser par défaut","gs.saved":"Paramètres généraux enregistrés","gs.radar_show_live":"Afficher la présence en direct sur le plan","gs.radar_show_live_hint":"Masque ou affiche toutes les cibles radar en direct. Cela ne démarre ni n’arrête l’enregistrement des observations.","radar.title":"Présence sur le plan","radar.help":"Reliez ce marqueur aux entités radar exactes de Home Assistant, placez le capteur et choisissez son profil de coordonnées. Les positions en direct sont limitées à la pièce sélectionnée.","radar.help.aria":"Aide : paramètres du radar de présence","radar.enabled":"Utiliser ce radar de présence","radar.show_live":"Afficher les cibles en direct","radar.configure":"Configurer le radar","radar.configure_on_plan":"Configurer sur le plan","radar.change_installation":"Changer l’installation","radar.no_contour":"Cette pièce n’a pas de contour. Les points radar ne seront pas limités.","radar.discard_setup_title":"Abandonner la configuration du radar ?","radar.discard_setup":"La configuration du radar non enregistrée sera perdue.","radar.step_place_mount":"Indiquez la position physique du capteur","radar.step_place_heading":"Indiquez un point droit devant le capteur","radar.step_reference":"Indiquez la position de référence {n}, puis lancez la mesure","radar.step_check_reference":"Indiquez une position de contrôle indépendante","radar.start_measure":"Lancer la mesure","radar.countdown":"Placez-vous sur le repère dans {seconds} s","radar.capturing":"Restez immobile et seul pendant la mesure…","radar.fit_ready":"Le calibrage est prêt","radar.check_third":"Vérifier à une autre position","radar.check_complete":"Contrôle indépendant terminé","radar.error_distance":"Écart de position : {distance}","radar.ambiguous_target":"Plusieurs cibles ont été signalées. Recommencez la mesure seul.","radar.insufficient_samples":"Coordonnées actuelles insuffisantes. Réessayez ou utilisez le réglage manuel.","radar.bad_references":"Choisissez des références espacées dans des directions différentes du capteur.","radar.ambiguous_sources":"Les mesures permettent deux directions également plausibles. Choisissez des repères distinguant la gauche de la droite.","radar.bad_fit":"Les mesures ne correspondent pas. Vérifiez les unités, la position du capteur et les références.","radar.desktop_hint":"Utilisez un ordinateur pour un réglage précis. L’édition sur appareils tactiles est prise en charge au mieux.","radar.detected":"House Plan a reconnu les métadonnées radar de cet appareil. Vérifiez les sources exactes avant d’enregistrer.","radar.detected_ld2450":"House Plan a trouvé un ensemble de coordonnées ESPHome LD2450. Vérifiez les sources X/Y exactes avant d’enregistrer.","radar.additional_actions":"Actions supplémentaires","radar.declare":"Ceci est un radar de présence","radar.profile":"Profil de données","radar.profile_esphome_ld2450_v1":"ESPHome LD2450 (cibles X/Y)","radar.profile_cartesian_v1":"Cibles cartésiennes (X/Y)","radar.profile_polar_v1":"Cible polaire (distance/angle)","radar.profile_range_v1":"Distance uniquement","radar.profile_zones_v1":"États des zones","radar.profile_presence_v1":"Présence uniquement","radar.room":"Pièce observée","radar.room_choose":"Choisir une pièce","radar.target":"Cible {n}","radar.axis_x":"Entité de coordonnée X","radar.axis_y":"Entité de coordonnée Y","radar.add_target":"Ajouter un emplacement de cible","radar.range_channel":"Canal de distance {n}","radar.add_range":"Ajouter un canal de distance","radar.presence_gate":"Entité de présence du canal","radar.swap_axes":"Permuter les axes X et Y","radar.axis_x_sign":"Direction X","radar.axis_y_sign":"Direction Y","radar.distance_source":"Entité de distance","radar.angle_source":"Entité d’angle","radar.angle_unit":"Unité d’angle","radar.degrees":"Degrés","radar.radians":"Radians","radar.angle_zero":"Direction de l’angle zéro","radar.angle_forward":"Vers l’avant","radar.angle_right":"Vers la droite","radar.angle_clockwise":"Les angles augmentent dans le sens horaire","radar.zone_source":"Entité de zone","radar.occupancy_source":"Entité de présence","radar.count_source":"Entité du nombre de cibles","radar.availability_source":"Entité de disponibilité","radar.source_choose":"Choisir une entité","radar.source_optional":"Facultatif","radar.source_missing":"actuellement indisponible","radar.saved_unsupported":"Cette configuration radar enregistrée est incomplète ou non prise en charge. Elle reste inactive ; supprimez-la ou mettez House Plan à jour avant de la reconfigurer.","radar.occupancy":"Présence (activée/désactivée)","radar.count":"Nombre","radar.mount":"Position et direction","radar.mount_hint":"Il s’agit de la position physique du capteur. Déplacer son marqueur décoratif ne la modifie pas.","radar.heading":"Direction, °","radar.range_cm":"Portée, cm","radar.fov_deg":"Champ de vision, °","radar.unit":"Unité de la source","radar.mirror":"Inverser l’axe gauche/droite","radar.remove":"Supprimer les paramètres radar","radar.invalid":"Renseignez la pièce, les sources et la position du radar avant d’enregistrer.","radar.check_sources":"Vérifier les données en direct","radar.checking":"Vérification…","radar.health":"État de la connexion","radar.live_summary":"Cibles actuelles : {targets} ; arcs de distance : {ranges}","radar.health_ok":"Données actuelles reçues","radar.health_off":"Aucune cible détectée","radar.health_stale":"Certaines coordonnées sont obsolètes","radar.health_partial":"Certaines sources sont à jour, d’autres sont obsolètes","radar.health_restricted":"L’accès à une ou plusieurs sources est limité","radar.health_incomplete":"Le rapport radar actuel est incomplet","radar.health_position_unavailable":"Présence signalée ; position actuelle indisponible","radar.health_unavailable":"Données du capteur indisponibles","radar.health_needs_setup":"L’installation doit être configurée","radar.health_inconsistent":"Les sources fournissent des valeurs contradictoires","radar.health_unknown":"L’état actuel est inconnu","radar.health_disabled":"Le radar est désactivé","radar.error_invalid_radar":"Vérifiez les paramètres radar.","radar.error_invalid_selection":"Sélectionnez une pièce existante et des sources valides.","radar.error_source_restricted":"Vous n’avez pas accès à toutes les sources sélectionnées.","radar.error_rate_limited":"Trop de demandes. Réessayez dans un instant.","radar.error_not_ready":"Le traitement radar n’est pas encore prêt.","radar.error_conflict":"Le plan a changé. Rouvrez la configuration radar et réessayez.","radar.error_source_unavailable":"Une ou plusieurs sources radar sélectionnées sont indisponibles.","radar.error_unsupported_capability":"Cette fonction radar n’est pas prise en charge par l’intégration installée.","radar.report_age":"il y a {seconds} s","space.show_lqi":"Afficher le signal Zigbee (LQI) à côté des appareils","space.hide_decor":"Masquer la couche décorative","space.hide_decor_tip":"Les lignes, formes, étiquettes et meubles restent à leur place — visibles dans l’éditeur d’arrière-plan, mais pas sur le plan.","space.hide_openings":"Masquer les ouvertures","space.hide_openings_tip":"Les symboles de portes, fenêtres et portails ne sont pas dessinés, mais les ouvertures continuent de fonctionner : la lumière les traverse, le soleil entre par les fenêtres et les capteurs de contact continuent de les ouvrir. L’éditeur de plan les affiche toujours.","gs.light_none":"Aucune source lumineuse","mode.plan":"Éditeur de plan","mode.devices":"Éditeur d’appareils","display.value":"Valeur + état","marker.subarea":"aucune zone, manuel","device.new":"Nouvel appareil — ouvrez son éditeur pour fermer","opening.unlock_action":"Déverrouiller","opening.lock_action":"Verrouiller","opening.lock_pending":"En cours…","title.close_editor":"Fermer l’éditeur (retour à la vue)","title.add_device":"Ajouter un appareil au plan","devbar.add":"Ajouter","devbar.rules":"Règles d’icônes","device_inbox.button":"Appareils","device_inbox.title":"Appareils sur le plan","device_inbox.search":"Rechercher appareils, entités et intégrations…","device_inbox.add_virtual":"Ajouter un appareil virtuel","device_inbox.tab_on_plan":"Sur le plan","device_inbox.tab_available":"Disponibles","device_inbox.tab_hidden":"Masqués","device_inbox.tab_readd":"De nouveau disponibles","device_inbox.only_new":"Nouveaux uniquement","device_inbox.show_entities":"Afficher les entités","device_inbox.show_hidden":"Afficher les masqués sur le plan","device_inbox.show_hidden.help":"Affiche temporairement les marqueurs masqués et désactivés sous forme de fantômes réservés à l’éditeur. La visibilité enregistrée des appareils ne change pas.","device_inbox.show_hidden.help.aria":"Aide : afficher les appareils masqués sur le plan","device_inbox.new":"Nouveau","device_inbox.find":"Trouver sur le plan","device_inbox.edit":"Modifier","device_inbox.hide":"Masquer","device_inbox.show":"Afficher","device_inbox.add":"Ajouter","device_inbox.readd":"Ajouter à nouveau","device_inbox.hide_available":"Masquer de la liste","device_inbox.show_more":"Afficher plus","device_inbox.more_actions":"Plus d'actions","device_inbox.find_hidden_hint":"Activez d'abord « Afficher les masqués sur le plan »","device_inbox.show_disabled":"Activez cette liaison dans Home Assistant avant de l'afficher","device_inbox.empty_on_plan":"Aucun appareil correspondant n'est encore sur le plan.","device_inbox.empty_available":"Aucun appareil disponible à ajouter.","device_inbox.empty_hidden":"Il n'y a aucun appareil masqué.","device_inbox.empty_readd":"Aucun appareil supprimé n'est disponible pour un nouvel ajout.","device_inbox.reason_visible_auto":"Découvert automatiquement","device_inbox.reason_visible_explicit":"Ajouté explicitement","device_inbox.reason_manual_hidden":"Masqué par l'utilisateur","device_inbox.reason_automatic_hidden":"Masqué automatiquement","device_inbox.reason_service_entry":"Entrée de registre de service uniquement","device_inbox.reason_excluded_integration":"Intégration « {integration} » exclue par les filtres de découverte","device_inbox.reason_excluded_domain":"Type d'entité non spatial","device_inbox.reason_grouped_light":"Représenté par un groupe de lumières de la pièce","device_inbox.reason_represented_by_parent":"Représenté par son appareil parent","device_inbox.reason_removed":"Précédemment retiré du plan","device_inbox.reason_available":"Disponible pour ajout au plan","device_inbox.reason_no_bound_room":"La zone HA n'est liée à aucune pièce du plan","device_inbox.status_ha_disabled":"Désactivé dans Home Assistant","device_inbox.status_orphaned":"La liaison n'existe plus dans Home Assistant","device_inbox.status_unverified":"Le registre Home Assistant est temporairement indisponible","device_inbox.saved":"Liste des appareils mise à jour","device_inbox.filters_excluded":"Intégrations exclues","device_inbox.filters_group_lights":"Regrouper les lumières de la pièce en un marqueur","device_inbox.filters_preview_appear":"apparaîtra : {count}","device_inbox.filters_preview_hide":"disparaîtra : {count}","device_inbox.filters_preview_lights":"lumières concernées : {count}","device_inbox.filters_reset":"Rétablir les recommandées","device_inbox.filters_save":"Enregistrer les filtres","device_inbox.filters_search_ph":"Ajouter une intégration…","device_inbox.filters_title":"Filtres de découverte","space.roomcard_section":"La carte de pièce affiche :","space.label_temp":"Température","space.label_hum":"Humidité","space.label_lqi":"Signal Zigbee moyen","space.label_light":"Lumières allumées/éteintes","roomcard.light_on":"Allumé","roomcard.light_off":"Éteint","roomcard.light_partial":"{on} sur {total}","toast.split_pick_inside":"Les points intermédiaires de découpe doivent se trouver à l’intérieur de la pièce","mode.decor":"Éditeur d’arrière-plan","decor.select":"Sélectionner","decor.line":"Ligne","decor.rect":"Rectangle","decor.ellipse":"Ovale","decor.text":"Texte","decor.erase":"Effacer","decor.erase_confirm_title":"Effacer l’objet ?","decor.color":"Couleur","decor.width":"Épaisseur de ligne","decor.line_style":"Style de ligne","decor.line_style_solid":"Plein","decor.line_style_dashed":"Pointillés","decor.fill":"Remplissage","decor.fill_color":"Couleur de remplissage","decor.length":"Longueur","decor.size":"Taille","decor.flip_h":"Retourner horizontalement","decor.flip_v":"Retourner verticalement","decor.angle":"Angle de rotation, °","decor.text_size":"Taille du texte","decor.backdrop_properties":"Propriétés de l’arrière-plan du plan","decor.text_title":"Étiquette de texte","decor.object_title":"Modifier {kind}","decor.text_label":"Texte","decor.live_group":"Insérer une variable HA","decor.live_entity":"Entité","decor.live_entity_ph":"choisir une entité","decor.live_attr":"Valeur","decor.live_attr_ph":"choisir l’état ou un attribut","decor.live_state":"État","decor.backdrop":"Image d’arrière-plan","decor.backdrop_hint":"Faites glisser pour déplacer ; tirez un coin pour redimensionner ; utilisez la poignée supérieure pour faire pivoter. Maj modifie les proportions ou libère l’angle.","decor.backdrop_reset":"Réinitialiser l’image","decor.backdrop_reset_done":"L’image a retrouvé sa position et sa taille d’origine","marker.icon_auto":"Auto : {icon} (selon les règles d’icônes ; choisissez-en une pour remplacer)","marker.icon_pin_auto":"Épingle","mode.plan_tip":"Éditeur de plan — la géométrie du logement : dessiner et diviser/fusionner les pièces, les associer aux zones HA, placer portes, fenêtres et portails, déplacer les cartes de pièces, régler l’échelle","mode.devices_tip":"Éditeur d’appareils — tout ce qui concerne les icônes : faire glisser pour positionner, cliquer pour modifier l’association/l’icône/l’affichage, ajouter des appareils virtuels, règles d’icônes","mode.decor_tip":"Éditeur d’arrière-plan — décoration purement visuelle sous le plan : lignes, rectangles, ovales et étiquettes de texte qui ne réagissent jamais aux clics","space.glow_enabled":"Halo des sources lumineuses","gs.glow_group":"Halo des sources lumineuses","gs.glow_base":"Obscurité de la maison","gs.glow_light":"Couleur / intensité de lumière par défaut","gs.wall_group":"Murs","gs.wall_fill":"Remplissage des murs","gs.glow_radius":"Rayon du halo","gs.glow_radius.help":"Définit le rayon général du halo en mètres ou en pieds ; le rayon propre à un appareil remplace cette valeur.","gs.glow_radius.help.aria":"Aide : rayon général du halo","gs.unit_m":"m","gs.unit_ft":"pi","marker.controls_label":"Contrôle d’autres sources lumineuses","marker.controls.help":"Avec l’action « Basculer l’état », les sources répertoriées basculent avec ce marqueur. Leur halo reste sur leurs propres marqueurs et ce lien ne transforme pas à lui seul le marqueur de contrôle en source lumineuse.","marker.controls.help.aria":"Aide : contrôler d’autres sources lumineuses","marker.controls_filter":"Rechercher des lumières et interrupteurs…","info.controls":"Contrôle","marker.glow_radius_label":"Rayon du halo","marker.glow_radius.help":"Définit le rayon du halo en mètres ou en pieds ; une valeur vide utilise le rayon des paramètres généraux.","marker.glow_radius.help.aria":"Aide : rayon du halo","markup.wallthick":"Épaisseur","markup.select":"Sélectionner","title.markup_wallthick":"Épaisseur — cliquez sur un mur pour définir son épaisseur de 0 à 100 cm.","markup.hint_wallthick":"cliquez sur un mur · Échap ferme sans appliquer","wallthick.field":"Épaisseur","wallthick.unit_cm":"cm","wallthick.unit_in":"po","wallthick.apply_room":"Appliquer à tous les murs de cette pièce","markup.draw_wall_title":"Épaisseur de chaque nouveau segment de mur (0–100 cm). Les murs partagés conservent la valeur existante.","room.queue_progress":"Pièce {current} sur {total}","toast.wall_rooms_saved":"Pièces créées : {n}","toast.wall_chain_saved":"Chaîne de murs enregistrée","toast.wallthick_pick":"Cliquez sur un mur","toast.wallthick_set":"Épaisseur du mur définie","toast.wallthick_cleared":"Épaisseur du mur supprimée","toast.physical_range":"Saisissez une valeur comprise entre {min} et {max} {unit}","toast.zero_wall_opening_conflict":"Supprimez d’abord l’ouverture sur ce segment de mur.","toast.zero_wall_ambiguous":"Le segment de mur est ambigu. Simplifiez ou ajustez la jonction.","toast.zero_wall_migration_blocked":"L’espace n’a pas été converti : {reason}. Aucune donnée n’a été modifiée.","toast.physical_angle":"Saisissez un angle de rotation compris entre 0° inclus et 90° exclu","toast.physical_limit":"L’espace a atteint la limite pour ce type de géométrie","toast.geometry_unsafe":"Modification annulée : la géométrie des murs n’a pas pu être construite en toute sécurité.","junction.limit_angle":"L'angle entre les murs est trop aigu : {actual}°, minimum {limit}°.","junction.limit_valence":"Trop de murs se rejoignent en un nœud : {actual}, maximum {limit}.","junction.limit_length":"Le segment de mur est trop court : {actual} cm, minimum {limit} cm.","junction.limit_distance":"Les murs et les nœuds sont trop proches : {actual} cm, minimum {limit} cm.","junction.limit_clearance":"Il ne reste plus d'intérieur de pièce : {actual} cm², minimum {limit} cm².","junction.limit_check_failed":"La vérification des jonctions n'a pas pu s'exécuter — la modification n'a pas été enregistrée","toast.wall_model_migration_blocked":"Le modèle de murs n’a pas pu être mis à jour : {reason}. Le plan n’a pas été modifié. Lancez « Optimiser les plans » ; si l’erreur se reproduit, corrigez la géométrie de mur conflictuelle.","toast.wall_model_client_outdated":"Mettez à jour la carte et rechargez la page avant de modifier le plan.","wall_model.reason.invalid-room":"contour de pièce invalide","wall_model.reason.zero-length":"segment de mur de longueur nulle","wall_model.reason.third-owner":"mur partagé par plus de deux pièces","wall_model.reason.duplicate-id":"identifiants de mur en conflit","wall_model.reason.thickness-conflict":"valeurs d’épaisseur de mur en conflit","wall_model.reason.opening-host":"l’ouverture ne peut pas être attribuée à un seul mur","toast.delete_room_pick":"Cliquez à l’intérieur de la pièce que vous souhaitez supprimer","toast.plan_snap_ambiguous":"Zoomez pour choisir le nœud du mur","toast.wall_repair_ambiguous":"Le contour de la pièce possède plusieurs connexions possibles. Zoomez et reliez-le explicitement.","toast.wall_repair_too_large":"L’écart dépasse 2 cm. Reliez les murs avant de créer la pièce.","toast.wall_repair_changed":"La géométrie des murs a changé. Essayez de créer de nouveau la pièce.","toast.opening_on_zero_wall":"Les ouvertures ne peuvent pas être placées sur un mur d’épaisseur nulle","marker.from_ha_option":"Choisir dans la liste HA","marker.show_entities":"Afficher les entités","marker.show_entities_tip":"Ajoute à la liste non seulement les appareils, mais aussi toutes leurs entités","marker.pick_ph":"Choisir un appareil…","room.open_area":"Ouvrir la zone HA","room.fit_action":"Ajuster la pièce {name}","view.volumetric":"Vue volumétrique","view.flat":"Vue plane","kiosk.title":"Tailles pour cet écran","kiosk.hint":"Enregistrées uniquement sur cet appareil — chaque tablette murale ou TV peut avoir ses propres tailles confortables.","kiosk.icon_scale":"Taille des icônes d’appareils","kiosk.font_scale":"Taille du texte des cartes de pièces","editor.kiosk":"Mode appareil mural (kiosque)","editor.cycle":"Changer automatiquement d’espace toutes les N secondes (kiosque, 0 = désactivé)","room.settings_title":"Paramètres de la pièce","room.settings_section":"Paramètres de la pièce (remplacent ceux de l’espace)","room.fill_label":"Remplissage de CETTE pièce","fill.inherit":"Comme l’espace","room.custom_fill_space":"Couleur de l’espace","room.custom_fill_own":"Couleur de la pièce","room.temp_range_label":"Plage de confort","room.temp_range_min":"Limite basse de température confortable","room.temp_range_max":"Limite haute de température confortable","room.temp_range_reset":"Comme l’espace","room.temp_range.help":"Cette plage s’applique uniquement à cette pièce. Un champ vide hérite de la limite correspondante de l’espace ; si les limites sont inversées, House Plan utilise la plus petite comme limite basse et la plus grande comme limite haute.","room.temp_range.help.aria":"À propos de la plage de confort de la pièce","room.temp_src_label":"Source de température","room.hum_src_label":"Source d’humidité","room.src_average":"Moyenne des capteurs de la pièce (par défaut)","room.src_pick":"Un appareil ou une entité HA spécifique","room.src_ph":"Choisir une source…","toast.room_updated":"Pièce mise à jour","space.card_font":"Taille de police des cartes de pièces (tout l’espace)","room.sizes_section":"Tailles de police","room.name_scale":"Taille du nom de la pièce","room.label_scale":"Taille des mesures","preview.room_name":"Salon","toast.cfg_reload_failed":"Impossible de recharger le plan depuis le serveur : {err}","toast.locale_load_failed":"Impossible de charger le pack de langue. L'anglais est utilisé jusqu'au rechargement de la page.","toast.furniture_art_load_failed":"Impossible de charger les dessins de meubles. Rechargez la page pour les afficher.","room.settings_short":"Paramètres de la pièce","room.unnamed":"Pièce sans nom","marker.use_climate_temp":"Inclure la température de l’appareil dans la pièce","marker.use_climate_temp_tip":"Ajoute la valeur current_temperature d’un climatiseur ou thermostat à la moyenne de la pièce. Configurez séparément le badge de valeur externe ci-dessous.","marker.value_badge_title":"Badge de valeur","marker.value_badge.help":"Affiche une valeur sélectionnée à côté de l’icône. Cela n’affecte pas les mesures de la pièce, la lumière, le halo ni l’action au toucher.","marker.value_badge.help.aria":"Aide : badge de valeur de l’appareil","marker.value_badge_enabled":"Afficher un badge de valeur","marker.value_badge_source":"Valeur","marker.value_badge_source.help":"Choisissez un état précis, un attribut pris en charge ou une valeur dérivée de cet appareil.","marker.value_badge_source.help.aria":"Aide : source du badge de valeur","marker.value_badge_position":"Position","marker.value_badge_position.help":"Le côté choisi reste fixe et ne bascule pas automatiquement au bord du plan.","marker.value_badge_position.help.aria":"Aide : position du badge de valeur","marker.value_badge_right":"À droite","marker.value_badge_bottom":"En dessous","marker.value_badge_left":"À gauche","marker.value_badge_top":"Au-dessus","marker.value_badge_empty":"Cet appareil n’a aucune valeur disponible","marker.value_badge_static":"Une icône statique n’affiche pas de valeurs en direct. Le paramètre est conservé.","marker.value_badge_missing":"Source indisponible","marker.value_badge_missing_hint":"La source enregistrée est actuellement indisponible. Conservez-la, désactivez le badge ou choisissez une autre valeur.","marker.value_badge_duplicate":"La même valeur est déjà affichée dans l’icône.","marker.value_badge_state":"État · {name}","marker.value_badge_marker_state":"État de la source lumineuse · {name}","marker.value_badge_lqi":"Qualité moyenne du signal Zigbee","marker.value_badge_attr_current_temperature":"Température actuelle · {name}","marker.value_badge_attr_temperature":"Température cible · {name}","marker.value_badge_attr_current_humidity":"Humidité actuelle · {name}","marker.value_badge_attr_humidity":"Humidité · {name}","marker.value_badge_attr_current_position":"Position · {name}","marker.value_badge_attr_percentage":"Vitesse · {name}","marker.value_badge_attr_brightness":"Luminosité · {name}","marker.value_badge_attr_volume_level":"Volume · {name}","marker.value_badge_attr_battery_level":"Batterie · {name}","marker.value_badge_attr_fan_speed":"Vitesse du ventilateur · {name}","marker.value_source":"Source de la valeur","marker.value_source.help":"Choisissez la valeur qui remplace l’icône. L’action au toucher ne change pas.","marker.value_source.help.aria":"Aide : source de la valeur dans le marqueur","marker.value_source_auto":"Automatique (comme avant)","marker.value_source_missing_hint":"La source enregistrée est indisponible. Le marqueur affiche — jusqu’à son retour ou jusqu’au choix d’une autre valeur.","marker.light_role_label":"Cet appareil est-il une source lumineuse ?","marker.light_role.help":"« Auto » utilise le rôle déterminé de l’appareil lié, « Toujours » force sa propre source et « Jamais » l’exclut ; les lumières liées ci-dessus restent indépendantes.","marker.light_role.help.aria":"Aide : cet appareil est-il une source lumineuse","marker.light_role_auto_yes":"Auto (source lumineuse)","marker.light_role_auto_no":"Auto (pas une source lumineuse)","marker.light_role_always":"Toujours une source lumineuse","marker.light_role_never":"Jamais une source lumineuse","marker.light_entity_label":"Entité lumineuse principale","marker.light_entity.help":"Pour un appareil composite, choisissez l’entité dont l’état, la couleur et la luminosité représentent cette source sur le plan. Le choix automatique reste compatible avec les anciens plans.","marker.light_entity.help.aria":"Aide : entité lumineuse principale","marker.light_entity_auto":"Automatique ({entity})","marker.light_entity_none":"aucune entité contrôlable","marker.light_entity_missing":"L’entité enregistrée {entity} est indisponible. House Plan utilise temporairement {fallback} ; le choix enregistré sera restauré si elle revient.","marker.toggle_entity_label":"Entité à basculer","marker.toggle_entity.help":"Pour un appareil composite, choisissez précisément la lumière ou l’interrupteur propre à actionner par un toucher. Automatique conserve les règles de cible précédentes et reste indépendant de l’entité lumineuse principale.","marker.toggle_entity.help.aria":"Aide : entité à basculer","marker.toggle_entity_auto":"Automatique ({entity})","marker.toggle_entity_none":"aucune entité propre contrôlable","marker.toggle_entity_missing":"L’entité enregistrée {entity} ne fait plus partie des canaux sélectionnables de ce marqueur. House Plan utilise temporairement {fallback} ; le choix enregistré sera restauré si elle revient.","marker.glow_color_label":"Couleur et luminosité du halo","marker.glow_mode.help":"Utilisez les valeurs en direct de la source, remplacez uniquement sa couleur ou fixez à la fois la couleur et la luminosité. Le minimum est 1 % ; pour désactiver la source, choisissez « Jamais ».","marker.glow_mode.help.aria":"Aide : couleur et luminosité du halo","marker.glow_mode_auto":"Depuis la source","marker.glow_mode_color":"Définir la couleur","marker.glow_mode_fixed":"Définir la couleur et la luminosité","marker.glow_color":"Couleur du halo","marker.glow_brightness":"Luminosité","marker.glow_disabled_never":"Les paramètres du halo sont indisponibles car ce marqueur est explicitement défini comme n’étant pas une source lumineuse.","marker.glow_disabled_auto":"Le mode Auto n’a trouvé aucune source lumineuse spatiale pour ce marqueur.","marker.glow_disabled_no_entity":"Aucune entité Home Assistant contrôlable et active n’est disponible pour cette source spatiale.","marker.glow_passive_hint":"Cette source ne possède aucune donnée Home Assistant propre. Définissez manuellement sa couleur et sa luminosité ; son rayon reste disponible.","marker.control_broken":"La source enregistrée est absente ou n’est plus marquée comme lumière","marker.control_missing_label":"Lumière du plan manquante","marker.control_passive":"source passive","toast.marker_control_cycle":"Ce lien créerait une chaîne circulaire de contrôles de lumière.","toast.marker_binding_required":"Choisissez un appareil Home Assistant avant de lier une autre source lumineuse.","confirm.unlock_title":"Déverrouiller ?","confirm.unlock_body":"House Plan enverra une commande de déverrouillage à cette serrure.","toast.files_migrate_failed":"Les pièces jointes n’ont pas pu être déplacées vers la nouvelle association ; les liens continuent de pointer vers les anciens fichiers : {err}","space.pick_saved":"Déjà importé","space.pick_saved_hint":"Plans stockés sur le serveur, y compris ceux que vous avez précédemment dissociés","space.no_saved":"Aucun plan n’est encore stocké sur le serveur.","space.loading":"Chargement…","space.used_by":"utilisé par : {list}","space.in_use":"Un espace utilise encore ce plan — dissociez-le d’abord","btn.use":"Utiliser","confirm.delete_plan_title":"Supprimer le fichier du plan ?","confirm.delete_plan_body":"Le fichier sera supprimé du serveur. Cette action est irréversible.","toast.plans_list_failed":"Impossible de lister les plans stockés : {err}","toast.plan_delete_failed":"Impossible de supprimer le plan : {err}","marker.hide":"Masquer","marker.hide_tip":"L’appareil disparaîtra du plan après l’enregistrement mais continuera de compter dans le signal de la pièce. Restaurez-le via « Masqués et désactivés » dans l’éditeur d’appareils.","marker.show":"Afficher","marker.show_tip":"L’appareil apparaîtra de nouveau sur le plan après l’enregistrement.","marker.hidden_ghost":"Appareil masqué par l’utilisateur","marker.ha_disabled_device":"L’appareil est désactivé dans Home Assistant et masqué du plan.","marker.ha_disabled_entity":"L’entité est désactivée dans Home Assistant et masquée du plan.","marker.ha_disabled_all_entities":"L’appareil n’a aucune entité Home Assistant active ; il est donc masqué du plan.","marker.ha_registry_limited":"Le registre Home Assistant complet n’est pas accessible à cet utilisateur. L’objet non vérifié ne peut pas être affiché ni utilisé pour le moment.","marker.delete_tip":"Supprimer complètement l’appareil du plan et de tous les agrégats. Vous pourrez l’ajouter de nouveau plus tard.","tap.run":"Exécuter une automatisation/un script/une scène","tap.none":"Ne rien faire","marker.run_target_label":"Élément à exécuter","marker.run_search_ph":"Rechercher : automatisation, script ou scène…","marker.run_target_gone":"Cible {id} introuvable — choisissez-en une autre","marker.tap_confirm":"Demander une confirmation","marker.tap_confirm_tip":"Afficher une boîte de dialogue de confirmation avant l’action — protection contre les appuis accidentels.","marker.toggle_hint_single":"Cible : {name} ({id}).","marker.virtual_light_target":"Lumière virtuelle : {name}.","marker.virtual_light_current":"État manuel : {state} → {effect}.","marker.virtual_light_state_on":"allumé","marker.virtual_light_state_off":"éteint","marker.toggle_hint_group":"Basculera {count} source(s) : {names}.","marker.toggle_hint_current":"Actuellement : {state} → {effect}.","marker.toggle_hint_group_current":"Actuellement allumées : {on} sur {count} → {effect}.","marker.toggle_hint_skipped":"Seront ignorées ({count}) : {targets}.","marker.toggle_effect_turn_on":"sera allumé","marker.toggle_effect_turn_off":"sera éteint","marker.toggle_effect_open":"sera ouvert","marker.toggle_effect_close":"sera fermé","marker.toggle_effect_stop":"sera arrêté","marker.toggle_effect_toggle":"l’état sera basculé","marker.toggle_skip_missing":"introuvable","marker.toggle_skip_ha_disabled":"désactivé dans HA","marker.toggle_skip_unavailable":"indisponible","marker.toggle_skip_unsupported":"basculement non pris en charge","marker.toggle_skip_secure":"bloqué pour des raisons de sécurité","marker.toggle_none_no_binding":"Cet appareil n’a aucune association ; il n’y a donc aucun état à basculer. Un toucher ne fera rien.","marker.toggle_none_no_actionable_entity":"Cet appareil n’a aucun état pouvant être basculé. Un toucher ne fera rien.","marker.toggle_none_configured_targets_missing":"Les cibles configurées sont indisponibles. L’entité propre de l’appareil ne leur sera pas substituée.","marker.toggle_none_ha_disabled":"La cible est désactivée dans Home Assistant et ne peut pas être utilisée sur le plan.","marker.toggle_none_unavailable":"La cible est actuellement indisponible. Un toucher ne fera rien.","marker.toggle_none_unsupported":"Home Assistant n’expose aucune opération de basculement sûre pour cette entité. Un toucher ne fera rien.","marker.toggle_none_secure":"Le basculement des serrures, alarmes et portails sécurisés depuis le plan est bloqué pour des raisons de sécurité.","run.automation":"automatisation","run.script":"script","run.scene":"scène","confirm.tap_run":"Exécuter « {name} » ?","confirm.tap_toggle":"Basculer « {name} » ?","confirm.current_state":"État actuel : {state}","confirm.expected_state":"Après basculement : {state}","confirm.group_current":"{on} allumé(s) sur {total}","confirm.group_all_on":"tout est allumé","confirm.group_all_off":"tout est éteint","confirm.unavailable_targets":"Indisponibles : {count}","confirm.expected_by_ha":"Home Assistant déterminera l’état","confirm.state_on":"Allumé","confirm.state_off":"Éteint","confirm.state_open":"Ouvert","confirm.state_closed":"Fermé","confirm.state_opening":"Ouverture en cours","confirm.state_closing":"Fermeture en cours","confirm.state_stopped":"Arrêté","confirm.state_unknown":"Inconnu","toast.run_started":"Démarré : {name}","toast.run_target_missing":"Cible d’exécution introuvable — vérifiez les paramètres de l’appareil","toast.run_target_required":"Choisissez une automatisation, un script ou une scène","toast.tap_target_changed":"La cible de l’action a changé. Réessayez.","toast.virtual_light_toggle_failed":"Impossible de basculer la lumière virtuelle : {err}","toast.value_badge_source_required":"Choisissez une valeur pour le badge","btn.run":"Exécuter","vac.section":"Robot aspirateur : position en direct","vac.autocal":"Configurer automatiquement","vac.live":"Position en direct sur le plan","vac.trail":"Afficher le trajet du robot","vac.autocal_no_rooms":"L’intégration ne fournit aucune liste de pièces — ouvrez « Ajuster manuellement »","vac.route_warn_unmapped":"Le robot nettoie une carte qui n'est assignée à aucun étage","vac.route_warn_needs_calibration":"La carte est assignée à un étage mais n'est pas calibrée","vac.route_warn_ambiguous":"Deux cartes sont indiscernables — aucun étage choisi","vac.route_warn_missing_space":"L'espace de cette carte a été supprimé","vac.autocal_no_match":"Les noms de pièces ne correspondent pas (il en faut ≥3 en commun) — ouvrez « Ajuster manuellement »","vac.autocal_done":"Terminé : association via {rooms} pièces. Lancez un nettoyage et vérifiez","vac.cal_need_pos":"Le robot ne transmet pas de coordonnées — lancez un nettoyage puis mettez-le en pause","vac.cal_done":"Calibration enregistrée. Lancez un nettoyage et vérifiez","vac.cal_cancelled":"Calibration annulée","vac.fit":"Ajuster manuellement","vac.fit_hint":"Faites glisser la carte du robot pour la positionner, étirez-la par les coins","vac.fit_rotate":"Rotation de 90°","vac.fit_mirror":"Miroir","vac.trail_never":"Jamais","vac.trail_cleaning":"Pendant le nettoyage","vac.trail_always":"Toujours","gs.bg_group":"Arrière-plan de la scène","gs.bg_color":"Arrière-plan autour du plan","gs.bg_default":"Valeur par défaut du thème","gs.bg_theme":"valeur par défaut du thème","gs.bg_mode":"Arrière-plan du plan","gs.bg_mode.help":"« Suit le soleil » utilise sun.sun ou, à défaut, l’heure locale du navigateur ; « Couleur statique » affiche toujours la couleur choisie.","gs.bg_mode.help.aria":"Aide : arrière-plan général du plan","gs.bg_static":"Couleur statique","gs.bg_daynight":"Suit le soleil","gs.sun_group":"Soleil","gs.sun_missing":"L’entité sun.sun est introuvable — l’arrière-plan suit votre heure locale ; les rayons de soleil par les fenêtres sont indisponibles.","gs.north":"Nord sur le plan","gs.north.help":"L’angle se mesure dans le sens horaire depuis la verticale supérieure du plan ; le nord sert aux rayons des fenêtres, pas à l’arrière-plan « Suit le soleil ».","gs.north.help.aria":"Aide : direction générale du nord","gs.north_ph":"non défini","gs.north_clear":"Effacer","gs.north_letter":"N","gs.sun_rays":"Lumière du soleil à travers les fenêtres","gs.sun_ray_origin":"Rayons du soleil","gs.sun_ray_origin.inner":"Depuis les angles intérieurs des fenêtres","gs.sun_ray_origin.outer":"Depuis les angles extérieurs des fenêtres","gs.about_version":"Houseplan Card v{v}","gs.about_github":"GitHub · documentation et problèmes","gs.about_telegram":"Discussion Telegram","support.title":"Aide et commentaires","space.bg_color":"Arrière-plan autour du plan","space.bg_inherit":"Hériter des paramètres généraux","space.bg_inherited":"hérite des paramètres généraux","space.bg_mode":"Arrière-plan du plan","space.bg_mode.help":"Héritez de l’arrière-plan général ou remplacez-le pour cet espace par une couleur statique ou le mode « Suit le soleil ».","space.bg_mode.help.aria":"Aide : arrière-plan de l’espace","space.north":"Nord sur le plan (remplacement)","space.north.help":"Remplace le nord général pour cet espace ; l’angle se mesure dans le sens horaire depuis la verticale supérieure du plan et sert aux rayons des fenêtres.","space.north.help.aria":"Aide : nord de cet espace","space.north_inherited":"hérité : {v}","space.sun_rays":"Lumière du soleil à travers les fenêtres","space.sun_inherit":"Hériter des paramètres généraux","space.sun_on":"Activé","space.sun_off":"Désactivé","canvas.far_objects":"{n} objet(s) éloigné(s) du plan","canvas.show_far":"Afficher","canvas.home_tip":"Le plan est là-bas — cliquez pour l’ajuster à l’écran","gs.grid_group":"Maintenance du plan","gs.grid_hint":"Met à jour les modèles de données, aligne les éléments du plan sur la grille et fusionne les fragments de murs redondants. Un rapport précis est affiché avant tout enregistrement.","gs.align_all":"Optimiser les plans","gs.align_title":"Optimiser les plans","gs.align_none":"Tous les plans utilisent déjà le modèle de données optimisé actuel.","gs.optimize_no_automatic_changes":"Aucune modification automatique n’est à appliquer. Vérifiez les éléments ci-dessous.","gs.align_count":"{n} élément(s) sur {total} seront déplacés, de {cm} cm au maximum.","gs.align_where":"Le plus grand déplacement se trouve dans « {s} ».","gs.align_turned":"Ouvertures dont l’angle est corrigé : {n}.","gs.align_preflight_failed":"Impossible de vérifier en toute sécurité la géométrie des espaces suivants : {spaces}{more}.","gs.align_preflight_hint":"Les plans n’ont pas été modifiés. Copiez les diagnostics avec le bouton ci-dessous et joignez-les au rapport de bug avec un export de l’espace.","gs.preflight_reason_prepare-exception":"Impossible de préparer la géométrie de l’espace (exception lors de la construction du modèle)","gs.preflight_reason_wall-null":"Le corps du mur n’a pas pu être construit (l’union a renvoyé un résultat vide)","gs.preflight_reason_wall-degraded-extra":"Le corps du mur s’est dégradé avec une géométrie supplémentaire","gs.preflight_reason_wall-failed-core":"Le noyau du corps du mur n’a pas pu être assemblé","gs.preflight_reason_wall-exception":"La construction du mur a déclenché une exception","gs.preflight_reason_floor-null":"Le contour du sol n’a pas pu être construit","gs.preflight_reason_floor-exception":"La construction du sol a déclenché une exception","gs.preflight_copy":"Copier les diagnostics","gs.preflight_copied":"Diagnostics copiés","gs.preflight_update_hint":"Les versions de la carte et de l’intégration diffèrent — mettez House Plan à jour puis réessayez.","gs.align_preflight_space":"Espace {n}","gs.align_preflight_more":", et {n} de plus","gs.optimize_changes":"Migrations de modèle : {m} ; espaces mis à jour : {c} ; valeurs de coordonnées parasites supprimées : {p} ; fragments de murs réels fusionnés : {w} ; fragments de murs d’épaisseur nulle fusionnés : {s} ; murs indépendants : {i}.","gs.zero_walls_migrated":"Portions de murs virtuels converties : {n}.","gs.wall_segments_migrated":"Segments de murs stabilisés : {n}.","gs.room_drafts_migrated":"Contours inachevés convertis en murs ordinaires : {drafts} ; segments : {segments}.","gs.optimize_lattice_summary":"Valeurs de coordonnées parasites normalisées : {n} ; déplacement maximal : {cm} cm.","gs.optimize_lattice_space":"{space} : valeurs de coordonnées normalisées : {n} ; valeurs hors grille laissées inchangées : {far}.","gs.optimize_coincident_partitions":"Sections de murs indépendants masquées absorbées dans les murs des pièces : {n}.","gs.optimize_openings_rehosted":"Ouvertures rattachées aux murs des pièces : {n}.","gs.optimize_walls_straightened":"Murs redressés : {n} ; déplacement maximal : {cm} cm.","gs.optimize_walls_straightened_where":"Plus grande correction de mur : {s}.","gs.optimize_walls_straighten_skipped":"Murs proches d’un axe laissés inchangés car ils ne pouvaient pas être réparés en toute sécurité : {n}.","gs.optimize_glow_migration":"Ancien mode Glow : {spaces} espaces → aucun remplissage de données + Glow indépendant ; {rooms} pièces → remplissage de données hérité + Glow indépendant.","gs.optimize_references":"Références réparées : espaces — {spaces} ; pièces — {rooms} ; positions — {positions} ; appareils dissociés des espaces manquants — {detached}.","gs.optimize_reference_more":", et {n} de plus","gs.optimize_orphans_removed":"Enregistrements oubliés supprimés : {total} — étiquettes de pièces : {rooms} ; appareils : {devices} ; marqueurs de groupe : {groups}. Ils appartenaient à des espaces supprimés précédemment.","gs.optimize_live_positions":"Anciennes positions dans des espaces supprimés appartenant à des objets existants : {n}{names}. Elles seront conservées.","gs.optimize_live_positions_remove":"Anciennes positions dans des espaces supprimés appartenant à des objets existants : {n}{names}. Elles sont sélectionnées pour suppression.","gs.optimize_live_names":" : {names}{more}","gs.optimize_live_remove":"Supprimer les anciennes positions","gs.optimize_live_keep":"Conserver les anciennes positions","gs.optimize_live_selected":"Les anciennes positions seront supprimées après l’application de l’optimisation.","gs.optimize_unverified":"Impossible de vérifier en toute sécurité les positions : {n}. Elles ont été laissées inchangées.","gs.optimize_registry_limited":"Un accès administrateur complet aux registres Home Assistant est requis pour une vérification sûre.","gs.optimize_vacuum_warning":"Associations de pièces d’aspirateur nécessitant encore une vérification : {n}.","gs.optimize_details":"Détails","gs.optimize_details_more":"Et {n} enregistrement(s) de plus.","gs.optimize_detail_removed":"sera supprimé","gs.optimize_detail_live":"sera conservé","gs.optimize_detail_unverified":"non vérifié","gs.optimize_detail_room_label":"étiquette de pièce","gs.optimize_detail_device":"appareil","gs.optimize_detail_group":"marqueur de groupe","gs.optimize_detail_unknown":"propriétaire inconnu","gs.optimize_detail_item":"{status} : {kind} {id} ; ancien espace {space}","gs.align_warn":"Les éléments volontairement placés entre les nœuds de la grille seront déplacés. Une seule annulation est disponible après l’opération, uniquement jusqu’à la prochaine modification du plan.","gs.align_run":"Optimiser","gs.align_done":"Plans optimisés : {n} élément(s) déplacé(s), {m} enregistrement(s) maintenu(s), {r} référence(s) réparée(s)","gs.optimize_undo":"Annuler la dernière optimisation","gs.optimize_undone":"La dernière optimisation a été annulée","decor.furniture":"Mobilier","decor.image":"Image","decor.image_title":"Images personnalisées","decor.image_upload":"Importer une image","decor.image_replace":"Remplacer l’image","decor.image_uploading":"Importation…","decor.image_asset":"Fichier image","decor.image_pick_hint":"Importez une image ou choisissez-en une existante.","decor.image_place_hint":"Cliquez sur le plan pour placer l’image.","decor.image_none":"Aucune image importée pour le moment.","decor.image_unavailable":"Image indisponible","decor.image_used":"Utilisée dans {n} objets","decor.image_upload_failed":"Impossible d’importer l’image : {err}","decor.image_error_capacity":"Le stockage des images personnalisées est plein.","decor.image_in_use":"Supprimez toutes les copies placées avant ce fichier.","decor.image_delete_title":"Supprimer le fichier image ?","decor.image_delete_message":"Supprimer « {name} » de House Plan ? Cette action est irréversible.","furn.title":"Bibliothèque de mobilier","furn.symbol":"Symbole","furn.group_furniture":"Mobilier","furn.group_appliance":"Électroménager","furn.group_sanitary":"Sanitaires","furn.group_other":"Autre","furn.width":"Largeur","furn.depth":"Profondeur","furn.back_to_categories":"Toutes les catégories","furn.pick_hint":"Choisissez un symbole, puis cliquez sur le plan.","furn.place_hint":"Cliquez sur le plan — le meuble se place contre le mur le plus proche. Maj permet un placement libre.","furn.cat_air_conditioner":"Climatiseurs","furn.cat_armchair":"Fauteuils","furn.cat_bathtub":"Baignoires","furn.cat_bed":"Lits","furn.cat_bidet":"Bidets","furn.cat_boiler":"Chauffe-eau","furn.cat_chair":"Chaises","furn.cat_coffee_table":"Tables basses","furn.cat_cooktop":"Plaques de cuisson","furn.cat_dining_table":"Tables à manger","furn.cat_dishwasher":"Lave-vaisselle","furn.cat_dryer":"Sèche-linge","furn.cat_fireplace":"Cheminées","furn.cat_fridge":"Réfrigérateurs","furn.cat_kitchen_cabinet":"Meubles de cuisine","furn.cat_kitchen_sink":"Éviers de cuisine","furn.cat_nightstand":"Meubles","furn.cat_plant":"Plantes","furn.cat_rug":"Tapis","furn.cat_shelving":"Étagères","furn.cat_shower":"Douches","furn.cat_sink":"Lavabos","furn.cat_sofa":"Canapés","furn.cat_stairs":"Escaliers","furn.cat_toilet":"Toilettes","furn.cat_tv":"Téléviseurs","furn.cat_wardrobe":"Armoires","furn.cat_washer":"Lave-linge","furn.cat_work_table":"Bureaux","furn.sym_sofa":"Canapé","furn.sym_sofa_three_seat":"Canapé trois places","furn.sym_sofa_corner_right":"Canapé d'angle droit","furn.sym_armchair":"Fauteuil","furn.sym_armchair_office":"Chaise de bureau","furn.sym_coffee_table":"Table basse","furn.sym_coffee_table_round":"Table basse ronde","furn.sym_coffee_table_oval":"Table basse ovale","furn.sym_coffee_table_rounded":"Table basse arrondie","furn.sym_table_dining":"Table à manger","furn.sym_table_round":"Table ronde","furn.sym_table_dining_oval":"Table à manger ovale","furn.sym_table_dining_rounded":"Table à manger arrondie","furn.sym_chair":"Chaise","furn.sym_chair_bar":"Tabouret de bar","furn.sym_desk":"Bureau","furn.sym_desk_corner":"Bureau d'angle","furn.sym_bed_double":"Lit double","furn.sym_bed_single":"Lit simple","furn.sym_nightstand":"Table de chevet","furn.sym_cabinet_tv":"Meuble TV","furn.sym_cabinet_shoe":"Meuble à chaussures","furn.sym_cabinet_sink":"Meuble sous lavabo","furn.sym_wardrobe":"Armoire","furn.sym_bookshelf":"Bibliothèque","furn.sym_wall_unit":"Élément mural","furn.sym_kitchen_floor":"Module de cuisine bas","furn.sym_kitchen_floor_corner":"Module de cuisine bas d'angle","furn.sym_kitchen_wall":"Module de cuisine haut","furn.sym_kitchen_wall_corner":"Module de cuisine haut d'angle","furn.sym_shelf_floor":"Étagère au sol","furn.sym_shelf_wall":"Étagère murale","furn.sym_fridge":"Réfrigérateur","furn.sym_stove":"Cuisinière","furn.sym_cooktop_two":"Plaque à deux feux","furn.sym_dishwasher":"Lave-vaisselle","furn.sym_washer":"Lave-linge","furn.sym_dryer":"Sèche-linge","furn.sym_tv":"Téléviseur","furn.sym_tv_wall":"Téléviseur mural","furn.sym_ac":"Climatiseur","furn.sym_water_heater":"Chauffe-eau","furn.sym_toilet":"Toilettes","furn.sym_toilet_built_in":"Toilettes suspendues","furn.sym_bathtub":"Baignoire","furn.sym_bathtub_corner":"Baignoire d'angle","furn.sym_shower":"Douche","furn.sym_sink":"Lavabo","furn.sym_kitchen_sink":"Évier de cuisine","furn.sym_kitchen_sink_double":"Évier de cuisine double","furn.sym_bidet":"Bidet","furn.sym_bidet_built_in":"Bidet suspendu","furn.sym_stairs":"Escalier","furn.sym_fireplace":"Cheminée","furn.sym_plant":"Plante","furn.sym_rug":"Tapis","common.yes":"Oui","common.no":"Non","vac.diag_source":"Source","vac.diag_platform":"Intégration","vac.diag_status":"État","vac.diag_position":"Position","vac.diag_rooms":"Pièces","vac.diag_rooms_value":"{total} · {matched} noms correspondent · {readiness}","vac.autocal_ready":"calibration automatique disponible","vac.autocal_not_ready":"3 noms correspondants requis","vac.diag_path":"Chemin de l’intégration","vac.diag_map":"ID de carte","vac.source_none":"non sélectionné","vac.source_status_ok":"Prêt","vac.source_status_missing":"Manquant","vac.source_status_disabled":"Désactivé dans Home Assistant","vac.source_status_unavailable":"Indisponible","vac.source_status_unverified":"Impossible à vérifier avec les autorisations actuelles","vac.source_status_unsupported":"Aucune donnée de position","vac.source_status_none":"Aucune source","vac.source_banner_missing":"La source enregistrée n’existe plus. Elle n’a pas été remplacée automatiquement ; choisissez une autre source ou restaurez-la dans Home Assistant.","vac.source_banner_disabled":"La source enregistrée est désactivée dans Home Assistant. Activez-la ou choisissez une autre source.","vac.source_banner_unverified":"Les autorisations Home Assistant actuelles ne permettent pas de vérifier cette source enregistrée. Elle reste épinglée et ne sera pas remplacée automatiquement.","vac.choose_source":"Choisir la source","vac.source_auto":"Automatique","vac.source_auto_hint":"Utiliser une entité compatible de cet appareil","vac.all_cameras":"Toutes les caméras","vac.all_cameras_warn":"Une caméra peut ne pas fournir de données du robot. Choisissez-en une uniquement s’il s’agit de la carte de votre aspirateur.","vac.all_cameras_empty":"Aucune autre entité caméra trouvée.","vac.platform_unknown":"intégration inconnue","vac.cap_position":"position","vac.cap_rooms_short":"pièces","vac.cap_path":"trajet","vac.cap_map":"ID de carte","vac.cap_none":"aucune donnée de robot détectée","vac.xcme_hint":"Activez ces attributs Xiaomi Cloud Map Extractor :","vac.documentation":"Documentation","vac.residual_title":"Vérifier la calibration automatique","vac.residual_message":"Les pièces correspondantes présentent un écart maximal de {error}. Appliquez cette calibration approximative, affinez-la manuellement ou annulez sans modifier la configuration enregistrée.","vac.apply_proposal":"Appliquer","gs.backup_group":"Sauvegarde et transfert","gs.backup_hint":"Téléchargez une sauvegarde JSON portable ou prévisualisez et importez une sauvegarde créée par House Plan.","backup.export_open":"Exporter","backup.import_open":"Importer","backup.export_title":"Exporter House Plan","backup.import_title":"Importer House Plan","backup.export_hint":"Choisissez si la sauvegarde doit contenir toute la configuration House Plan ou uniquement l’espace actuel.","backup.full":"Sauvegarde complète","backup.current_space":"Espace actuel","backup.current_space_title":"Espace actuel : {title}","backup.no_current_space":"Aucun espace actuel","backup.plan_only":"Plan uniquement","backup.plan_only_hint":"Conserver les pièces, murs, ouvertures, décorations et positions des étiquettes de pièces sans les appareils ni les associations Home Assistant.","backup.plan_only_preview":"Ce fichier contient uniquement le plan","backup.privacy_warning":"L’archive conserve les noms, identifiants Home Assistant et coordonnées exactes. Les plans internes et pièces jointes sont référencés, pas intégrés ; les états d’exécution et trajets d’aspirateur ne sont pas inclus.","backup.download":"Télécharger le JSON","backup.export_done":"Sauvegarde téléchargée","backup.reading":"Vérification de la sauvegarde…","backup.revalidated":"Le plan a changé depuis cet aperçu. Le résumé a été actualisé ; vérifiez-le et confirmez de nouveau.","backup.error.support_invalid_message":"Vérifiez le message d’assistance et réessayez.","backup.error.support_package_too_large":"Le paquet d’assistance anonymisé dépasse la limite de 8 Mio.","backup.error.support_preview_expired":"L’aperçu de la pièce jointe d’assistance a expiré ou n’est plus disponible.","backup.error.support_rate_limited":"Trop de rapports ou d’aperçus d’assistance ont été demandés. Réessayez plus tard.","backup.error.support_rejected":"Le rapport n’a pas passé la validation du service d’assistance.","backup.error.support_unavailable":"Le service d’assistance privé est temporairement indisponible.","backup.error.unauthorized":"Vous n’avez pas l’autorisation d’exporter ou d’importer ce plan.","backup.error.not_ready":"House Plan n’est pas encore prêt. Réessayez dans un instant.","backup.error.too_large":"La sauvegarde dépasse la limite de 8 Mio.","backup.error.invalid_json":"Le fichier sélectionné n’est pas un JSON valide.","backup.error.invalid_format":"Le fichier sélectionné n’est pas une sauvegarde House Plan.","backup.error.invalid_image":"L’image est endommagée ou ne correspond pas à son format.","backup.error.unsupported_export_version":"Ce format de sauvegarde n’est pas pris en charge par la version installée.","backup.error.unsupported_image":"Utilisez une image PNG, JPEG, WebP ou SVG prise en charge.","backup.error.future_model":"La sauvegarde a été créée avec un modèle de données House Plan plus récent.","backup.error.invalid_config":"La sauvegarde contient une configuration House Plan invalide.","backup.error.wall_model_migration_blocked":"Le modèle de murs de la sauvegarde n’a pas pu être mis à niveau en toute sécurité. Optimisez d’abord le plan source, puis exportez-le de nouveau.","backup.error.invalid_layout":"La sauvegarde contient des positions d’objets invalides.","backup.error.invalid_content":"La sauvegarde contient des références de contenu invalides ou incohérentes.","backup.error.space_not_found":"L’espace sélectionné n’existe plus.","backup.error.capacity_exceeded":"L’ajout de cette sauvegarde dépasserait les limites du plan.","backup.error.preview_expired":"L’aperçu a expiré. Sélectionnez de nouveau le fichier de sauvegarde.","backup.error.preview_owner_mismatch":"Cet aperçu appartient à un autre utilisateur Home Assistant.","backup.error.conflict":"Le plan a changé depuis l’aperçu. Vérifiez le résumé actualisé.","backup.error.content_confirmation_required":"Confirmez que le contenu local indisponible peut être dissocié.","backup.error.commit_failed":"La sauvegarde n’a pas pu être appliquée en toute sécurité. Le plan précédent a été restauré ou est en attente de récupération.","backup.error.missing_plan":"Un fichier de plan référencé a disparu depuis l’aperçu. Vérifiez de nouveau la sauvegarde.","backup.error.missing_content":"Une pièce jointe locale référencée a disparu depuis l’aperçu. Vérifiez de nouveau la sauvegarde.","backup.error.marker_control_missing":"Une lumière liée au plan est absente de la sauvegarde.","backup.error.marker_control_not_light":"Une cible liée au plan n’est plus marquée comme source lumineuse.","backup.error.marker_control_self":"Une source lumineuse ne peut pas se contrôler elle-même.","backup.error.marker_control_cycle":"La sauvegarde contient une chaîne circulaire de contrôles de lumière.","backup.error.duplicate_marker_control":"La sauvegarde contient un lien de lumière du plan en doublon.","backup.error.no_backup":"Aucun instantané d’importation ou d’optimisation n’est disponible à restaurer.","backup.error.in_use":"L'élément est encore utilisé","backup.error.invalid_data":"La requête contient des données invalides","backup.error.invalid_light_entity":"La lumière principale doit être une entité light.* ou switch.*","backup.error.invalid_marker_control":"Référence de contrôle de marqueur invalide","backup.error.invalid_name":"Le nom est invalide","backup.error.invalid_partition_opening_host":"L'ouverture doit conserver sa cloison porteuse","backup.error.invalid_partition_opening_jamb_margin":"L'ouverture ne laisse aucun jambage physique au bout du mur","backup.error.invalid_passage_fields":"Un passage ouvert ne peut pas porter de réglages de porte","backup.error.invalid_space_id":"Espace inconnu","backup.error.invalid_toggle_entity":"L'entité de bascule doit être light.* ou switch.*","backup.error.invalid_value_badge":"Réglages de badge de valeur invalides","backup.error.invalid_value_badge_attribute":"Attribut de badge de valeur invalide","backup.error.invalid_value_badge_position":"Position de badge de valeur invalide","backup.error.invalid_value_badge_source":"Source de badge de valeur invalide","backup.error.invalid_vacuum_map_route":"Vérifiez l'affectation des cartes du robot aux espaces.","backup.error.invalid_value_source":"Source de valeur invalide","backup.error.invalid_value_source_attribute":"Attribut de source de valeur invalide","backup.error.io_error":"Une opération de fichier a échoué sur le serveur","backup.error.not_toggleable":"Cet appareil ne peut pas être basculé","backup.error.nothing_to_repair":"Rien à réparer","backup.error.space_in_use":"L'espace est encore référencé","backup.error.value_badge_source_required":"Le badge de valeur nécessite une source","backup.error.wall_model_client_outdated":"Le plan a été mis à jour ailleurs — rechargez la page","backup.same_source":"Créée sur cette instance Home Assistant","backup.foreign_source":"Créée sur une autre instance Home Assistant","backup.created":"Créée : {value}","backup.versions":"Carte {card} ; intégration {integration} ; modèle de données {model}","backup.count_spaces":"Espaces : {n}","backup.count_rooms":"Pièces : {n}","backup.count_walls":"Murs : {n}","backup.count_openings":"Ouvertures : {n}","backup.count_decor":"Objets décoratifs : {n}","backup.count_markers":"Appareils : {n}","backup.count_layout":"Positions : {n}","backup.bindings":"Associations — appareils : {device}, entités : {entity}, virtuels : {virtual} ; positions sans espace : {legacy}","backup.binding_status":"État des cibles — actives : {active}, désactivées : {disabled}, manquantes : {missing}","backup.missing_areas":"Zones absentes sur la cible : {areas}","backup.dropped_marker_links":"Liens de lumières du plan hors de cet espace transféré omis : {n}.","backup.room_drafts_migrated":"Anciens contours inachevés convertis en murs ordinaires : {drafts} ; segments : {segments}.","backup.repaired_target_refs":"Références existantes restaurées par cet import d’espace : {n}.","backup.preserved_unresolved_refs":"Références qui n’ont pas pu être restaurées sans ambiguïté conservées : {n}.","backup.preserved_unresolved_hint":"Aucune donnée n’a été devinée ni supprimée. Après l’importation, lancez « Optimiser les plans » pour examiner les références restantes.","backup.import_details":"Détails des références d’importation","backup.import_detail.incoming_remapped":"Références mises à jour dans la copie importée : {n}","backup.import_detail.target_repaired":"Références existantes restaurées : {n}","backup.import_detail.preserved_unresolved":"Références non résolues conservées : {n}","backup.import_detail.collisions":"Conflits de destination conservés en toute sécurité : {n}","backup.import_detail.dropped_links":"Liens entrants omis selon les règles de transfert : {n}","backup.import_detail.bounded_lineages":"Identifiants trop imbriqués maintenus dans les limites : {n}","backup.replace_warning":"Cela remplace la configuration et la disposition actuelles. Les fichiers importés ne sont jamais supprimés. Une seule annulation reste disponible jusqu’à la prochaine modification du plan.","backup.foreign_bookkeeping":"Les données de suivi des appareils connus/nouveaux propres à l’instance ne seront pas importées.","backup.final_name":"Nom du nouvel espace","backup.target_settings":"Les paramètres généraux de l’instance cible restent inchangés.","backup.duplicates":"Associations déjà présentes : {n}","backup.skip":"Ignorer les appareils en doublon","backup.virtual_copy":"Ajouter des copies virtuelles statiques sûres","backup.content":"Contenu référencé","backup.decor_images_summary":"Images personnalisées : {objects} objets, {assets} fichiers ; fichiers absents : {missing}.","backup.content_available":"disponible localement","backup.content_external":"lien externe","backup.content_detach_required":"sera dissocié","backup.confirm_detach":"Je comprends que les plans internes et pièces jointes indisponibles seront dissociés de la configuration importée.","backup.confirm_missing_images":"Je comprends que les images personnalisées absentes resteront des espaces réservés réparables et que les autres fichiers locaux indisponibles seront dissociés.","backup.replace":"Remplacer","backup.add":"Ajouter un espace","backup.space_done":"Espace importé : {rooms} pièces, {markers} appareils, {refs} références existantes restaurées","backup.full_done":"Sauvegarde restaurée : {spaces} espaces, {rooms} pièces, {markers} appareils","backup.undo_import":"Annuler la dernière importation complète","backup.import_undone":"Importation complète annulée","backdrop.large_title":"Grande image","backdrop.large_body":"Cette image fait {w}×{h} (fichier de {fileMb} Mo) et nécessite environ {decodedMb} Mo de mémoire pour s'afficher. Sur tablette, cela peut faire planter la page.","backdrop.unknown_body":"Les dimensions de l'image n'ont pas pu être lues — le fichier est peut-être endommagé. Continuer peut faire planter la page sur tablette.","backdrop.reduced_dimensions":"Copie réduite : {w}×{h} px.","backdrop.use_downscaled":"Téléverser une copie réduite","backdrop.reducing":"Réduction…","backdrop.keep_original":"Conserver l'original","backdrop.too_large_title":"Image trop grande","backdrop.too_large_body":"Cette image dépasse ce que les navigateurs peuvent afficher ({w}×{h}, limite {limit} px par côté). Réduisez-la dans un éditeur de bureau puis téléversez-la à nouveau.","backdrop.downscale_failed":"Impossible de créer la copie réduite. Le plan actuel n'a pas été modifié."};const r="4da0d706a85c3f1c08ab6de960deb5feb08baaf9055265234e7bd1b554332653";export{e as dictionary,r as fingerprint};
diff --git a/custom_components/houseplan/frontend/houseplan-assets/furniture-plan-art.generated-BfO1XOcD.js b/custom_components/houseplan/frontend/houseplan-assets/furniture-plan-art.generated-CDfS5UbT.js
similarity index 99%
rename from custom_components/houseplan/frontend/houseplan-assets/furniture-plan-art.generated-BfO1XOcD.js
rename to custom_components/houseplan/frontend/houseplan-assets/furniture-plan-art.generated-CDfS5UbT.js
index f533b6e6..18e965a9 100644
--- a/custom_components/houseplan/frontend/houseplan-assets/furniture-plan-art.generated-BfO1XOcD.js
+++ b/custom_components/houseplan/frontend/houseplan-assets/furniture-plan-art.generated-CDfS5UbT.js
@@ -1 +1 @@
-globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="34d1dbfc181acaf58842dfced0e6aa3a899aef6b8d1eeba53732ef729a63137e";const L="34d1dbfc181acaf58842dfced0e6aa3a899aef6b8d1eeba53732ef729a63137e",M={coffee_table:{d:"M 0,2.4996674 C 0,1.11983275 1.11965812,0 2.5,0 L 117.5,0 C 118.88141026,0 120,1.11869239 120,2.4996674 L 120,57.49919225 C 120,58.88130761 118.88141026,60 117.5,60 L 2.5,60 C 1.11965812,60 0,58.88130761 0,57.5003326 L 0,2.4996674 M 106,13.00123539 L 106,6.99952485 M 106,6.99952487 A 1.00009503,1 90 0,1 106.29289321,6.29235088 A 1.00009503,1 90 0,1 106.99999999,5.99942982 M 107,5.99942982 L 113,5.99942982 A 1.00009503,1 90 0,1 113.70710678,6.29235087 A 1.00009503,1 90 0,1 114,6.99952485 L 114,13.00009503 M 114,13.00009502 A 1.00009503,1 90 0,1 113.70710679,13.707269 A 1.00009503,1 90 0,1 113.00000001,14.00019006 M 113,14.00019006 L 107,14.00019006 M 107,14.00019006 A 1.00009503,1 90 0,1 106.29289322,13.70726901 A 1.00009503,1 90 0,1 106,13.00009503 M 106,53.00161551 L 106,47.00104533 M 106,47.00104534 A 1.00009503,1 90 0,1 106.29289321,46.29387136 A 1.00009503,1 90 0,1 106.99999999,46.0009503 M 107,46.0009503 L 113,46.0009503 M 113,46.0009503 A 1.00009503,1 90 0,1 113.70710678,46.29387135 A 1.00009503,1 90 0,1 114,47.00104533 M 114,47.00104533 L 114,53.00161551 M 114,53.00161549 A 1.00009503,1 90 0,1 113.70710679,53.70878948 A 1.00009503,1 90 0,1 113.00000001,54.00171054 M 113,54.00171054 L 107,54.00171054 M 107,54.00171054 A 1.00009503,1 90 0,1 106.29289322,53.70878949 A 1.00009503,1 90 0,1 106,53.00161551 M 6,13.00123539 L 6,6.99952485 M 6,6.99952487 A 1.00009503,1 90 0,1 6.29289321,6.29235088 A 1.00009503,1 90 0,1 6.99999999,5.99942982 M 7,5.99942982 L 13,5.99942982 A 1.00009503,1 90 0,1 13.70710678,6.29235087 A 1.00009503,1 90 0,1 14,6.99952485 L 14,13.00009503 M 14,13.00009502 A 1.00009503,1 90 0,1 13.70710679,13.707269 A 1.00009503,1 90 0,1 13.00000001,14.00019006 M 13,14.00019006 L 7,14.00019006 A 1.00009503,1 90 0,1 6.29289322,13.70726901 A 1.00009503,1 90 0,1 6,13.00009503 M 6,53.00161551 L 6,47.00104533 M 6,47.00104533 A 1.00009503,1 90 0,1 6.29289322,46.29387135 A 1.00009503,1 90 0,1 7,46.0009503 M 7,46.0009503 L 13,46.0009503 M 13,46.0009503 A 1.00009503,1 90 0,1 13.70710678,46.29387135 A 1.00009503,1 90 0,1 14,47.00104533 M 14,47.00104533 L 14,53.00161551 A 1.00009503,1 90 0,1 13.70710678,53.70878949 A 1.00009503,1 90 0,1 13,54.00171054 M 13,54.00171054 L 7,54.00171054 M 7,54.00171054 A 1.00009503,1 90 0,1 6.29289322,53.70878949 A 1.00009503,1 90 0,1 6,53.00161551",viewW:120,viewH:60},coffee_table_round:{d:"M 0,40 A 40,40 0 0,0 40,80 A 40,40 0 0,0 80,40 A 40,40 0 0,0 40,0 A 40,40 0 0,0 0,40 M 57.94949634,25.60507796 L 53.70718918,21.3627708 A 1.00013799,1.00013799 0 0,1 53.70718918,19.94977232 L 57.94949634,15.70636125 A 1.00013799,1.00013799 0 0,1 59.36359873,15.70636125 L 63.6070098,19.94866841 A 1.00013799,1.00013799 0 0,1 63.6070098,21.3627708 L 59.36359873,25.60618187 A 1.00013799,1.00013799 0 0,1 57.95060025,25.60618187 M 57.94949634,63.86753139 L 53.70718918,59.62522423 A 1.00013799,1.00013799 0 0,1 53.70718918,58.21112184 L 57.94949634,53.96771078 A 1.00013799,1.00013799 0 0,1 59.36359873,53.96771078 L 63.60590589,58.21112184 A 1.00013799,1.00013799 0 0,1 63.60590589,59.62412033 L 59.36359873,63.86753139 A 1.00013799,1.00013799 0 0,1 57.94949634,63.86753139 M 19.94977232,25.60618187 L 15.70746516,21.36387471 A 1.00013799,1.00013799 0 0,1 15.70746516,19.94977232 L 19.94977232,15.70636125 A 1.00013799,1.00013799 0 0,1 21.36387471,15.70636125 L 25.60728577,19.94977232 A 1.00013799,1.00013799 0 0,1 25.60728577,21.3627708 L 21.36387471,25.60618187 A 1.00013799,1.00013799 0 0,1 19.95087622,25.60618187 M 19.94977232,63.86753139 L 15.70746516,59.62522423 A 1.00013799,1.00013799 0 0,1 15.70746516,58.21112184 L 19.94977232,53.96881468 A 1.00013799,1.00013799 0 0,1 21.36387471,53.96881468 L 25.60728577,58.21112184 A 1.00013799,1.00013799 0 0,1 25.60728577,59.62522423 L 21.36387471,63.86753139 A 1.00013799,1.00013799 0 0,1 19.95087622,63.86753139",viewW:80,viewH:80},coffee_table_oval:{d:"M 0,30.00057018 C 0,13.43115081 13.43162393,0 30,0 L 90,0 C 106.56944444,0 120,13.43115081 120,30.00057018 C 120,46.56998955 106.56944444,60 90,60 L 30,60 C 13.43162393,60 0,46.56998955 0,30.00057018 M 82,13.00123539 L 82,6.99952485 M 82,6.99952487 A 1.00009503,1 90 0,1 82.29289321,6.29235088 A 1.00009503,1 90 0,1 82.99999999,5.99942982 M 83,5.99942982 L 89,5.99942982 A 1.00009503,1 90 0,1 89.70710678,6.29235087 A 1.00009503,1 90 0,1 90,6.99952485 L 90,13.00009503 M 90,13.00009502 A 1.00009503,1 90 0,1 89.70710679,13.707269 A 1.00009503,1 90 0,1 89.00000001,14.00019006 M 89,14.00019006 L 83,14.00019006 M 83,14.00019006 A 1.00009503,1 90 0,1 82.29289322,13.70726901 A 1.00009503,1 90 0,1 82,13.00009503 M 82,53.00047515 L 82,46.99990497 M 82,46.99990498 A 1.00009503,1 90 0,1 82.29289321,46.292731 A 1.00009503,1 90 0,1 82.99999999,45.99980994 M 83,45.99980994 L 89,45.99980994 M 89,45.99980994 A 1.00009503,1 90 0,1 89.70710678,46.29273099 A 1.00009503,1 90 0,1 90,46.99990497 M 90,46.99990497 L 90,53.00047515 M 90,53.00047513 A 1.00009503,1 90 0,1 89.70710679,53.70764912 A 1.00009503,1 90 0,1 89.00000001,54.00057018 M 89,54.00057018 L 83,54.00057018 M 83,54.00057018 A 1.00009503,1 90 0,1 82.29289322,53.70764913 A 1.00009503,1 90 0,1 82,53.00047515 M 30,13.00123539 L 30,6.99952485 M 30,6.99952487 A 1.00009503,1 90 0,1 30.29289321,6.29235088 A 1.00009503,1 90 0,1 30.99999999,5.99942982 M 31,5.99942982 L 37,5.99942982 M 37,5.99942982 A 1.00009503,1 90 0,1 37.70710678,6.29235087 A 1.00009503,1 90 0,1 38,6.99952485 L 38,13.00009503 A 1.00009503,1 90 0,1 37,13.9990497 L 31,13.9990497 A 1.00009503,1 90 0,1 30,13.00009503 M 30,53.00047515 L 30,46.99990497 M 30,46.99990497 A 1.00009503,1 90 0,1 30.29289322,46.29273099 A 1.00009503,1 90 0,1 31,45.99980994 M 31,45.99980994 L 37,45.99980994 M 37,45.99980994 A 1.00009503,1 90 0,1 37.70710678,46.29273099 A 1.00009503,1 90 0,1 38,46.99990497 M 38,46.99990497 L 38,53.00047515 A 1.00009503,1 90 0,1 37,53.99942982 L 31,53.99942982 A 1.00009503,1 90 0,1 30,53.00047515",viewW:120,viewH:60},coffee_table_rounded:{d:"M 0,10.00057016 C 0,4.47802041 4.47649573,0 10,0 L 110,0 C 115.52350427,0 120,4.47802041 120,10.00057016 L 120,49.99942984 C 120,55.52197959 115.52350427,60 110,60 L 10,60 C 4.47649573,60 0,55.52197959 0,49.99942984 L 0,10.00057016 M 106,13.00188152 L 106,7.00039911 M 106,7.00039913 A 1.00005702,1 90 0,1 106.29289321,6.29325202 A 1.00005702,1 90 0,1 106.99999999,6.00034209 M 107,6.00034209 L 113,6.00034209 A 1.00005702,1 90 0,1 113.70710678,6.29325201 A 1.00005702,1 90 0,1 114,7.00039911 L 114,13.00074121 M 114,13.00074119 A 1.00005702,1 90 0,1 113.70710679,13.70788829 A 1.00005702,1 90 0,1 113.00000001,14.00079822 M 113,14.00079822 L 107,14.00079822 M 107,14.00079822 A 1.00005702,1 90 0,1 106.29289322,13.7078883 A 1.00005702,1 90 0,1 106,13.00074121 M 106,53.00074121 L 106,47.00039911 M 106,47.00039913 A 1.00005702,1 90 0,1 106.29289321,46.29325202 A 1.00005702,1 90 0,1 106.99999999,46.00034209 M 107,46.00034209 L 113,46.00034209 M 113,46.00034209 A 1.00005702,1 90 0,1 113.70710678,46.29325201 A 1.00005702,1 90 0,1 114,47.00039911 M 114,47.00039911 L 114,53.00074121 M 114,53.00074119 A 1.00005702,1 90 0,1 113.70710679,53.70788829 A 1.00005702,1 90 0,1 113.00000001,54.00079822 M 113,54.00079822 L 107,54.00079822 M 107,54.00079822 A 1.00005702,1 90 0,1 106.29289322,53.7078883 A 1.00005702,1 90 0,1 106,53.00074121 M 6,13.00188152 L 6,7.00039911 M 6,7.00039913 A 1.00005702,1 90 0,1 6.29289321,6.29325202 A 1.00005702,1 90 0,1 6.99999999,6.00034209 M 7,6.00034209 L 13,6.00034209 A 1.00005702,1 90 0,1 13.70710678,6.29325201 A 1.00005702,1 90 0,1 14,7.00039911 L 14,13.00074121 M 14,13.00074119 A 1.00005702,1 90 0,1 13.70710679,13.70788829 A 1.00005702,1 90 0,1 13.00000001,14.00079822 M 13,14.00079822 L 7,14.00079822 M 7,14.00079822 A 1.00005702,1 90 0,1 6.29289322,13.7078883 A 1.00005702,1 90 0,1 6,13.00074121 M 6,53.00074121 L 6,47.00039911 M 6,47.00039911 A 1.00005702,1 90 0,1 6.29289322,46.29325201 A 1.00005702,1 90 0,1 7,46.00034209 M 7,46.00034209 L 13,46.00034209 M 13,46.00034209 A 1.00005702,1 90 0,1 13.70710678,46.29325201 A 1.00005702,1 90 0,1 14,47.00039911 M 14,47.00039911 L 14,53.00074121 M 14,53.00074121 A 1.00005702,1 90 0,1 13.70710678,53.7078883 A 1.00005702,1 90 0,1 13,54.00079822 M 13,54.00079822 L 7,54.00079822 M 7,54.00079822 A 1.00005702,1 90 0,1 6.29289322,53.7078883 A 1.00005702,1 90 0,1 6,53.00074121",viewW:120,viewH:60},table_dining:{d:"M 0,2.50060665 C 0,1.11926717 1.11927063,0 2.49917894,0 L 157.49871914,0 C 158.87967841,0 160,1.11926717 160,2.50060665 L 160,87.49939335 C 160,88.88073283 158.87967841,90 157.49871914,90 L 2.49917894,90 C 1.11927063,90 0,88.88073283 0,87.49939335 L 0,2.50060665 M 142.00023647,16.99975734 L 142.00023647,10.99939335 A 1.00051234,1.00024266 0 0,1 142.99969785,10.00024266 L 149.00066999,10.00024266 A 1.00051234,1.00024266 0 0,1 149.99908041,10.99939335 L 149.99908041,16.99975734 A 1.00051234,1.00024266 0 0,1 149.00066999,18 L 142.99969785,18 A 1.00051234,1.00024266 0 0,1 142.00023647,16.99975734 M 141.99918551,78.99951468 L 141.99918551,72.99915069 A 1.00051234,1.00024266 0 0,1 142.99969785,72 L 148.99961903,72 A 1.00051234,1.00024266 0 0,1 149.99908041,72.99915069 L 149.99908041,78.99951468 A 1.00051234,1.00024266 0 0,1 148.99961903,79.99975734 L 142.99864689,79.99975734 A 1.00051234,1.00024266 0 0,1 142.00023647,78.99951468 M 9.99986863,16.99975734 L 9.99986863,10.99939335 A 1.00051234,1.00024266 0 0,1 10.99933001,9.99915069 L 17.00030215,9.99915069 A 1.00051234,1.00024266 0 0,1 17.99871258,10.99939335 L 17.99871258,16.99975734 A 1.00051234,1.00024266 0 0,1 17.00030215,17.99890803 L 10.99933001,17.99890803 A 1.00051234,1.00024266 0 0,1 9.99986863,16.99975734 M 9.99881767,79.00060665 L 9.99881767,73.00024266 A 1.00051234,1.00024266 0 0,1 10.99933001,72 L 16.99925119,72 A 1.00051234,1.00024266 0 0,1 17.99871258,73.00024266 L 17.99871258,79.00060665 A 1.00051234,1.00024266 0 0,1 16.99925119,79.99975734 L 10.99827906,79.99975734 A 1.00051234,1.00024266 0 0,1 9.99986863,79.00060665",viewW:160,viewH:90},table_round:{d:"M 0,55 A 55,55 90 0,0 55,110 A 55,55 90 0,0 110,55 A 55,55 90 0,0 55,0 A 55,55 90 0,0 0,55 M 82.94844112,30.60630783 L 78.70638697,26.36425368 A 0.99952125,0.99952125 90 0,1 78.41321383,25.65706553 A 0.99952125,0.99952125 90 0,1 78.70638697,24.94987738 M 78.70638697,24.94987738 L 82.94844112,20.70674848 A 0.99952125,0.99952125 90 0,1 83.65562927,20.41357533 A 0.99952125,0.99952125 90 0,1 84.36281742,20.70674848 L 88.60594632,24.94987738 M 88.60594632,24.94987738 A 0.99952125,0.99952125 90 0,1 88.89911946,25.65706553 A 0.99952125,0.99952125 90 0,1 88.60594632,26.36425368 L 84.36281742,30.60630783 A 0.99952125,0.99952125 90 0,1 83.65562927,30.89948097 A 0.99952125,0.99952125 90 0,1 82.94844112,30.60630783 M 82.94844112,89.6070797 L 78.70638697,85.3639508 A 0.99952125,0.99952125 90 0,1 78.41321383,84.65676265 A 0.99952125,0.99952125 90 0,1 78.70638697,83.9495745 L 82.94844112,79.70752035 A 0.99952125,0.99952125 90 0,1 83.65562927,79.4143472 A 0.99952125,0.99952125 90 0,1 84.36281742,79.70752035 L 88.60594632,83.9495745 A 0.99952125,0.99952125 90 0,1 88.89911946,84.65676265 A 0.99952125,0.99952125 90 0,1 88.60594632,85.3639508 L 84.36174266,89.6070797 A 0.99952125,0.99952125 90 0,1 83.65455451,89.90025284 A 0.99952125,0.99952125 90 0,1 82.94736636,89.6070797 M 24.94934,30.60738258 L 20.70728586,26.36425368 A 0.99952125,0.99952125 90 0,1 20.70728586,24.95095213 L 24.95041476,20.70782323 A 0.99952125,0.99952125 90 0,1 26.3637163,20.70782323 L 30.60684521,24.95095213 A 0.99952125,0.99952125 90 0,1 30.60684521,26.36425368 L 26.3637163,30.60738258 A 0.99952125,0.99952125 90 0,1 24.95041476,30.60738258 M 24.94934,89.29325152 L 20.70728586,85.05012262 A 0.99952125,0.99952125 90 0,1 20.41411271,84.34293447 A 0.99952125,0.99952125 90 0,1 20.70728586,83.63574632 L 24.95041476,79.39369217 A 0.99952125,0.99952125 90 0,1 26.3637163,79.39369217 L 30.60684521,83.63574632 A 0.99952125,0.99952125 90 0,1 30.90001835,84.34293447 A 0.99952125,0.99952125 90 0,1 30.60684521,85.05012262 L 26.3637163,89.29325152 A 0.99952125,0.99952125 90 0,1 24.95041476,89.29325152",viewW:110,viewH:110},table_dining_oval:{d:"M 0,50 C 0,22.38579779 22.38594332,0 49.99994193,0 L 129.99901287,0 C 157.61301149,0 180,22.38579779 180,50 C 180,77.61420221 157.61301149,100 129.99901287,100 L 49.99994193,100 C 22.38594332,100 0,77.61420221 0,50 M 123.99960515,16.99935051 L 123.99960515,10.99805153 A 1.00024968,1.0002165 0 0,1 124.99880964,9.99783503 L 130.99821737,9.99783503 M 130.99821737,9.99783503 A 1.00024968,1.0002165 0 0,1 131.70617646,10.29042188 A 1.00024968,1.0002165 0 0,1 131.99951224,10.99805153 M 131.99951224,10.99805153 L 131.99951224,16.99826802 A 1.00024968,1.0002165 0 0,1 130.99926256,17.99848452 L 124.99985483,17.99848452 A 1.00024968,1.0002165 0 0,1 124.29189574,17.70589767 A 1.00024968,1.0002165 0 0,1 123.99855996,16.99826802 M 123.99960515,89.00086599 L 123.99960515,83.00064949 M 123.99960515,83.00064951 A 1.00024968,1.0002165 0 0,1 124.29257149,82.29338963 A 1.00024968,1.0002165 0 0,1 124.99985482,82.00043299 M 124.99985483,82.00043299 L 130.99926256,82.00043299 A 1.00024968,1.0002165 0 0,1 131.70654589,82.29338962 A 1.00024968,1.0002165 0 0,1 131.99951224,83.00064949 L 131.99951224,89.00086599 M 131.99951224,89.00086597 A 1.00024968,1.0002165 0 0,1 131.7065459,89.70812585 A 1.00024968,1.0002165 0 0,1 130.99926257,90.00108249 M 130.99926256,90.00108249 L 124.99985483,90.00108249 A 1.00024968,1.0002165 0 0,1 124.2925715,89.70812586 A 1.00024968,1.0002165 0 0,1 123.99960515,89.00086599 M 47.99944256,17.00043299 L 47.99944256,11.0002165 M 47.99944256,11.00021648 A 1.00024968,1.0002165 0 0,1 48.29240892,10.29295662 A 1.00024968,1.0002165 0 0,1 48.99969226,10 M 48.99969225,10 L 54.99909997,10 A 1.00024968,1.0002165 0 0,1 55.70705907,10.29258685 A 1.00024968,1.0002165 0 0,1 56.00039485,11.0002165 L 56.00039485,16.99935051 M 56.00039485,16.99935052 A 1.00024968,1.0002165 0 0,1 55.70742849,17.70661039 A 1.00024968,1.0002165 0 0,1 55.00014515,17.99956701 M 55.00014517,17.99956701 L 49.00073744,17.99956701 A 1.00024968,1.0002165 0 0,1 48.29277835,17.70698015 A 1.00024968,1.0002165 0 0,1 47.99944256,16.99935051 M 47.99944256,89.00194847 L 47.99944256,83.00173198 M 47.99944256,83.00173199 A 1.00024968,1.0002165 0 0,1 48.2924089,82.29447212 A 1.00024968,1.0002165 0 0,1 48.99969223,82.00151548 M 48.99969225,82.00151548 L 54.99909997,82.00151548 A 1.00024968,1.0002165 0 0,1 55.70638331,82.29447211 A 1.00024968,1.0002165 0 0,1 55.99934966,83.00173198 L 55.99934966,89.00194847 A 1.00024968,1.0002165 0 0,1 54.99909997,90.00108249 L 48.99969225,90.00108249 M 48.99969225,90.00108249 A 1.00024968,1.0002165 0 0,1 48.29240891,89.70812586 A 1.00024968,1.0002165 0 0,1 47.99944256,89.00086599",viewW:180,viewH:100},table_dining_rounded:{d:"M 0,15.00018199 C 0,6.71552153 6.71566792,0 14.99937599,0 L 144.99957305,0 C 153.28433208,0 160,6.71552153 160,15.00018199 L 160,74.99981801 C 160,83.28447847 153.28433208,90 144.99957305,90 L 14.99937599,90 C 6.71566792,90 0,83.28447847 0,74.99981801 L 0,15.00018199 M 142.0011692,16.99955109 L 142.0011692,10.9992599 A 1.00051891,1.00023052 0 0,1 143.00063715,10.00012133 L 149.0016487,10.00012133 A 1.00051891,1.00023052 0 0,1 150.00006569,10.9992599 L 150.00006569,16.99955109 A 1.00051891,1.00023052 0 0,1 149.0016487,17.99978161 L 143.00063715,17.99978161 A 1.00051891,1.00023052 0 0,1 142.0011692,16.99955109 M 142.00011823,78.99855619 L 142.00011823,72.99826501 A 1.00051891,1.00023052 0 0,1 143.00063715,71.99912644 L 149.00059774,71.99912644 A 1.00051891,1.00023052 0 0,1 150.00006569,72.99826501 L 150.00006569,78.99855619 A 1.00051891,1.00023052 0 0,1 149.00059774,79.99878672 L 142.99958618,79.99878672 A 1.00051891,1.00023052 0 0,1 142.0011692,78.99855619 M 9.99993431,16.99955109 L 9.99993431,10.9992599 A 1.00051891,1.00023052 0 0,1 10.99940226,9.99902937 L 17.00041382,9.99902937 A 1.00051891,1.00023052 0 0,1 17.9988308,10.9992599 L 17.9988308,16.99955109 A 1.00051891,1.00023052 0 0,1 17.00041382,17.99868965 L 10.99940226,17.99868965 A 1.00051891,1.00023052 0 0,1 9.99993431,16.99955109 M 9.99888335,78.99964815 L 9.99888335,72.99935696 A 1.00051891,1.00023052 0 0,1 10.99940226,71.99912644 L 16.99936285,71.99912644 A 1.00051891,1.00023052 0 0,1 17.9988308,72.99935696 L 17.9988308,78.99964815 A 1.00051891,1.00023052 0 0,1 16.99936285,79.99878672 L 10.9983513,79.99878672 A 1.00051891,1.00023052 0 0,1 9.99993431,78.99964815",viewW:160,viewH:90},desk:{d:"M 0,2.5007596 C 0,1.11940895 1.11872146,0 2.4999244,0 L 137.5000756,0 C 138.88127854,0 140,1.11940895 140,2.5007596 L 140,67.50035981 C 140,68.88171046 138.88127854,70 137.5000756,70 L 2.4999244,70 C 1.11872146,70 0,68.88059105 0,67.50035981 L 0,2.5007596 M 6.00003024,12.99969616 L 6.00003024,6.99966418 A 1.00018144,0.99963219 0 0,1 6.2929766,6.29281747 A 1.00018144,0.99963219 0 0,1 7.00021168,6.00003198 L 13.00130031,6.00003198 A 1.00018144,0.99963219 0 0,1 14.00042336,6.99966418 L 14.00042336,12.99969616 M 14.00042336,12.99969616 A 1.00018144,0.99963219 0 0,1 13.70787328,13.70726661 A 1.00018144,0.99963219 0 0,1 13.00024192,14.00044776 M 13.00024192,14.00044776 L 7.00021168,14.00044776 A 1.00018144,0.99963219 0 0,1 6.29258032,13.70726661 A 1.00018144,0.99963219 0 0,1 6.00003024,12.99969616 M 125.99957664,13.00081557 L 125.99957664,7.00078359 M 125.99957664,7.00078359 A 1.00018144,0.99963219 0 0,1 126.29212672,6.29321313 A 1.00018144,0.99963219 0 0,1 126.99975808,6.00003198 L 133.00084671,6.00003198 M 133.00084671,6.00003198 A 1.00018144,0.99963219 0 0,1 133.70779377,6.29358707 A 1.00018144,0.99963219 0 0,1 133.99996976,7.00078359 M 133.99996976,7.00078359 L 133.99996976,13.00081557 A 1.00018144,0.99963219 0 0,1 132.99978832,14.00044776 L 126.99975808,14.00044776 A 1.00018144,0.99963219 0 0,1 125.99957664,13.00081557 M 5.99897185,63.00033582 L 5.99897185,57.00030384 M 5.99897185,57.00030384 A 1.00018144,0.99963219 0 0,1 6.29229231,56.29308288 A 1.00018144,0.99963219 0 0,1 7.00021168,56.00067165 M 7.00021168,56.00067165 L 13.00024192,56.00067165 A 1.00018144,0.99963219 0 0,1 13.707477,56.29345714 A 1.00018144,0.99963219 0 0,1 14.00042336,57.00030384 L 14.00042336,63.00033582 M 14.00042336,63.00033582 A 1.00018144,0.99963219 0 0,1 13.70787328,63.70790627 A 1.00018144,0.99963219 0 0,1 13.00024192,64.00108743 M 13.00024192,64.00108743 L 6.99915329,64.00108743 M 6.99915329,64.00108743 A 1.00018144,0.99963219 0 0,1 6.29220623,63.70753234 A 1.00018144,0.99963219 0 0,1 6.00003024,63.00033582 M 126.00063504,63.00145523 L 126.00063504,57.00142325 M 126.00063504,57.00142325 A 1.00018144,0.99963219 0 0,1 126.29318511,56.2938528 A 1.00018144,0.99963219 0 0,1 127.00081647,56.00067165 L 133.00084671,56.00067165 A 1.00018144,0.99963219 0 0,1 133.70847808,56.2938528 A 1.00018144,0.99963219 0 0,1 134.00102815,57.00142325 L 134.00102815,63.00145523 A 1.00018144,0.99963219 0 0,1 133.00084671,64.00108743 L 126.99975808,64.00108743 A 1.00018144,0.99963219 0 0,1 126.00063504,63.00145523 M 22.99993952,60.00031983 L 117.00006048,60.00031983",viewW:140,viewH:70},desk_corner:{d:"M 159.99894904,65.49825605 A 2.50129729,2.50128086 90 0,1 157.49871914,67.99955334 L 94.99927747,67.99955334 C 81.19178676,67.99955334 69.99908041,79.19233321 69.99908041,92.99886364 L 69.99908041,157.49870271 A 2.50129729,2.50128086 90 0,1 67.49885051,160 L 2.49917894,160 A 2.50129729,2.50128086 90 0,1 0,157.49870271 L 0,2.49814439 A 2.50129729,2.50128086 90 0,1 2.49917894,0 L 157.49871914,0 A 2.50129729,2.50128086 90 0,1 160,2.49919535 L 159.99894904,65.49825605 M 5.99992118,12.99938913 L 5.99992118,6.99837757 M 5.99992118,6.99837757 A 0.99841698,0.99841043 90 0,1 6.29272029,6.29201832 A 0.99841698,0.99841043 90 0,1 6.99938256,5.99996059 M 6.99938256,5.99996059 L 13.0003547,5.99996059 A 0.99841698,0.99841043 90 0,1 13.99876512,6.99837757 L 13.99876512,12.99938913 M 13.99876512,12.99938913 A 0.99841698,0.99841043 90 0,1 13.70670931,13.70605604 A 0.99841698,0.99841043 90 0,1 13.0003547,13.99885708 M 13.0003547,13.99885708 L 6.99938256,13.99885708 A 0.99841698,0.99841043 90 0,1 6.29234827,13.70642806 A 0.99841698,0.99841043 90 0,1 5.99992118,12.99938913 M 146.00018392,13.00044009 L 146.00018392,6.99942854 M 146.00018392,6.99942854 A 0.99841698,0.99841043 90 0,1 146.29261101,6.2923896 A 0.99841698,0.99841043 90 0,1 146.9996453,5.99996059 M 146.9996453,5.99996059 L 153.00061744,5.99996059 A 0.99841698,0.99841043 90 0,1 153.70697205,6.29276163 A 0.99841698,0.99841043 90 0,1 153.99902786,6.99942854 L 153.99902786,13.00044009 M 153.99902786,13.00044009 A 0.99841698,0.99841043 90 0,1 153.70697205,13.707107 A 0.99841698,0.99841043 90 0,1 153.00061744,13.99990804 L 146.9996453,13.99990804 A 0.99841698,0.99841043 90 0,1 146.29261101,13.70747903 A 0.99841698,0.99841043 90 0,1 146.00018392,13.00044009 M 146.00018392,61.0001248 L 146.00018392,54.99911325 M 146.00018392,54.99911325 A 0.99841698,0.99841043 90 0,1 146.29298209,54.29170176 A 0.99841698,0.99841043 90 0,1 147.00069626,53.9996453 M 147.00069626,53.9996453 L 153.00061744,53.9996453 M 153.00061744,53.9996453 A 0.99841698,0.99841043 90 0,1 153.70765173,54.29207431 A 0.99841698,0.99841043 90 0,1 154.00007882,54.99911325 L 154.00007882,61.0001248 M 154.00007882,61.0001248 A 0.99841698,0.99841043 90 0,1 153.70765173,61.70716374 A 0.99841698,0.99841043 90 0,1 153.00061744,61.99959275 M 153.00061744,61.99959275 L 146.9996453,61.99959275 A 0.99841698,0.99841043 90 0,1 146.29329069,61.70679171 A 0.99841698,0.99841043 90 0,1 146.00123488,61.0001248 M 5.99887022,152.9995205 L 5.99887022,147.00061087 M 5.99887022,147.00061087 A 0.99841698,0.99841043 90 0,1 6.29129565,146.29251931 A 0.99841698,0.99841043 90 0,1 6.99938256,146.00009196 M 6.99938256,146.00009196 L 12.99930374,146.00009196 A 0.99841698,0.99841043 90 0,1 13.70671058,146.29289205 A 0.99841698,0.99841043 90 0,1 13.99876512,147.00061087 L 13.99876512,153.00057146 M 13.99876512,153.00057146 A 0.99841698,0.99841043 90 0,1 13.70633803,153.7076104 A 0.99841698,0.99841043 90 0,1 12.99930374,154.00003941 M 12.99930374,154.00003941 L 6.9983316,154.00003941 A 0.99841698,0.99841043 90 0,1 6.29129731,153.7076104 A 0.99841698,0.99841043 90 0,1 5.99887022,153.00057146 M 55.99926433,153.00057146 L 55.99926433,147.00061087 M 55.99926433,147.00061087 A 0.99841698,0.99841043 90 0,1 56.2920625,146.29319939 A 0.99841698,0.99841043 90 0,1 56.99977667,146.00114292 M 56.99977667,146.00114292 L 62.99969785,146.00114292 A 0.99841698,0.99841043 90 0,1 63.70673214,146.29357194 A 0.99841698,0.99841043 90 0,1 63.99915923,147.00061087 L 63.99915923,153.00162243 M 63.99915923,153.00162243 A 0.99841698,0.99841043 90 0,1 63.70636012,153.70798168 A 0.99841698,0.99841043 90 0,1 62.99969785,154.00003941 M 62.99969785,154.00003941 L 56.99872571,154.00003941 M 56.99872571,154.00003941 A 0.99841698,0.99841043 90 0,1 56.29206344,153.70798168 A 0.99841698,0.99841043 90 0,1 55.99926433,153.00162243 M 109.99960589,57.99856806 L 96.36237044,57.99856806 A 36.36339751,36.36315866 90 0,0 70.64973437,68.6491606 A 36.36339751,36.36315866 90 0,0 59.99921178,94.36196557 L 59.99921178,107.9992906",viewW:160,viewH:160},chair:{d:"M 41.91143767,10.29325717 L 8.08739211,10.29325717 A 5.14662859,5.14662858 90 0,1 2.94076353,5.14662859 A 5.14662859,5.14662858 90 0,1 8.08739211,0 L 41.91143767,0 A 5.14662859,5.14662858 90 0,1 47.05806625,5.14662859 A 5.14662859,5.14662858 90 0,1 41.91143767,10.29325717 M 8.08739211,10.29325717 L 5.14662867,10.29325717 A 5.14896903,5.14896902 90 0,0 0.00000009,15.44105598 L 0.00000009,42.64633596 M 0.00000009,42.64633596 A 7.35249373,7.35249371 90 0,0 2.15308186,47.84609063 A 7.35249373,7.35249371 90 0,0 7.35249381,49.99999991 M 7.35249381,49.99999991 L 42.64633597,49.99999991 M 42.64633597,49.99999991 A 7.35249373,7.35249371 90 0,0 47.84650445,47.84650445 A 7.35249373,7.35249371 90 0,0 49.99999991,42.64633596 M 49.99999991,42.64633596 L 49.99999991,15.44105598 C 49.99999991,12.59742081 47.69466605,10.29325717 44.85220111,10.29325717 L 41.91143767,10.29325717",viewW:50,viewH:50},chair_bar:{d:"M 41.6420124,15.95288922 C 43.22061234,18.92793522 43.95991141,23.03717335 43.95991141,26.63643725 C 43.95991141,38.43533309 34.35259503,48 22.5011905,48 C 10.64978597,48 1.04127909,38.43533309 1.04127909,26.63643725 C 1.04127909,23.03717335 1.73891074,18.91969084 3.31751068,15.94464483 M 41.6420124,15.95288922 A 4.27388672,4.22819286 0 0,1 37.67408359,14.80338609 M 41.6420124,15.95288922 A 4.28579169,4.23997056 0 0,0 43.74324083,14.80338609 M 3.47227538,15.97644461 L 3.31751068,15.94464483 A 4.28579169,4.23997056 0 0,1 1.25675917,14.80338609 M 37.67408359,14.80338609 A 21.42895847,21.19985278 0 0,0 30.71205308,10.17239603 A 21.34562363,21.11740891 0 0,0 14.28794692,10.17239603 A 21.42895847,21.19985278 0 0,0 7.32591641,14.80338609 A 4.27388672,4.22819286 0 0,1 3.47227538,15.97644461 M 37.67408359,14.80338609 A 4.27388672,4.22819286 0 0,0 40.70866221,16.0541972 A 4.27388672,4.22819286 0 0,0 43.74324083,14.80338609 M 3.47227538,15.97644461 A 4.28579169,4.23997056 0 0,1 1.25675917,14.80338609 A 4.33817359,4.29179242 0 0,1 1.25675917,8.76142805 A 30.00054185,29.67979389 0 0,1 11.00336378,2.2778064 A 29.88149208,29.56201693 0 0,1 22.5,0 A 29.88149208,29.56201693 0 0,1 33.99663622,2.2778064 A 30.00054185,29.67979389 0 0,1 43.74324083,8.76142805 A 4.33817359,4.29179242 0 0,1 43.74324083,14.80338609",viewW:45,viewH:48},armchair:{d:"M 78.52464784,10.06903664 Q 78.5377513,9.82334385 78.5377513,9.57437515 C 78.5377513,4.28597428 74.26056466,0 68.98533141,0 L 21.01357664,0 C 15.73943534,0 11.4622487,4.28597428 11.4622487,9.57437515 Q 11.4622487,9.82334385 11.4742602,10.06903664 M 80.08614309,74.58141228 Q 80.73039638,74.68078136 81.40304049,74.68187333 C 86.15085961,74.68187333 90,70.8239505 90,66.06406212 L 90,18.19218636 C 90,13.43229799 86.15085961,9.57437515 81.40304049,9.57437515 C 80.39407433,9.57437515 79.42441853,9.74909003 78.52464784,10.06903664 A 8.61562727,8.61552274 90 0,0 72.80608097,18.19109439 L 72.80608097,18.35270565 A 9.50012133,9.50000607 90 0,1 68.98533141,19.14984227 L 21.01357664,19.14984227 A 9.50012133,9.50000607 90 0,1 17.19282707,18.35270565 M 72.80608097,18.35270565 L 72.80608097,66.06406212 A 8.61562727,8.61552274 90 0,0 80.08614309,74.58141228 M 11.4742602,10.06794467 A 8.61562727,8.61552274 90 0,1 17.19282707,18.19000243 L 17.19282707,18.35161369 L 17.19282707,66.06406212 A 8.61562727,8.61552274 90 0,1 9.91385691,74.58141228 Q 9.26960362,74.68078136 8.59695951,74.68187333 C 3.84914039,74.68187333 0,70.8239505 0,66.06406212 L 0,18.19218636 C 0,13.43229799 3.84914039,9.57437515 8.59695951,9.57437515 C 9.60592567,9.57437515 10.57448951,9.74909003 11.4742602,10.06903664 M 80.08614309,74.58141228 C 78.35539486,83.37175443 70.62217153,90 61.34383228,90 L 28.65507577,90 C 19.37782847,90 11.64460514,83.37175443 9.91385691,74.58141228",viewW:90,viewH:90},armchair_office:{d:"M 60.12480149,17.08328496 Q 60.12480149,16.66780357 60.06834946,16.27038659 M 51.18618701,11.38735127 L 13.81381391,11.38735127 A 5.69036465,5.69028856 0 0,1 9.79038036,9.71870864 A 5.69036465,5.69028856 0 0,1 8.12570733,5.69367564 M 8.12570733,5.69367564 A 5.69036465,5.69028856 0 0,1 9.79038036,1.66864264 A 5.69036465,5.69028856 0 0,1 13.81381391,0 M 13.81381391,0 L 51.18844509,0 M 51.18844509,0 A 5.69036465,5.69028856 0 0,1 55.21187864,1.66864264 A 5.69036465,5.69028856 0 0,1 56.87655166,5.69367564 M 56.87655166,5.69367564 A 5.69036465,5.69028856 0 0,1 55.21187864,9.71870864 A 5.69036465,5.69028856 0 0,1 51.18844509,11.38735127 M 13.81381391,11.38735127 L 10.56217696,11.38735127 A 5.69036465,5.69028856 0 0,0 4.9327805,16.26812854 M 51.18731605,11.38735127 L 54.43782395,11.38735127 A 5.69036465,5.69028856 0 0,1 60.06722042,16.26925757 M 60.12480149,44.29844483 A 4.87745542,4.87739019 0 0,0 63.57342145,42.86789464 A 4.87745542,4.87739019 0 0,0 64.99999882,39.41766756 M 64.99999882,39.41766756 L 64.99999882,21.15003484 M 64.99999882,21.15003484 A 4.87745542,4.87739019 0 0,0 63.55272454,17.68002711 A 4.87745542,4.87739019 0 0,0 60.06722042,16.27038659 M 60.12480149,44.29957385 A 4.87745542,4.87739019 0 0,1 56.67618152,42.86902366 A 4.87745542,4.87739019 0 0,1 55.24960415,39.41879658 M 55.24960415,39.41879658 L 55.24960415,21.15003484 A 4.87745542,4.87739019 0 0,1 60.06722042,16.27038659 M 46.69937964,58.31529651 L 52.00022529,58.31529651 C 52.83119917,58.31529651 53.632818,58.18997468 54.38814617,57.95739542 A 8.14038277,8.14027391 0 0,0 60.12480149,50.1795387 L 60.12480149,44.29957385 M 4.9327805,16.26925757 L 4.87519943,16.26925757 M 4.87519943,16.26925757 A 4.87745542,4.87739019 0 0,0 1.42657946,17.69980776 A 4.87745542,4.87739019 0 0,0 0.00000209,21.15003484 L 0.00000209,39.41766756 M 0.00000209,39.41766756 A 4.87745542,4.87739019 0 0,0 1.42617995,42.86862456 A 4.87745542,4.87739019 0 0,0 4.87519943,44.29957385 M 4.87519943,44.29957385 A 4.87745542,4.87739019 0 0,0 8.32308951,42.86862466 A 4.87745542,4.87739019 0 0,0 9.74926772,39.41879658 M 9.74926772,39.41879658 L 9.74926772,21.15003484 A 4.87745542,4.87739019 0 0,0 4.9327805,16.26925757 M 18.40788013,58.31416748 L 12.99977563,58.31416748 A 8.12909236,8.12898366 0 0,1 10.69653279,57.98223398 A 8.14038277,8.14027391 0 0,1 4.87519943,50.18066772 L 4.87519943,44.29844483 M 46.70050868,58.31416748 L 52.5455519,64.16590669 C 53.63959225,65.26106143 55.40654079,65.28025487 56.52429099,64.20880966 A 2.85195657,2.85191843 0 0,0 57.39975759,62.18274316 A 2.85195657,2.85191843 0 0,0 56.56719454,60.1386727 L 54.38814617,57.95739542 M 46.69937964,58.31416748 L 18.40900917,58.31416748 M 10.69766183,57.98223398 L 8.54232332,60.1386727 C 7.41554079,61.26769821 7.43586352,63.10462271 8.58522686,64.20880966 C 9.70297706,65.28025487 11.46992561,65.26106143 12.56396596,64.16590669 L 18.40900917,58.31416748",viewW:65,viewH:65},sofa:{d:"M 89.9994774,17.00719477 L 89.9994774,79.3698208 M 89.9994774,17.00828672 L 89.9994774,4.25097973 M 89.9994774,17.00610281 C 89.9994774,19.35489742 88.08050309,21.25817449 85.71418617,21.25817449 L 27.85648339,21.25817449 A 11.68391551,11.18356492 90 0,1 23.53356521,20.35731185 M 89.9994774,17.00719477 C 89.9994774,19.35598937 91.91845172,21.25926645 94.28476863,21.25926645 L 152.14247142,21.25926645 C 153.68099549,21.25926645 155.14322047,20.93823176 156.46643479,20.3584038 M 89.9994774,79.3698208 C 89.9994774,85.24016937 85.20204161,90 79.28624932,90 L 27.8554382,90 C 22.35145195,90 17.81635959,85.8811468 17.21014766,80.58189054 M 89.9994774,79.3698208 C 89.9994774,85.24016937 94.7969132,90 100.71270548,90 L 152.14247142,90 C 157.64645767,90 162.18155002,85.8811468 162.78776195,80.58189054 M 89.9994774,4.25207168 C 89.9994774,1.90436903 88.07945789,0 85.71314098,0 L 27.85648339,0 C 21.93964591,0 17.14325531,4.75873867 17.14325531,10.6301792 Q 17.14325531,11.08443237 17.18088226,11.53104185 M 89.9994774,4.25207168 C 89.9994774,1.90436903 91.91845172,0 94.28476863,0 L 152.14247142,0 C 158.0593089,0 162.8556995,4.75873867 162.8556995,10.6301792 Q 162.8556995,11.08443237 162.81807255,11.53104185 A 11.68391551,11.18356492 90 0,1 167.14203592,10.6301792 L 169.28468154,10.6301792 C 175.20256421,10.6301792 180,15.38891787 180,21.25926645 L 180,70.86676939 C 180,76.73711797 175.20256421,81.49585664 169.28572673,81.49585664 L 167.14308111,81.49585664 C 165.59201473,81.49585664 164.11829262,81.16827022 162.78776195,80.58189054 C 159.04074511,78.92539523 156.42880784,75.19855377 156.42880784,70.86567744 L 156.42880784,21.2603584 Q 156.42880784,20.80501329 156.46643479,20.35949576 C 156.80089654,16.40443576 159.31772125,13.06523823 162.81807255,11.5321338 M 17.18088226,11.5321338 C 20.68227875,13.06523823 23.19910346,16.40443576 23.53356521,20.35949576 Q 23.57119216,20.80501329 23.57119216,21.2603584 L 23.57119216,70.86786135 C 23.57119216,75.19964572 20.9582097,78.92648718 17.21119286,80.58298249 A 11.68391551,11.18356492 90 0,1 12.85691889,81.49694859 L 10.71427327,81.49694859 C 4.7963906,81.49694859 0,76.73820992 0,70.86676939 L 0,21.2603584 C 0,15.39000983 4.79743579,10.63127116 10.71322808,10.63127116 L 12.85587369,10.63127116 C 14.39544296,10.63127116 15.85766794,10.95230584 17.18088226,11.5321338",viewW:180,viewH:90},sofa_three_seat:{d:"M 85.42409676,16.16420572 L 85.42409676,79.89832688 M 85.42409676,16.16529768 L 85.42409676,4.04132442 M 85.42409676,16.16420572 C 85.42409676,18.39616117 83.60262573,20.20553014 81.35628263,20.20553014 L 26.44130873,20.20553014 C 24.98061715,20.20553014 23.59228821,19.89978282 22.33731328,19.34943764 M 85.42409676,16.16420572 C 85.42409676,18.39616117 87.24556779,20.20553014 89.49191089,20.20553014 L 150.50808911,20.20553014 C 152.75546596,20.20553014 154.57590324,18.39616117 154.57590324,16.16529768 M 85.42409676,79.89614297 C 85.42409676,85.47603159 80.87145294,89.99890805 75.25507831,89.99890805 L 26.44130873,89.99890805 C 21.21672611,89.99890805 16.91218277,86.08425037 16.3363829,81.04706325 M 85.42409676,79.89614297 C 85.42409676,85.47603159 89.97674058,89.99890805 95.59311521,89.99890805 L 144.40688479,89.99890805 C 150.02325942,89.99890805 154.57590324,85.47603159 154.57590324,79.89614297 M 154.57590324,16.16311377 L 154.57590324,79.89832688 M 154.57590324,16.16529768 L 154.57590324,4.04132442 M 154.57590324,16.16420572 C 154.57590324,18.39616117 156.39737427,20.20553014 158.64475112,20.20553014 L 213.55972502,20.20553014 C 215.0204166,20.20553014 216.40874554,19.89978282 217.66372047,19.34943764 M 154.57590324,79.89723493 C 154.57590324,85.47712355 159.12958081,90 164.74595545,90 L 213.55972502,90 C 218.78430764,90 223.08885098,86.08534233 223.66465085,81.0481552 M 85.42409676,4.04132442 C 85.42409676,1.80936897 83.60262573,0 81.35628263,0 L 26.44130873,0 C 20.8249341,0 16.27125653,4.52287645 16.27125653,10.10276507 Q 16.27125653,10.53517914 16.30743785,10.95885757 M 85.42409676,4.04132442 C 85.42409676,1.80936897 87.24556779,0 89.49191089,0 L 150.50808911,0 C 152.75546596,0 154.57590324,1.80936897 154.57590324,4.04023247 C 154.57590324,1.80936897 156.39737427,0 158.64475112,0 L 213.55972502,0 C 219.17609965,0 223.72977723,4.52287645 223.72977723,10.10276507 C 223.72977723,10.38448939 223.75251977,10.66730566 223.72977723,10.94357021 M 223.66465085,81.0481552 C 224.92582829,81.60723602 226.32552851,81.91735116 227.79759136,81.91735116 L 229.83098155,81.91735116 C 235.44735618,81.91735116 240,77.39447471 240,71.81458609 L 240,20.20553014 C 240,14.62564152 235.44735618,10.10276507 229.83098155,10.10276507 L 227.79759136,10.10276507 C 222.47066729,10.10276507 218.10099757,14.17029641 217.66372047,19.34943764 Q 217.6265054,19.77202412 217.62753915,20.20553014 L 217.62753915,71.81458609 C 217.62753915,75.93234734 220.10751021,79.47464845 223.66465085,81.0481552 M 16.30743785,10.95885757 A 11.24713362,10.64764563 90 0,0 12.20344239,10.10276507 L 10.1700522,10.10276507 C 4.55367757,10.10276507 0,14.62564152 0,20.20553014 L 0,71.81458609 C 0,77.39447471 4.55367757,81.91735116 10.1700522,81.91735116 L 12.20344239,81.91735116 C 13.67550525,81.91735116 15.07417171,81.60723602 16.3363829,81.0481552 C 19.89352354,79.47464845 22.3734946,75.93234734 22.3734946,71.81458609 L 22.3734946,20.20553014 A 9.82759248,9.30376803 90 0,0 22.33731328,19.34943764 C 22.01995141,15.58983754 19.63095053,12.41661712 16.30743785,10.95885757",viewW:240,viewH:90},sofa_corner_right:{d:"M 92.54139418,17.60590034 L 92.54139418,83.62724067 M 92.54139418,17.60485243 L 92.54139418,4.40121311 M 92.54139418,17.60485243 C 92.54139418,20.03599872 90.56883033,22.00606554 88.13534854,22.00606554 L 28.64290558,22.00606554 A 11.31740513,11.1362726 90 0,1 24.19767677,21.07342752 M 92.54139418,17.60485243 C 92.54139418,20.03599872 94.51498915,22.00606554 96.94847094,22.00606554 L 163.05049792,22.00606554 C 165.48397971,22.00606554 167.45757469,20.03599872 167.45757469,17.60485243 M 92.54139418,83.62933649 C 92.54139418,89.70720221 87.609469,94.63341717 81.52473339,94.63341717 L 28.64290558,94.63341717 C 22.98299815,94.63341717 18.32019956,90.3705279 17.69636207,84.88368223 M 92.54139418,83.62933649 C 92.54139418,89.70720221 97.47435048,94.63341717 103.55805496,94.63341717 L 156.4409139,94.63341717 C 162.52461838,94.63341717 167.45757469,89.70720221 167.45757469,83.6303844 M 167.45757469,17.60694825 L 167.45757469,83.62724067 M 167.45757469,17.60485243 L 167.45757469,4.40121311 M 167.45757469,17.60485243 C 167.45757469,20.03599872 169.43116967,22.00606554 171.86362032,22.00606554 L 231.35606328,22.00606554 C 232.93782644,22.00606554 234.44225438,21.67387874 235.80232323,21.07342752 M 167.45860582,83.62828858 L 167.45860582,158.99696723 C 167.45860582,165.07378504 172.38949986,170 178.47526661,170 L 231.35606328,170 C 237.01700185,170 241.67980044,165.73711073 242.30260679,160.25026506 L 242.30260679,84.88263432 M 92.54139418,4.40121311 C 92.54139418,1.97006682 90.56883033,0 88.13534854,0 L 28.64290558,0 C 22.55920111,0 17.6262448,4.92516705 17.6262448,11.00303277 Q 17.6262448,11.47459132 17.66542798,11.93567078 M 92.54139418,4.40121311 C 92.54139418,1.97006682 94.51498915,0 96.94847094,0 L 163.05049792,0 C 165.48397971,0 167.45757469,1.97006682 167.45757469,4.40121311 C 167.45757469,1.97006682 169.43116967,0 171.86362032,0 L 231.35606328,0 C 237.43976776,0 242.3737552,4.92516705 242.3737552,11.00303277 C 242.3737552,11.31006978 242.39850247,11.6181547 242.3737552,11.91890426 M 242.30157566,84.88263432 C 243.66989359,85.49042089 245.18566403,85.82994304 246.78083197,85.82994304 L 248.98333922,85.82994304 C 255.06807483,85.82994304 260,80.90268018 260,74.82586237 L 260,22.00711345 C 260,15.92924773 255.06807483,11.00408068 248.98333922,11.00408068 L 246.78083197,11.00408068 C 241.01059294,11.00408068 236.27664595,15.4335873 235.80232323,21.07447543 Q 235.76314005,21.5355549 235.76314005,22.00711345 L 235.76314005,74.82481446 C 235.76314005,79.3098602 238.44925024,83.16720911 242.30260679,84.88158641 M 17.66645912,11.93567078 A 11.31740513,11.1362726 90 0,0 13.22019917,11.00303277 L 11.01666078,11.00303277 C 4.93295631,11.00303277 0,15.92924773 0,22.00606554 L 0,74.82586237 C 0,80.90372809 4.93192517,85.82889514 11.01666078,85.82889514 L 13.22019917,85.82889514 C 14.81433597,85.82889514 16.33010641,85.4914688 17.69739321,84.88263432 C 21.55074976,83.16825702 24.23685995,79.3109081 24.23685995,74.82586237 L 24.23685995,22.00711345 Q 24.23685995,21.5355549 24.19870791,21.07447543 C 23.85430837,16.98029933 21.26615612,13.52325123 17.66645912,11.93671869",viewW:260,viewH:170},bed_single:{d:"M 0,10.53299756 C 0,16.34997607 4.71506048,21.06599513 10.53190328,21.06599513 L 79.46700477,21.06599513 C 85.28493952,21.06599513 90,16.34997607 90,10.53299756 M 65.10670824,59.36856126 L 65.10670824,44.04670232 C 65.10670824,38.75835085 60.81969401,34.4721014 55.5313573,34.4721014 L 34.46755075,34.4721014 C 29.18030599,34.4721014 24.89329176,38.75939145 24.89329176,44.04670232 L 24.89329176,59.36752066 M 0,59.36752066 L 89.99890805,59.36752066 M 89.99890805,82.34926846 L 0,82.34926846 M 9.57425899,200 L 80.42574101,200 C 85.71298577,200 90,195.71270994 90,190.42435847 L 90,9.57564153 C 90,4.28729006 85.71298577,0 80.42574101,0 L 9.57425899,0 C 4.28592228,0 0,4.28729006 0,9.57564153 L 0,190.42435847 C 0,195.71270994 4.28592228,200 9.57425899,200",viewW:90,viewH:200},bed_double:{d:"M 0,10.58300164 C 0,16.42914748 4.74612788,21.1680845 10.60206776,21.1680845 L 149.39688128,21.1680845 C 155.25177021,21.1680845 159.99894904,16.42914748 159.99894904,10.58300164 M 74.69791516,59.65815968 L 74.69791516,44.26233773 C 74.69791516,38.94794349 70.38268021,34.63981893 65.0595762,34.63981893 L 43.85438972,34.63981893 C 38.53128572,34.63981893 34.21710172,38.94794349 34.21710172,44.26233773 L 34.21710172,59.65815968 M 128.67408468,59.65815968 L 128.67408468,44.26233773 C 128.67408468,38.94794349 124.35779877,34.63981893 119.03469476,34.63981893 L 97.83055924,34.63981893 C 92.50745524,34.63981893 88.19222028,38.94794349 88.19222028,44.26233773 L 88.19222028,59.65815968 M 0,59.65815968 L 159.99894904,59.65815968 M 159.99894904,82.7513723 L 0.00105096,82.7513723 M 9.63833896,200 L 150.36166104,200 C 155.68476505,200 160,195.69187544 160,190.3774812 L 160,9.6225188 C 160,4.30812456 155.68476505,0 150.36166104,0 L 9.63833896,0 C 4.31628591,0 0.00105096,4.30812456 0.00105096,9.6225188 L 0.00105096,190.37644059 C 0.00105096,195.69083483 4.31628591,199.99895939 9.63833896,199.99895939",viewW:160,viewH:200},nightstand:{d:"M 2.49959042,0.00000027 L 47.49923936,0.00000027 M 47.49923936,0.00000027 A 2.50053206,2.49959042 90 0,1 49.26747323,0.73197514 A 2.50053206,2.49959042 90 0,1 50,2.50053233 L 50,37.49946767 M 50,37.49946767 A 2.50053206,2.49959042 90 0,1 49.26747323,39.26802486 A 2.50053206,2.49959042 90 0,1 47.49923936,39.99999973 M 47.49923936,39.99999973 L 2.49959042,39.99999973 A 2.50053206,2.49959042 90 0,1 0,37.49946767 L 0,2.50053233 A 2.50053206,2.49959042 90 0,1 2.49959042,0.00000027",viewW:50,viewH:40},cabinet_tv:{d:"M 55.99957664,17 L 61.62493574,17 L 67.25029484,17 M 61.62493574,17 L 61.62493574,27.96904762 M 72.03105628,17 L 77.65641537,28.25 L 83.28071608,17 M 2.4999244,45 L 137.5000756,45 C 138.88127854,45 140,43.88095238 140,42.5 L 140,2.5 C 140,1.11904762 138.88127854,0 137.5000756,0 L 2.4999244,0 C 1.11872146,0 0,1.11904762 0,2.5 L 0,42.5 C 0,43.88095238 1.11872146,45 2.4999244,45",viewW:140,viewH:45},cabinet_shoe:{d:"M 39.69311439,15.91375 L 41.35449151,13.91875 M 42.60631986,17.85625 L 44.2952946,15.68375 M 2.50034497,35 L 77.49965503,35 C 78.88064026,35 80,33.88125 80,32.5 L 80,2.5 C 80,1.11875 78.88064026,0 77.50075893,0 L 2.50034497,0 C 1.11935974,0 0,1.11875 0,2.5 L 0,32.5 C 0,33.88125 1.11935974,35 2.50034497,35 M 48.82682489,17.11875 L 47.63902304,17 A 4.25,3.75327722 90 0,1 45.63764316,16.1175 L 40.57844625,11.5925 C 39.18311025,10.3425 36.96094936,11.185 36.74237616,13.04375 C 36.53815372,14.78125 34.55333241,15.66875 33.12156755,14.6675 L 31.43038499,13.48375 C 30.36180488,12.8425 29.00179385,13.6125 29.00179385,14.85875 L 29.00179385,19.1875 C 29.00179385,21.13625 30.58037809,22.71625 32.52987443,22.71625 L 48.54753691,22.71625 C 50.09741962,22.71625 51.35366358,21.46 51.35366358,19.91 C 51.35366358,18.46875 50.26079757,17.2625 48.82682489,17.11875",viewW:80,viewH:35},cabinet_sink:{d:"M 0,2.49959042 C 0,1.11873055 1.11935974,0 2.50034497,0 L 77.49965503,0 C 78.88064026,0 80,1.11873055 80,2.49959042 L 80,47.49923936 C 80,48.88009923 78.88064026,50 77.50075893,50 L 2.50034497,50 C 1.11935974,50 0,48.88009923 0,47.49923936 L 0,2.49959042 M 35.68152339,33.34893627 C 38.46888368,35.54895031 42.53125431,35.54895031 45.3186146,33.34893627 C 48.10597489,31.14892223 48.81468194,27.37964285 46.9965503,24.41196433 L 40.50669242,14.99988298 L 34.00137988,24.41196433 C 32.18655996,27.37964285 32.8941631,31.14658179 35.68152339,33.34893627",viewW:80,viewH:50},bookshelf:{d:"M 57.70667129,21.235 L 45.09910046,21.235 C 44.542709,21.235 44.00796701,21.39 43.61394659,21.66625 C 43.21992618,21.9425 42.99910155,22.31625 42.99910155,22.70625 M 47.41126422,12.41125 L 53.29342614,12.41125 M 2.4994317,0 L 97.49948583,0 C 98.88072223,0 100,1.11875 100,2.5 L 100,32.5 C 100,33.88125 98.88072223,35 97.49948583,35 L 2.50051417,35 C 1.12036025,35 0,33.88125 0,32.5 L 0,2.5 C 0,1.11875 1.12036025,0 2.50051417,0 M 57.70667129,8 L 57.70667129,25.6475 L 45.10018294,25.6475 A 2.55,2.20824628 90 0,1 43.61502906,25.00125 A 2.125,1.84020524 90 0,1 43.00018402,23.44125 L 43.00018402,10.20625 C 43.00018402,9.62125 43.22100865,9.06 43.61502906,8.64625 A 2.55,2.20824628 90 0,1 45.10018294,8 L 57.70667129,8",viewW:100,viewH:35},wall_unit:{d:"M 2.49961234,45 L 237.50038766,45 A 2.5,2.49961234 90 0,0 239.2678805,44.26776695 A 2.5,2.49961234 90 0,0 240,42.5 L 240,2.5 A 2.5,2.49961234 90 0,0 239.2678805,0.73223305 A 2.5,2.49961234 90 0,0 237.50038766,0 L 2.49961234,0 A 2.5,2.49961234 90 0,0 0,2.5 L 0,42.5 M 0,42.5 A 2.5,2.49961234 90 0,0 0.7321195,44.26776695 A 2.5,2.49961234 90 0,0 2.49961234,45 M 47.72005996,38 L 47.72005996,7 M 95.71923296,38 L 95.71923296,7 M 143.71943971,38 L 143.71943971,7 M 191.71964646,38 L 191.71964646,7",viewW:240,viewH:45},wardrobe:{d:"M 94.04437425,18.88320821 A 3.7631854,3.44913684 90 0,0 92.92392737,16.13836358 A 4.33336501,3.97173334 90 0,0 90.22105832,15.00142545 C 89.20722112,15.00142545 88.23519165,15.40967405 87.51714407,16.13836358 A 3.7631854,3.44913684 90 0,0 86.39774238,18.88320821 C 86.39774238,22.11954766 87.67810379,24.70702271 90.22105832,26.64905445 L 90.20538042,26.64905445 L 105.44429412,35.24394184 C 106.04005412,35.58034781 106.53756598,36.07184263 106.88352486,36.66939086 C 107.22948373,37.26579873 107.41134731,37.94659318 107.41134731,38.63879122 L 107.41134731,40.23643448 A 3.7631854,3.44913684 90 0,1 106.29194563,42.9812791 A 4.33336501,3.97173334 90 0,1 103.58803138,44.1193576 L 76.82272946,44.1193576 A 4.33336501,3.97173334 90 0,1 74.11986041,42.9812791 A 3.7631854,3.44913684 90 0,1 72.99941353,40.23643448 L 72.99941353,38.63993158 C 72.99941353,37.94659318 73.18127711,37.26579873 73.52723599,36.66939086 A 4.04827521,3.71043509 90 0,1 74.96646673,35.24394184 L 90.20538042,26.64905445 M 2.50010162,0 L 177.49989838,0 C 178.87955312,0 180,1.11869239 180,2.4996674 L 180,57.49919225 C 180,58.88130761 178.88059831,60 177.49989838,60 L 2.50010162,60 C 1.11940169,60 0,58.88130761 0,57.5003326 L 0,2.50194811 C 0,1.11983275 1.11835649,0.00114036 2.50010162,0.00114036",viewW:180,viewH:60},kitchen_floor:{d:"M 0.00000104,2.4996673 C 0.00000104,1.1198327 1.11869337,0 2.4996683,0 L 57.49919004,0 C 58.88130533,0 59.99999766,1.11869234 59.99999766,2.4996673 L 59.99999766,57.49919 M 59.99999766,57.49919 A 2.49738658,2.49738654 90 0,1 59.26893509,59.26812834 A 2.49738658,2.49738654 90 0,1 57.5003304,59.99999766 M 57.5003304,59.99999766 L 2.50080866,59.99999766 M 2.50080866,59.99999766 A 2.49738658,2.49738654 90 0,1 0.73187035,59.26893508 A 2.49738658,2.49738654 90 0,1 0.00000104,57.50033036 M 0.00000104,57.50033036 L 0.00000104,2.4996673",viewW:60,viewH:60},kitchen_floor_corner:{d:"M 46.03081776,41.46966756 A 2.50060665,2.50060665 0 0,0 48.53142441,43.97027421 L 87.49939335,43.97027421 A 2.50060665,2.50060665 0 0,1 89.26758927,44.70268494 A 2.50060665,2.50060665 0 0,1 90,46.47088085 L 90,87.49939335 A 2.50060665,2.50060665 0 0,1 89.26758927,89.26758927 A 2.50060665,2.50060665 0 0,1 87.49939335,90 M 87.49939335,90 L 2.50060665,90 A 2.50060665,2.50060665 0 0,1 0.73241073,89.26758927 A 2.50060665,2.50060665 0 0,1 0,87.49939335 L 0,2.50060665 A 2.50060665,2.50060665 0 0,1 2.50060665,0 L 43.53239505,0 A 2.50060665,2.50060665 0 0,1 46.0330017,2.50060665 L 46.03081776,41.46966756",viewW:90,viewH:90},kitchen_wall:{d:"M 0.85755013,34.41625 L 58.7307802,0.6575 M 0.85526941,0.5825 L 58.72849948,34.3425 M 2.4996674,35 L 57.49919225,35 C 58.88130761,35 60,33.88125 60,32.5 L 60,2.5 C 60,1.11875 58.88130761,0 57.5003326,0 L 2.50080775,0 C 1.11869239,0 0,1.11875 0,2.5 L 0,32.5 C 0,33.88125 1.11869239,35 2.4996674,35",viewW:60,viewH:35},kitchen_wall_corner:{d:"M 0.09122874,29.53302228 L 29.86372655,0.78798922 M 1.00123537,58.99990268 L 58.99990394,30.00056953 M 0.55079349,0.78798922 L 30.99952431,28.00037958 M 0,29.00047456 L 58.99990394,58.99990268 M 28.18739854,0.00000104 L 2.49966735,0.00000104 C 1.11983273,0.00000104 0,1.11869337 0,2.4996683 L 0,57.49919004 C 0,58.88130533 1.11869237,59.99999766 2.49966735,59.99999766 L 57.49919125,59.99999766 M 57.49919125,59.99999766 A 2.49738663,2.49738654 0 0,0 59.26812963,59.26893509 A 2.49738663,2.49738654 0 0,0 59.99999896,57.5003304 M 59.99999896,57.5003304 L 59.99999896,31.81260022 C 59.99999896,30.43276565 58.88130659,29.31293296 57.5003316,29.31293296 L 33.1878736,29.31293296 A 2.49738663,2.49738654 0 0,1 31.41893522,28.5818704 A 2.49738663,2.49738654 0 0,1 30.68706589,26.81326571 L 30.68706589,2.50080866 M 30.68706589,2.50080866 A 2.49738663,2.49738654 0 0,0 29.9560033,0.73187035 A 2.49738663,2.49738654 0 0,0 28.18739854,0.00000104",viewW:60,viewH:60},shelf_floor:{d:"M 2.50054124,35 L 97.49945876,35 A 2.50054124,2.5 0 0,0 99.26760843,34.26776695 A 2.50054124,2.5 0 0,0 100,32.5 L 100,2.5 A 2.50054124,2.5 0 0,0 99.26760843,0.73223305 A 2.50054124,2.5 0 0,0 97.49945876,0 L 2.50054124,0 A 2.50054124,2.5 0 0,0 0,2.5 L 0,32.5 A 2.50054124,2.5 0 0,0 2.50054124,35 M 5.71444036,28.04125 C 5.17969257,28.18125 4.8744317,28.72375 5.03247456,29.25375 C 5.19051743,29.78375 5.75124486,30.0975 6.28491015,29.95875 L 6.0002165,29 L 5.71444036,28.04125 M 94.28664213,6.95875 C 94.82030743,6.81875 95.1255683,6.27625 94.96860792,5.74625 C 94.81164754,5.21625 94.24983763,4.9025 93.71508985,5.04125 L 94.00086599,6 L 94.28664213,6.95875 M 8.73024464,29.32 C 9.26390994,29.18 9.56917082,28.6375 9.41221044,28.1075 C 9.25525005,27.5775 8.69344014,27.2625 8.15869236,27.4025 L 8.4444685,28.36125 L 8.73024464,29.32 M 13.04719636,26.125 C 12.51353107,26.265 12.20827019,26.8075 12.36523057,27.33625 C 12.52219095,27.865 13.08400087,28.18125 13.61874865,28.04125 L 13.3329725,27.08375 L 13.04719636,26.125 M 18.50833514,26.76375 C 19.04200043,26.62375 19.34726131,26.0825 19.19030093,25.5525 C 19.03334055,25.0225 18.47153063,24.7075 17.93678285,24.8475 L 18.222559,25.805 L 18.50833514,26.76375 M 22.82528686,23.57 C 22.29162156,23.70875 21.98636068,24.25125 22.14332107,24.78 C 22.30136393,25.31 22.86209136,25.62625 23.39683914,25.48625 L 23.111063,24.5275 L 22.82528686,23.57 M 28.28534315,24.2075 C 28.82009093,24.06875 29.12535181,23.52625 28.96730894,22.9975 C 28.81034856,22.4675 28.24853864,22.1525 27.71487335,22.29125 L 27.99956701,23.25 L 28.28534315,24.2075 M 32.60445984,21.01375 C 32.06862957,21.15375 31.76336869,21.69625 31.92249405,22.22625 C 32.07945443,22.755 32.64018186,23.07 33.17492964,22.93 L 32.8891535,21.9725 L 32.60445984,21.01375 M 38.06343364,21.6525 C 38.59818142,21.5125 38.9034423,20.97125 38.74539944,20.44125 C 38.58735657,19.91125 38.02662914,19.59625 37.49188136,19.73625 L 37.7776575,20.695 L 38.06343364,21.6525 M 42.38146785,18.45875 C 41.84672007,18.5975 41.54145919,19.14 41.69950206,19.67 C 41.85754492,20.2 42.41827235,20.515 42.95193765,20.375 L 42.66724399,19.41625 L 42.38146785,18.45875 M 47.84152414,19.09625 C 48.37627192,18.95875 48.6815328,18.415 48.52348993,17.88625 C 48.36544707,17.35625 47.80471964,17.04125 47.26997186,17.18 L 47.555748,18.13875 L 47.84152414,19.09625 M 52.15955835,15.9025 C 51.62481057,16.0425 51.31954969,16.585 51.47759255,17.115 C 51.63455293,17.64375 52.19636285,17.95875 52.73002814,17.82 L 52.444252,16.86125 L 52.15955835,15.9025 M 57.61961464,16.54125 C 58.15327993,16.4025 58.45854081,15.86 58.30158043,15.33 C 58.14462005,14.8 57.58281013,14.485 57.04806235,14.625 L 57.33383849,15.58375 L 57.61961464,16.54125 M 61.93656636,13.3475 C 61.40290106,13.4875 61.09764018,14.02875 61.25460056,14.55875 C 61.41156094,15.08875 61.97337086,15.40375 62.50811864,15.26375 L 62.2223425,14.305 L 61.93656636,13.3475 M 67.39770513,13.985 C 67.93137043,13.8475 68.23663131,13.30375 68.07967092,12.775 C 67.92162806,12.245 67.36090063,11.93 66.82615285,12.07 L 67.11192899,13.0275 L 67.39770513,13.985 M 71.71465685,10.79125 C 71.18099156,10.93125 70.87573068,11.47375 71.03269106,12.00375 C 71.18965144,12.53375 71.75146136,12.8475 72.28620914,12.70875 L 72.00043299,11.75 L 71.71465685,10.79125 M 77.17471314,11.43 C 77.70946092,11.29125 78.0147218,10.74875 77.85667893,10.22 C 77.69971855,9.69 77.13790864,9.37375 76.60424334,9.51375 L 76.89001948,10.4725 L 77.17471314,11.43 M 81.49382983,8.23625 C 80.95908205,8.37625 80.65273869,8.9175 80.81186404,9.4475 C 80.96882442,9.97625 81.52955185,10.2925 82.06429963,10.1525 L 81.77852349,9.195 L 81.49382983,8.23625 M 86.95280364,8.875 C 87.48755142,8.735 87.7928123,8.1925 87.63476943,7.66375 C 87.47672656,7.135 86.91599913,6.81875 86.38233384,6.95875 L 86.6670275,7.91625 L 86.95280364,8.875 M 91.27083784,5.68 C 90.73609006,5.82 90.43082918,6.3625 90.58887205,6.8925 C 90.74691492,7.4225 91.30764235,7.7375 91.84239013,7.5975 L 91.55661399,6.63875 L 91.27083784,5.68 M 6.0002165,29 L 6.28491015,29.95875 L 8.73024464,29.32 L 8.4444685,28.36125 L 8.15869236,27.4025 L 5.71444036,28.04125 L 6.0002165,29 M 13.3329725,27.08375 L 13.61874865,28.04125 L 18.50833514,26.76375 L 18.222559,25.805 L 17.93678285,24.8475 L 13.04719636,26.125 L 13.3329725,27.08375 M 23.111063,24.5275 L 23.39683914,25.48625 L 28.28534315,24.20875 L 27.99956701,23.25 L 27.71487335,22.29125 L 22.82528686,23.57 L 23.111063,24.5275 M 32.8891535,21.9725 L 33.17492964,22.93 L 38.06343364,21.6525 L 37.7776575,20.695 L 37.49188136,19.73625 L 32.60337735,21.01375 L 32.8891535,21.9725 M 42.66724399,19.41625 L 42.95193765,20.375 L 47.84152414,19.0975 L 47.555748,18.13875 L 47.26997186,17.18 L 42.38146785,18.45875 L 42.66724399,19.41625 M 52.444252,16.86125 L 52.73002814,17.82 L 57.61961464,16.54125 L 57.33383849,15.58375 L 57.04806235,14.625 L 52.15955835,15.9025 L 52.444252,16.86125 M 62.2223425,14.305 L 62.50811864,15.26375 L 67.39770513,13.98625 L 67.11192899,13.0275 L 66.82615285,12.07 L 61.93656636,13.3475 L 62.2223425,14.305 M 72.00043299,11.75 L 72.28620914,12.70875 L 77.17471314,11.43 L 76.89001948,10.4725 L 76.60424334,9.51375 L 71.71465685,10.79125 L 72.00043299,11.75 M 81.77852349,9.195 L 82.06429963,10.1525 L 86.95280364,8.875 L 86.6670275,7.91625 L 86.38233384,6.95875 L 81.49274735,8.23625 L 81.77852349,9.195 M 91.55661399,6.6375 L 91.84239013,7.59625 L 94.28664213,6.9575 L 94.00086599,5.99875 L 93.71508985,5.04 L 91.27083784,5.67875 L 91.55661399,6.6375 M 5.71444036,6.95875 C 5.17969257,6.81875 4.8744317,6.27625 5.03247456,5.74625 C 5.19051743,5.21625 5.75124486,4.9025 6.28491015,5.04125 L 6.0002165,6 L 5.71444036,6.95875 M 94.28664213,28.04125 C 94.82030743,28.18125 95.1255683,28.72375 94.96860792,29.25375 C 94.81164754,29.78375 94.24983763,30.0975 93.71508985,29.95875 L 94.00086599,29 L 94.28664213,28.04125 M 8.73024464,5.68 C 9.26390994,5.82 9.56917082,6.3625 9.41221044,6.8925 C 9.25525005,7.4225 8.69344014,7.7375 8.15869236,7.5975 L 8.4444685,6.63875 L 8.73024464,5.68 M 13.04719636,8.875 C 12.51353107,8.735 12.20827019,8.1925 12.36523057,7.66375 C 12.52219095,7.135 13.08400087,6.81875 13.61874865,6.95875 L 13.3329725,7.91625 L 13.04719636,8.875 M 18.50833514,8.23625 C 19.04200043,8.37625 19.34726131,8.9175 19.19030093,9.4475 C 19.03334055,9.9775 18.47153063,10.2925 17.93678285,10.1525 L 18.222559,9.195 L 18.50833514,8.23625 M 22.82528686,11.43 C 22.29162156,11.29125 21.98636068,10.74875 22.14332107,10.22 C 22.30136393,9.69 22.86209136,9.37375 23.39683914,9.51375 L 23.111063,10.4725 L 22.82528686,11.43 M 28.28534315,10.7925 C 28.82009093,10.93125 29.12535181,11.47375 28.96730894,12.0025 C 28.81034856,12.5325 28.24853864,12.8475 27.71487335,12.70875 L 27.99956701,11.75 L 28.28534315,10.7925 M 32.60445984,13.98625 C 32.06862957,13.84625 31.76336869,13.30375 31.92249405,12.77375 C 32.07945443,12.245 32.64018186,11.93 33.17492964,12.07 L 32.8891535,13.0275 L 32.60445984,13.98625 M 38.06343364,13.3475 C 38.59818142,13.4875 38.9034423,14.02875 38.74539944,14.55875 C 38.58735657,15.08875 38.02662914,15.40375 37.49188136,15.26375 L 37.7776575,14.305 L 38.06343364,13.3475 M 42.38146785,16.54125 C 41.84672007,16.4025 41.54145919,15.86 41.69950206,15.33 C 41.85754492,14.8 42.41827235,14.485 42.95193765,14.625 L 42.66724399,15.58375 L 42.38146785,16.54125 M 47.84152414,15.90375 C 48.37627192,16.04125 48.6815328,16.585 48.52348993,17.11375 C 48.36544707,17.64375 47.80471964,17.95875 47.26997186,17.82 L 47.555748,16.86125 L 47.84152414,15.90375 M 52.15955835,19.0975 C 51.62481057,18.9575 51.31954969,18.415 51.47759255,17.885 C 51.63455293,17.35625 52.19636285,17.04125 52.73002814,17.18 L 52.444252,18.13875 L 52.15955835,19.0975 M 57.61961464,18.45875 C 58.15327993,18.5975 58.45854081,19.14 58.30158043,19.67 C 58.14462005,20.2 57.58281013,20.515 57.04806235,20.375 L 57.33383849,19.41625 L 57.61961464,18.45875 M 61.93656636,21.6525 C 61.40290106,21.5125 61.09764018,20.97125 61.25460056,20.44125 C 61.41156094,19.91125 61.97337086,19.59625 62.50811864,19.73625 L 62.2223425,20.695 L 61.93656636,21.6525 M 67.39770513,21.015 C 67.93137043,21.1525 68.23663131,21.69625 68.07967092,22.225 C 67.92162806,22.755 67.36090063,23.07 66.82615285,22.93 L 67.11192899,21.9725 L 67.39770513,21.015 M 71.71465685,24.20875 C 71.18099156,24.06875 70.87573068,23.52625 71.03269106,22.99625 C 71.18965144,22.46625 71.75146136,22.1525 72.28620914,22.29125 L 72.00043299,23.25 L 71.71465685,24.20875 M 77.17471314,23.57 C 77.70946092,23.70875 78.0147218,24.25125 77.85667893,24.78 C 77.69971855,25.31 77.13790864,25.62625 76.60424334,25.48625 L 76.89001948,24.5275 L 77.17471314,23.57 M 81.49382983,26.76375 C 80.95908205,26.62375 80.65273869,26.0825 80.81186404,25.5525 C 80.96882442,25.02375 81.52955185,24.7075 82.06429963,24.8475 L 81.77852349,25.805 L 81.49382983,26.76375 M 86.95280364,26.125 C 87.48755142,26.265 87.7928123,26.8075 87.63476943,27.33625 C 87.47672656,27.865 86.91599913,28.18125 86.38233384,28.04125 L 86.6670275,27.08375 L 86.95280364,26.125 M 91.27083784,29.32 C 90.73609006,29.18 90.43082918,28.6375 90.58887205,28.1075 C 90.74691492,27.5775 91.30764235,27.2625 91.84239013,27.4025 L 91.55661399,28.36125 L 91.27083784,29.32 M 6.0002165,6 L 6.28491015,5.04125 L 8.73024464,5.68 L 8.4444685,6.63875 L 8.15869236,7.5975 L 5.71444036,6.95875 L 6.0002165,6 M 13.3329725,7.91625 L 13.61874865,6.95875 L 18.50833514,8.23625 L 18.222559,9.195 L 17.93678285,10.1525 L 13.04719636,8.875 L 13.3329725,7.91625 M 23.111063,10.4725 L 23.39683914,9.51375 L 28.28534315,10.79125 L 27.99956701,11.75 L 27.71487335,12.70875 L 22.82528686,11.43 L 23.111063,10.4725 M 32.8891535,13.0275 L 33.17492964,12.07 L 38.06343364,13.3475 L 37.7776575,14.305 L 37.49188136,15.26375 L 32.60337735,13.98625 L 32.8891535,13.0275 M 42.66724399,15.58375 L 42.95193765,14.625 L 47.84152414,15.9025 L 47.555748,16.86125 L 47.26997186,17.82 L 42.38146785,16.54125 L 42.66724399,15.58375 M 52.444252,18.13875 L 52.73002814,17.18 L 57.61961464,18.45875 L 57.33383849,19.41625 L 57.04806235,20.375 L 52.15955835,19.0975 L 52.444252,18.13875 M 62.2223425,20.695 L 62.50811864,19.73625 L 67.39770513,21.01375 L 67.11192899,21.9725 L 66.82615285,22.93 L 61.93656636,21.6525 L 62.2223425,20.695 M 72.00043299,23.25 L 72.28620914,22.29125 L 77.17471314,23.57 L 76.89001948,24.5275 L 76.60424334,25.48625 L 71.71465685,24.20875 L 72.00043299,23.25 M 81.77852349,25.805 L 82.06429963,24.8475 L 86.95280364,26.125 L 86.6670275,27.08375 L 86.38233384,28.04125 L 81.49274735,26.76375 L 81.77852349,25.805 M 91.55661399,28.36125 L 91.84239013,27.4025 L 94.28664213,28.04125 L 94.00086599,29 L 93.71508985,29.95875 L 91.27083784,29.32 L 91.55661399,28.36125",viewW:100,viewH:35},shelf_wall:{d:"M 16.00095257,0 L 16.00095257,3.50051819 C 16.00095257,4.88054328 14.88168691,6.00010909 13.50046546,6.00010909 L 12.50027062,6.00010909 C 11.12013163,6.00010909 10.00086597,4.88190694 10.00086597,3.50051819 L 10.00086597,0 M 90.00021649,0 L 90.00021649,3.50051819 C 90.00021649,4.88054328 88.88095083,6.00010909 87.49972938,6.00010909 L 86.49953454,6.00010909 C 85.11939555,6.00010909 83.99904743,4.88190694 83.99904743,3.50051819 L 83.99904743,0 M 2.50048711,0 L 97.49951289,0 C 98.88073434,0 100,1.11820215 100,2.4995909 L 100,22.5004091 C 100,23.88043419 98.88073434,25 97.49951289,25 L 2.50048711,25 C 1.12034812,25 0,23.88179785 0,22.5004091 L 0,2.4995909 C 0,1.11956581 1.12034812,0 2.50048711,0",viewW:100,viewH:25},cooktop_two:{d:"M 14.99935186,32.00009362 L 14.99935186,29.99906385 M 18.99969753,35.99981277 L 20.99857408,35.99981277 M 14.99935186,41.9993915 L 14.99935186,39.99953192 M 9.00012963,35.99981277 L 10.99900618,35.99981277 M 3.12535108,50 L 26.87594521,50 C 28.60130493,50 30,48.60044935 30,46.8755851 L 30,3.1244149 C 30,1.39838045 28.60130493,0 26.87594521,0 L 3.12405479,0 C 1.39869507,0 0,1.39838045 0,3.1244149 L 0,46.87324471 C 0,48.59927916 1.39869507,49.99765961 3.12405479,49.99765961 M 21.99801236,14.99719154 C 21.99801236,18.86350871 18.86488355,21.99728515 14.99805557,21.99728515 C 11.13382016,21.99728515 7.99809878,18.86350871 7.99809878,14.99836173 C 7.99809878,11.13321475 11.13382016,7.99826811 14.99805557,7.99826811 C 18.86488355,7.99826811 21.99801236,11.13204456 21.99801236,14.99836173 M 20.0004321,35.99981277 C 20.0004321,38.76146789 17.76174221,41.00004681 15.00064814,41.00004681 C 12.23955408,41.00004681 10.00086419,38.76146789 10.00086419,35.99981277 C 10.00086419,33.23815765 12.23825779,30.99957873 14.99935186,30.99957873 C 17.76044592,30.99957873 19.99913581,33.23815765 19.99913581,35.99981277",viewW:30,viewH:50},stove:{d:"M 42.58125034,35.80643381 A 0.96783093,0.96783093 0 0,0 41.61341941,34.83860288 A 0.96783093,0.96783093 0 0,0 40.64558848,35.80643381 M 40.64558848,35.80643381 L 42.58125034,35.80643381 M 47.41930144,42.58014677 A 0.96783093,0.96783093 0 0,0 48.28464415,42.10618697 A 0.96783093,0.96783093 0 0,0 48.28464415,41.11954828 A 0.96783093,0.96783093 0 0,0 47.41930144,40.64558848 L 47.41930144,42.58014677 M 42.58125034,45.48363957 A 0.96783093,0.96783093 0 0,0 42.10729054,44.61829686 A 0.96783093,0.96783093 0 0,0 41.12065185,44.61829686 A 0.96783093,0.96783093 0 0,0 40.64669205,45.48363957 L 42.58125034,45.48363957 M 37.74319925,42.58125034 A 0.96783093,0.96783093 0 0,0 38.71103018,41.61341941 A 0.96783093,0.96783093 0 0,0 37.74319925,40.64558848 M 37.74319925,40.64558848 L 37.74319925,42.58125034 M 3.38796005,0.96672736 L 3.38796005,1.9345583 L 56.61314352,1.9345583 L 56.61314352,0 L 3.38796005,0 L 3.38796005,0.96672736 M 59.03216907,3.38575291 L 58.06433813,3.38575291 L 58.06433813,56.61093638 L 60,56.61093638 L 60,3.38796005 L 59.03216907,3.38575291 M 56.61314352,59.0310655 L 56.61314352,58.06323456 L 3.38796005,58.06323456 L 3.38796005,59.99889643 L 56.61314352,59.99889643 L 56.61314352,59.0310655 M 0.96783093,56.61314352 L 1.93566187,56.61314352 L 1.93566187,3.38796005 L 0,3.38796005 L 0,56.61314352 L 0.96783093,56.61314352 M 3.38685648,59.03216907 L 3.38685648,58.06433813 A 1.45119461,1.45119461 0 0,1 1.93566187,56.61314352 L 0,56.61314352 A 3.38796005,3.38796005 0 0,0 3.38796005,60 L 3.38685648,59.03216907 M 59.03216907,56.61314352 L 58.06433813,56.61314352 C 58.06433813,57.41433537 57.41433537,58.06433813 56.61314352,58.06433813 L 56.61314352,60 A 3.38796005,3.38796005 0 0,0 60,56.61203995 L 59.03216907,56.61314352 M 56.61314352,0.96783093 L 56.61314352,1.93566187 C 57.41433537,1.93566187 58.06433813,2.58566463 58.06433813,3.38685648 L 60,3.38685648 A 3.38796005,3.38796005 0 0,0 56.61203995,0 L 56.61314352,0.96783093 M 3.38796005,0.96783093 L 3.38796005,0 A 3.38796005,3.38796005 0 0,0 0,3.38796005 L 1.93566187,3.38796005 C 1.93566187,2.58566463 2.58566463,1.93566187 3.38685648,1.93566187 L 3.38796005,0.96783093 M 25.16139712,41.61231584 L 24.19356619,41.61231584 A 5.80477846,5.80477846 0 0,1 22.49338636,45.71912161 A 5.80477846,5.80477846 0 0,1 18.38658059,47.41930144 M 18.38658059,47.41930144 L 18.38658059,49.35496331 M 18.38658059,49.35496331 A 7.74154389,7.74154389 0 0,0 23.86139219,47.0879078 A 7.74154389,7.74154389 0 0,0 26.12922805,41.61341941 M 26.12922805,41.61341941 L 25.16139712,41.61231584 M 18.38658059,48.38713237 L 18.38658059,47.41930144 A 5.80477846,5.80477846 0 0,1 14.2808787,45.7191213 A 5.80477846,5.80477846 0 0,1 12.58069856,41.61341941 L 10.64503669,41.61341941 A 7.74154389,7.74154389 0 0,0 18.38658059,49.35496331 L 18.38658059,48.38713237 M 11.61286763,41.61341941 L 12.58069856,41.61341941 M 12.58069856,41.61341941 A 5.80477846,5.80477846 0 0,1 14.28048835,37.50700403 A 5.80477846,5.80477846 0 0,1 18.38658059,35.80643381 M 18.38658059,35.80643381 L 18.38658059,33.87077195 M 18.38658059,33.87077195 A 7.74154389,7.74154389 0 0,0 12.9120922,36.13860781 A 7.74154389,7.74154389 0 0,0 10.64503669,41.61341941 M 10.64503669,41.61341941 L 11.61286763,41.61341941 M 18.38658059,34.83860288 L 18.38658059,35.80643381 M 18.38658059,35.80643381 A 5.80477846,5.80477846 0 0,1 22.49338636,37.50661364 A 5.80477846,5.80477846 0 0,1 24.19356619,41.61341941 L 26.12922805,41.61341941 M 26.12922805,41.61341941 A 7.74154389,7.74154389 0 0,0 23.86178242,36.13821758 A 7.74154389,7.74154389 0 0,0 18.38658059,33.87077195 M 18.38658059,33.87077195 L 18.38658059,34.83860288 M 48.38713237,18.38658059 L 47.41930144,18.38658059 M 47.41930144,18.38658059 A 5.80477846,5.80477846 0 0,1 45.71951165,22.49299597 A 5.80477846,5.80477846 0 0,1 41.61341941,24.19356619 M 41.61341941,24.19356619 L 41.61341941,26.12922805 M 41.61341941,26.12922805 A 7.74154389,7.74154389 0 0,0 47.0879078,23.86139219 A 7.74154389,7.74154389 0 0,0 49.35496331,18.38658059 M 49.35496331,18.38658059 L 48.38713237,18.38658059 M 41.61341941,25.16139712 L 41.61341941,24.19356619 A 5.80477846,5.80477846 0 0,1 37.50661364,22.49338636 A 5.80477846,5.80477846 0 0,1 35.80643381,18.38658059 L 33.87077195,18.38658059 M 33.87077195,18.38658059 A 7.74154389,7.74154389 0 0,0 36.13821758,23.86178242 A 7.74154389,7.74154389 0 0,0 41.61341941,26.12922805 M 41.61341941,26.12922805 L 41.61341941,25.16139712 M 34.83860288,18.38658059 L 35.80643381,18.38658059 M 35.80643381,18.38658059 A 5.80477846,5.80477846 0 0,1 37.50700403,14.28048835 A 5.80477846,5.80477846 0 0,1 41.61341941,12.58069856 M 41.61341941,12.58069856 L 41.61341941,10.64503669 M 41.61341941,10.64503669 A 7.74154389,7.74154389 0 0,0 36.13860781,12.9120922 A 7.74154389,7.74154389 0 0,0 33.87077195,18.38658059 M 33.87077195,18.38658059 L 34.83860288,18.38658059 M 41.61341941,11.61286763 L 41.61341941,12.58069856 M 41.61341941,12.58069856 A 5.80477846,5.80477846 0 0,1 45.7191213,14.2808787 A 5.80477846,5.80477846 0 0,1 47.41930144,18.38658059 M 47.41930144,18.38658059 L 49.35496331,18.38658059 A 7.74154389,7.74154389 0 0,0 47.0875176,12.9124824 A 7.74154389,7.74154389 0 0,0 41.61341941,10.64503669 L 41.61341941,11.61286763 M 46.45147051,41.61341941 L 45.48363957,41.61341941 A 3.87353087,3.87353087 0 0,1 41.61341941,45.48363957 L 41.61341941,47.41930144 M 41.61341941,47.41930144 A 5.80477846,5.80477846 0 0,0 45.7191213,45.7191213 A 5.80477846,5.80477846 0 0,0 47.41930144,41.61341941 M 47.41930144,41.61341941 L 46.45147051,41.61341941 M 41.61341941,46.45147051 L 41.61341941,45.48363957 A 3.87353087,3.87353087 0 0,1 37.74209568,41.61341941 L 35.80533024,41.61341941 M 35.80533024,41.61341941 A 5.80477846,5.80477846 0 0,0 37.50590046,45.71951165 A 5.80477846,5.80477846 0 0,0 41.61231584,47.41930144 M 41.61231584,47.41930144 L 41.61341941,46.45147051 M 36.77426475,41.61341941 L 37.74209568,41.61341941 A 3.87353087,3.87353087 0 0,1 41.61341941,37.74209568 L 41.61341941,35.80533024 A 5.80477846,5.80477846 0 0,0 37.50661364,37.50551007 A 5.80477846,5.80477846 0 0,0 35.80643381,41.61231584 L 36.77426475,41.61341941 M 41.61341941,36.77426475 L 41.61341941,37.74209568 A 3.87353087,3.87353087 0 0,1 45.48363957,41.61341941 L 47.41930144,41.61341941 M 47.41930144,41.61341941 A 5.80477846,5.80477846 0 0,0 45.71951165,37.50700403 A 5.80477846,5.80477846 0 0,0 41.61341941,35.80643381 M 41.61341941,35.80643381 L 41.61341941,36.77426475 M 41.61341941,37.74209568 L 42.58014677,37.74209568 L 42.58014677,35.80533024 L 40.64558848,35.80533024 L 40.64558848,37.74099211 L 41.61341941,37.74209568 M 45.48474314,41.61341941 L 45.48474314,42.58014677 L 47.41930144,42.58014677 L 47.41930144,40.64558848 L 45.48474314,40.64558848 L 45.48474314,41.61341941 M 41.61341941,47.41930144 L 42.58014677,47.41930144 L 42.58014677,45.48363957 L 40.64558848,45.48363957 L 40.64558848,47.41930144 L 41.61341941,47.41930144 M 35.80753738,41.61341941 L 35.80753738,42.58014677 L 37.74209568,42.58014677 L 37.74209568,40.64558848 L 35.80753738,40.64558848 L 35.80753738,41.61341941 M 25.16139712,18.38658059 L 24.19356619,18.38658059 M 24.19356619,18.38658059 A 5.80477846,5.80477846 0 0,1 22.49338636,22.49338636 A 5.80477846,5.80477846 0 0,1 18.38658059,24.19356619 M 18.38658059,24.19356619 L 18.38658059,26.12922805 M 18.38658059,26.12922805 A 7.74154389,7.74154389 0 0,0 23.86178242,23.86178242 A 7.74154389,7.74154389 0 0,0 26.12922805,18.38658059 L 25.16139712,18.38658059 M 18.38658059,25.16139712 L 18.38658059,24.19356619 A 5.80477846,5.80477846 0 0,1 14.28048835,22.49299597 A 5.80477846,5.80477846 0 0,1 12.58069856,18.38658059 M 12.58069856,18.38658059 L 10.64503669,18.38658059 M 10.64503669,18.38658059 A 7.74154389,7.74154389 0 0,0 12.9120922,23.86139219 A 7.74154389,7.74154389 0 0,0 18.38658059,26.12922805 M 18.38658059,26.12922805 L 18.38658059,25.16139712 M 11.61286763,18.38658059 L 12.58069856,18.38658059 M 12.58069856,18.38658059 A 5.80477846,5.80477846 0 0,1 14.2808787,14.2808787 A 5.80477846,5.80477846 0 0,1 18.38658059,12.58069856 M 18.38658059,12.58069856 L 18.38658059,10.64503669 A 7.74154389,7.74154389 0 0,0 10.64503669,18.38658059 L 11.61286763,18.38658059 M 18.38658059,11.61286763 L 18.38658059,12.58069856 A 5.80477846,5.80477846 0 0,1 22.49299597,14.28048835 A 5.80477846,5.80477846 0 0,1 24.19356619,18.38658059 L 26.12922805,18.38658059 M 26.12922805,18.38658051 A 7.74154389,7.74154389 0 0,0 23.86139213,12.91209214 A 7.74154389,7.74154389 0 0,0 18.38658051,10.64503669 M 18.38658059,10.64503669 L 18.38658059,11.61286763",viewW:60,viewH:60},tv:{d:"M 44.11752137,9.73109561 L 2.5,9.73109561 C 1.11965812,9.73109561 0,10.850462 0,12.23118989 L 0,15.76881011 C 0,17.14821799 1.11965812,18.26758439 2.5,18.26758439 L 44.11752137,18.26758439 M 44.11752137,9.73109561 L 44.11752137,2.50009429 C 44.11752137,1.1193664 45.23717949,0 46.61752137,0 L 75.1474359,0 C 76.52777778,0 77.6474359,1.1193664 77.6474359,2.50009429 L 77.6474359,9.73109561 M 44.11752137,9.73109561 L 77.6474359,9.73109561 L 117.5,9.73109561 C 118.88141026,9.73109561 120,10.850462 120,12.23118989 L 120,15.76881011 C 120,17.14821799 118.88141026,18.26758439 117.5,18.26758439 L 77.6474359,18.26758439 M 44.11752137,18.26758439 L 44.11752137,25.49990571 C 44.11752137,26.8806336 45.23717949,28 46.61752137,28 L 75.1474359,28 C 76.52777778,28 77.6474359,26.8806336 77.6474359,25.49990571 L 77.6474359,18.26758439 M 44.11752137,18.26758439 L 77.6474359,18.26758439",viewW:120,viewH:28},tv_wall:{d:"M 34.42622951,13.23529412 C 33.88293401,13.23529412 33.44262295,13.63088235 33.44262295,14.11764706 C 33.44262295,14.60441176 33.88293401,15 34.42622951,15 L 34.42622951,13.23529412 M 86.49957966,15 C 87.04287516,15 87.48318621,14.60441176 87.48318621,14.11764706 C 87.48318621,13.63088235 87.0418243,13.23529412 86.49957966,13.23529412 L 86.49957966,15 M 3.44262295,0.88235294 L 3.44262295,1.76470588 L 116.55737705,1.76470588 L 116.55737705,0 L 3.44262295,0 L 3.44262295,0.88235294 M 119.01639344,3.08823529 L 118.03278689,3.08823529 L 118.03278689,5.73529412 L 120,5.73529412 L 120,3.08823529 L 119.01639344,3.08823529 M 116.55737705,7.94117647 L 116.55737705,7.05882353 L 3.44262295,7.05882353 L 3.44262295,8.82352941 L 116.55737705,8.82352941 L 116.55737705,7.94117647 M 0.98360656,5.73529412 L 1.96721311,5.73529412 L 1.96721311,3.08823529 L 0,3.08823529 L 0,5.73529412 L 0.98360656,5.73529412 M 3.44262295,7.94117647 L 3.44262295,7.05882353 C 2.62820513,7.05882353 1.96721311,6.46617647 1.96721311,5.73529412 L 0,5.73529412 C 0,7.44117647 1.54161412,8.82352941 3.44262295,8.82352941 L 3.44262295,7.94117647 M 119.01639344,5.73529412 L 118.03278689,5.73529412 C 118.03278689,6.46617647 117.37179487,7.05882353 116.55737705,7.05882353 L 116.55737705,8.82352941 C 118.45943674,8.82352941 120,7.44117647 120,5.73529412 L 119.01639344,5.73529412 M 116.55737705,0.88235294 L 116.55737705,1.76470588 C 117.37179487,1.76470588 118.03278689,2.35735294 118.03278689,3.08823529 L 120,3.08823529 C 120,1.38235294 118.45838588,0 116.55737705,0 L 116.55737705,0.88235294 M 3.44262295,0.88235294 L 3.44262295,0 C 1.54056326,0 0,1.38235294 0,3.08823529 L 1.96721311,3.08823529 C 1.96721311,2.35735294 2.62820513,1.76470588 3.44262295,1.76470588 L 3.44262295,0.88235294 M 67.86885246,7.05882353 L 66.8852459,7.05882353 L 66.8852459,14.11764706 L 68.85245902,14.11764706 L 68.85245902,7.05882353 L 67.86885246,7.05882353 M 52.13114754,14.11764706 L 53.1147541,14.11764706 L 53.1147541,7.05882353 L 51.14754098,7.05882353 L 51.14754098,14.11764706 L 52.13114754,14.11764706 M 34.42622951,14.11764706 L 34.42622951,15 L 86.49957966,15 L 86.49957966,13.23529412 L 34.42622951,13.23529412 L 34.42622951,14.11764706",viewW:120,viewH:15},toilet:{d:"M 0,50.64541922 C 0,61.33577471 8.66551127,70 19.35479948,70 L 20.64520052,70 C 31.33570495,70 40,61.33577471 40,50.64541922 L 40,2.49964019 C 40,1.11940895 38.88108486,0 37.49946791,0 L 2.50053209,0 C 1.12013135,0 0,1.11940895 0,2.5007596 L 0,50.64541922 M 4.99984797,50.80661411 C 4.99984797,58.645835 11.35455623,65.00071962 19.19304327,65.00071962 L 20.80695673,65.00071962 C 28.64544377,65.00071962 35.00015203,58.645835 35.00015203,50.80661411 L 35.00015203,31.50016791 C 35.00015203,30.11993667 33.88123689,29.00052772 32.49961993,29.00052772 L 7.50038007,29.00052772 C 6.11997932,29.00052772 4.99984797,30.11993667 4.99984797,31.50016791 L 4.99984797,50.80661411 M 36.77460549,0 C 38.55635623,0 40,1.44403755 40,3.2261366 L 40,16.77434315 C 40,18.5564422 38.55635623,20.00047975 36.77460549,20.00047975 L 3.22661072,20.00047975 C 1.44485998,20.00047975 0,18.5564422 0,16.77434315 L 0,3.2261366 C 0,1.44515696 1.44485998,0 3.22661072,0 L 36.77460549,0 M 24.99923987,51.99990405 C 24.99923987,54.76148594 22.76140959,57.00030384 20.00060811,57.00030384 C 17.23980662,57.00030384 15.00076013,54.76148594 15.00076013,51.99990405 C 15.00076013,49.23832217 17.23859041,47.00062367 19.99939189,47.00062367 C 22.76019338,47.00062367 25.00045608,49.23944157 25.00045608,51.99990405",viewW:40,viewH:70},toilet_built_in:{d:"M 0,35.64551996 C 0,46.33352214 8.66551127,55 19.35479948,55 L 20.64520052,55 C 31.33570495,55 40,46.33467598 40,35.64436612 L 40,2.49921329 C 40,1.11922294 38.88108486,0 37.49946791,0 L 2.50053209,0 C 1.12013135,0 0,1.11922294 0,2.49921329 L 0,35.64551996 M 4.99984797,35.80705729 C 4.99984797,43.64507941 11.35455623,49.99926574 19.19304327,49.99926574 L 20.80695673,49.99926574 C 28.64544377,49.99926574 35.00015203,43.64507941 35.00015203,35.80705729 L 35.00015203,12.49952798 C 35.00015203,11.11838379 33.88123689,9.99916085 32.49961993,9.99916085 L 7.50038007,9.99916085 C 6.11997932,9.99916085 4.99984797,11.11838379 4.99984797,12.49952798 L 4.99984797,35.80705729 M 24.99923987,36.99897204 C 24.99923987,39.76126041 22.76140959,41.9997063 20.00060811,41.9997063 C 17.23980662,41.9997063 15.00076013,39.76126041 15.00076013,36.99897204 C 15.00076013,34.23668366 17.23859041,31.99939161 19.99939189,31.99939161 C 22.76019338,31.99939161 25.00045608,34.2378375 25.00045608,36.99897204",viewW:40,viewH:55},bathtub:{d:"M 0.00104789,2.5 C 0.00104789,1.11888889 1.12019281,0 2.50130986,0 L 167.49973803,0 C 168.88085508,0 170,1.11888889 170,2.5 L 170,72.5 C 170,73.88111111 168.88085508,75 167.49973803,75 L 2.50026197,75 C 1.11914492,75 0,73.88111111 0,72.5 L 0.00104789,2.5 M 10.00104789,37.5 C 10.00104789,22.31222222 22.31373782,10 37.50078592,10 L 132.50026197,10 C 147.68731007,10 160,22.31222222 160,37.5 C 160,52.68777778 147.68731007,65 132.50026197,65 L 37.49973803,65 C 22.31268993,65 10,52.68777778 10,37.5 M 29.00136226,37.5 C 29.00136226,39.98555556 26.98627266,42 24.50068113,42 C 22.01508959,42 20.00104789,39.98555556 20.00104789,37.5 C 20.00104789,35.01444444 22.01613748,33 24.50068113,33 C 26.98627266,33 29.00136226,35.01444444 29.00136226,37.5",viewW:170,viewH:75},bathtub_corner:{d:"M 0.0000009,2.49992528 A 2.4978076,2.4978076 90 0,1 0.73159091,0.73159091 A 2.4978076,2.4978076 90 0,1 2.49992528,0.0000009 M 2.49992528,0.0000009 L 137.70540387,0.0000009 C 138.97230035,0.0000009 140,1.02664216 140,2.29459703 C 140,78.34754644 78.34754644,140 2.29459703,140 A 2.29671292,2.29671292 90 0,1 0.0000009,137.70540387 L 0.0000009,2.49992528 M 9.99969844,30.0001519 C 9.99969844,18.95370364 18.95370364,9.99969844 30.0001519,9.99969844 L 122.7450181,9.99969844 A 2.2543772,2.2543772 90 0,1 124.9993953,12.25407563 C 124.9993953,74.52251395 74.52251395,125.00045369 12.25513403,125.00045369 A 2.2543772,2.2543772 90 0,1 10.66067431,124.33978775 A 2.2543772,2.2543772 90 0,1 10.00075683,122.7450181 L 9.99969844,30.0001519 M 30.0001519,25.00030314 A 5.00037797,5.00037797 90 0,1 24.99977394,30.0006811 A 5.00037797,5.00037797 90 0,1 19.99939597,25.00030314 A 5.00037797,5.00037797 90 0,1 24.99977394,19.99992517 A 5.00037797,5.00037797 90 0,1 30.0001519,25.00030314",viewW:140,viewH:140},bidet:{d:"M 22.99978716,0 L 22.99978716,11.50052266 C 22.99978716,12.88035731 21.88087202,14.00019006 20.50047128,14.00019006 L 19.50074493,14.00019006 C 18.11912798,14.00019006 17.00021284,12.88149767 17.00021284,11.50052266 L 17.00021284,0 M 22.99978716,10.0009503 L 26.50004561,10.0009503 C 27.88044635,10.0009503 29.0005777,8.88111755 29.0005777,7.50014254 L 29.0005777,6.50004751 C 29.0005777,5.12021287 27.88166256,4.00038012 26.50004561,4.00038012 L 22.99978716,4.00038012 M 17.00021284,10.0009503 L 13.49995439,10.0009503 C 12.11955365,10.0009503 11.00063851,8.88111755 11.00063851,7.50014254 L 11.00063851,6.50004751 C 11.00063851,5.12021287 12.11955365,4.00038012 13.49995439,4.00038012 L 17.00021284,4.00038012 M 2.50053209,0 L 37.49946791,0 C 38.88108486,0 40,1.11869239 40,2.4996674 L 40,40.64468308 C 40,51.33441034 31.33448873,60 20.64520052,60 L 19.35601569,60 C 8.66551127,60 0,51.33441034 0,40.64582343 L 0,2.50080775 C 0,1.11869239 1.11891514,0 2.50053209,0 M 7.49916385,18.00057018 L 32.49961993,18.00057018 C 33.88123689,18.00057018 35.00015203,19.11926257 35.00015203,20.50023757 L 35.00015203,40.80661408 C 35.00015203,48.64544331 28.64544377,55.00066521 20.80695673,55.00066521 L 19.19304327,55.00066521 C 11.35455623,55.00066521 4.99984797,48.64544331 4.99984797,40.80661408 L 4.99984797,20.50137793 C 4.99984797,19.12154329 6.11876311,18.00171054 7.50038007,18.00171054 M 24.00072973,27.00142545 C 24.00072973,29.21030124 22.21046551,31.00180557 20.00182432,31.00180557 C 17.79196692,31.00180557 16.00048648,29.2114416 16.00048648,27.00142545 C 16.00048648,24.79140929 17.79196692,23.00218569 20.00182432,23.00218569 C 22.21168172,23.00218569 24.00072973,24.79254965 24.00072973,27.00142545",viewW:40,viewH:60},bidet_built_in:{d:"M 16.73872723,9.99953191 L 6.93605765,9.99953191 C 5.86579099,9.99953191 4.99984797,10.86549489 4.99984797,11.93507618 L 4.99984797,30.8060477 C 4.99984797,38.64418284 11.35455623,44.99964893 19.19304327,44.99964893 L 20.80695673,44.99964893 C 28.64544377,44.99964893 35.00015203,38.64535306 35.00015203,30.80487748 L 35.00015203,11.9362464 C 35.00015203,10.86666511 34.13299279,10.00070213 33.06515856,10.00070213 L 23.26005655,10.00070213 M 22.99857095,0.00117022 L 22.99857095,11.50092447 C 22.99857095,12.88178435 21.87965581,14.0005149 20.49925507,14.0005149 L 19.49952872,14.0005149 C 18.11791176,14.0005149 16.99899663,12.88178435 16.99899663,11.50092447 L 16.99899663,0 M 29.99908784,9.99953191 L 29.99908784,0 M 9.99847973,0 L 9.99847973,9.99953191 M 2.50053209,0 L 37.49946791,0 C 38.88108486,0 40,1.11873055 40,2.49959042 L 40,30.64455731 C 40,41.33451916 31.33448873,50 20.64520052,50 L 19.35601569,50 C 8.66551127,50 0,41.33451916 0,30.64455731 L 0,2.49959042 C 0,1.11873055 1.11891514,0 2.50053209,0 M 24.00072973,22.99833829 C 24.00072973,25.20771409 22.20924929,26.99815105 19.99939189,26.99815105 C 17.78953449,26.99815105 16.00048648,25.20771409 16.00048648,22.99833829 C 16.00048648,20.78896248 17.79075071,18.99852552 20.00060811,18.99852552 C 22.20924929,18.99852552 23.99951352,20.78896248 23.99951352,22.99833829",viewW:40,viewH:50},kitchen_sink:{d:"M 39.41423548,6.00088937 L 51.49976243,6.00088937 C 52.88073743,6.00088937 54.00057018,7.11961991 54.00057018,8.50047979 L 54.00057018,41.50069043 C 54.00057018,42.88155031 52.88073743,44.00028085 51.49976243,44.00028085 L 8.50137793,44.00028085 C 7.12154329,44.00028085 6.00171054,42.88155031 6.00171054,41.50069043 L 6.00171054,8.50047979 C 6.00171054,7.11961991 7.12040293,6.00088937 8.50137793,6.00088937 L 20.58804523,6.00088937 M 33.00085527,0 L 33.00085527,13.50200108 C 33.00085527,14.88286095 31.88216288,16.0015915 30.50118787,16.0015915 L 29.50109284,16.0015915 C 28.1212582,16.0015915 27.00142545,14.88169073 27.00142545,13.50200108 L 27.00142545,0 M 33.00085527,9.00016383 L 36.50175805,9.00016383 C 37.8815927,9.00016383 39.00142545,7.88143329 39.00142545,6.50057341 L 39.00142545,5.50003511 C 39.00142545,4.11917523 37.8815927,3.00044468 36.50175805,3.00044468 L 33.00085527,3.00044468 M 27.00142545,9.00016383 L 23.50052266,9.00016383 C 22.12068802,9.00016383 21.00085527,7.88143329 21.00085527,6.50057341 L 21.00085527,5.50003511 C 21.00085527,4.11917523 22.12068802,3.00044468 23.50166302,3.00044468 L 27.00142545,3.00044468 M 2.4996674,50 L 57.5003326,50 C 58.88016725,50 60,48.88126945 60,47.50040958 L 60,2.50076064 C 60,1.11990077 58.88130761,0 57.5003326,0 L 2.50080775,0 C 1.11983275,0 0,1.11990077 0,2.50076064 L 0,47.50040958 C 0,48.88126945 1.11983275,50 2.4996674,50 M 33.99980994,25.99995319 C 33.99980994,28.209329 32.20944598,29.99976596 30.00057018,29.99976596 C 27.79169438,29.99976596 26.00019006,28.209329 26.00019006,25.99995319 C 26.00019006,23.79174761 27.79055402,22.00014043 30.00057018,22.00014043 C 32.21058633,22.00014043 33.99980994,23.79057739 33.99980994,25.99995319",viewW:60,viewH:50},kitchen_sink_double:{d:"M 53.81917613,10.60756523 C 53.3184331,10.60756523 52.91291684,11.00704162 52.91291684,11.49905209 C 52.91291684,11.99106256 53.31950306,12.39053895 53.81917613,12.39053895 L 53.81917613,10.60756523 M 77.33590917,12.39053895 C 77.83558224,12.39053895 78.2410985,11.99219103 78.2410985,11.49905209 C 78.2410985,11.00704162 77.83558224,10.60756523 77.33590917,10.60756523 L 77.33590917,12.39053895 M 3.35647625,0.89148686 L 3.35647625,1.78297373 L 86.64459371,1.78297373 L 86.64459371,0 L 3.35647625,0 L 3.35647625,0.89148686 M 89.09267075,3.30414372 L 88.18641146,3.30414372 L 88.18641146,46.69811321 L 89.99893004,46.69811321 L 89.99893004,3.30301526 L 89.09267075,3.30414372 M 86.64245378,49.10851314 L 86.64245378,48.21702627 L 3.35647625,48.21702627 L 3.35647625,50 L 86.64459371,50 L 86.64245378,49.10851314 M 0.90625929,46.69698474 L 1.81251858,46.69698474 L 1.81251858,3.30301526 L 0,3.30301526 L 0,46.69698474 L 0.90625929,46.69698474 M 3.35647625,49.10738467 L 3.35647625,48.21589781 C 2.50371515,48.21589781 1.81251858,47.53543378 1.81251858,46.69698474 L 0,46.69698474 C 0,48.52058319 1.50222909,49.99887154 3.35647625,49.99887154 L 3.35647625,49.10738467 M 89.09374071,46.69698474 L 88.18748142,46.69698474 C 88.18748142,47.53543378 87.49628485,48.21589781 86.64459371,48.21589781 L 86.64459371,49.99887154 C 88.49777091,49.99887154 90,48.52058319 90,46.69698474 L 89.09374071,46.69698474 M 86.64352375,0.89261533 L 86.64352375,1.78410219 C 87.49628485,1.78410219 88.18748142,2.46343775 88.18748142,3.30301526 L 90,3.30301526 C 90,1.47828835 88.49777091,0 86.64459371,0 L 86.64352375,0.89261533 M 3.35647625,0.89261533 L 3.35647625,0.00112846 C 1.50222909,0.00112846 0,1.47941681 0,3.30301526 L 1.81251858,3.30301526 C 1.81251858,2.46343775 2.50371515,1.78297373 3.35647625,1.78297373 L 3.35647625,0.89261533 M 9.23485704,43.32174777 L 9.23485704,44.21323463 L 39.61112762,44.21323463 L 39.61112762,42.4302609 L 9.23485704,42.4302609 L 9.23485704,43.32174777 M 42.06134459,40.91134784 L 42.96653391,40.91134784 L 42.96653391,9.08865216 L 41.15401534,9.08865216 L 41.15401534,40.91134784 L 42.06134459,40.91134784 M 6.78464008,9.08865216 L 5.87945075,9.08865216 L 5.87945075,40.91134784 L 7.69196933,40.91134784 L 7.69196933,9.08865216 L 6.78464008,9.08865216 M 39.61219759,6.67825223 L 39.61219759,5.78676537 L 33.54657314,5.78676537 L 33.54657314,7.5697391 L 39.61219759,7.5697391 L 39.61219759,6.67825223 M 15.30155145,6.67825223 L 15.30155145,5.78676537 L 9.235927,5.78676537 L 9.235927,7.5697391 L 15.30155145,7.5697391 L 15.30155145,6.67825223 M 6.78678,9.08865216 L 7.69303929,9.08865216 C 7.69303929,8.24907466 8.3831659,7.5697391 9.235927,7.5697391 L 9.235927,5.78676537 C 7.38274981,5.78676537 5.88052072,7.26505371 5.88052072,9.08865216 L 6.78678,9.08865216 M 42.06134459,9.08865216 L 42.96760388,9.08865216 C 42.96760388,7.26505371 41.46537478,5.78563691 39.61219759,5.78563691 L 39.61219759,7.56861063 C 40.46495869,7.56861063 41.1550853,8.24907466 41.1550853,9.08865216 L 42.06134459,9.08865216 M 39.61112762,43.32174777 L 39.61112762,44.21323463 C 41.46537478,44.21323463 42.96760388,42.73494629 42.96760388,40.91134784 L 41.1550853,40.91134784 C 41.1550853,41.74979688 40.46495869,42.4302609 39.61219759,42.4302609 L 39.61112762,43.32174777 M 9.235927,43.32174777 L 9.235927,42.4302609 C 8.3831659,42.4302609 7.69303929,41.74979688 7.69303929,40.91134784 L 5.87945075,40.91134784 C 5.87945075,42.73494629 7.38167984,44.21323463 9.23485704,44.21323463 L 9.235927,43.32174777 M 23.9340189,16.32098041 L 23.9340189,17.21246727 L 24.91410569,17.21246727 L 24.91410569,15.42949355 L 23.9340189,15.42949355 L 23.9340189,16.32098041 M 27.36325269,13.91058048 L 28.26951198,13.91058048 L 28.26951198,0.89148686 L 26.4569934,0.89148686 L 26.4569934,13.91170895 L 27.36325269,13.91058048 M 21.48380194,0.89148686 L 20.57754265,0.89148686 L 20.57754265,13.91170895 L 22.38899126,13.91170895 L 22.38899126,0.89148686 L 21.48380194,0.89148686 M 24.91303572,16.32098041 L 24.91303572,17.21246727 C 26.76621292,17.21246727 28.26844201,15.73417893 28.26844201,13.91058048 L 26.4569934,13.91058048 C 26.4569934,14.74902952 25.76579683,15.42949355 24.91303572,15.42949355 L 24.91303572,16.32098041 M 23.93294894,16.32098041 L 23.93294894,15.42949355 C 23.08018784,15.42949355 22.38899126,14.74902952 22.38899126,13.91058048 L 20.57754265,13.91058048 C 20.57754265,15.73417893 22.07977174,17.21246727 23.93294894,17.21246727 L 23.93294894,16.32098041 M 27.36218273,9.57050645 L 27.36218273,10.46199332 L 30.79248648,10.46199332 L 30.79248648,8.67901959 L 27.36218273,8.67901959 L 27.36218273,9.57050645 M 33.24163348,7.16010653 L 34.14789277,7.16010653 L 34.14789277,6.19526948 L 32.33537419,6.19526948 L 32.33537419,7.16010653 L 33.24163348,7.16010653 M 30.79141651,3.78486955 L 30.79141651,2.89338268 L 27.36218273,2.89338268 L 27.36218273,4.67635641 L 30.79248648,4.67635641 L 30.79141651,3.78486955 M 33.24163348,6.19526948 L 34.14789277,6.19526948 C 34.14789277,4.37167103 32.64566367,2.89338268 30.79248648,2.89338268 L 30.79248648,4.67635641 C 31.64417761,4.67635641 32.33537419,5.35682044 32.33537419,6.19526948 L 33.24163348,6.19526948 M 30.79141651,9.57050645 L 30.79141651,10.46199332 C 32.64566367,10.46199332 34.14789277,8.98370497 34.14789277,7.16010653 L 32.33537419,7.16010653 C 32.33537419,7.99855557 31.64417761,8.67901959 30.79248648,8.67901959 L 30.79141651,9.57050645 M 18.05349819,9.57050645 L 18.05349819,10.46199332 L 21.48380194,10.46199332 L 21.48380194,8.67901959 L 18.05349819,8.67901959 L 18.05349819,9.57050645 M 21.48380194,3.78486955 L 21.48380194,2.89338268 L 18.05349819,2.89338268 L 18.05349819,4.67635641 L 21.48380194,4.67635641 L 21.48380194,3.78486955 M 15.60435119,6.19526948 L 14.6980919,6.19526948 L 14.6980919,7.16010653 L 16.51061047,7.16010653 L 16.51061047,6.19526948 L 15.60435119,6.19526948 M 18.05456815,3.78486955 L 18.05456815,2.89338268 C 16.20032099,2.89338268 14.6980919,4.37167103 14.6980919,6.19526948 L 16.51061047,6.19526948 C 16.51061047,5.35682044 17.20180705,4.67635641 18.05349819,4.67635641 L 18.05456815,3.78486955 M 18.05456815,9.57050645 L 18.05456815,8.67901959 C 17.20180705,8.67901959 16.51061047,7.99855557 16.51061047,7.16010653 L 14.6980919,7.16010653 C 14.6980919,8.98370497 16.20032099,10.46199332 18.05349819,10.46199332 L 18.05456815,9.57050645 M 28.34226951,25.96370859 L 27.43601022,25.96370859 C 27.43601022,27.60223887 26.08785591,28.92931299 24.42299233,28.92931299 L 24.42299233,30.71228672 C 27.08720204,30.71228672 29.2485288,28.58625982 29.2485288,25.96370859 L 28.34226951,25.96370859 M 24.4240623,29.82079986 L 24.4240623,28.92931299 C 22.76026868,28.92931299 21.4110444,27.60223887 21.4110444,25.96370859 L 19.59852583,25.96370859 C 19.59852583,28.58625982 21.75985258,30.71341518 24.4240623,30.71341518 L 24.4240623,29.82079986 M 20.50478512,25.96370859 L 21.4110444,25.96370859 C 21.4110444,24.32630676 22.75919872,22.99810418 24.4240623,22.99810418 L 24.4240623,21.21513045 C 21.75985258,21.21513045 19.59852583,23.34115735 19.59852583,25.96370859 L 20.50478512,25.96370859 M 24.4240623,22.10661732 L 24.4240623,22.99810418 C 26.08785591,22.99810418 27.43708019,24.32630676 27.43708019,25.96370859 L 29.24959876,25.96370859 C 29.24959876,23.34115735 27.08827201,21.21513045 24.4240623,21.21513045 L 24.4240623,22.10661732 M 50.38994234,43.32174777 L 50.38994234,44.21323463 L 80.76621292,44.21323463 L 80.76621292,42.4302609 L 50.38994234,42.4302609 L 50.38994234,43.32174777 M 83.21642989,40.91134784 L 84.12161921,40.91134784 L 84.12161921,9.08865216 L 82.30910064,9.08865216 L 82.30910064,40.91134784 L 83.21642989,40.91134784 M 80.764073,6.67825223 L 80.764073,5.78676537 L 50.38780241,5.78676537 L 50.38780241,7.5697391 L 80.764073,7.5697391 L 80.764073,6.67825223 M 47.93758545,9.08865216 L 47.03239612,9.08865216 L 47.03239612,40.91134784 L 48.8449147,40.91134784 L 48.8449147,9.08865216 L 47.93758545,9.08865216 M 50.38780241,6.67825223 L 50.38780241,5.78676537 C 48.53462522,5.78676537 47.03239612,7.26505371 47.03239612,9.08865216 L 48.8449147,9.08865216 C 48.8449147,8.24907466 49.53611128,7.5697391 50.38780241,7.5697391 L 50.38780241,6.67825223 M 83.21428996,9.08865216 L 84.11947928,9.08865216 C 84.11947928,7.26505371 82.61725019,5.78563691 80.764073,5.78563691 L 80.764073,7.56861063 C 81.6168341,7.56861063 82.30803067,8.24907466 82.30803067,9.08865216 L 83.21428996,9.08865216 M 80.764073,43.32174777 L 80.764073,44.21323463 C 82.61725019,44.21323463 84.11947928,42.73494629 84.11947928,40.91134784 L 82.30910064,40.91134784 C 82.30910064,41.74979688 81.61790406,42.4302609 80.76514296,42.4302609 L 80.764073,43.32174777 M 50.38780241,43.32174777 L 50.38780241,42.4302609 C 49.53611128,42.4302609 48.8449147,41.74979688 48.8449147,40.91134784 L 47.03239612,40.91134784 C 47.03239612,42.73494629 48.53462522,44.21323463 50.38780241,44.21323463 L 50.38780241,43.32174777 M 53.81810616,11.49905209 L 53.81810616,12.39053895 L 77.33483921,12.39053895 L 77.33483921,10.60756523 L 53.8170362,10.60756523 L 53.81810616,11.49905209",viewW:90,viewH:50}};export{L as FURNITURE_ART_FINGERPRINT,M as GENERATED_FURNITURE_ART};
+globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="4da0d706a85c3f1c08ab6de960deb5feb08baaf9055265234e7bd1b554332653";const L="4da0d706a85c3f1c08ab6de960deb5feb08baaf9055265234e7bd1b554332653",M={coffee_table:{d:"M 0,2.4996674 C 0,1.11983275 1.11965812,0 2.5,0 L 117.5,0 C 118.88141026,0 120,1.11869239 120,2.4996674 L 120,57.49919225 C 120,58.88130761 118.88141026,60 117.5,60 L 2.5,60 C 1.11965812,60 0,58.88130761 0,57.5003326 L 0,2.4996674 M 106,13.00123539 L 106,6.99952485 M 106,6.99952487 A 1.00009503,1 90 0,1 106.29289321,6.29235088 A 1.00009503,1 90 0,1 106.99999999,5.99942982 M 107,5.99942982 L 113,5.99942982 A 1.00009503,1 90 0,1 113.70710678,6.29235087 A 1.00009503,1 90 0,1 114,6.99952485 L 114,13.00009503 M 114,13.00009502 A 1.00009503,1 90 0,1 113.70710679,13.707269 A 1.00009503,1 90 0,1 113.00000001,14.00019006 M 113,14.00019006 L 107,14.00019006 M 107,14.00019006 A 1.00009503,1 90 0,1 106.29289322,13.70726901 A 1.00009503,1 90 0,1 106,13.00009503 M 106,53.00161551 L 106,47.00104533 M 106,47.00104534 A 1.00009503,1 90 0,1 106.29289321,46.29387136 A 1.00009503,1 90 0,1 106.99999999,46.0009503 M 107,46.0009503 L 113,46.0009503 M 113,46.0009503 A 1.00009503,1 90 0,1 113.70710678,46.29387135 A 1.00009503,1 90 0,1 114,47.00104533 M 114,47.00104533 L 114,53.00161551 M 114,53.00161549 A 1.00009503,1 90 0,1 113.70710679,53.70878948 A 1.00009503,1 90 0,1 113.00000001,54.00171054 M 113,54.00171054 L 107,54.00171054 M 107,54.00171054 A 1.00009503,1 90 0,1 106.29289322,53.70878949 A 1.00009503,1 90 0,1 106,53.00161551 M 6,13.00123539 L 6,6.99952485 M 6,6.99952487 A 1.00009503,1 90 0,1 6.29289321,6.29235088 A 1.00009503,1 90 0,1 6.99999999,5.99942982 M 7,5.99942982 L 13,5.99942982 A 1.00009503,1 90 0,1 13.70710678,6.29235087 A 1.00009503,1 90 0,1 14,6.99952485 L 14,13.00009503 M 14,13.00009502 A 1.00009503,1 90 0,1 13.70710679,13.707269 A 1.00009503,1 90 0,1 13.00000001,14.00019006 M 13,14.00019006 L 7,14.00019006 A 1.00009503,1 90 0,1 6.29289322,13.70726901 A 1.00009503,1 90 0,1 6,13.00009503 M 6,53.00161551 L 6,47.00104533 M 6,47.00104533 A 1.00009503,1 90 0,1 6.29289322,46.29387135 A 1.00009503,1 90 0,1 7,46.0009503 M 7,46.0009503 L 13,46.0009503 M 13,46.0009503 A 1.00009503,1 90 0,1 13.70710678,46.29387135 A 1.00009503,1 90 0,1 14,47.00104533 M 14,47.00104533 L 14,53.00161551 A 1.00009503,1 90 0,1 13.70710678,53.70878949 A 1.00009503,1 90 0,1 13,54.00171054 M 13,54.00171054 L 7,54.00171054 M 7,54.00171054 A 1.00009503,1 90 0,1 6.29289322,53.70878949 A 1.00009503,1 90 0,1 6,53.00161551",viewW:120,viewH:60},coffee_table_round:{d:"M 0,40 A 40,40 0 0,0 40,80 A 40,40 0 0,0 80,40 A 40,40 0 0,0 40,0 A 40,40 0 0,0 0,40 M 57.94949634,25.60507796 L 53.70718918,21.3627708 A 1.00013799,1.00013799 0 0,1 53.70718918,19.94977232 L 57.94949634,15.70636125 A 1.00013799,1.00013799 0 0,1 59.36359873,15.70636125 L 63.6070098,19.94866841 A 1.00013799,1.00013799 0 0,1 63.6070098,21.3627708 L 59.36359873,25.60618187 A 1.00013799,1.00013799 0 0,1 57.95060025,25.60618187 M 57.94949634,63.86753139 L 53.70718918,59.62522423 A 1.00013799,1.00013799 0 0,1 53.70718918,58.21112184 L 57.94949634,53.96771078 A 1.00013799,1.00013799 0 0,1 59.36359873,53.96771078 L 63.60590589,58.21112184 A 1.00013799,1.00013799 0 0,1 63.60590589,59.62412033 L 59.36359873,63.86753139 A 1.00013799,1.00013799 0 0,1 57.94949634,63.86753139 M 19.94977232,25.60618187 L 15.70746516,21.36387471 A 1.00013799,1.00013799 0 0,1 15.70746516,19.94977232 L 19.94977232,15.70636125 A 1.00013799,1.00013799 0 0,1 21.36387471,15.70636125 L 25.60728577,19.94977232 A 1.00013799,1.00013799 0 0,1 25.60728577,21.3627708 L 21.36387471,25.60618187 A 1.00013799,1.00013799 0 0,1 19.95087622,25.60618187 M 19.94977232,63.86753139 L 15.70746516,59.62522423 A 1.00013799,1.00013799 0 0,1 15.70746516,58.21112184 L 19.94977232,53.96881468 A 1.00013799,1.00013799 0 0,1 21.36387471,53.96881468 L 25.60728577,58.21112184 A 1.00013799,1.00013799 0 0,1 25.60728577,59.62522423 L 21.36387471,63.86753139 A 1.00013799,1.00013799 0 0,1 19.95087622,63.86753139",viewW:80,viewH:80},coffee_table_oval:{d:"M 0,30.00057018 C 0,13.43115081 13.43162393,0 30,0 L 90,0 C 106.56944444,0 120,13.43115081 120,30.00057018 C 120,46.56998955 106.56944444,60 90,60 L 30,60 C 13.43162393,60 0,46.56998955 0,30.00057018 M 82,13.00123539 L 82,6.99952485 M 82,6.99952487 A 1.00009503,1 90 0,1 82.29289321,6.29235088 A 1.00009503,1 90 0,1 82.99999999,5.99942982 M 83,5.99942982 L 89,5.99942982 A 1.00009503,1 90 0,1 89.70710678,6.29235087 A 1.00009503,1 90 0,1 90,6.99952485 L 90,13.00009503 M 90,13.00009502 A 1.00009503,1 90 0,1 89.70710679,13.707269 A 1.00009503,1 90 0,1 89.00000001,14.00019006 M 89,14.00019006 L 83,14.00019006 M 83,14.00019006 A 1.00009503,1 90 0,1 82.29289322,13.70726901 A 1.00009503,1 90 0,1 82,13.00009503 M 82,53.00047515 L 82,46.99990497 M 82,46.99990498 A 1.00009503,1 90 0,1 82.29289321,46.292731 A 1.00009503,1 90 0,1 82.99999999,45.99980994 M 83,45.99980994 L 89,45.99980994 M 89,45.99980994 A 1.00009503,1 90 0,1 89.70710678,46.29273099 A 1.00009503,1 90 0,1 90,46.99990497 M 90,46.99990497 L 90,53.00047515 M 90,53.00047513 A 1.00009503,1 90 0,1 89.70710679,53.70764912 A 1.00009503,1 90 0,1 89.00000001,54.00057018 M 89,54.00057018 L 83,54.00057018 M 83,54.00057018 A 1.00009503,1 90 0,1 82.29289322,53.70764913 A 1.00009503,1 90 0,1 82,53.00047515 M 30,13.00123539 L 30,6.99952485 M 30,6.99952487 A 1.00009503,1 90 0,1 30.29289321,6.29235088 A 1.00009503,1 90 0,1 30.99999999,5.99942982 M 31,5.99942982 L 37,5.99942982 M 37,5.99942982 A 1.00009503,1 90 0,1 37.70710678,6.29235087 A 1.00009503,1 90 0,1 38,6.99952485 L 38,13.00009503 A 1.00009503,1 90 0,1 37,13.9990497 L 31,13.9990497 A 1.00009503,1 90 0,1 30,13.00009503 M 30,53.00047515 L 30,46.99990497 M 30,46.99990497 A 1.00009503,1 90 0,1 30.29289322,46.29273099 A 1.00009503,1 90 0,1 31,45.99980994 M 31,45.99980994 L 37,45.99980994 M 37,45.99980994 A 1.00009503,1 90 0,1 37.70710678,46.29273099 A 1.00009503,1 90 0,1 38,46.99990497 M 38,46.99990497 L 38,53.00047515 A 1.00009503,1 90 0,1 37,53.99942982 L 31,53.99942982 A 1.00009503,1 90 0,1 30,53.00047515",viewW:120,viewH:60},coffee_table_rounded:{d:"M 0,10.00057016 C 0,4.47802041 4.47649573,0 10,0 L 110,0 C 115.52350427,0 120,4.47802041 120,10.00057016 L 120,49.99942984 C 120,55.52197959 115.52350427,60 110,60 L 10,60 C 4.47649573,60 0,55.52197959 0,49.99942984 L 0,10.00057016 M 106,13.00188152 L 106,7.00039911 M 106,7.00039913 A 1.00005702,1 90 0,1 106.29289321,6.29325202 A 1.00005702,1 90 0,1 106.99999999,6.00034209 M 107,6.00034209 L 113,6.00034209 A 1.00005702,1 90 0,1 113.70710678,6.29325201 A 1.00005702,1 90 0,1 114,7.00039911 L 114,13.00074121 M 114,13.00074119 A 1.00005702,1 90 0,1 113.70710679,13.70788829 A 1.00005702,1 90 0,1 113.00000001,14.00079822 M 113,14.00079822 L 107,14.00079822 M 107,14.00079822 A 1.00005702,1 90 0,1 106.29289322,13.7078883 A 1.00005702,1 90 0,1 106,13.00074121 M 106,53.00074121 L 106,47.00039911 M 106,47.00039913 A 1.00005702,1 90 0,1 106.29289321,46.29325202 A 1.00005702,1 90 0,1 106.99999999,46.00034209 M 107,46.00034209 L 113,46.00034209 M 113,46.00034209 A 1.00005702,1 90 0,1 113.70710678,46.29325201 A 1.00005702,1 90 0,1 114,47.00039911 M 114,47.00039911 L 114,53.00074121 M 114,53.00074119 A 1.00005702,1 90 0,1 113.70710679,53.70788829 A 1.00005702,1 90 0,1 113.00000001,54.00079822 M 113,54.00079822 L 107,54.00079822 M 107,54.00079822 A 1.00005702,1 90 0,1 106.29289322,53.7078883 A 1.00005702,1 90 0,1 106,53.00074121 M 6,13.00188152 L 6,7.00039911 M 6,7.00039913 A 1.00005702,1 90 0,1 6.29289321,6.29325202 A 1.00005702,1 90 0,1 6.99999999,6.00034209 M 7,6.00034209 L 13,6.00034209 A 1.00005702,1 90 0,1 13.70710678,6.29325201 A 1.00005702,1 90 0,1 14,7.00039911 L 14,13.00074121 M 14,13.00074119 A 1.00005702,1 90 0,1 13.70710679,13.70788829 A 1.00005702,1 90 0,1 13.00000001,14.00079822 M 13,14.00079822 L 7,14.00079822 M 7,14.00079822 A 1.00005702,1 90 0,1 6.29289322,13.7078883 A 1.00005702,1 90 0,1 6,13.00074121 M 6,53.00074121 L 6,47.00039911 M 6,47.00039911 A 1.00005702,1 90 0,1 6.29289322,46.29325201 A 1.00005702,1 90 0,1 7,46.00034209 M 7,46.00034209 L 13,46.00034209 M 13,46.00034209 A 1.00005702,1 90 0,1 13.70710678,46.29325201 A 1.00005702,1 90 0,1 14,47.00039911 M 14,47.00039911 L 14,53.00074121 M 14,53.00074121 A 1.00005702,1 90 0,1 13.70710678,53.7078883 A 1.00005702,1 90 0,1 13,54.00079822 M 13,54.00079822 L 7,54.00079822 M 7,54.00079822 A 1.00005702,1 90 0,1 6.29289322,53.7078883 A 1.00005702,1 90 0,1 6,53.00074121",viewW:120,viewH:60},table_dining:{d:"M 0,2.50060665 C 0,1.11926717 1.11927063,0 2.49917894,0 L 157.49871914,0 C 158.87967841,0 160,1.11926717 160,2.50060665 L 160,87.49939335 C 160,88.88073283 158.87967841,90 157.49871914,90 L 2.49917894,90 C 1.11927063,90 0,88.88073283 0,87.49939335 L 0,2.50060665 M 142.00023647,16.99975734 L 142.00023647,10.99939335 A 1.00051234,1.00024266 0 0,1 142.99969785,10.00024266 L 149.00066999,10.00024266 A 1.00051234,1.00024266 0 0,1 149.99908041,10.99939335 L 149.99908041,16.99975734 A 1.00051234,1.00024266 0 0,1 149.00066999,18 L 142.99969785,18 A 1.00051234,1.00024266 0 0,1 142.00023647,16.99975734 M 141.99918551,78.99951468 L 141.99918551,72.99915069 A 1.00051234,1.00024266 0 0,1 142.99969785,72 L 148.99961903,72 A 1.00051234,1.00024266 0 0,1 149.99908041,72.99915069 L 149.99908041,78.99951468 A 1.00051234,1.00024266 0 0,1 148.99961903,79.99975734 L 142.99864689,79.99975734 A 1.00051234,1.00024266 0 0,1 142.00023647,78.99951468 M 9.99986863,16.99975734 L 9.99986863,10.99939335 A 1.00051234,1.00024266 0 0,1 10.99933001,9.99915069 L 17.00030215,9.99915069 A 1.00051234,1.00024266 0 0,1 17.99871258,10.99939335 L 17.99871258,16.99975734 A 1.00051234,1.00024266 0 0,1 17.00030215,17.99890803 L 10.99933001,17.99890803 A 1.00051234,1.00024266 0 0,1 9.99986863,16.99975734 M 9.99881767,79.00060665 L 9.99881767,73.00024266 A 1.00051234,1.00024266 0 0,1 10.99933001,72 L 16.99925119,72 A 1.00051234,1.00024266 0 0,1 17.99871258,73.00024266 L 17.99871258,79.00060665 A 1.00051234,1.00024266 0 0,1 16.99925119,79.99975734 L 10.99827906,79.99975734 A 1.00051234,1.00024266 0 0,1 9.99986863,79.00060665",viewW:160,viewH:90},table_round:{d:"M 0,55 A 55,55 90 0,0 55,110 A 55,55 90 0,0 110,55 A 55,55 90 0,0 55,0 A 55,55 90 0,0 0,55 M 82.94844112,30.60630783 L 78.70638697,26.36425368 A 0.99952125,0.99952125 90 0,1 78.41321383,25.65706553 A 0.99952125,0.99952125 90 0,1 78.70638697,24.94987738 M 78.70638697,24.94987738 L 82.94844112,20.70674848 A 0.99952125,0.99952125 90 0,1 83.65562927,20.41357533 A 0.99952125,0.99952125 90 0,1 84.36281742,20.70674848 L 88.60594632,24.94987738 M 88.60594632,24.94987738 A 0.99952125,0.99952125 90 0,1 88.89911946,25.65706553 A 0.99952125,0.99952125 90 0,1 88.60594632,26.36425368 L 84.36281742,30.60630783 A 0.99952125,0.99952125 90 0,1 83.65562927,30.89948097 A 0.99952125,0.99952125 90 0,1 82.94844112,30.60630783 M 82.94844112,89.6070797 L 78.70638697,85.3639508 A 0.99952125,0.99952125 90 0,1 78.41321383,84.65676265 A 0.99952125,0.99952125 90 0,1 78.70638697,83.9495745 L 82.94844112,79.70752035 A 0.99952125,0.99952125 90 0,1 83.65562927,79.4143472 A 0.99952125,0.99952125 90 0,1 84.36281742,79.70752035 L 88.60594632,83.9495745 A 0.99952125,0.99952125 90 0,1 88.89911946,84.65676265 A 0.99952125,0.99952125 90 0,1 88.60594632,85.3639508 L 84.36174266,89.6070797 A 0.99952125,0.99952125 90 0,1 83.65455451,89.90025284 A 0.99952125,0.99952125 90 0,1 82.94736636,89.6070797 M 24.94934,30.60738258 L 20.70728586,26.36425368 A 0.99952125,0.99952125 90 0,1 20.70728586,24.95095213 L 24.95041476,20.70782323 A 0.99952125,0.99952125 90 0,1 26.3637163,20.70782323 L 30.60684521,24.95095213 A 0.99952125,0.99952125 90 0,1 30.60684521,26.36425368 L 26.3637163,30.60738258 A 0.99952125,0.99952125 90 0,1 24.95041476,30.60738258 M 24.94934,89.29325152 L 20.70728586,85.05012262 A 0.99952125,0.99952125 90 0,1 20.41411271,84.34293447 A 0.99952125,0.99952125 90 0,1 20.70728586,83.63574632 L 24.95041476,79.39369217 A 0.99952125,0.99952125 90 0,1 26.3637163,79.39369217 L 30.60684521,83.63574632 A 0.99952125,0.99952125 90 0,1 30.90001835,84.34293447 A 0.99952125,0.99952125 90 0,1 30.60684521,85.05012262 L 26.3637163,89.29325152 A 0.99952125,0.99952125 90 0,1 24.95041476,89.29325152",viewW:110,viewH:110},table_dining_oval:{d:"M 0,50 C 0,22.38579779 22.38594332,0 49.99994193,0 L 129.99901287,0 C 157.61301149,0 180,22.38579779 180,50 C 180,77.61420221 157.61301149,100 129.99901287,100 L 49.99994193,100 C 22.38594332,100 0,77.61420221 0,50 M 123.99960515,16.99935051 L 123.99960515,10.99805153 A 1.00024968,1.0002165 0 0,1 124.99880964,9.99783503 L 130.99821737,9.99783503 M 130.99821737,9.99783503 A 1.00024968,1.0002165 0 0,1 131.70617646,10.29042188 A 1.00024968,1.0002165 0 0,1 131.99951224,10.99805153 M 131.99951224,10.99805153 L 131.99951224,16.99826802 A 1.00024968,1.0002165 0 0,1 130.99926256,17.99848452 L 124.99985483,17.99848452 A 1.00024968,1.0002165 0 0,1 124.29189574,17.70589767 A 1.00024968,1.0002165 0 0,1 123.99855996,16.99826802 M 123.99960515,89.00086599 L 123.99960515,83.00064949 M 123.99960515,83.00064951 A 1.00024968,1.0002165 0 0,1 124.29257149,82.29338963 A 1.00024968,1.0002165 0 0,1 124.99985482,82.00043299 M 124.99985483,82.00043299 L 130.99926256,82.00043299 A 1.00024968,1.0002165 0 0,1 131.70654589,82.29338962 A 1.00024968,1.0002165 0 0,1 131.99951224,83.00064949 L 131.99951224,89.00086599 M 131.99951224,89.00086597 A 1.00024968,1.0002165 0 0,1 131.7065459,89.70812585 A 1.00024968,1.0002165 0 0,1 130.99926257,90.00108249 M 130.99926256,90.00108249 L 124.99985483,90.00108249 A 1.00024968,1.0002165 0 0,1 124.2925715,89.70812586 A 1.00024968,1.0002165 0 0,1 123.99960515,89.00086599 M 47.99944256,17.00043299 L 47.99944256,11.0002165 M 47.99944256,11.00021648 A 1.00024968,1.0002165 0 0,1 48.29240892,10.29295662 A 1.00024968,1.0002165 0 0,1 48.99969226,10 M 48.99969225,10 L 54.99909997,10 A 1.00024968,1.0002165 0 0,1 55.70705907,10.29258685 A 1.00024968,1.0002165 0 0,1 56.00039485,11.0002165 L 56.00039485,16.99935051 M 56.00039485,16.99935052 A 1.00024968,1.0002165 0 0,1 55.70742849,17.70661039 A 1.00024968,1.0002165 0 0,1 55.00014515,17.99956701 M 55.00014517,17.99956701 L 49.00073744,17.99956701 A 1.00024968,1.0002165 0 0,1 48.29277835,17.70698015 A 1.00024968,1.0002165 0 0,1 47.99944256,16.99935051 M 47.99944256,89.00194847 L 47.99944256,83.00173198 M 47.99944256,83.00173199 A 1.00024968,1.0002165 0 0,1 48.2924089,82.29447212 A 1.00024968,1.0002165 0 0,1 48.99969223,82.00151548 M 48.99969225,82.00151548 L 54.99909997,82.00151548 A 1.00024968,1.0002165 0 0,1 55.70638331,82.29447211 A 1.00024968,1.0002165 0 0,1 55.99934966,83.00173198 L 55.99934966,89.00194847 A 1.00024968,1.0002165 0 0,1 54.99909997,90.00108249 L 48.99969225,90.00108249 M 48.99969225,90.00108249 A 1.00024968,1.0002165 0 0,1 48.29240891,89.70812586 A 1.00024968,1.0002165 0 0,1 47.99944256,89.00086599",viewW:180,viewH:100},table_dining_rounded:{d:"M 0,15.00018199 C 0,6.71552153 6.71566792,0 14.99937599,0 L 144.99957305,0 C 153.28433208,0 160,6.71552153 160,15.00018199 L 160,74.99981801 C 160,83.28447847 153.28433208,90 144.99957305,90 L 14.99937599,90 C 6.71566792,90 0,83.28447847 0,74.99981801 L 0,15.00018199 M 142.0011692,16.99955109 L 142.0011692,10.9992599 A 1.00051891,1.00023052 0 0,1 143.00063715,10.00012133 L 149.0016487,10.00012133 A 1.00051891,1.00023052 0 0,1 150.00006569,10.9992599 L 150.00006569,16.99955109 A 1.00051891,1.00023052 0 0,1 149.0016487,17.99978161 L 143.00063715,17.99978161 A 1.00051891,1.00023052 0 0,1 142.0011692,16.99955109 M 142.00011823,78.99855619 L 142.00011823,72.99826501 A 1.00051891,1.00023052 0 0,1 143.00063715,71.99912644 L 149.00059774,71.99912644 A 1.00051891,1.00023052 0 0,1 150.00006569,72.99826501 L 150.00006569,78.99855619 A 1.00051891,1.00023052 0 0,1 149.00059774,79.99878672 L 142.99958618,79.99878672 A 1.00051891,1.00023052 0 0,1 142.0011692,78.99855619 M 9.99993431,16.99955109 L 9.99993431,10.9992599 A 1.00051891,1.00023052 0 0,1 10.99940226,9.99902937 L 17.00041382,9.99902937 A 1.00051891,1.00023052 0 0,1 17.9988308,10.9992599 L 17.9988308,16.99955109 A 1.00051891,1.00023052 0 0,1 17.00041382,17.99868965 L 10.99940226,17.99868965 A 1.00051891,1.00023052 0 0,1 9.99993431,16.99955109 M 9.99888335,78.99964815 L 9.99888335,72.99935696 A 1.00051891,1.00023052 0 0,1 10.99940226,71.99912644 L 16.99936285,71.99912644 A 1.00051891,1.00023052 0 0,1 17.9988308,72.99935696 L 17.9988308,78.99964815 A 1.00051891,1.00023052 0 0,1 16.99936285,79.99878672 L 10.9983513,79.99878672 A 1.00051891,1.00023052 0 0,1 9.99993431,78.99964815",viewW:160,viewH:90},desk:{d:"M 0,2.5007596 C 0,1.11940895 1.11872146,0 2.4999244,0 L 137.5000756,0 C 138.88127854,0 140,1.11940895 140,2.5007596 L 140,67.50035981 C 140,68.88171046 138.88127854,70 137.5000756,70 L 2.4999244,70 C 1.11872146,70 0,68.88059105 0,67.50035981 L 0,2.5007596 M 6.00003024,12.99969616 L 6.00003024,6.99966418 A 1.00018144,0.99963219 0 0,1 6.2929766,6.29281747 A 1.00018144,0.99963219 0 0,1 7.00021168,6.00003198 L 13.00130031,6.00003198 A 1.00018144,0.99963219 0 0,1 14.00042336,6.99966418 L 14.00042336,12.99969616 M 14.00042336,12.99969616 A 1.00018144,0.99963219 0 0,1 13.70787328,13.70726661 A 1.00018144,0.99963219 0 0,1 13.00024192,14.00044776 M 13.00024192,14.00044776 L 7.00021168,14.00044776 A 1.00018144,0.99963219 0 0,1 6.29258032,13.70726661 A 1.00018144,0.99963219 0 0,1 6.00003024,12.99969616 M 125.99957664,13.00081557 L 125.99957664,7.00078359 M 125.99957664,7.00078359 A 1.00018144,0.99963219 0 0,1 126.29212672,6.29321313 A 1.00018144,0.99963219 0 0,1 126.99975808,6.00003198 L 133.00084671,6.00003198 M 133.00084671,6.00003198 A 1.00018144,0.99963219 0 0,1 133.70779377,6.29358707 A 1.00018144,0.99963219 0 0,1 133.99996976,7.00078359 M 133.99996976,7.00078359 L 133.99996976,13.00081557 A 1.00018144,0.99963219 0 0,1 132.99978832,14.00044776 L 126.99975808,14.00044776 A 1.00018144,0.99963219 0 0,1 125.99957664,13.00081557 M 5.99897185,63.00033582 L 5.99897185,57.00030384 M 5.99897185,57.00030384 A 1.00018144,0.99963219 0 0,1 6.29229231,56.29308288 A 1.00018144,0.99963219 0 0,1 7.00021168,56.00067165 M 7.00021168,56.00067165 L 13.00024192,56.00067165 A 1.00018144,0.99963219 0 0,1 13.707477,56.29345714 A 1.00018144,0.99963219 0 0,1 14.00042336,57.00030384 L 14.00042336,63.00033582 M 14.00042336,63.00033582 A 1.00018144,0.99963219 0 0,1 13.70787328,63.70790627 A 1.00018144,0.99963219 0 0,1 13.00024192,64.00108743 M 13.00024192,64.00108743 L 6.99915329,64.00108743 M 6.99915329,64.00108743 A 1.00018144,0.99963219 0 0,1 6.29220623,63.70753234 A 1.00018144,0.99963219 0 0,1 6.00003024,63.00033582 M 126.00063504,63.00145523 L 126.00063504,57.00142325 M 126.00063504,57.00142325 A 1.00018144,0.99963219 0 0,1 126.29318511,56.2938528 A 1.00018144,0.99963219 0 0,1 127.00081647,56.00067165 L 133.00084671,56.00067165 A 1.00018144,0.99963219 0 0,1 133.70847808,56.2938528 A 1.00018144,0.99963219 0 0,1 134.00102815,57.00142325 L 134.00102815,63.00145523 A 1.00018144,0.99963219 0 0,1 133.00084671,64.00108743 L 126.99975808,64.00108743 A 1.00018144,0.99963219 0 0,1 126.00063504,63.00145523 M 22.99993952,60.00031983 L 117.00006048,60.00031983",viewW:140,viewH:70},desk_corner:{d:"M 159.99894904,65.49825605 A 2.50129729,2.50128086 90 0,1 157.49871914,67.99955334 L 94.99927747,67.99955334 C 81.19178676,67.99955334 69.99908041,79.19233321 69.99908041,92.99886364 L 69.99908041,157.49870271 A 2.50129729,2.50128086 90 0,1 67.49885051,160 L 2.49917894,160 A 2.50129729,2.50128086 90 0,1 0,157.49870271 L 0,2.49814439 A 2.50129729,2.50128086 90 0,1 2.49917894,0 L 157.49871914,0 A 2.50129729,2.50128086 90 0,1 160,2.49919535 L 159.99894904,65.49825605 M 5.99992118,12.99938913 L 5.99992118,6.99837757 M 5.99992118,6.99837757 A 0.99841698,0.99841043 90 0,1 6.29272029,6.29201832 A 0.99841698,0.99841043 90 0,1 6.99938256,5.99996059 M 6.99938256,5.99996059 L 13.0003547,5.99996059 A 0.99841698,0.99841043 90 0,1 13.99876512,6.99837757 L 13.99876512,12.99938913 M 13.99876512,12.99938913 A 0.99841698,0.99841043 90 0,1 13.70670931,13.70605604 A 0.99841698,0.99841043 90 0,1 13.0003547,13.99885708 M 13.0003547,13.99885708 L 6.99938256,13.99885708 A 0.99841698,0.99841043 90 0,1 6.29234827,13.70642806 A 0.99841698,0.99841043 90 0,1 5.99992118,12.99938913 M 146.00018392,13.00044009 L 146.00018392,6.99942854 M 146.00018392,6.99942854 A 0.99841698,0.99841043 90 0,1 146.29261101,6.2923896 A 0.99841698,0.99841043 90 0,1 146.9996453,5.99996059 M 146.9996453,5.99996059 L 153.00061744,5.99996059 A 0.99841698,0.99841043 90 0,1 153.70697205,6.29276163 A 0.99841698,0.99841043 90 0,1 153.99902786,6.99942854 L 153.99902786,13.00044009 M 153.99902786,13.00044009 A 0.99841698,0.99841043 90 0,1 153.70697205,13.707107 A 0.99841698,0.99841043 90 0,1 153.00061744,13.99990804 L 146.9996453,13.99990804 A 0.99841698,0.99841043 90 0,1 146.29261101,13.70747903 A 0.99841698,0.99841043 90 0,1 146.00018392,13.00044009 M 146.00018392,61.0001248 L 146.00018392,54.99911325 M 146.00018392,54.99911325 A 0.99841698,0.99841043 90 0,1 146.29298209,54.29170176 A 0.99841698,0.99841043 90 0,1 147.00069626,53.9996453 M 147.00069626,53.9996453 L 153.00061744,53.9996453 M 153.00061744,53.9996453 A 0.99841698,0.99841043 90 0,1 153.70765173,54.29207431 A 0.99841698,0.99841043 90 0,1 154.00007882,54.99911325 L 154.00007882,61.0001248 M 154.00007882,61.0001248 A 0.99841698,0.99841043 90 0,1 153.70765173,61.70716374 A 0.99841698,0.99841043 90 0,1 153.00061744,61.99959275 M 153.00061744,61.99959275 L 146.9996453,61.99959275 A 0.99841698,0.99841043 90 0,1 146.29329069,61.70679171 A 0.99841698,0.99841043 90 0,1 146.00123488,61.0001248 M 5.99887022,152.9995205 L 5.99887022,147.00061087 M 5.99887022,147.00061087 A 0.99841698,0.99841043 90 0,1 6.29129565,146.29251931 A 0.99841698,0.99841043 90 0,1 6.99938256,146.00009196 M 6.99938256,146.00009196 L 12.99930374,146.00009196 A 0.99841698,0.99841043 90 0,1 13.70671058,146.29289205 A 0.99841698,0.99841043 90 0,1 13.99876512,147.00061087 L 13.99876512,153.00057146 M 13.99876512,153.00057146 A 0.99841698,0.99841043 90 0,1 13.70633803,153.7076104 A 0.99841698,0.99841043 90 0,1 12.99930374,154.00003941 M 12.99930374,154.00003941 L 6.9983316,154.00003941 A 0.99841698,0.99841043 90 0,1 6.29129731,153.7076104 A 0.99841698,0.99841043 90 0,1 5.99887022,153.00057146 M 55.99926433,153.00057146 L 55.99926433,147.00061087 M 55.99926433,147.00061087 A 0.99841698,0.99841043 90 0,1 56.2920625,146.29319939 A 0.99841698,0.99841043 90 0,1 56.99977667,146.00114292 M 56.99977667,146.00114292 L 62.99969785,146.00114292 A 0.99841698,0.99841043 90 0,1 63.70673214,146.29357194 A 0.99841698,0.99841043 90 0,1 63.99915923,147.00061087 L 63.99915923,153.00162243 M 63.99915923,153.00162243 A 0.99841698,0.99841043 90 0,1 63.70636012,153.70798168 A 0.99841698,0.99841043 90 0,1 62.99969785,154.00003941 M 62.99969785,154.00003941 L 56.99872571,154.00003941 M 56.99872571,154.00003941 A 0.99841698,0.99841043 90 0,1 56.29206344,153.70798168 A 0.99841698,0.99841043 90 0,1 55.99926433,153.00162243 M 109.99960589,57.99856806 L 96.36237044,57.99856806 A 36.36339751,36.36315866 90 0,0 70.64973437,68.6491606 A 36.36339751,36.36315866 90 0,0 59.99921178,94.36196557 L 59.99921178,107.9992906",viewW:160,viewH:160},chair:{d:"M 41.91143767,10.29325717 L 8.08739211,10.29325717 A 5.14662859,5.14662858 90 0,1 2.94076353,5.14662859 A 5.14662859,5.14662858 90 0,1 8.08739211,0 L 41.91143767,0 A 5.14662859,5.14662858 90 0,1 47.05806625,5.14662859 A 5.14662859,5.14662858 90 0,1 41.91143767,10.29325717 M 8.08739211,10.29325717 L 5.14662867,10.29325717 A 5.14896903,5.14896902 90 0,0 0.00000009,15.44105598 L 0.00000009,42.64633596 M 0.00000009,42.64633596 A 7.35249373,7.35249371 90 0,0 2.15308186,47.84609063 A 7.35249373,7.35249371 90 0,0 7.35249381,49.99999991 M 7.35249381,49.99999991 L 42.64633597,49.99999991 M 42.64633597,49.99999991 A 7.35249373,7.35249371 90 0,0 47.84650445,47.84650445 A 7.35249373,7.35249371 90 0,0 49.99999991,42.64633596 M 49.99999991,42.64633596 L 49.99999991,15.44105598 C 49.99999991,12.59742081 47.69466605,10.29325717 44.85220111,10.29325717 L 41.91143767,10.29325717",viewW:50,viewH:50},chair_bar:{d:"M 41.6420124,15.95288922 C 43.22061234,18.92793522 43.95991141,23.03717335 43.95991141,26.63643725 C 43.95991141,38.43533309 34.35259503,48 22.5011905,48 C 10.64978597,48 1.04127909,38.43533309 1.04127909,26.63643725 C 1.04127909,23.03717335 1.73891074,18.91969084 3.31751068,15.94464483 M 41.6420124,15.95288922 A 4.27388672,4.22819286 0 0,1 37.67408359,14.80338609 M 41.6420124,15.95288922 A 4.28579169,4.23997056 0 0,0 43.74324083,14.80338609 M 3.47227538,15.97644461 L 3.31751068,15.94464483 A 4.28579169,4.23997056 0 0,1 1.25675917,14.80338609 M 37.67408359,14.80338609 A 21.42895847,21.19985278 0 0,0 30.71205308,10.17239603 A 21.34562363,21.11740891 0 0,0 14.28794692,10.17239603 A 21.42895847,21.19985278 0 0,0 7.32591641,14.80338609 A 4.27388672,4.22819286 0 0,1 3.47227538,15.97644461 M 37.67408359,14.80338609 A 4.27388672,4.22819286 0 0,0 40.70866221,16.0541972 A 4.27388672,4.22819286 0 0,0 43.74324083,14.80338609 M 3.47227538,15.97644461 A 4.28579169,4.23997056 0 0,1 1.25675917,14.80338609 A 4.33817359,4.29179242 0 0,1 1.25675917,8.76142805 A 30.00054185,29.67979389 0 0,1 11.00336378,2.2778064 A 29.88149208,29.56201693 0 0,1 22.5,0 A 29.88149208,29.56201693 0 0,1 33.99663622,2.2778064 A 30.00054185,29.67979389 0 0,1 43.74324083,8.76142805 A 4.33817359,4.29179242 0 0,1 43.74324083,14.80338609",viewW:45,viewH:48},armchair:{d:"M 78.52464784,10.06903664 Q 78.5377513,9.82334385 78.5377513,9.57437515 C 78.5377513,4.28597428 74.26056466,0 68.98533141,0 L 21.01357664,0 C 15.73943534,0 11.4622487,4.28597428 11.4622487,9.57437515 Q 11.4622487,9.82334385 11.4742602,10.06903664 M 80.08614309,74.58141228 Q 80.73039638,74.68078136 81.40304049,74.68187333 C 86.15085961,74.68187333 90,70.8239505 90,66.06406212 L 90,18.19218636 C 90,13.43229799 86.15085961,9.57437515 81.40304049,9.57437515 C 80.39407433,9.57437515 79.42441853,9.74909003 78.52464784,10.06903664 A 8.61562727,8.61552274 90 0,0 72.80608097,18.19109439 L 72.80608097,18.35270565 A 9.50012133,9.50000607 90 0,1 68.98533141,19.14984227 L 21.01357664,19.14984227 A 9.50012133,9.50000607 90 0,1 17.19282707,18.35270565 M 72.80608097,18.35270565 L 72.80608097,66.06406212 A 8.61562727,8.61552274 90 0,0 80.08614309,74.58141228 M 11.4742602,10.06794467 A 8.61562727,8.61552274 90 0,1 17.19282707,18.19000243 L 17.19282707,18.35161369 L 17.19282707,66.06406212 A 8.61562727,8.61552274 90 0,1 9.91385691,74.58141228 Q 9.26960362,74.68078136 8.59695951,74.68187333 C 3.84914039,74.68187333 0,70.8239505 0,66.06406212 L 0,18.19218636 C 0,13.43229799 3.84914039,9.57437515 8.59695951,9.57437515 C 9.60592567,9.57437515 10.57448951,9.74909003 11.4742602,10.06903664 M 80.08614309,74.58141228 C 78.35539486,83.37175443 70.62217153,90 61.34383228,90 L 28.65507577,90 C 19.37782847,90 11.64460514,83.37175443 9.91385691,74.58141228",viewW:90,viewH:90},armchair_office:{d:"M 60.12480149,17.08328496 Q 60.12480149,16.66780357 60.06834946,16.27038659 M 51.18618701,11.38735127 L 13.81381391,11.38735127 A 5.69036465,5.69028856 0 0,1 9.79038036,9.71870864 A 5.69036465,5.69028856 0 0,1 8.12570733,5.69367564 M 8.12570733,5.69367564 A 5.69036465,5.69028856 0 0,1 9.79038036,1.66864264 A 5.69036465,5.69028856 0 0,1 13.81381391,0 M 13.81381391,0 L 51.18844509,0 M 51.18844509,0 A 5.69036465,5.69028856 0 0,1 55.21187864,1.66864264 A 5.69036465,5.69028856 0 0,1 56.87655166,5.69367564 M 56.87655166,5.69367564 A 5.69036465,5.69028856 0 0,1 55.21187864,9.71870864 A 5.69036465,5.69028856 0 0,1 51.18844509,11.38735127 M 13.81381391,11.38735127 L 10.56217696,11.38735127 A 5.69036465,5.69028856 0 0,0 4.9327805,16.26812854 M 51.18731605,11.38735127 L 54.43782395,11.38735127 A 5.69036465,5.69028856 0 0,1 60.06722042,16.26925757 M 60.12480149,44.29844483 A 4.87745542,4.87739019 0 0,0 63.57342145,42.86789464 A 4.87745542,4.87739019 0 0,0 64.99999882,39.41766756 M 64.99999882,39.41766756 L 64.99999882,21.15003484 M 64.99999882,21.15003484 A 4.87745542,4.87739019 0 0,0 63.55272454,17.68002711 A 4.87745542,4.87739019 0 0,0 60.06722042,16.27038659 M 60.12480149,44.29957385 A 4.87745542,4.87739019 0 0,1 56.67618152,42.86902366 A 4.87745542,4.87739019 0 0,1 55.24960415,39.41879658 M 55.24960415,39.41879658 L 55.24960415,21.15003484 A 4.87745542,4.87739019 0 0,1 60.06722042,16.27038659 M 46.69937964,58.31529651 L 52.00022529,58.31529651 C 52.83119917,58.31529651 53.632818,58.18997468 54.38814617,57.95739542 A 8.14038277,8.14027391 0 0,0 60.12480149,50.1795387 L 60.12480149,44.29957385 M 4.9327805,16.26925757 L 4.87519943,16.26925757 M 4.87519943,16.26925757 A 4.87745542,4.87739019 0 0,0 1.42657946,17.69980776 A 4.87745542,4.87739019 0 0,0 0.00000209,21.15003484 L 0.00000209,39.41766756 M 0.00000209,39.41766756 A 4.87745542,4.87739019 0 0,0 1.42617995,42.86862456 A 4.87745542,4.87739019 0 0,0 4.87519943,44.29957385 M 4.87519943,44.29957385 A 4.87745542,4.87739019 0 0,0 8.32308951,42.86862466 A 4.87745542,4.87739019 0 0,0 9.74926772,39.41879658 M 9.74926772,39.41879658 L 9.74926772,21.15003484 A 4.87745542,4.87739019 0 0,0 4.9327805,16.26925757 M 18.40788013,58.31416748 L 12.99977563,58.31416748 A 8.12909236,8.12898366 0 0,1 10.69653279,57.98223398 A 8.14038277,8.14027391 0 0,1 4.87519943,50.18066772 L 4.87519943,44.29844483 M 46.70050868,58.31416748 L 52.5455519,64.16590669 C 53.63959225,65.26106143 55.40654079,65.28025487 56.52429099,64.20880966 A 2.85195657,2.85191843 0 0,0 57.39975759,62.18274316 A 2.85195657,2.85191843 0 0,0 56.56719454,60.1386727 L 54.38814617,57.95739542 M 46.69937964,58.31416748 L 18.40900917,58.31416748 M 10.69766183,57.98223398 L 8.54232332,60.1386727 C 7.41554079,61.26769821 7.43586352,63.10462271 8.58522686,64.20880966 C 9.70297706,65.28025487 11.46992561,65.26106143 12.56396596,64.16590669 L 18.40900917,58.31416748",viewW:65,viewH:65},sofa:{d:"M 89.9994774,17.00719477 L 89.9994774,79.3698208 M 89.9994774,17.00828672 L 89.9994774,4.25097973 M 89.9994774,17.00610281 C 89.9994774,19.35489742 88.08050309,21.25817449 85.71418617,21.25817449 L 27.85648339,21.25817449 A 11.68391551,11.18356492 90 0,1 23.53356521,20.35731185 M 89.9994774,17.00719477 C 89.9994774,19.35598937 91.91845172,21.25926645 94.28476863,21.25926645 L 152.14247142,21.25926645 C 153.68099549,21.25926645 155.14322047,20.93823176 156.46643479,20.3584038 M 89.9994774,79.3698208 C 89.9994774,85.24016937 85.20204161,90 79.28624932,90 L 27.8554382,90 C 22.35145195,90 17.81635959,85.8811468 17.21014766,80.58189054 M 89.9994774,79.3698208 C 89.9994774,85.24016937 94.7969132,90 100.71270548,90 L 152.14247142,90 C 157.64645767,90 162.18155002,85.8811468 162.78776195,80.58189054 M 89.9994774,4.25207168 C 89.9994774,1.90436903 88.07945789,0 85.71314098,0 L 27.85648339,0 C 21.93964591,0 17.14325531,4.75873867 17.14325531,10.6301792 Q 17.14325531,11.08443237 17.18088226,11.53104185 M 89.9994774,4.25207168 C 89.9994774,1.90436903 91.91845172,0 94.28476863,0 L 152.14247142,0 C 158.0593089,0 162.8556995,4.75873867 162.8556995,10.6301792 Q 162.8556995,11.08443237 162.81807255,11.53104185 A 11.68391551,11.18356492 90 0,1 167.14203592,10.6301792 L 169.28468154,10.6301792 C 175.20256421,10.6301792 180,15.38891787 180,21.25926645 L 180,70.86676939 C 180,76.73711797 175.20256421,81.49585664 169.28572673,81.49585664 L 167.14308111,81.49585664 C 165.59201473,81.49585664 164.11829262,81.16827022 162.78776195,80.58189054 C 159.04074511,78.92539523 156.42880784,75.19855377 156.42880784,70.86567744 L 156.42880784,21.2603584 Q 156.42880784,20.80501329 156.46643479,20.35949576 C 156.80089654,16.40443576 159.31772125,13.06523823 162.81807255,11.5321338 M 17.18088226,11.5321338 C 20.68227875,13.06523823 23.19910346,16.40443576 23.53356521,20.35949576 Q 23.57119216,20.80501329 23.57119216,21.2603584 L 23.57119216,70.86786135 C 23.57119216,75.19964572 20.9582097,78.92648718 17.21119286,80.58298249 A 11.68391551,11.18356492 90 0,1 12.85691889,81.49694859 L 10.71427327,81.49694859 C 4.7963906,81.49694859 0,76.73820992 0,70.86676939 L 0,21.2603584 C 0,15.39000983 4.79743579,10.63127116 10.71322808,10.63127116 L 12.85587369,10.63127116 C 14.39544296,10.63127116 15.85766794,10.95230584 17.18088226,11.5321338",viewW:180,viewH:90},sofa_three_seat:{d:"M 85.42409676,16.16420572 L 85.42409676,79.89832688 M 85.42409676,16.16529768 L 85.42409676,4.04132442 M 85.42409676,16.16420572 C 85.42409676,18.39616117 83.60262573,20.20553014 81.35628263,20.20553014 L 26.44130873,20.20553014 C 24.98061715,20.20553014 23.59228821,19.89978282 22.33731328,19.34943764 M 85.42409676,16.16420572 C 85.42409676,18.39616117 87.24556779,20.20553014 89.49191089,20.20553014 L 150.50808911,20.20553014 C 152.75546596,20.20553014 154.57590324,18.39616117 154.57590324,16.16529768 M 85.42409676,79.89614297 C 85.42409676,85.47603159 80.87145294,89.99890805 75.25507831,89.99890805 L 26.44130873,89.99890805 C 21.21672611,89.99890805 16.91218277,86.08425037 16.3363829,81.04706325 M 85.42409676,79.89614297 C 85.42409676,85.47603159 89.97674058,89.99890805 95.59311521,89.99890805 L 144.40688479,89.99890805 C 150.02325942,89.99890805 154.57590324,85.47603159 154.57590324,79.89614297 M 154.57590324,16.16311377 L 154.57590324,79.89832688 M 154.57590324,16.16529768 L 154.57590324,4.04132442 M 154.57590324,16.16420572 C 154.57590324,18.39616117 156.39737427,20.20553014 158.64475112,20.20553014 L 213.55972502,20.20553014 C 215.0204166,20.20553014 216.40874554,19.89978282 217.66372047,19.34943764 M 154.57590324,79.89723493 C 154.57590324,85.47712355 159.12958081,90 164.74595545,90 L 213.55972502,90 C 218.78430764,90 223.08885098,86.08534233 223.66465085,81.0481552 M 85.42409676,4.04132442 C 85.42409676,1.80936897 83.60262573,0 81.35628263,0 L 26.44130873,0 C 20.8249341,0 16.27125653,4.52287645 16.27125653,10.10276507 Q 16.27125653,10.53517914 16.30743785,10.95885757 M 85.42409676,4.04132442 C 85.42409676,1.80936897 87.24556779,0 89.49191089,0 L 150.50808911,0 C 152.75546596,0 154.57590324,1.80936897 154.57590324,4.04023247 C 154.57590324,1.80936897 156.39737427,0 158.64475112,0 L 213.55972502,0 C 219.17609965,0 223.72977723,4.52287645 223.72977723,10.10276507 C 223.72977723,10.38448939 223.75251977,10.66730566 223.72977723,10.94357021 M 223.66465085,81.0481552 C 224.92582829,81.60723602 226.32552851,81.91735116 227.79759136,81.91735116 L 229.83098155,81.91735116 C 235.44735618,81.91735116 240,77.39447471 240,71.81458609 L 240,20.20553014 C 240,14.62564152 235.44735618,10.10276507 229.83098155,10.10276507 L 227.79759136,10.10276507 C 222.47066729,10.10276507 218.10099757,14.17029641 217.66372047,19.34943764 Q 217.6265054,19.77202412 217.62753915,20.20553014 L 217.62753915,71.81458609 C 217.62753915,75.93234734 220.10751021,79.47464845 223.66465085,81.0481552 M 16.30743785,10.95885757 A 11.24713362,10.64764563 90 0,0 12.20344239,10.10276507 L 10.1700522,10.10276507 C 4.55367757,10.10276507 0,14.62564152 0,20.20553014 L 0,71.81458609 C 0,77.39447471 4.55367757,81.91735116 10.1700522,81.91735116 L 12.20344239,81.91735116 C 13.67550525,81.91735116 15.07417171,81.60723602 16.3363829,81.0481552 C 19.89352354,79.47464845 22.3734946,75.93234734 22.3734946,71.81458609 L 22.3734946,20.20553014 A 9.82759248,9.30376803 90 0,0 22.33731328,19.34943764 C 22.01995141,15.58983754 19.63095053,12.41661712 16.30743785,10.95885757",viewW:240,viewH:90},sofa_corner_right:{d:"M 92.54139418,17.60590034 L 92.54139418,83.62724067 M 92.54139418,17.60485243 L 92.54139418,4.40121311 M 92.54139418,17.60485243 C 92.54139418,20.03599872 90.56883033,22.00606554 88.13534854,22.00606554 L 28.64290558,22.00606554 A 11.31740513,11.1362726 90 0,1 24.19767677,21.07342752 M 92.54139418,17.60485243 C 92.54139418,20.03599872 94.51498915,22.00606554 96.94847094,22.00606554 L 163.05049792,22.00606554 C 165.48397971,22.00606554 167.45757469,20.03599872 167.45757469,17.60485243 M 92.54139418,83.62933649 C 92.54139418,89.70720221 87.609469,94.63341717 81.52473339,94.63341717 L 28.64290558,94.63341717 C 22.98299815,94.63341717 18.32019956,90.3705279 17.69636207,84.88368223 M 92.54139418,83.62933649 C 92.54139418,89.70720221 97.47435048,94.63341717 103.55805496,94.63341717 L 156.4409139,94.63341717 C 162.52461838,94.63341717 167.45757469,89.70720221 167.45757469,83.6303844 M 167.45757469,17.60694825 L 167.45757469,83.62724067 M 167.45757469,17.60485243 L 167.45757469,4.40121311 M 167.45757469,17.60485243 C 167.45757469,20.03599872 169.43116967,22.00606554 171.86362032,22.00606554 L 231.35606328,22.00606554 C 232.93782644,22.00606554 234.44225438,21.67387874 235.80232323,21.07342752 M 167.45860582,83.62828858 L 167.45860582,158.99696723 C 167.45860582,165.07378504 172.38949986,170 178.47526661,170 L 231.35606328,170 C 237.01700185,170 241.67980044,165.73711073 242.30260679,160.25026506 L 242.30260679,84.88263432 M 92.54139418,4.40121311 C 92.54139418,1.97006682 90.56883033,0 88.13534854,0 L 28.64290558,0 C 22.55920111,0 17.6262448,4.92516705 17.6262448,11.00303277 Q 17.6262448,11.47459132 17.66542798,11.93567078 M 92.54139418,4.40121311 C 92.54139418,1.97006682 94.51498915,0 96.94847094,0 L 163.05049792,0 C 165.48397971,0 167.45757469,1.97006682 167.45757469,4.40121311 C 167.45757469,1.97006682 169.43116967,0 171.86362032,0 L 231.35606328,0 C 237.43976776,0 242.3737552,4.92516705 242.3737552,11.00303277 C 242.3737552,11.31006978 242.39850247,11.6181547 242.3737552,11.91890426 M 242.30157566,84.88263432 C 243.66989359,85.49042089 245.18566403,85.82994304 246.78083197,85.82994304 L 248.98333922,85.82994304 C 255.06807483,85.82994304 260,80.90268018 260,74.82586237 L 260,22.00711345 C 260,15.92924773 255.06807483,11.00408068 248.98333922,11.00408068 L 246.78083197,11.00408068 C 241.01059294,11.00408068 236.27664595,15.4335873 235.80232323,21.07447543 Q 235.76314005,21.5355549 235.76314005,22.00711345 L 235.76314005,74.82481446 C 235.76314005,79.3098602 238.44925024,83.16720911 242.30260679,84.88158641 M 17.66645912,11.93567078 A 11.31740513,11.1362726 90 0,0 13.22019917,11.00303277 L 11.01666078,11.00303277 C 4.93295631,11.00303277 0,15.92924773 0,22.00606554 L 0,74.82586237 C 0,80.90372809 4.93192517,85.82889514 11.01666078,85.82889514 L 13.22019917,85.82889514 C 14.81433597,85.82889514 16.33010641,85.4914688 17.69739321,84.88263432 C 21.55074976,83.16825702 24.23685995,79.3109081 24.23685995,74.82586237 L 24.23685995,22.00711345 Q 24.23685995,21.5355549 24.19870791,21.07447543 C 23.85430837,16.98029933 21.26615612,13.52325123 17.66645912,11.93671869",viewW:260,viewH:170},bed_single:{d:"M 0,10.53299756 C 0,16.34997607 4.71506048,21.06599513 10.53190328,21.06599513 L 79.46700477,21.06599513 C 85.28493952,21.06599513 90,16.34997607 90,10.53299756 M 65.10670824,59.36856126 L 65.10670824,44.04670232 C 65.10670824,38.75835085 60.81969401,34.4721014 55.5313573,34.4721014 L 34.46755075,34.4721014 C 29.18030599,34.4721014 24.89329176,38.75939145 24.89329176,44.04670232 L 24.89329176,59.36752066 M 0,59.36752066 L 89.99890805,59.36752066 M 89.99890805,82.34926846 L 0,82.34926846 M 9.57425899,200 L 80.42574101,200 C 85.71298577,200 90,195.71270994 90,190.42435847 L 90,9.57564153 C 90,4.28729006 85.71298577,0 80.42574101,0 L 9.57425899,0 C 4.28592228,0 0,4.28729006 0,9.57564153 L 0,190.42435847 C 0,195.71270994 4.28592228,200 9.57425899,200",viewW:90,viewH:200},bed_double:{d:"M 0,10.58300164 C 0,16.42914748 4.74612788,21.1680845 10.60206776,21.1680845 L 149.39688128,21.1680845 C 155.25177021,21.1680845 159.99894904,16.42914748 159.99894904,10.58300164 M 74.69791516,59.65815968 L 74.69791516,44.26233773 C 74.69791516,38.94794349 70.38268021,34.63981893 65.0595762,34.63981893 L 43.85438972,34.63981893 C 38.53128572,34.63981893 34.21710172,38.94794349 34.21710172,44.26233773 L 34.21710172,59.65815968 M 128.67408468,59.65815968 L 128.67408468,44.26233773 C 128.67408468,38.94794349 124.35779877,34.63981893 119.03469476,34.63981893 L 97.83055924,34.63981893 C 92.50745524,34.63981893 88.19222028,38.94794349 88.19222028,44.26233773 L 88.19222028,59.65815968 M 0,59.65815968 L 159.99894904,59.65815968 M 159.99894904,82.7513723 L 0.00105096,82.7513723 M 9.63833896,200 L 150.36166104,200 C 155.68476505,200 160,195.69187544 160,190.3774812 L 160,9.6225188 C 160,4.30812456 155.68476505,0 150.36166104,0 L 9.63833896,0 C 4.31628591,0 0.00105096,4.30812456 0.00105096,9.6225188 L 0.00105096,190.37644059 C 0.00105096,195.69083483 4.31628591,199.99895939 9.63833896,199.99895939",viewW:160,viewH:200},nightstand:{d:"M 2.49959042,0.00000027 L 47.49923936,0.00000027 M 47.49923936,0.00000027 A 2.50053206,2.49959042 90 0,1 49.26747323,0.73197514 A 2.50053206,2.49959042 90 0,1 50,2.50053233 L 50,37.49946767 M 50,37.49946767 A 2.50053206,2.49959042 90 0,1 49.26747323,39.26802486 A 2.50053206,2.49959042 90 0,1 47.49923936,39.99999973 M 47.49923936,39.99999973 L 2.49959042,39.99999973 A 2.50053206,2.49959042 90 0,1 0,37.49946767 L 0,2.50053233 A 2.50053206,2.49959042 90 0,1 2.49959042,0.00000027",viewW:50,viewH:40},cabinet_tv:{d:"M 55.99957664,17 L 61.62493574,17 L 67.25029484,17 M 61.62493574,17 L 61.62493574,27.96904762 M 72.03105628,17 L 77.65641537,28.25 L 83.28071608,17 M 2.4999244,45 L 137.5000756,45 C 138.88127854,45 140,43.88095238 140,42.5 L 140,2.5 C 140,1.11904762 138.88127854,0 137.5000756,0 L 2.4999244,0 C 1.11872146,0 0,1.11904762 0,2.5 L 0,42.5 C 0,43.88095238 1.11872146,45 2.4999244,45",viewW:140,viewH:45},cabinet_shoe:{d:"M 39.69311439,15.91375 L 41.35449151,13.91875 M 42.60631986,17.85625 L 44.2952946,15.68375 M 2.50034497,35 L 77.49965503,35 C 78.88064026,35 80,33.88125 80,32.5 L 80,2.5 C 80,1.11875 78.88064026,0 77.50075893,0 L 2.50034497,0 C 1.11935974,0 0,1.11875 0,2.5 L 0,32.5 C 0,33.88125 1.11935974,35 2.50034497,35 M 48.82682489,17.11875 L 47.63902304,17 A 4.25,3.75327722 90 0,1 45.63764316,16.1175 L 40.57844625,11.5925 C 39.18311025,10.3425 36.96094936,11.185 36.74237616,13.04375 C 36.53815372,14.78125 34.55333241,15.66875 33.12156755,14.6675 L 31.43038499,13.48375 C 30.36180488,12.8425 29.00179385,13.6125 29.00179385,14.85875 L 29.00179385,19.1875 C 29.00179385,21.13625 30.58037809,22.71625 32.52987443,22.71625 L 48.54753691,22.71625 C 50.09741962,22.71625 51.35366358,21.46 51.35366358,19.91 C 51.35366358,18.46875 50.26079757,17.2625 48.82682489,17.11875",viewW:80,viewH:35},cabinet_sink:{d:"M 0,2.49959042 C 0,1.11873055 1.11935974,0 2.50034497,0 L 77.49965503,0 C 78.88064026,0 80,1.11873055 80,2.49959042 L 80,47.49923936 C 80,48.88009923 78.88064026,50 77.50075893,50 L 2.50034497,50 C 1.11935974,50 0,48.88009923 0,47.49923936 L 0,2.49959042 M 35.68152339,33.34893627 C 38.46888368,35.54895031 42.53125431,35.54895031 45.3186146,33.34893627 C 48.10597489,31.14892223 48.81468194,27.37964285 46.9965503,24.41196433 L 40.50669242,14.99988298 L 34.00137988,24.41196433 C 32.18655996,27.37964285 32.8941631,31.14658179 35.68152339,33.34893627",viewW:80,viewH:50},bookshelf:{d:"M 57.70667129,21.235 L 45.09910046,21.235 C 44.542709,21.235 44.00796701,21.39 43.61394659,21.66625 C 43.21992618,21.9425 42.99910155,22.31625 42.99910155,22.70625 M 47.41126422,12.41125 L 53.29342614,12.41125 M 2.4994317,0 L 97.49948583,0 C 98.88072223,0 100,1.11875 100,2.5 L 100,32.5 C 100,33.88125 98.88072223,35 97.49948583,35 L 2.50051417,35 C 1.12036025,35 0,33.88125 0,32.5 L 0,2.5 C 0,1.11875 1.12036025,0 2.50051417,0 M 57.70667129,8 L 57.70667129,25.6475 L 45.10018294,25.6475 A 2.55,2.20824628 90 0,1 43.61502906,25.00125 A 2.125,1.84020524 90 0,1 43.00018402,23.44125 L 43.00018402,10.20625 C 43.00018402,9.62125 43.22100865,9.06 43.61502906,8.64625 A 2.55,2.20824628 90 0,1 45.10018294,8 L 57.70667129,8",viewW:100,viewH:35},wall_unit:{d:"M 2.49961234,45 L 237.50038766,45 A 2.5,2.49961234 90 0,0 239.2678805,44.26776695 A 2.5,2.49961234 90 0,0 240,42.5 L 240,2.5 A 2.5,2.49961234 90 0,0 239.2678805,0.73223305 A 2.5,2.49961234 90 0,0 237.50038766,0 L 2.49961234,0 A 2.5,2.49961234 90 0,0 0,2.5 L 0,42.5 M 0,42.5 A 2.5,2.49961234 90 0,0 0.7321195,44.26776695 A 2.5,2.49961234 90 0,0 2.49961234,45 M 47.72005996,38 L 47.72005996,7 M 95.71923296,38 L 95.71923296,7 M 143.71943971,38 L 143.71943971,7 M 191.71964646,38 L 191.71964646,7",viewW:240,viewH:45},wardrobe:{d:"M 94.04437425,18.88320821 A 3.7631854,3.44913684 90 0,0 92.92392737,16.13836358 A 4.33336501,3.97173334 90 0,0 90.22105832,15.00142545 C 89.20722112,15.00142545 88.23519165,15.40967405 87.51714407,16.13836358 A 3.7631854,3.44913684 90 0,0 86.39774238,18.88320821 C 86.39774238,22.11954766 87.67810379,24.70702271 90.22105832,26.64905445 L 90.20538042,26.64905445 L 105.44429412,35.24394184 C 106.04005412,35.58034781 106.53756598,36.07184263 106.88352486,36.66939086 C 107.22948373,37.26579873 107.41134731,37.94659318 107.41134731,38.63879122 L 107.41134731,40.23643448 A 3.7631854,3.44913684 90 0,1 106.29194563,42.9812791 A 4.33336501,3.97173334 90 0,1 103.58803138,44.1193576 L 76.82272946,44.1193576 A 4.33336501,3.97173334 90 0,1 74.11986041,42.9812791 A 3.7631854,3.44913684 90 0,1 72.99941353,40.23643448 L 72.99941353,38.63993158 C 72.99941353,37.94659318 73.18127711,37.26579873 73.52723599,36.66939086 A 4.04827521,3.71043509 90 0,1 74.96646673,35.24394184 L 90.20538042,26.64905445 M 2.50010162,0 L 177.49989838,0 C 178.87955312,0 180,1.11869239 180,2.4996674 L 180,57.49919225 C 180,58.88130761 178.88059831,60 177.49989838,60 L 2.50010162,60 C 1.11940169,60 0,58.88130761 0,57.5003326 L 0,2.50194811 C 0,1.11983275 1.11835649,0.00114036 2.50010162,0.00114036",viewW:180,viewH:60},kitchen_floor:{d:"M 0.00000104,2.4996673 C 0.00000104,1.1198327 1.11869337,0 2.4996683,0 L 57.49919004,0 C 58.88130533,0 59.99999766,1.11869234 59.99999766,2.4996673 L 59.99999766,57.49919 M 59.99999766,57.49919 A 2.49738658,2.49738654 90 0,1 59.26893509,59.26812834 A 2.49738658,2.49738654 90 0,1 57.5003304,59.99999766 M 57.5003304,59.99999766 L 2.50080866,59.99999766 M 2.50080866,59.99999766 A 2.49738658,2.49738654 90 0,1 0.73187035,59.26893508 A 2.49738658,2.49738654 90 0,1 0.00000104,57.50033036 M 0.00000104,57.50033036 L 0.00000104,2.4996673",viewW:60,viewH:60},kitchen_floor_corner:{d:"M 46.03081776,41.46966756 A 2.50060665,2.50060665 0 0,0 48.53142441,43.97027421 L 87.49939335,43.97027421 A 2.50060665,2.50060665 0 0,1 89.26758927,44.70268494 A 2.50060665,2.50060665 0 0,1 90,46.47088085 L 90,87.49939335 A 2.50060665,2.50060665 0 0,1 89.26758927,89.26758927 A 2.50060665,2.50060665 0 0,1 87.49939335,90 M 87.49939335,90 L 2.50060665,90 A 2.50060665,2.50060665 0 0,1 0.73241073,89.26758927 A 2.50060665,2.50060665 0 0,1 0,87.49939335 L 0,2.50060665 A 2.50060665,2.50060665 0 0,1 2.50060665,0 L 43.53239505,0 A 2.50060665,2.50060665 0 0,1 46.0330017,2.50060665 L 46.03081776,41.46966756",viewW:90,viewH:90},kitchen_wall:{d:"M 0.85755013,34.41625 L 58.7307802,0.6575 M 0.85526941,0.5825 L 58.72849948,34.3425 M 2.4996674,35 L 57.49919225,35 C 58.88130761,35 60,33.88125 60,32.5 L 60,2.5 C 60,1.11875 58.88130761,0 57.5003326,0 L 2.50080775,0 C 1.11869239,0 0,1.11875 0,2.5 L 0,32.5 C 0,33.88125 1.11869239,35 2.4996674,35",viewW:60,viewH:35},kitchen_wall_corner:{d:"M 0.09122874,29.53302228 L 29.86372655,0.78798922 M 1.00123537,58.99990268 L 58.99990394,30.00056953 M 0.55079349,0.78798922 L 30.99952431,28.00037958 M 0,29.00047456 L 58.99990394,58.99990268 M 28.18739854,0.00000104 L 2.49966735,0.00000104 C 1.11983273,0.00000104 0,1.11869337 0,2.4996683 L 0,57.49919004 C 0,58.88130533 1.11869237,59.99999766 2.49966735,59.99999766 L 57.49919125,59.99999766 M 57.49919125,59.99999766 A 2.49738663,2.49738654 0 0,0 59.26812963,59.26893509 A 2.49738663,2.49738654 0 0,0 59.99999896,57.5003304 M 59.99999896,57.5003304 L 59.99999896,31.81260022 C 59.99999896,30.43276565 58.88130659,29.31293296 57.5003316,29.31293296 L 33.1878736,29.31293296 A 2.49738663,2.49738654 0 0,1 31.41893522,28.5818704 A 2.49738663,2.49738654 0 0,1 30.68706589,26.81326571 L 30.68706589,2.50080866 M 30.68706589,2.50080866 A 2.49738663,2.49738654 0 0,0 29.9560033,0.73187035 A 2.49738663,2.49738654 0 0,0 28.18739854,0.00000104",viewW:60,viewH:60},shelf_floor:{d:"M 2.50054124,35 L 97.49945876,35 A 2.50054124,2.5 0 0,0 99.26760843,34.26776695 A 2.50054124,2.5 0 0,0 100,32.5 L 100,2.5 A 2.50054124,2.5 0 0,0 99.26760843,0.73223305 A 2.50054124,2.5 0 0,0 97.49945876,0 L 2.50054124,0 A 2.50054124,2.5 0 0,0 0,2.5 L 0,32.5 A 2.50054124,2.5 0 0,0 2.50054124,35 M 5.71444036,28.04125 C 5.17969257,28.18125 4.8744317,28.72375 5.03247456,29.25375 C 5.19051743,29.78375 5.75124486,30.0975 6.28491015,29.95875 L 6.0002165,29 L 5.71444036,28.04125 M 94.28664213,6.95875 C 94.82030743,6.81875 95.1255683,6.27625 94.96860792,5.74625 C 94.81164754,5.21625 94.24983763,4.9025 93.71508985,5.04125 L 94.00086599,6 L 94.28664213,6.95875 M 8.73024464,29.32 C 9.26390994,29.18 9.56917082,28.6375 9.41221044,28.1075 C 9.25525005,27.5775 8.69344014,27.2625 8.15869236,27.4025 L 8.4444685,28.36125 L 8.73024464,29.32 M 13.04719636,26.125 C 12.51353107,26.265 12.20827019,26.8075 12.36523057,27.33625 C 12.52219095,27.865 13.08400087,28.18125 13.61874865,28.04125 L 13.3329725,27.08375 L 13.04719636,26.125 M 18.50833514,26.76375 C 19.04200043,26.62375 19.34726131,26.0825 19.19030093,25.5525 C 19.03334055,25.0225 18.47153063,24.7075 17.93678285,24.8475 L 18.222559,25.805 L 18.50833514,26.76375 M 22.82528686,23.57 C 22.29162156,23.70875 21.98636068,24.25125 22.14332107,24.78 C 22.30136393,25.31 22.86209136,25.62625 23.39683914,25.48625 L 23.111063,24.5275 L 22.82528686,23.57 M 28.28534315,24.2075 C 28.82009093,24.06875 29.12535181,23.52625 28.96730894,22.9975 C 28.81034856,22.4675 28.24853864,22.1525 27.71487335,22.29125 L 27.99956701,23.25 L 28.28534315,24.2075 M 32.60445984,21.01375 C 32.06862957,21.15375 31.76336869,21.69625 31.92249405,22.22625 C 32.07945443,22.755 32.64018186,23.07 33.17492964,22.93 L 32.8891535,21.9725 L 32.60445984,21.01375 M 38.06343364,21.6525 C 38.59818142,21.5125 38.9034423,20.97125 38.74539944,20.44125 C 38.58735657,19.91125 38.02662914,19.59625 37.49188136,19.73625 L 37.7776575,20.695 L 38.06343364,21.6525 M 42.38146785,18.45875 C 41.84672007,18.5975 41.54145919,19.14 41.69950206,19.67 C 41.85754492,20.2 42.41827235,20.515 42.95193765,20.375 L 42.66724399,19.41625 L 42.38146785,18.45875 M 47.84152414,19.09625 C 48.37627192,18.95875 48.6815328,18.415 48.52348993,17.88625 C 48.36544707,17.35625 47.80471964,17.04125 47.26997186,17.18 L 47.555748,18.13875 L 47.84152414,19.09625 M 52.15955835,15.9025 C 51.62481057,16.0425 51.31954969,16.585 51.47759255,17.115 C 51.63455293,17.64375 52.19636285,17.95875 52.73002814,17.82 L 52.444252,16.86125 L 52.15955835,15.9025 M 57.61961464,16.54125 C 58.15327993,16.4025 58.45854081,15.86 58.30158043,15.33 C 58.14462005,14.8 57.58281013,14.485 57.04806235,14.625 L 57.33383849,15.58375 L 57.61961464,16.54125 M 61.93656636,13.3475 C 61.40290106,13.4875 61.09764018,14.02875 61.25460056,14.55875 C 61.41156094,15.08875 61.97337086,15.40375 62.50811864,15.26375 L 62.2223425,14.305 L 61.93656636,13.3475 M 67.39770513,13.985 C 67.93137043,13.8475 68.23663131,13.30375 68.07967092,12.775 C 67.92162806,12.245 67.36090063,11.93 66.82615285,12.07 L 67.11192899,13.0275 L 67.39770513,13.985 M 71.71465685,10.79125 C 71.18099156,10.93125 70.87573068,11.47375 71.03269106,12.00375 C 71.18965144,12.53375 71.75146136,12.8475 72.28620914,12.70875 L 72.00043299,11.75 L 71.71465685,10.79125 M 77.17471314,11.43 C 77.70946092,11.29125 78.0147218,10.74875 77.85667893,10.22 C 77.69971855,9.69 77.13790864,9.37375 76.60424334,9.51375 L 76.89001948,10.4725 L 77.17471314,11.43 M 81.49382983,8.23625 C 80.95908205,8.37625 80.65273869,8.9175 80.81186404,9.4475 C 80.96882442,9.97625 81.52955185,10.2925 82.06429963,10.1525 L 81.77852349,9.195 L 81.49382983,8.23625 M 86.95280364,8.875 C 87.48755142,8.735 87.7928123,8.1925 87.63476943,7.66375 C 87.47672656,7.135 86.91599913,6.81875 86.38233384,6.95875 L 86.6670275,7.91625 L 86.95280364,8.875 M 91.27083784,5.68 C 90.73609006,5.82 90.43082918,6.3625 90.58887205,6.8925 C 90.74691492,7.4225 91.30764235,7.7375 91.84239013,7.5975 L 91.55661399,6.63875 L 91.27083784,5.68 M 6.0002165,29 L 6.28491015,29.95875 L 8.73024464,29.32 L 8.4444685,28.36125 L 8.15869236,27.4025 L 5.71444036,28.04125 L 6.0002165,29 M 13.3329725,27.08375 L 13.61874865,28.04125 L 18.50833514,26.76375 L 18.222559,25.805 L 17.93678285,24.8475 L 13.04719636,26.125 L 13.3329725,27.08375 M 23.111063,24.5275 L 23.39683914,25.48625 L 28.28534315,24.20875 L 27.99956701,23.25 L 27.71487335,22.29125 L 22.82528686,23.57 L 23.111063,24.5275 M 32.8891535,21.9725 L 33.17492964,22.93 L 38.06343364,21.6525 L 37.7776575,20.695 L 37.49188136,19.73625 L 32.60337735,21.01375 L 32.8891535,21.9725 M 42.66724399,19.41625 L 42.95193765,20.375 L 47.84152414,19.0975 L 47.555748,18.13875 L 47.26997186,17.18 L 42.38146785,18.45875 L 42.66724399,19.41625 M 52.444252,16.86125 L 52.73002814,17.82 L 57.61961464,16.54125 L 57.33383849,15.58375 L 57.04806235,14.625 L 52.15955835,15.9025 L 52.444252,16.86125 M 62.2223425,14.305 L 62.50811864,15.26375 L 67.39770513,13.98625 L 67.11192899,13.0275 L 66.82615285,12.07 L 61.93656636,13.3475 L 62.2223425,14.305 M 72.00043299,11.75 L 72.28620914,12.70875 L 77.17471314,11.43 L 76.89001948,10.4725 L 76.60424334,9.51375 L 71.71465685,10.79125 L 72.00043299,11.75 M 81.77852349,9.195 L 82.06429963,10.1525 L 86.95280364,8.875 L 86.6670275,7.91625 L 86.38233384,6.95875 L 81.49274735,8.23625 L 81.77852349,9.195 M 91.55661399,6.6375 L 91.84239013,7.59625 L 94.28664213,6.9575 L 94.00086599,5.99875 L 93.71508985,5.04 L 91.27083784,5.67875 L 91.55661399,6.6375 M 5.71444036,6.95875 C 5.17969257,6.81875 4.8744317,6.27625 5.03247456,5.74625 C 5.19051743,5.21625 5.75124486,4.9025 6.28491015,5.04125 L 6.0002165,6 L 5.71444036,6.95875 M 94.28664213,28.04125 C 94.82030743,28.18125 95.1255683,28.72375 94.96860792,29.25375 C 94.81164754,29.78375 94.24983763,30.0975 93.71508985,29.95875 L 94.00086599,29 L 94.28664213,28.04125 M 8.73024464,5.68 C 9.26390994,5.82 9.56917082,6.3625 9.41221044,6.8925 C 9.25525005,7.4225 8.69344014,7.7375 8.15869236,7.5975 L 8.4444685,6.63875 L 8.73024464,5.68 M 13.04719636,8.875 C 12.51353107,8.735 12.20827019,8.1925 12.36523057,7.66375 C 12.52219095,7.135 13.08400087,6.81875 13.61874865,6.95875 L 13.3329725,7.91625 L 13.04719636,8.875 M 18.50833514,8.23625 C 19.04200043,8.37625 19.34726131,8.9175 19.19030093,9.4475 C 19.03334055,9.9775 18.47153063,10.2925 17.93678285,10.1525 L 18.222559,9.195 L 18.50833514,8.23625 M 22.82528686,11.43 C 22.29162156,11.29125 21.98636068,10.74875 22.14332107,10.22 C 22.30136393,9.69 22.86209136,9.37375 23.39683914,9.51375 L 23.111063,10.4725 L 22.82528686,11.43 M 28.28534315,10.7925 C 28.82009093,10.93125 29.12535181,11.47375 28.96730894,12.0025 C 28.81034856,12.5325 28.24853864,12.8475 27.71487335,12.70875 L 27.99956701,11.75 L 28.28534315,10.7925 M 32.60445984,13.98625 C 32.06862957,13.84625 31.76336869,13.30375 31.92249405,12.77375 C 32.07945443,12.245 32.64018186,11.93 33.17492964,12.07 L 32.8891535,13.0275 L 32.60445984,13.98625 M 38.06343364,13.3475 C 38.59818142,13.4875 38.9034423,14.02875 38.74539944,14.55875 C 38.58735657,15.08875 38.02662914,15.40375 37.49188136,15.26375 L 37.7776575,14.305 L 38.06343364,13.3475 M 42.38146785,16.54125 C 41.84672007,16.4025 41.54145919,15.86 41.69950206,15.33 C 41.85754492,14.8 42.41827235,14.485 42.95193765,14.625 L 42.66724399,15.58375 L 42.38146785,16.54125 M 47.84152414,15.90375 C 48.37627192,16.04125 48.6815328,16.585 48.52348993,17.11375 C 48.36544707,17.64375 47.80471964,17.95875 47.26997186,17.82 L 47.555748,16.86125 L 47.84152414,15.90375 M 52.15955835,19.0975 C 51.62481057,18.9575 51.31954969,18.415 51.47759255,17.885 C 51.63455293,17.35625 52.19636285,17.04125 52.73002814,17.18 L 52.444252,18.13875 L 52.15955835,19.0975 M 57.61961464,18.45875 C 58.15327993,18.5975 58.45854081,19.14 58.30158043,19.67 C 58.14462005,20.2 57.58281013,20.515 57.04806235,20.375 L 57.33383849,19.41625 L 57.61961464,18.45875 M 61.93656636,21.6525 C 61.40290106,21.5125 61.09764018,20.97125 61.25460056,20.44125 C 61.41156094,19.91125 61.97337086,19.59625 62.50811864,19.73625 L 62.2223425,20.695 L 61.93656636,21.6525 M 67.39770513,21.015 C 67.93137043,21.1525 68.23663131,21.69625 68.07967092,22.225 C 67.92162806,22.755 67.36090063,23.07 66.82615285,22.93 L 67.11192899,21.9725 L 67.39770513,21.015 M 71.71465685,24.20875 C 71.18099156,24.06875 70.87573068,23.52625 71.03269106,22.99625 C 71.18965144,22.46625 71.75146136,22.1525 72.28620914,22.29125 L 72.00043299,23.25 L 71.71465685,24.20875 M 77.17471314,23.57 C 77.70946092,23.70875 78.0147218,24.25125 77.85667893,24.78 C 77.69971855,25.31 77.13790864,25.62625 76.60424334,25.48625 L 76.89001948,24.5275 L 77.17471314,23.57 M 81.49382983,26.76375 C 80.95908205,26.62375 80.65273869,26.0825 80.81186404,25.5525 C 80.96882442,25.02375 81.52955185,24.7075 82.06429963,24.8475 L 81.77852349,25.805 L 81.49382983,26.76375 M 86.95280364,26.125 C 87.48755142,26.265 87.7928123,26.8075 87.63476943,27.33625 C 87.47672656,27.865 86.91599913,28.18125 86.38233384,28.04125 L 86.6670275,27.08375 L 86.95280364,26.125 M 91.27083784,29.32 C 90.73609006,29.18 90.43082918,28.6375 90.58887205,28.1075 C 90.74691492,27.5775 91.30764235,27.2625 91.84239013,27.4025 L 91.55661399,28.36125 L 91.27083784,29.32 M 6.0002165,6 L 6.28491015,5.04125 L 8.73024464,5.68 L 8.4444685,6.63875 L 8.15869236,7.5975 L 5.71444036,6.95875 L 6.0002165,6 M 13.3329725,7.91625 L 13.61874865,6.95875 L 18.50833514,8.23625 L 18.222559,9.195 L 17.93678285,10.1525 L 13.04719636,8.875 L 13.3329725,7.91625 M 23.111063,10.4725 L 23.39683914,9.51375 L 28.28534315,10.79125 L 27.99956701,11.75 L 27.71487335,12.70875 L 22.82528686,11.43 L 23.111063,10.4725 M 32.8891535,13.0275 L 33.17492964,12.07 L 38.06343364,13.3475 L 37.7776575,14.305 L 37.49188136,15.26375 L 32.60337735,13.98625 L 32.8891535,13.0275 M 42.66724399,15.58375 L 42.95193765,14.625 L 47.84152414,15.9025 L 47.555748,16.86125 L 47.26997186,17.82 L 42.38146785,16.54125 L 42.66724399,15.58375 M 52.444252,18.13875 L 52.73002814,17.18 L 57.61961464,18.45875 L 57.33383849,19.41625 L 57.04806235,20.375 L 52.15955835,19.0975 L 52.444252,18.13875 M 62.2223425,20.695 L 62.50811864,19.73625 L 67.39770513,21.01375 L 67.11192899,21.9725 L 66.82615285,22.93 L 61.93656636,21.6525 L 62.2223425,20.695 M 72.00043299,23.25 L 72.28620914,22.29125 L 77.17471314,23.57 L 76.89001948,24.5275 L 76.60424334,25.48625 L 71.71465685,24.20875 L 72.00043299,23.25 M 81.77852349,25.805 L 82.06429963,24.8475 L 86.95280364,26.125 L 86.6670275,27.08375 L 86.38233384,28.04125 L 81.49274735,26.76375 L 81.77852349,25.805 M 91.55661399,28.36125 L 91.84239013,27.4025 L 94.28664213,28.04125 L 94.00086599,29 L 93.71508985,29.95875 L 91.27083784,29.32 L 91.55661399,28.36125",viewW:100,viewH:35},shelf_wall:{d:"M 16.00095257,0 L 16.00095257,3.50051819 C 16.00095257,4.88054328 14.88168691,6.00010909 13.50046546,6.00010909 L 12.50027062,6.00010909 C 11.12013163,6.00010909 10.00086597,4.88190694 10.00086597,3.50051819 L 10.00086597,0 M 90.00021649,0 L 90.00021649,3.50051819 C 90.00021649,4.88054328 88.88095083,6.00010909 87.49972938,6.00010909 L 86.49953454,6.00010909 C 85.11939555,6.00010909 83.99904743,4.88190694 83.99904743,3.50051819 L 83.99904743,0 M 2.50048711,0 L 97.49951289,0 C 98.88073434,0 100,1.11820215 100,2.4995909 L 100,22.5004091 C 100,23.88043419 98.88073434,25 97.49951289,25 L 2.50048711,25 C 1.12034812,25 0,23.88179785 0,22.5004091 L 0,2.4995909 C 0,1.11956581 1.12034812,0 2.50048711,0",viewW:100,viewH:25},cooktop_two:{d:"M 14.99935186,32.00009362 L 14.99935186,29.99906385 M 18.99969753,35.99981277 L 20.99857408,35.99981277 M 14.99935186,41.9993915 L 14.99935186,39.99953192 M 9.00012963,35.99981277 L 10.99900618,35.99981277 M 3.12535108,50 L 26.87594521,50 C 28.60130493,50 30,48.60044935 30,46.8755851 L 30,3.1244149 C 30,1.39838045 28.60130493,0 26.87594521,0 L 3.12405479,0 C 1.39869507,0 0,1.39838045 0,3.1244149 L 0,46.87324471 C 0,48.59927916 1.39869507,49.99765961 3.12405479,49.99765961 M 21.99801236,14.99719154 C 21.99801236,18.86350871 18.86488355,21.99728515 14.99805557,21.99728515 C 11.13382016,21.99728515 7.99809878,18.86350871 7.99809878,14.99836173 C 7.99809878,11.13321475 11.13382016,7.99826811 14.99805557,7.99826811 C 18.86488355,7.99826811 21.99801236,11.13204456 21.99801236,14.99836173 M 20.0004321,35.99981277 C 20.0004321,38.76146789 17.76174221,41.00004681 15.00064814,41.00004681 C 12.23955408,41.00004681 10.00086419,38.76146789 10.00086419,35.99981277 C 10.00086419,33.23815765 12.23825779,30.99957873 14.99935186,30.99957873 C 17.76044592,30.99957873 19.99913581,33.23815765 19.99913581,35.99981277",viewW:30,viewH:50},stove:{d:"M 42.58125034,35.80643381 A 0.96783093,0.96783093 0 0,0 41.61341941,34.83860288 A 0.96783093,0.96783093 0 0,0 40.64558848,35.80643381 M 40.64558848,35.80643381 L 42.58125034,35.80643381 M 47.41930144,42.58014677 A 0.96783093,0.96783093 0 0,0 48.28464415,42.10618697 A 0.96783093,0.96783093 0 0,0 48.28464415,41.11954828 A 0.96783093,0.96783093 0 0,0 47.41930144,40.64558848 L 47.41930144,42.58014677 M 42.58125034,45.48363957 A 0.96783093,0.96783093 0 0,0 42.10729054,44.61829686 A 0.96783093,0.96783093 0 0,0 41.12065185,44.61829686 A 0.96783093,0.96783093 0 0,0 40.64669205,45.48363957 L 42.58125034,45.48363957 M 37.74319925,42.58125034 A 0.96783093,0.96783093 0 0,0 38.71103018,41.61341941 A 0.96783093,0.96783093 0 0,0 37.74319925,40.64558848 M 37.74319925,40.64558848 L 37.74319925,42.58125034 M 3.38796005,0.96672736 L 3.38796005,1.9345583 L 56.61314352,1.9345583 L 56.61314352,0 L 3.38796005,0 L 3.38796005,0.96672736 M 59.03216907,3.38575291 L 58.06433813,3.38575291 L 58.06433813,56.61093638 L 60,56.61093638 L 60,3.38796005 L 59.03216907,3.38575291 M 56.61314352,59.0310655 L 56.61314352,58.06323456 L 3.38796005,58.06323456 L 3.38796005,59.99889643 L 56.61314352,59.99889643 L 56.61314352,59.0310655 M 0.96783093,56.61314352 L 1.93566187,56.61314352 L 1.93566187,3.38796005 L 0,3.38796005 L 0,56.61314352 L 0.96783093,56.61314352 M 3.38685648,59.03216907 L 3.38685648,58.06433813 A 1.45119461,1.45119461 0 0,1 1.93566187,56.61314352 L 0,56.61314352 A 3.38796005,3.38796005 0 0,0 3.38796005,60 L 3.38685648,59.03216907 M 59.03216907,56.61314352 L 58.06433813,56.61314352 C 58.06433813,57.41433537 57.41433537,58.06433813 56.61314352,58.06433813 L 56.61314352,60 A 3.38796005,3.38796005 0 0,0 60,56.61203995 L 59.03216907,56.61314352 M 56.61314352,0.96783093 L 56.61314352,1.93566187 C 57.41433537,1.93566187 58.06433813,2.58566463 58.06433813,3.38685648 L 60,3.38685648 A 3.38796005,3.38796005 0 0,0 56.61203995,0 L 56.61314352,0.96783093 M 3.38796005,0.96783093 L 3.38796005,0 A 3.38796005,3.38796005 0 0,0 0,3.38796005 L 1.93566187,3.38796005 C 1.93566187,2.58566463 2.58566463,1.93566187 3.38685648,1.93566187 L 3.38796005,0.96783093 M 25.16139712,41.61231584 L 24.19356619,41.61231584 A 5.80477846,5.80477846 0 0,1 22.49338636,45.71912161 A 5.80477846,5.80477846 0 0,1 18.38658059,47.41930144 M 18.38658059,47.41930144 L 18.38658059,49.35496331 M 18.38658059,49.35496331 A 7.74154389,7.74154389 0 0,0 23.86139219,47.0879078 A 7.74154389,7.74154389 0 0,0 26.12922805,41.61341941 M 26.12922805,41.61341941 L 25.16139712,41.61231584 M 18.38658059,48.38713237 L 18.38658059,47.41930144 A 5.80477846,5.80477846 0 0,1 14.2808787,45.7191213 A 5.80477846,5.80477846 0 0,1 12.58069856,41.61341941 L 10.64503669,41.61341941 A 7.74154389,7.74154389 0 0,0 18.38658059,49.35496331 L 18.38658059,48.38713237 M 11.61286763,41.61341941 L 12.58069856,41.61341941 M 12.58069856,41.61341941 A 5.80477846,5.80477846 0 0,1 14.28048835,37.50700403 A 5.80477846,5.80477846 0 0,1 18.38658059,35.80643381 M 18.38658059,35.80643381 L 18.38658059,33.87077195 M 18.38658059,33.87077195 A 7.74154389,7.74154389 0 0,0 12.9120922,36.13860781 A 7.74154389,7.74154389 0 0,0 10.64503669,41.61341941 M 10.64503669,41.61341941 L 11.61286763,41.61341941 M 18.38658059,34.83860288 L 18.38658059,35.80643381 M 18.38658059,35.80643381 A 5.80477846,5.80477846 0 0,1 22.49338636,37.50661364 A 5.80477846,5.80477846 0 0,1 24.19356619,41.61341941 L 26.12922805,41.61341941 M 26.12922805,41.61341941 A 7.74154389,7.74154389 0 0,0 23.86178242,36.13821758 A 7.74154389,7.74154389 0 0,0 18.38658059,33.87077195 M 18.38658059,33.87077195 L 18.38658059,34.83860288 M 48.38713237,18.38658059 L 47.41930144,18.38658059 M 47.41930144,18.38658059 A 5.80477846,5.80477846 0 0,1 45.71951165,22.49299597 A 5.80477846,5.80477846 0 0,1 41.61341941,24.19356619 M 41.61341941,24.19356619 L 41.61341941,26.12922805 M 41.61341941,26.12922805 A 7.74154389,7.74154389 0 0,0 47.0879078,23.86139219 A 7.74154389,7.74154389 0 0,0 49.35496331,18.38658059 M 49.35496331,18.38658059 L 48.38713237,18.38658059 M 41.61341941,25.16139712 L 41.61341941,24.19356619 A 5.80477846,5.80477846 0 0,1 37.50661364,22.49338636 A 5.80477846,5.80477846 0 0,1 35.80643381,18.38658059 L 33.87077195,18.38658059 M 33.87077195,18.38658059 A 7.74154389,7.74154389 0 0,0 36.13821758,23.86178242 A 7.74154389,7.74154389 0 0,0 41.61341941,26.12922805 M 41.61341941,26.12922805 L 41.61341941,25.16139712 M 34.83860288,18.38658059 L 35.80643381,18.38658059 M 35.80643381,18.38658059 A 5.80477846,5.80477846 0 0,1 37.50700403,14.28048835 A 5.80477846,5.80477846 0 0,1 41.61341941,12.58069856 M 41.61341941,12.58069856 L 41.61341941,10.64503669 M 41.61341941,10.64503669 A 7.74154389,7.74154389 0 0,0 36.13860781,12.9120922 A 7.74154389,7.74154389 0 0,0 33.87077195,18.38658059 M 33.87077195,18.38658059 L 34.83860288,18.38658059 M 41.61341941,11.61286763 L 41.61341941,12.58069856 M 41.61341941,12.58069856 A 5.80477846,5.80477846 0 0,1 45.7191213,14.2808787 A 5.80477846,5.80477846 0 0,1 47.41930144,18.38658059 M 47.41930144,18.38658059 L 49.35496331,18.38658059 A 7.74154389,7.74154389 0 0,0 47.0875176,12.9124824 A 7.74154389,7.74154389 0 0,0 41.61341941,10.64503669 L 41.61341941,11.61286763 M 46.45147051,41.61341941 L 45.48363957,41.61341941 A 3.87353087,3.87353087 0 0,1 41.61341941,45.48363957 L 41.61341941,47.41930144 M 41.61341941,47.41930144 A 5.80477846,5.80477846 0 0,0 45.7191213,45.7191213 A 5.80477846,5.80477846 0 0,0 47.41930144,41.61341941 M 47.41930144,41.61341941 L 46.45147051,41.61341941 M 41.61341941,46.45147051 L 41.61341941,45.48363957 A 3.87353087,3.87353087 0 0,1 37.74209568,41.61341941 L 35.80533024,41.61341941 M 35.80533024,41.61341941 A 5.80477846,5.80477846 0 0,0 37.50590046,45.71951165 A 5.80477846,5.80477846 0 0,0 41.61231584,47.41930144 M 41.61231584,47.41930144 L 41.61341941,46.45147051 M 36.77426475,41.61341941 L 37.74209568,41.61341941 A 3.87353087,3.87353087 0 0,1 41.61341941,37.74209568 L 41.61341941,35.80533024 A 5.80477846,5.80477846 0 0,0 37.50661364,37.50551007 A 5.80477846,5.80477846 0 0,0 35.80643381,41.61231584 L 36.77426475,41.61341941 M 41.61341941,36.77426475 L 41.61341941,37.74209568 A 3.87353087,3.87353087 0 0,1 45.48363957,41.61341941 L 47.41930144,41.61341941 M 47.41930144,41.61341941 A 5.80477846,5.80477846 0 0,0 45.71951165,37.50700403 A 5.80477846,5.80477846 0 0,0 41.61341941,35.80643381 M 41.61341941,35.80643381 L 41.61341941,36.77426475 M 41.61341941,37.74209568 L 42.58014677,37.74209568 L 42.58014677,35.80533024 L 40.64558848,35.80533024 L 40.64558848,37.74099211 L 41.61341941,37.74209568 M 45.48474314,41.61341941 L 45.48474314,42.58014677 L 47.41930144,42.58014677 L 47.41930144,40.64558848 L 45.48474314,40.64558848 L 45.48474314,41.61341941 M 41.61341941,47.41930144 L 42.58014677,47.41930144 L 42.58014677,45.48363957 L 40.64558848,45.48363957 L 40.64558848,47.41930144 L 41.61341941,47.41930144 M 35.80753738,41.61341941 L 35.80753738,42.58014677 L 37.74209568,42.58014677 L 37.74209568,40.64558848 L 35.80753738,40.64558848 L 35.80753738,41.61341941 M 25.16139712,18.38658059 L 24.19356619,18.38658059 M 24.19356619,18.38658059 A 5.80477846,5.80477846 0 0,1 22.49338636,22.49338636 A 5.80477846,5.80477846 0 0,1 18.38658059,24.19356619 M 18.38658059,24.19356619 L 18.38658059,26.12922805 M 18.38658059,26.12922805 A 7.74154389,7.74154389 0 0,0 23.86178242,23.86178242 A 7.74154389,7.74154389 0 0,0 26.12922805,18.38658059 L 25.16139712,18.38658059 M 18.38658059,25.16139712 L 18.38658059,24.19356619 A 5.80477846,5.80477846 0 0,1 14.28048835,22.49299597 A 5.80477846,5.80477846 0 0,1 12.58069856,18.38658059 M 12.58069856,18.38658059 L 10.64503669,18.38658059 M 10.64503669,18.38658059 A 7.74154389,7.74154389 0 0,0 12.9120922,23.86139219 A 7.74154389,7.74154389 0 0,0 18.38658059,26.12922805 M 18.38658059,26.12922805 L 18.38658059,25.16139712 M 11.61286763,18.38658059 L 12.58069856,18.38658059 M 12.58069856,18.38658059 A 5.80477846,5.80477846 0 0,1 14.2808787,14.2808787 A 5.80477846,5.80477846 0 0,1 18.38658059,12.58069856 M 18.38658059,12.58069856 L 18.38658059,10.64503669 A 7.74154389,7.74154389 0 0,0 10.64503669,18.38658059 L 11.61286763,18.38658059 M 18.38658059,11.61286763 L 18.38658059,12.58069856 A 5.80477846,5.80477846 0 0,1 22.49299597,14.28048835 A 5.80477846,5.80477846 0 0,1 24.19356619,18.38658059 L 26.12922805,18.38658059 M 26.12922805,18.38658051 A 7.74154389,7.74154389 0 0,0 23.86139213,12.91209214 A 7.74154389,7.74154389 0 0,0 18.38658051,10.64503669 M 18.38658059,10.64503669 L 18.38658059,11.61286763",viewW:60,viewH:60},tv:{d:"M 44.11752137,9.73109561 L 2.5,9.73109561 C 1.11965812,9.73109561 0,10.850462 0,12.23118989 L 0,15.76881011 C 0,17.14821799 1.11965812,18.26758439 2.5,18.26758439 L 44.11752137,18.26758439 M 44.11752137,9.73109561 L 44.11752137,2.50009429 C 44.11752137,1.1193664 45.23717949,0 46.61752137,0 L 75.1474359,0 C 76.52777778,0 77.6474359,1.1193664 77.6474359,2.50009429 L 77.6474359,9.73109561 M 44.11752137,9.73109561 L 77.6474359,9.73109561 L 117.5,9.73109561 C 118.88141026,9.73109561 120,10.850462 120,12.23118989 L 120,15.76881011 C 120,17.14821799 118.88141026,18.26758439 117.5,18.26758439 L 77.6474359,18.26758439 M 44.11752137,18.26758439 L 44.11752137,25.49990571 C 44.11752137,26.8806336 45.23717949,28 46.61752137,28 L 75.1474359,28 C 76.52777778,28 77.6474359,26.8806336 77.6474359,25.49990571 L 77.6474359,18.26758439 M 44.11752137,18.26758439 L 77.6474359,18.26758439",viewW:120,viewH:28},tv_wall:{d:"M 34.42622951,13.23529412 C 33.88293401,13.23529412 33.44262295,13.63088235 33.44262295,14.11764706 C 33.44262295,14.60441176 33.88293401,15 34.42622951,15 L 34.42622951,13.23529412 M 86.49957966,15 C 87.04287516,15 87.48318621,14.60441176 87.48318621,14.11764706 C 87.48318621,13.63088235 87.0418243,13.23529412 86.49957966,13.23529412 L 86.49957966,15 M 3.44262295,0.88235294 L 3.44262295,1.76470588 L 116.55737705,1.76470588 L 116.55737705,0 L 3.44262295,0 L 3.44262295,0.88235294 M 119.01639344,3.08823529 L 118.03278689,3.08823529 L 118.03278689,5.73529412 L 120,5.73529412 L 120,3.08823529 L 119.01639344,3.08823529 M 116.55737705,7.94117647 L 116.55737705,7.05882353 L 3.44262295,7.05882353 L 3.44262295,8.82352941 L 116.55737705,8.82352941 L 116.55737705,7.94117647 M 0.98360656,5.73529412 L 1.96721311,5.73529412 L 1.96721311,3.08823529 L 0,3.08823529 L 0,5.73529412 L 0.98360656,5.73529412 M 3.44262295,7.94117647 L 3.44262295,7.05882353 C 2.62820513,7.05882353 1.96721311,6.46617647 1.96721311,5.73529412 L 0,5.73529412 C 0,7.44117647 1.54161412,8.82352941 3.44262295,8.82352941 L 3.44262295,7.94117647 M 119.01639344,5.73529412 L 118.03278689,5.73529412 C 118.03278689,6.46617647 117.37179487,7.05882353 116.55737705,7.05882353 L 116.55737705,8.82352941 C 118.45943674,8.82352941 120,7.44117647 120,5.73529412 L 119.01639344,5.73529412 M 116.55737705,0.88235294 L 116.55737705,1.76470588 C 117.37179487,1.76470588 118.03278689,2.35735294 118.03278689,3.08823529 L 120,3.08823529 C 120,1.38235294 118.45838588,0 116.55737705,0 L 116.55737705,0.88235294 M 3.44262295,0.88235294 L 3.44262295,0 C 1.54056326,0 0,1.38235294 0,3.08823529 L 1.96721311,3.08823529 C 1.96721311,2.35735294 2.62820513,1.76470588 3.44262295,1.76470588 L 3.44262295,0.88235294 M 67.86885246,7.05882353 L 66.8852459,7.05882353 L 66.8852459,14.11764706 L 68.85245902,14.11764706 L 68.85245902,7.05882353 L 67.86885246,7.05882353 M 52.13114754,14.11764706 L 53.1147541,14.11764706 L 53.1147541,7.05882353 L 51.14754098,7.05882353 L 51.14754098,14.11764706 L 52.13114754,14.11764706 M 34.42622951,14.11764706 L 34.42622951,15 L 86.49957966,15 L 86.49957966,13.23529412 L 34.42622951,13.23529412 L 34.42622951,14.11764706",viewW:120,viewH:15},toilet:{d:"M 0,50.64541922 C 0,61.33577471 8.66551127,70 19.35479948,70 L 20.64520052,70 C 31.33570495,70 40,61.33577471 40,50.64541922 L 40,2.49964019 C 40,1.11940895 38.88108486,0 37.49946791,0 L 2.50053209,0 C 1.12013135,0 0,1.11940895 0,2.5007596 L 0,50.64541922 M 4.99984797,50.80661411 C 4.99984797,58.645835 11.35455623,65.00071962 19.19304327,65.00071962 L 20.80695673,65.00071962 C 28.64544377,65.00071962 35.00015203,58.645835 35.00015203,50.80661411 L 35.00015203,31.50016791 C 35.00015203,30.11993667 33.88123689,29.00052772 32.49961993,29.00052772 L 7.50038007,29.00052772 C 6.11997932,29.00052772 4.99984797,30.11993667 4.99984797,31.50016791 L 4.99984797,50.80661411 M 36.77460549,0 C 38.55635623,0 40,1.44403755 40,3.2261366 L 40,16.77434315 C 40,18.5564422 38.55635623,20.00047975 36.77460549,20.00047975 L 3.22661072,20.00047975 C 1.44485998,20.00047975 0,18.5564422 0,16.77434315 L 0,3.2261366 C 0,1.44515696 1.44485998,0 3.22661072,0 L 36.77460549,0 M 24.99923987,51.99990405 C 24.99923987,54.76148594 22.76140959,57.00030384 20.00060811,57.00030384 C 17.23980662,57.00030384 15.00076013,54.76148594 15.00076013,51.99990405 C 15.00076013,49.23832217 17.23859041,47.00062367 19.99939189,47.00062367 C 22.76019338,47.00062367 25.00045608,49.23944157 25.00045608,51.99990405",viewW:40,viewH:70},toilet_built_in:{d:"M 0,35.64551996 C 0,46.33352214 8.66551127,55 19.35479948,55 L 20.64520052,55 C 31.33570495,55 40,46.33467598 40,35.64436612 L 40,2.49921329 C 40,1.11922294 38.88108486,0 37.49946791,0 L 2.50053209,0 C 1.12013135,0 0,1.11922294 0,2.49921329 L 0,35.64551996 M 4.99984797,35.80705729 C 4.99984797,43.64507941 11.35455623,49.99926574 19.19304327,49.99926574 L 20.80695673,49.99926574 C 28.64544377,49.99926574 35.00015203,43.64507941 35.00015203,35.80705729 L 35.00015203,12.49952798 C 35.00015203,11.11838379 33.88123689,9.99916085 32.49961993,9.99916085 L 7.50038007,9.99916085 C 6.11997932,9.99916085 4.99984797,11.11838379 4.99984797,12.49952798 L 4.99984797,35.80705729 M 24.99923987,36.99897204 C 24.99923987,39.76126041 22.76140959,41.9997063 20.00060811,41.9997063 C 17.23980662,41.9997063 15.00076013,39.76126041 15.00076013,36.99897204 C 15.00076013,34.23668366 17.23859041,31.99939161 19.99939189,31.99939161 C 22.76019338,31.99939161 25.00045608,34.2378375 25.00045608,36.99897204",viewW:40,viewH:55},bathtub:{d:"M 0.00104789,2.5 C 0.00104789,1.11888889 1.12019281,0 2.50130986,0 L 167.49973803,0 C 168.88085508,0 170,1.11888889 170,2.5 L 170,72.5 C 170,73.88111111 168.88085508,75 167.49973803,75 L 2.50026197,75 C 1.11914492,75 0,73.88111111 0,72.5 L 0.00104789,2.5 M 10.00104789,37.5 C 10.00104789,22.31222222 22.31373782,10 37.50078592,10 L 132.50026197,10 C 147.68731007,10 160,22.31222222 160,37.5 C 160,52.68777778 147.68731007,65 132.50026197,65 L 37.49973803,65 C 22.31268993,65 10,52.68777778 10,37.5 M 29.00136226,37.5 C 29.00136226,39.98555556 26.98627266,42 24.50068113,42 C 22.01508959,42 20.00104789,39.98555556 20.00104789,37.5 C 20.00104789,35.01444444 22.01613748,33 24.50068113,33 C 26.98627266,33 29.00136226,35.01444444 29.00136226,37.5",viewW:170,viewH:75},bathtub_corner:{d:"M 0.0000009,2.49992528 A 2.4978076,2.4978076 90 0,1 0.73159091,0.73159091 A 2.4978076,2.4978076 90 0,1 2.49992528,0.0000009 M 2.49992528,0.0000009 L 137.70540387,0.0000009 C 138.97230035,0.0000009 140,1.02664216 140,2.29459703 C 140,78.34754644 78.34754644,140 2.29459703,140 A 2.29671292,2.29671292 90 0,1 0.0000009,137.70540387 L 0.0000009,2.49992528 M 9.99969844,30.0001519 C 9.99969844,18.95370364 18.95370364,9.99969844 30.0001519,9.99969844 L 122.7450181,9.99969844 A 2.2543772,2.2543772 90 0,1 124.9993953,12.25407563 C 124.9993953,74.52251395 74.52251395,125.00045369 12.25513403,125.00045369 A 2.2543772,2.2543772 90 0,1 10.66067431,124.33978775 A 2.2543772,2.2543772 90 0,1 10.00075683,122.7450181 L 9.99969844,30.0001519 M 30.0001519,25.00030314 A 5.00037797,5.00037797 90 0,1 24.99977394,30.0006811 A 5.00037797,5.00037797 90 0,1 19.99939597,25.00030314 A 5.00037797,5.00037797 90 0,1 24.99977394,19.99992517 A 5.00037797,5.00037797 90 0,1 30.0001519,25.00030314",viewW:140,viewH:140},bidet:{d:"M 22.99978716,0 L 22.99978716,11.50052266 C 22.99978716,12.88035731 21.88087202,14.00019006 20.50047128,14.00019006 L 19.50074493,14.00019006 C 18.11912798,14.00019006 17.00021284,12.88149767 17.00021284,11.50052266 L 17.00021284,0 M 22.99978716,10.0009503 L 26.50004561,10.0009503 C 27.88044635,10.0009503 29.0005777,8.88111755 29.0005777,7.50014254 L 29.0005777,6.50004751 C 29.0005777,5.12021287 27.88166256,4.00038012 26.50004561,4.00038012 L 22.99978716,4.00038012 M 17.00021284,10.0009503 L 13.49995439,10.0009503 C 12.11955365,10.0009503 11.00063851,8.88111755 11.00063851,7.50014254 L 11.00063851,6.50004751 C 11.00063851,5.12021287 12.11955365,4.00038012 13.49995439,4.00038012 L 17.00021284,4.00038012 M 2.50053209,0 L 37.49946791,0 C 38.88108486,0 40,1.11869239 40,2.4996674 L 40,40.64468308 C 40,51.33441034 31.33448873,60 20.64520052,60 L 19.35601569,60 C 8.66551127,60 0,51.33441034 0,40.64582343 L 0,2.50080775 C 0,1.11869239 1.11891514,0 2.50053209,0 M 7.49916385,18.00057018 L 32.49961993,18.00057018 C 33.88123689,18.00057018 35.00015203,19.11926257 35.00015203,20.50023757 L 35.00015203,40.80661408 C 35.00015203,48.64544331 28.64544377,55.00066521 20.80695673,55.00066521 L 19.19304327,55.00066521 C 11.35455623,55.00066521 4.99984797,48.64544331 4.99984797,40.80661408 L 4.99984797,20.50137793 C 4.99984797,19.12154329 6.11876311,18.00171054 7.50038007,18.00171054 M 24.00072973,27.00142545 C 24.00072973,29.21030124 22.21046551,31.00180557 20.00182432,31.00180557 C 17.79196692,31.00180557 16.00048648,29.2114416 16.00048648,27.00142545 C 16.00048648,24.79140929 17.79196692,23.00218569 20.00182432,23.00218569 C 22.21168172,23.00218569 24.00072973,24.79254965 24.00072973,27.00142545",viewW:40,viewH:60},bidet_built_in:{d:"M 16.73872723,9.99953191 L 6.93605765,9.99953191 C 5.86579099,9.99953191 4.99984797,10.86549489 4.99984797,11.93507618 L 4.99984797,30.8060477 C 4.99984797,38.64418284 11.35455623,44.99964893 19.19304327,44.99964893 L 20.80695673,44.99964893 C 28.64544377,44.99964893 35.00015203,38.64535306 35.00015203,30.80487748 L 35.00015203,11.9362464 C 35.00015203,10.86666511 34.13299279,10.00070213 33.06515856,10.00070213 L 23.26005655,10.00070213 M 22.99857095,0.00117022 L 22.99857095,11.50092447 C 22.99857095,12.88178435 21.87965581,14.0005149 20.49925507,14.0005149 L 19.49952872,14.0005149 C 18.11791176,14.0005149 16.99899663,12.88178435 16.99899663,11.50092447 L 16.99899663,0 M 29.99908784,9.99953191 L 29.99908784,0 M 9.99847973,0 L 9.99847973,9.99953191 M 2.50053209,0 L 37.49946791,0 C 38.88108486,0 40,1.11873055 40,2.49959042 L 40,30.64455731 C 40,41.33451916 31.33448873,50 20.64520052,50 L 19.35601569,50 C 8.66551127,50 0,41.33451916 0,30.64455731 L 0,2.49959042 C 0,1.11873055 1.11891514,0 2.50053209,0 M 24.00072973,22.99833829 C 24.00072973,25.20771409 22.20924929,26.99815105 19.99939189,26.99815105 C 17.78953449,26.99815105 16.00048648,25.20771409 16.00048648,22.99833829 C 16.00048648,20.78896248 17.79075071,18.99852552 20.00060811,18.99852552 C 22.20924929,18.99852552 23.99951352,20.78896248 23.99951352,22.99833829",viewW:40,viewH:50},kitchen_sink:{d:"M 39.41423548,6.00088937 L 51.49976243,6.00088937 C 52.88073743,6.00088937 54.00057018,7.11961991 54.00057018,8.50047979 L 54.00057018,41.50069043 C 54.00057018,42.88155031 52.88073743,44.00028085 51.49976243,44.00028085 L 8.50137793,44.00028085 C 7.12154329,44.00028085 6.00171054,42.88155031 6.00171054,41.50069043 L 6.00171054,8.50047979 C 6.00171054,7.11961991 7.12040293,6.00088937 8.50137793,6.00088937 L 20.58804523,6.00088937 M 33.00085527,0 L 33.00085527,13.50200108 C 33.00085527,14.88286095 31.88216288,16.0015915 30.50118787,16.0015915 L 29.50109284,16.0015915 C 28.1212582,16.0015915 27.00142545,14.88169073 27.00142545,13.50200108 L 27.00142545,0 M 33.00085527,9.00016383 L 36.50175805,9.00016383 C 37.8815927,9.00016383 39.00142545,7.88143329 39.00142545,6.50057341 L 39.00142545,5.50003511 C 39.00142545,4.11917523 37.8815927,3.00044468 36.50175805,3.00044468 L 33.00085527,3.00044468 M 27.00142545,9.00016383 L 23.50052266,9.00016383 C 22.12068802,9.00016383 21.00085527,7.88143329 21.00085527,6.50057341 L 21.00085527,5.50003511 C 21.00085527,4.11917523 22.12068802,3.00044468 23.50166302,3.00044468 L 27.00142545,3.00044468 M 2.4996674,50 L 57.5003326,50 C 58.88016725,50 60,48.88126945 60,47.50040958 L 60,2.50076064 C 60,1.11990077 58.88130761,0 57.5003326,0 L 2.50080775,0 C 1.11983275,0 0,1.11990077 0,2.50076064 L 0,47.50040958 C 0,48.88126945 1.11983275,50 2.4996674,50 M 33.99980994,25.99995319 C 33.99980994,28.209329 32.20944598,29.99976596 30.00057018,29.99976596 C 27.79169438,29.99976596 26.00019006,28.209329 26.00019006,25.99995319 C 26.00019006,23.79174761 27.79055402,22.00014043 30.00057018,22.00014043 C 32.21058633,22.00014043 33.99980994,23.79057739 33.99980994,25.99995319",viewW:60,viewH:50},kitchen_sink_double:{d:"M 53.81917613,10.60756523 C 53.3184331,10.60756523 52.91291684,11.00704162 52.91291684,11.49905209 C 52.91291684,11.99106256 53.31950306,12.39053895 53.81917613,12.39053895 L 53.81917613,10.60756523 M 77.33590917,12.39053895 C 77.83558224,12.39053895 78.2410985,11.99219103 78.2410985,11.49905209 C 78.2410985,11.00704162 77.83558224,10.60756523 77.33590917,10.60756523 L 77.33590917,12.39053895 M 3.35647625,0.89148686 L 3.35647625,1.78297373 L 86.64459371,1.78297373 L 86.64459371,0 L 3.35647625,0 L 3.35647625,0.89148686 M 89.09267075,3.30414372 L 88.18641146,3.30414372 L 88.18641146,46.69811321 L 89.99893004,46.69811321 L 89.99893004,3.30301526 L 89.09267075,3.30414372 M 86.64245378,49.10851314 L 86.64245378,48.21702627 L 3.35647625,48.21702627 L 3.35647625,50 L 86.64459371,50 L 86.64245378,49.10851314 M 0.90625929,46.69698474 L 1.81251858,46.69698474 L 1.81251858,3.30301526 L 0,3.30301526 L 0,46.69698474 L 0.90625929,46.69698474 M 3.35647625,49.10738467 L 3.35647625,48.21589781 C 2.50371515,48.21589781 1.81251858,47.53543378 1.81251858,46.69698474 L 0,46.69698474 C 0,48.52058319 1.50222909,49.99887154 3.35647625,49.99887154 L 3.35647625,49.10738467 M 89.09374071,46.69698474 L 88.18748142,46.69698474 C 88.18748142,47.53543378 87.49628485,48.21589781 86.64459371,48.21589781 L 86.64459371,49.99887154 C 88.49777091,49.99887154 90,48.52058319 90,46.69698474 L 89.09374071,46.69698474 M 86.64352375,0.89261533 L 86.64352375,1.78410219 C 87.49628485,1.78410219 88.18748142,2.46343775 88.18748142,3.30301526 L 90,3.30301526 C 90,1.47828835 88.49777091,0 86.64459371,0 L 86.64352375,0.89261533 M 3.35647625,0.89261533 L 3.35647625,0.00112846 C 1.50222909,0.00112846 0,1.47941681 0,3.30301526 L 1.81251858,3.30301526 C 1.81251858,2.46343775 2.50371515,1.78297373 3.35647625,1.78297373 L 3.35647625,0.89261533 M 9.23485704,43.32174777 L 9.23485704,44.21323463 L 39.61112762,44.21323463 L 39.61112762,42.4302609 L 9.23485704,42.4302609 L 9.23485704,43.32174777 M 42.06134459,40.91134784 L 42.96653391,40.91134784 L 42.96653391,9.08865216 L 41.15401534,9.08865216 L 41.15401534,40.91134784 L 42.06134459,40.91134784 M 6.78464008,9.08865216 L 5.87945075,9.08865216 L 5.87945075,40.91134784 L 7.69196933,40.91134784 L 7.69196933,9.08865216 L 6.78464008,9.08865216 M 39.61219759,6.67825223 L 39.61219759,5.78676537 L 33.54657314,5.78676537 L 33.54657314,7.5697391 L 39.61219759,7.5697391 L 39.61219759,6.67825223 M 15.30155145,6.67825223 L 15.30155145,5.78676537 L 9.235927,5.78676537 L 9.235927,7.5697391 L 15.30155145,7.5697391 L 15.30155145,6.67825223 M 6.78678,9.08865216 L 7.69303929,9.08865216 C 7.69303929,8.24907466 8.3831659,7.5697391 9.235927,7.5697391 L 9.235927,5.78676537 C 7.38274981,5.78676537 5.88052072,7.26505371 5.88052072,9.08865216 L 6.78678,9.08865216 M 42.06134459,9.08865216 L 42.96760388,9.08865216 C 42.96760388,7.26505371 41.46537478,5.78563691 39.61219759,5.78563691 L 39.61219759,7.56861063 C 40.46495869,7.56861063 41.1550853,8.24907466 41.1550853,9.08865216 L 42.06134459,9.08865216 M 39.61112762,43.32174777 L 39.61112762,44.21323463 C 41.46537478,44.21323463 42.96760388,42.73494629 42.96760388,40.91134784 L 41.1550853,40.91134784 C 41.1550853,41.74979688 40.46495869,42.4302609 39.61219759,42.4302609 L 39.61112762,43.32174777 M 9.235927,43.32174777 L 9.235927,42.4302609 C 8.3831659,42.4302609 7.69303929,41.74979688 7.69303929,40.91134784 L 5.87945075,40.91134784 C 5.87945075,42.73494629 7.38167984,44.21323463 9.23485704,44.21323463 L 9.235927,43.32174777 M 23.9340189,16.32098041 L 23.9340189,17.21246727 L 24.91410569,17.21246727 L 24.91410569,15.42949355 L 23.9340189,15.42949355 L 23.9340189,16.32098041 M 27.36325269,13.91058048 L 28.26951198,13.91058048 L 28.26951198,0.89148686 L 26.4569934,0.89148686 L 26.4569934,13.91170895 L 27.36325269,13.91058048 M 21.48380194,0.89148686 L 20.57754265,0.89148686 L 20.57754265,13.91170895 L 22.38899126,13.91170895 L 22.38899126,0.89148686 L 21.48380194,0.89148686 M 24.91303572,16.32098041 L 24.91303572,17.21246727 C 26.76621292,17.21246727 28.26844201,15.73417893 28.26844201,13.91058048 L 26.4569934,13.91058048 C 26.4569934,14.74902952 25.76579683,15.42949355 24.91303572,15.42949355 L 24.91303572,16.32098041 M 23.93294894,16.32098041 L 23.93294894,15.42949355 C 23.08018784,15.42949355 22.38899126,14.74902952 22.38899126,13.91058048 L 20.57754265,13.91058048 C 20.57754265,15.73417893 22.07977174,17.21246727 23.93294894,17.21246727 L 23.93294894,16.32098041 M 27.36218273,9.57050645 L 27.36218273,10.46199332 L 30.79248648,10.46199332 L 30.79248648,8.67901959 L 27.36218273,8.67901959 L 27.36218273,9.57050645 M 33.24163348,7.16010653 L 34.14789277,7.16010653 L 34.14789277,6.19526948 L 32.33537419,6.19526948 L 32.33537419,7.16010653 L 33.24163348,7.16010653 M 30.79141651,3.78486955 L 30.79141651,2.89338268 L 27.36218273,2.89338268 L 27.36218273,4.67635641 L 30.79248648,4.67635641 L 30.79141651,3.78486955 M 33.24163348,6.19526948 L 34.14789277,6.19526948 C 34.14789277,4.37167103 32.64566367,2.89338268 30.79248648,2.89338268 L 30.79248648,4.67635641 C 31.64417761,4.67635641 32.33537419,5.35682044 32.33537419,6.19526948 L 33.24163348,6.19526948 M 30.79141651,9.57050645 L 30.79141651,10.46199332 C 32.64566367,10.46199332 34.14789277,8.98370497 34.14789277,7.16010653 L 32.33537419,7.16010653 C 32.33537419,7.99855557 31.64417761,8.67901959 30.79248648,8.67901959 L 30.79141651,9.57050645 M 18.05349819,9.57050645 L 18.05349819,10.46199332 L 21.48380194,10.46199332 L 21.48380194,8.67901959 L 18.05349819,8.67901959 L 18.05349819,9.57050645 M 21.48380194,3.78486955 L 21.48380194,2.89338268 L 18.05349819,2.89338268 L 18.05349819,4.67635641 L 21.48380194,4.67635641 L 21.48380194,3.78486955 M 15.60435119,6.19526948 L 14.6980919,6.19526948 L 14.6980919,7.16010653 L 16.51061047,7.16010653 L 16.51061047,6.19526948 L 15.60435119,6.19526948 M 18.05456815,3.78486955 L 18.05456815,2.89338268 C 16.20032099,2.89338268 14.6980919,4.37167103 14.6980919,6.19526948 L 16.51061047,6.19526948 C 16.51061047,5.35682044 17.20180705,4.67635641 18.05349819,4.67635641 L 18.05456815,3.78486955 M 18.05456815,9.57050645 L 18.05456815,8.67901959 C 17.20180705,8.67901959 16.51061047,7.99855557 16.51061047,7.16010653 L 14.6980919,7.16010653 C 14.6980919,8.98370497 16.20032099,10.46199332 18.05349819,10.46199332 L 18.05456815,9.57050645 M 28.34226951,25.96370859 L 27.43601022,25.96370859 C 27.43601022,27.60223887 26.08785591,28.92931299 24.42299233,28.92931299 L 24.42299233,30.71228672 C 27.08720204,30.71228672 29.2485288,28.58625982 29.2485288,25.96370859 L 28.34226951,25.96370859 M 24.4240623,29.82079986 L 24.4240623,28.92931299 C 22.76026868,28.92931299 21.4110444,27.60223887 21.4110444,25.96370859 L 19.59852583,25.96370859 C 19.59852583,28.58625982 21.75985258,30.71341518 24.4240623,30.71341518 L 24.4240623,29.82079986 M 20.50478512,25.96370859 L 21.4110444,25.96370859 C 21.4110444,24.32630676 22.75919872,22.99810418 24.4240623,22.99810418 L 24.4240623,21.21513045 C 21.75985258,21.21513045 19.59852583,23.34115735 19.59852583,25.96370859 L 20.50478512,25.96370859 M 24.4240623,22.10661732 L 24.4240623,22.99810418 C 26.08785591,22.99810418 27.43708019,24.32630676 27.43708019,25.96370859 L 29.24959876,25.96370859 C 29.24959876,23.34115735 27.08827201,21.21513045 24.4240623,21.21513045 L 24.4240623,22.10661732 M 50.38994234,43.32174777 L 50.38994234,44.21323463 L 80.76621292,44.21323463 L 80.76621292,42.4302609 L 50.38994234,42.4302609 L 50.38994234,43.32174777 M 83.21642989,40.91134784 L 84.12161921,40.91134784 L 84.12161921,9.08865216 L 82.30910064,9.08865216 L 82.30910064,40.91134784 L 83.21642989,40.91134784 M 80.764073,6.67825223 L 80.764073,5.78676537 L 50.38780241,5.78676537 L 50.38780241,7.5697391 L 80.764073,7.5697391 L 80.764073,6.67825223 M 47.93758545,9.08865216 L 47.03239612,9.08865216 L 47.03239612,40.91134784 L 48.8449147,40.91134784 L 48.8449147,9.08865216 L 47.93758545,9.08865216 M 50.38780241,6.67825223 L 50.38780241,5.78676537 C 48.53462522,5.78676537 47.03239612,7.26505371 47.03239612,9.08865216 L 48.8449147,9.08865216 C 48.8449147,8.24907466 49.53611128,7.5697391 50.38780241,7.5697391 L 50.38780241,6.67825223 M 83.21428996,9.08865216 L 84.11947928,9.08865216 C 84.11947928,7.26505371 82.61725019,5.78563691 80.764073,5.78563691 L 80.764073,7.56861063 C 81.6168341,7.56861063 82.30803067,8.24907466 82.30803067,9.08865216 L 83.21428996,9.08865216 M 80.764073,43.32174777 L 80.764073,44.21323463 C 82.61725019,44.21323463 84.11947928,42.73494629 84.11947928,40.91134784 L 82.30910064,40.91134784 C 82.30910064,41.74979688 81.61790406,42.4302609 80.76514296,42.4302609 L 80.764073,43.32174777 M 50.38780241,43.32174777 L 50.38780241,42.4302609 C 49.53611128,42.4302609 48.8449147,41.74979688 48.8449147,40.91134784 L 47.03239612,40.91134784 C 47.03239612,42.73494629 48.53462522,44.21323463 50.38780241,44.21323463 L 50.38780241,43.32174777 M 53.81810616,11.49905209 L 53.81810616,12.39053895 L 77.33483921,12.39053895 L 77.33483921,10.60756523 L 53.8170362,10.60756523 L 53.81810616,11.49905209",viewW:90,viewH:50}};export{L as FURNITURE_ART_FINGERPRINT,M as GENERATED_FURNITURE_ART};
diff --git a/custom_components/houseplan/frontend/houseplan-assets/houseplan-card-BKJrmMEj.js b/custom_components/houseplan/frontend/houseplan-assets/houseplan-card-CAm75-22.js
similarity index 99%
rename from custom_components/houseplan/frontend/houseplan-assets/houseplan-card-BKJrmMEj.js
rename to custom_components/houseplan/frontend/houseplan-assets/houseplan-card-CAm75-22.js
index 67e85d97..5a02bc21 100644
--- a/custom_components/houseplan/frontend/houseplan-assets/houseplan-card-BKJrmMEj.js
+++ b/custom_components/houseplan/frontend/houseplan-assets/houseplan-card-CAm75-22.js
@@ -1,4 +1,4 @@
-globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="34d1dbfc181acaf58842dfced0e6aa3a899aef6b8d1eeba53732ef729a63137e";const e=globalThis,t=e.ShadowRoot&&(void 0===e.ShadyCSS||e.ShadyCSS.nativeShadow)&&"adoptedStyleSheets"in Document.prototype&&"replace"in CSSStyleSheet.prototype,i=Symbol(),n=new WeakMap;let r=class{constructor(e,t,n){if(this._$cssResult$=!0,n!==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=n.get(i)),void 0===e&&((this.o=e=new CSSStyleSheet).replaceSync(this.cssText),t&&n.set(i,e))}return e}toString(){return this.cssText}};const o=(e,...t)=>{const n=1===e.length?e[0]:t.reduce((t,i,n)=>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[n+1],e[0]);return new r(n,e,i)},s=t?e=>e:e=>e instanceof CSSStyleSheet?(e=>{let t="";for(const i of e.cssRules)t+=i.cssText;return(e=>new r("string"==typeof e?e:e+"",void 0,i))(t)})(e):e,{is:a,defineProperty:l,getOwnPropertyDescriptor:c,getOwnPropertyNames:h,getOwnPropertySymbols:d,getPrototypeOf:u}=Object,p=globalThis,_=p.trustedTypes,m=_?_.emptyScript:"",g=p.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}},y=(e,t)=>!a(e,t),b={attribute:!0,type:String,converter:v,reflect:!1,useDefault:!1,hasChanged:y};Symbol.metadata??=Symbol("metadata"),p.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=b){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(),n=this.getPropertyDescriptor(e,i,t);void 0!==n&&l(this.prototype,e,n)}}static getPropertyDescriptor(e,t,i){const{get:n,set:r}=c(this.prototype,e)??{get(){return this[t]},set(e){this[t]=e}};return{get:n,set(t){const o=n?.call(this);r?.call(this,t),this.requestUpdate(e,o,i)},configurable:!0,enumerable:!0}}static getPropertyOptions(e){return this.elementProperties.get(e)??b}static _$Ei(){if(this.hasOwnProperty(f("elementProperties")))return;const e=u(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(s(e))}else void 0!==e&&t.push(s(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,n)=>{if(t)i.adoptedStyleSheets=n.map(e=>e instanceof CSSStyleSheet?e:e.styleSheet);else for(const t of n){const n=document.createElement("style"),r=e.litNonce;void 0!==r&&n.setAttribute("nonce",r),n.textContent=t.cssText,i.appendChild(n)}})(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),n=this.constructor._$Eu(e,i);if(void 0!==n&&!0===i.reflect){const r=(void 0!==i.converter?.toAttribute?i.converter:v).toAttribute(t,i.type);this._$Em=e,null==r?this.removeAttribute(n):this.setAttribute(n,r),this._$Em=null}}_$AK(e,t){const i=this.constructor,n=i._$Eh.get(e);if(void 0!==n&&this._$Em!==n){const e=i.getPropertyOptions(n),r="function"==typeof e.converter?{fromAttribute:e.converter}:void 0!==e.converter?.fromAttribute?e.converter:v;this._$Em=n;const o=r.fromAttribute(t,e.type);this[n]=o??this._$Ej?.get(n)??o,this._$Em=null}}requestUpdate(e,t,i,n=!1,r){if(void 0!==e){const o=this.constructor;if(!1===n&&(r=this[e]),i??=o.getPropertyOptions(e),!((i.hasChanged??y)(r,t)||i.useDefault&&i.reflect&&r===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:n,wrapped:r},o){i&&!(this._$Ej??=new Map).has(e)&&(this._$Ej.set(e,o??t??this[e]),!0!==r||void 0!==o)||(this._$AL.has(e)||(this.hasUpdated||i||(t=void 0),this._$AL.set(e,t)),!0===n&&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,n=this[t];!0!==e||this._$AL.has(t)||void 0===n||this.C(t,void 0,i,n)}}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}),(p.reactiveElementVersions??=[]).push("2.1.2");const k=globalThis,x=e=>e,S=k.trustedTypes,$=S?S.createPolicy("lit-html",{createHTML:e=>e}):void 0,M="$lit$",R=`lit$${Math.random().toFixed(9).slice(2)}$`,C="?"+R,T=`<${C}>`,D=document,A=()=>D.createComment(""),P=e=>null===e||"object"!=typeof e&&"function"!=typeof e,F=Array.isArray,z="[ \t\n\f\r]",I=/<(?:(!--|\/[^a-zA-Z])|(\/?[a-zA-Z][^>\s]*)|(\/?$))/g,O=/-->/g,E=/>/g,N=RegExp(`>|${z}(?:([^\\s"'>=/]+)(${z}*=${z}*(?:[^ \t\n\f\r"'\`<>=]|("|')|))|$)`,"g"),H=/'/g,L=/"/g,B=/^(?:script|style|textarea|title)$/i,q=e=>(t,...i)=>({_$litType$:e,strings:t,values:i}),j=q(1),W=q(2),U=Symbol.for("lit-noChange"),G=Symbol.for("lit-nothing"),V=new WeakMap,K=D.createTreeWalker(D,129);function Y(e,t){if(!F(e)||!e.hasOwnProperty("raw"))throw Error("invalid template strings array");return void 0!==$?$.createHTML(t):t}const X=(e,t)=>{const i=e.length-1,n=[];let r,o=2===t?"":3===t?"":"")),n]};class Z{constructor({strings:e,_$litType$:t},i){let n;this.parts=[];let r=0,o=0;const s=e.length-1,a=this.parts,[l,c]=X(e,t);if(this.el=Z.createElement(l,i),K.currentNode=this.el.content,2===t||3===t){const e=this.el.content.firstChild;e.replaceWith(...e.childNodes)}for(;null!==(n=K.nextNode())&&a.length0){n.textContent=S?S.emptyScript:"";for(let i=0;iF(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&&P(this._$AH)?this._$AA.nextSibling.data=e:this.T(D.createTextNode(e)),this._$AH=e}$(e){const{values:t,_$litType$:i}=e,n="number"==typeof i?this._$AC(e):(void 0===i.el&&(i.el=Z.createElement(Y(i.h,i.h[0]),this.options)),i);if(this._$AH?._$AD===n)this._$AH.p(t);else{const e=new Q(n,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 Z(e)),t}k(e){F(this._$AH)||(this._$AH=[],this._$AR());const t=this._$AH;let i,n=0;for(const r of e)n===t.length?t.push(i=new ee(this.O(A()),this.O(A()),this,this.options)):i=t[n],i._$AI(r),n++;n2||""!==i[0]||""!==i[1]?(this._$AH=Array(i.length-1).fill(new String),this.strings=i):this._$AH=G}_$AI(e,t=this,i,n){const r=this.strings;let o=!1;if(void 0===r)e=J(this,e,t,0),o=!P(e)||e!==this._$AH&&e!==U,o&&(this._$AH=e);else{const n=e;let s,a;for(e=r[0],s=0;s{const n=i?.renderBefore??t;let r=n._$litPart$;if(void 0===r){const e=i?.renderBefore??null;n._$litPart$=r=new ee(t.insertBefore(A(),e),e,void 0,i??{})}return r._$AI(e),r},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 ue=2,pe=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{I:me}=se,ge=e=>e,fe=(e,t)=>void 0!==e?._$litType$,ve=()=>document.createComment(""),ye=(e,t,i)=>{const n=e._$AA.parentNode,r=void 0===t?e._$AB:t._$AA;if(void 0===i){const t=n.insertBefore(ve(),r),o=n.insertBefore(ve(),r);i=new me(t,o,e,e.options)}else{const t=i._$AB.nextSibling,o=i._$AM,s=o!==e;if(s){let t;i._$AQ?.(e),i._$AM=e,void 0!==i._$AP&&(t=e._$AU)!==o._$AU&&i._$AP(t)}if(t!==r||s){let e=i._$AA;for(;e!==t;){const t=ge(e).nextSibling;ge(n).insertBefore(e,r),e=t}}}return i},be=(e,t,i=e)=>(e._$AI(t,i),e),we={},ke=(e,t=we)=>e._$AH=t,xe=e=>e._$AH,Se=e=>{e._$AR(),e._$AA.remove()},$e=e=>(e=>null!=e?._$litType$?.h)(e)?e._$litType$.h:e.strings,Me=pe(class extends _e{constructor(e){super(e),this.et=new WeakMap}render(e){return[e]}update(e,[t]){const i=fe(this.it)?$e(this.it):null,n=fe(t)?$e(t):null;if(null!==i&&(null===n||i!==n)){const t=xe(e).pop();let n=this.et.get(i);if(void 0===n){const e=document.createDocumentFragment();n=le(G,e),n.setConnected(!1),this.et.set(i,n)}ke(n,[t]),ye(n,void 0,t)}if(null!==n){if(null===i||i!==n){const t=this.et.get(n);if(void 0!==t){const i=xe(t).pop();(e=>{e._$AR()})(e),ye(e,void 0,i),ke(e,[i])}}this.it=t}else this.it=void 0;return this.render(t)}}),Re=pe(class extends _e{constructor(){super(...arguments),this.key=G}render(e,t){return this.key=e,t}update(e,[t,i]){return t!==this.key&&(ke(e),this.key=t),i}}),Ce=(e,t,i)=>{const n=new Map;for(let r=t;r<=i;r++)n.set(e[r],r);return n},Te=pe(class extends _e{constructor(e){if(super(e),e.type!==ue)throw Error("repeat() can only be used in text expressions")}dt(e,t,i){let n;void 0===i?i=t:void 0!==t&&(n=t);const r=[],o=[];let s=0;for(const t of e)r[s]=n?n(t,s):s,o[s]=i(t,s),s++;return{values:o,keys:r}}render(e,t,i){return this.dt(e,t,i).values}update(e,[t,i,n]){const r=xe(e),{values:o,keys:s}=this.dt(t,i,n);if(!Array.isArray(r))return this.ut=s,o;const a=this.ut??=[],l=[];let c,h,d=0,u=r.length-1,p=0,_=o.length-1;for(;d<=u&&p<=_;)if(null===r[d])d++;else if(null===r[u])u--;else if(a[d]===s[p])l[p]=be(r[d],o[p]),d++,p++;else if(a[u]===s[_])l[_]=be(r[u],o[_]),u--,_--;else if(a[d]===s[_])l[_]=be(r[d],o[_]),ye(e,l[_+1],r[d]),d++,_--;else if(a[u]===s[p])l[p]=be(r[u],o[p]),ye(e,r[d],r[u]),u--,p++;else if(void 0===c&&(c=Ce(s,p,_),h=Ce(a,d,u)),c.has(a[d]))if(c.has(a[u])){const t=h.get(s[p]),i=void 0!==t?r[t]:null;if(null===i){const t=ye(e,r[d]);be(t,o[p]),l[p]=t}else l[p]=be(i,o[p]),ye(e,r[d],i),r[t]=null;p++}else Se(r[u]),u--;else Se(r[d]),d++;for(;p<=_;){const t=ye(e,l[_+1]);be(t,o[p]),l[p++]=t}for(;d<=u;){const e=r[d++];null!==e&&Se(e)}return this.ut=s,ke(e,l),U}}),De=new WeakMap;let Ae=0;class Pe extends he{constructor(){super(...arguments),this.title="",this.icon="",this.wide=!1,this.alert=!1,this.describedBy="",this.dismissOnScrim=!1,this.flexContent=!1,this.hass=null,this._opener=null,this._focusRoot=null,this._useHaDialog=null,this._closing=!1,this._overlays=[],this._titleId="hp-dialog-title-"+ ++Ae,this._focusInitial=()=>{const e=this._focusableElements(),t=e.find(e=>e.hasAttribute("autofocus"))||e[0]||(this._usesHaDialog()?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._usesHaDialog())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 n=this._deepActiveElement(),r=i[0],o=i[i.length-1];!e.shiftKey||n!==r&&i.includes(n)?e.shiftKey||n!==o||(e.preventDefault(),r.focus()):(e.preventDefault(),o.focus())},this._onFallbackCancel=e=>{e.preventDefault(),this._requestClose()},this._onFallbackClick=e=>{this.dismissOnScrim&&e.target===e.currentTarget&&this._requestClose()}}_usesHaDialog(){return!0===this._useHaDialog&&!this.alert}connectedCallback(){this.setAttribute("data-hp","dialog"),super.connectedCallback(),this._opener=this._deepActiveElement();const e=this.getRootNode();this._focusRoot=e;const t=De.get(e)||{dialogs:new Set,opener:this._opener};t.dialogs.add(this),De.set(e,t),null===this._useHaDialog&&(this._useHaDialog=!!customElements.get("ha-dialog")),this.addEventListener("keydown",this._onKeyDown,!0),queueMicrotask(()=>{this._ensureNativeModal()&&this._focusInitial()})}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 n=t?De.get(t):void 0;n?.dialogs.delete(this),super.disconnectedCallback(),t&&n&&requestAnimationFrame(()=>{const e=De.get(t);if(!e)return;if(!e.dialogs.size)return e.opener?.isConnected&&e.opener.focus({preventScroll:!0}),void De.delete(t);const n=i?.closest("hp-dialog");i?.isConnected&&n&&e.dialogs.has(n)&&i.focus({preventScroll:!0})})}firstUpdated(e){super.firstUpdated(e),this._ensureNativeModal(),queueMicrotask(()=>this._focusInitial())}updated(e){super.updated(e),this._ensureNativeModal()}_ensureNativeModal(){if(this._usesHaDialog()||!this.isConnected)return!1;const e=this.renderRoot.querySelector("dialog");if(!e?.isConnected)return!1;try{return!e.matches(":modal")&&(e.open&&e.close(),e.showModal(),!0)}catch{return!1}}_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,n=r=>{if(!i.has(r)){if(i.add(r),r instanceof HTMLElement){if(r.matches(e)&&t.push(r),r instanceof HTMLSlotElement){for(const e of r.assignedNodes({flatten:!0}))n(e);return}if(r.shadowRoot){for(const e of r.shadowRoot.childNodes)n(e);return}}for(const e of r.childNodes)n(e)}};for(const e of this.childNodes)n(e);const r=this.overlayPortal();return r&&n(r),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})}rejectClose(){this._closing=!1,this.requestUpdate()}_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 n={...e,group:i,token:Symbol("hp-overlay")};this._overlays.push(n);let r=!1;return()=>{if(r)return;r=!0;const e=this._overlays.findIndex(e=>e.token===n.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=j`
+globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="4da0d706a85c3f1c08ab6de960deb5feb08baaf9055265234e7bd1b554332653";const e=globalThis,t=e.ShadowRoot&&(void 0===e.ShadyCSS||e.ShadyCSS.nativeShadow)&&"adoptedStyleSheets"in Document.prototype&&"replace"in CSSStyleSheet.prototype,i=Symbol(),n=new WeakMap;let r=class{constructor(e,t,n){if(this._$cssResult$=!0,n!==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=n.get(i)),void 0===e&&((this.o=e=new CSSStyleSheet).replaceSync(this.cssText),t&&n.set(i,e))}return e}toString(){return this.cssText}};const o=(e,...t)=>{const n=1===e.length?e[0]:t.reduce((t,i,n)=>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[n+1],e[0]);return new r(n,e,i)},s=t?e=>e:e=>e instanceof CSSStyleSheet?(e=>{let t="";for(const i of e.cssRules)t+=i.cssText;return(e=>new r("string"==typeof e?e:e+"",void 0,i))(t)})(e):e,{is:a,defineProperty:l,getOwnPropertyDescriptor:c,getOwnPropertyNames:h,getOwnPropertySymbols:d,getPrototypeOf:u}=Object,p=globalThis,_=p.trustedTypes,m=_?_.emptyScript:"",g=p.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}},y=(e,t)=>!a(e,t),b={attribute:!0,type:String,converter:v,reflect:!1,useDefault:!1,hasChanged:y};Symbol.metadata??=Symbol("metadata"),p.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=b){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(),n=this.getPropertyDescriptor(e,i,t);void 0!==n&&l(this.prototype,e,n)}}static getPropertyDescriptor(e,t,i){const{get:n,set:r}=c(this.prototype,e)??{get(){return this[t]},set(e){this[t]=e}};return{get:n,set(t){const o=n?.call(this);r?.call(this,t),this.requestUpdate(e,o,i)},configurable:!0,enumerable:!0}}static getPropertyOptions(e){return this.elementProperties.get(e)??b}static _$Ei(){if(this.hasOwnProperty(f("elementProperties")))return;const e=u(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(s(e))}else void 0!==e&&t.push(s(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,n)=>{if(t)i.adoptedStyleSheets=n.map(e=>e instanceof CSSStyleSheet?e:e.styleSheet);else for(const t of n){const n=document.createElement("style"),r=e.litNonce;void 0!==r&&n.setAttribute("nonce",r),n.textContent=t.cssText,i.appendChild(n)}})(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),n=this.constructor._$Eu(e,i);if(void 0!==n&&!0===i.reflect){const r=(void 0!==i.converter?.toAttribute?i.converter:v).toAttribute(t,i.type);this._$Em=e,null==r?this.removeAttribute(n):this.setAttribute(n,r),this._$Em=null}}_$AK(e,t){const i=this.constructor,n=i._$Eh.get(e);if(void 0!==n&&this._$Em!==n){const e=i.getPropertyOptions(n),r="function"==typeof e.converter?{fromAttribute:e.converter}:void 0!==e.converter?.fromAttribute?e.converter:v;this._$Em=n;const o=r.fromAttribute(t,e.type);this[n]=o??this._$Ej?.get(n)??o,this._$Em=null}}requestUpdate(e,t,i,n=!1,r){if(void 0!==e){const o=this.constructor;if(!1===n&&(r=this[e]),i??=o.getPropertyOptions(e),!((i.hasChanged??y)(r,t)||i.useDefault&&i.reflect&&r===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:n,wrapped:r},o){i&&!(this._$Ej??=new Map).has(e)&&(this._$Ej.set(e,o??t??this[e]),!0!==r||void 0!==o)||(this._$AL.has(e)||(this.hasUpdated||i||(t=void 0),this._$AL.set(e,t)),!0===n&&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,n=this[t];!0!==e||this._$AL.has(t)||void 0===n||this.C(t,void 0,i,n)}}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}),(p.reactiveElementVersions??=[]).push("2.1.2");const k=globalThis,x=e=>e,S=k.trustedTypes,$=S?S.createPolicy("lit-html",{createHTML:e=>e}):void 0,M="$lit$",R=`lit$${Math.random().toFixed(9).slice(2)}$`,C="?"+R,T=`<${C}>`,D=document,A=()=>D.createComment(""),P=e=>null===e||"object"!=typeof e&&"function"!=typeof e,F=Array.isArray,z="[ \t\n\f\r]",I=/<(?:(!--|\/[^a-zA-Z])|(\/?[a-zA-Z][^>\s]*)|(\/?$))/g,O=/-->/g,E=/>/g,N=RegExp(`>|${z}(?:([^\\s"'>=/]+)(${z}*=${z}*(?:[^ \t\n\f\r"'\`<>=]|("|')|))|$)`,"g"),H=/'/g,L=/"/g,B=/^(?:script|style|textarea|title)$/i,q=e=>(t,...i)=>({_$litType$:e,strings:t,values:i}),j=q(1),W=q(2),U=Symbol.for("lit-noChange"),G=Symbol.for("lit-nothing"),V=new WeakMap,K=D.createTreeWalker(D,129);function Y(e,t){if(!F(e)||!e.hasOwnProperty("raw"))throw Error("invalid template strings array");return void 0!==$?$.createHTML(t):t}const X=(e,t)=>{const i=e.length-1,n=[];let r,o=2===t?"":3===t?"":"")),n]};class Z{constructor({strings:e,_$litType$:t},i){let n;this.parts=[];let r=0,o=0;const s=e.length-1,a=this.parts,[l,c]=X(e,t);if(this.el=Z.createElement(l,i),K.currentNode=this.el.content,2===t||3===t){const e=this.el.content.firstChild;e.replaceWith(...e.childNodes)}for(;null!==(n=K.nextNode())&&a.length0){n.textContent=S?S.emptyScript:"";for(let i=0;iF(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&&P(this._$AH)?this._$AA.nextSibling.data=e:this.T(D.createTextNode(e)),this._$AH=e}$(e){const{values:t,_$litType$:i}=e,n="number"==typeof i?this._$AC(e):(void 0===i.el&&(i.el=Z.createElement(Y(i.h,i.h[0]),this.options)),i);if(this._$AH?._$AD===n)this._$AH.p(t);else{const e=new Q(n,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 Z(e)),t}k(e){F(this._$AH)||(this._$AH=[],this._$AR());const t=this._$AH;let i,n=0;for(const r of e)n===t.length?t.push(i=new ee(this.O(A()),this.O(A()),this,this.options)):i=t[n],i._$AI(r),n++;n2||""!==i[0]||""!==i[1]?(this._$AH=Array(i.length-1).fill(new String),this.strings=i):this._$AH=G}_$AI(e,t=this,i,n){const r=this.strings;let o=!1;if(void 0===r)e=J(this,e,t,0),o=!P(e)||e!==this._$AH&&e!==U,o&&(this._$AH=e);else{const n=e;let s,a;for(e=r[0],s=0;s{const n=i?.renderBefore??t;let r=n._$litPart$;if(void 0===r){const e=i?.renderBefore??null;n._$litPart$=r=new ee(t.insertBefore(A(),e),e,void 0,i??{})}return r._$AI(e),r},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 ue=2,pe=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{I:me}=se,ge=e=>e,fe=(e,t)=>void 0!==e?._$litType$,ve=()=>document.createComment(""),ye=(e,t,i)=>{const n=e._$AA.parentNode,r=void 0===t?e._$AB:t._$AA;if(void 0===i){const t=n.insertBefore(ve(),r),o=n.insertBefore(ve(),r);i=new me(t,o,e,e.options)}else{const t=i._$AB.nextSibling,o=i._$AM,s=o!==e;if(s){let t;i._$AQ?.(e),i._$AM=e,void 0!==i._$AP&&(t=e._$AU)!==o._$AU&&i._$AP(t)}if(t!==r||s){let e=i._$AA;for(;e!==t;){const t=ge(e).nextSibling;ge(n).insertBefore(e,r),e=t}}}return i},be=(e,t,i=e)=>(e._$AI(t,i),e),we={},ke=(e,t=we)=>e._$AH=t,xe=e=>e._$AH,Se=e=>{e._$AR(),e._$AA.remove()},$e=e=>(e=>null!=e?._$litType$?.h)(e)?e._$litType$.h:e.strings,Me=pe(class extends _e{constructor(e){super(e),this.et=new WeakMap}render(e){return[e]}update(e,[t]){const i=fe(this.it)?$e(this.it):null,n=fe(t)?$e(t):null;if(null!==i&&(null===n||i!==n)){const t=xe(e).pop();let n=this.et.get(i);if(void 0===n){const e=document.createDocumentFragment();n=le(G,e),n.setConnected(!1),this.et.set(i,n)}ke(n,[t]),ye(n,void 0,t)}if(null!==n){if(null===i||i!==n){const t=this.et.get(n);if(void 0!==t){const i=xe(t).pop();(e=>{e._$AR()})(e),ye(e,void 0,i),ke(e,[i])}}this.it=t}else this.it=void 0;return this.render(t)}}),Re=pe(class extends _e{constructor(){super(...arguments),this.key=G}render(e,t){return this.key=e,t}update(e,[t,i]){return t!==this.key&&(ke(e),this.key=t),i}}),Ce=(e,t,i)=>{const n=new Map;for(let r=t;r<=i;r++)n.set(e[r],r);return n},Te=pe(class extends _e{constructor(e){if(super(e),e.type!==ue)throw Error("repeat() can only be used in text expressions")}dt(e,t,i){let n;void 0===i?i=t:void 0!==t&&(n=t);const r=[],o=[];let s=0;for(const t of e)r[s]=n?n(t,s):s,o[s]=i(t,s),s++;return{values:o,keys:r}}render(e,t,i){return this.dt(e,t,i).values}update(e,[t,i,n]){const r=xe(e),{values:o,keys:s}=this.dt(t,i,n);if(!Array.isArray(r))return this.ut=s,o;const a=this.ut??=[],l=[];let c,h,d=0,u=r.length-1,p=0,_=o.length-1;for(;d<=u&&p<=_;)if(null===r[d])d++;else if(null===r[u])u--;else if(a[d]===s[p])l[p]=be(r[d],o[p]),d++,p++;else if(a[u]===s[_])l[_]=be(r[u],o[_]),u--,_--;else if(a[d]===s[_])l[_]=be(r[d],o[_]),ye(e,l[_+1],r[d]),d++,_--;else if(a[u]===s[p])l[p]=be(r[u],o[p]),ye(e,r[d],r[u]),u--,p++;else if(void 0===c&&(c=Ce(s,p,_),h=Ce(a,d,u)),c.has(a[d]))if(c.has(a[u])){const t=h.get(s[p]),i=void 0!==t?r[t]:null;if(null===i){const t=ye(e,r[d]);be(t,o[p]),l[p]=t}else l[p]=be(i,o[p]),ye(e,r[d],i),r[t]=null;p++}else Se(r[u]),u--;else Se(r[d]),d++;for(;p<=_;){const t=ye(e,l[_+1]);be(t,o[p]),l[p++]=t}for(;d<=u;){const e=r[d++];null!==e&&Se(e)}return this.ut=s,ke(e,l),U}}),De=new WeakMap;let Ae=0;class Pe extends he{constructor(){super(...arguments),this.title="",this.icon="",this.wide=!1,this.alert=!1,this.describedBy="",this.dismissOnScrim=!1,this.flexContent=!1,this.hass=null,this._opener=null,this._focusRoot=null,this._useHaDialog=null,this._closing=!1,this._overlays=[],this._titleId="hp-dialog-title-"+ ++Ae,this._focusInitial=()=>{const e=this._focusableElements(),t=e.find(e=>e.hasAttribute("autofocus"))||e[0]||(this._usesHaDialog()?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._usesHaDialog())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 n=this._deepActiveElement(),r=i[0],o=i[i.length-1];!e.shiftKey||n!==r&&i.includes(n)?e.shiftKey||n!==o||(e.preventDefault(),r.focus()):(e.preventDefault(),o.focus())},this._onFallbackCancel=e=>{e.preventDefault(),this._requestClose()},this._onFallbackClick=e=>{this.dismissOnScrim&&e.target===e.currentTarget&&this._requestClose()}}_usesHaDialog(){return!0===this._useHaDialog&&!this.alert}connectedCallback(){this.setAttribute("data-hp","dialog"),super.connectedCallback(),this._opener=this._deepActiveElement();const e=this.getRootNode();this._focusRoot=e;const t=De.get(e)||{dialogs:new Set,opener:this._opener};t.dialogs.add(this),De.set(e,t),null===this._useHaDialog&&(this._useHaDialog=!!customElements.get("ha-dialog")),this.addEventListener("keydown",this._onKeyDown,!0),queueMicrotask(()=>{this._ensureNativeModal()&&this._focusInitial()})}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 n=t?De.get(t):void 0;n?.dialogs.delete(this),super.disconnectedCallback(),t&&n&&requestAnimationFrame(()=>{const e=De.get(t);if(!e)return;if(!e.dialogs.size)return e.opener?.isConnected&&e.opener.focus({preventScroll:!0}),void De.delete(t);const n=i?.closest("hp-dialog");i?.isConnected&&n&&e.dialogs.has(n)&&i.focus({preventScroll:!0})})}firstUpdated(e){super.firstUpdated(e),this._ensureNativeModal(),queueMicrotask(()=>this._focusInitial())}updated(e){super.updated(e),this._ensureNativeModal()}_ensureNativeModal(){if(this._usesHaDialog()||!this.isConnected)return!1;const e=this.renderRoot.querySelector("dialog");if(!e?.isConnected)return!1;try{return!e.matches(":modal")&&(e.open&&e.close(),e.showModal(),!0)}catch{return!1}}_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,n=r=>{if(!i.has(r)){if(i.add(r),r instanceof HTMLElement){if(r.matches(e)&&t.push(r),r instanceof HTMLSlotElement){for(const e of r.assignedNodes({flatten:!0}))n(e);return}if(r.shadowRoot){for(const e of r.shadowRoot.childNodes)n(e);return}}for(const e of r.childNodes)n(e)}};for(const e of this.childNodes)n(e);const r=this.overlayPortal();return r&&n(r),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})}rejectClose(){this._closing=!1,this.requestUpdate()}_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 n={...e,group:i,token:Symbol("hp-overlay")};this._overlays.push(n);let r=!1;return()=>{if(r)return;r=!0;const e=this._overlays.findIndex(e=>e.token===n.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=j`
${this.icon?j``:G}
${this.title}`;return this._usesHaDialog()?this.describedBy?j`${e.map(e=>"path"in e?W``:"poly"in e?W``:W``)}`}const Cr={color:"#607d8b",opacity:1,widthCm:3.6,fill:!1,fillColor:"#607d8b",fillOpacity:.25},Tr=(e,t=1)=>{const i=Number(e);return Number.isFinite(i)?Math.min(1,Math.max(0,i)):t},Dr=e=>{let t=Number(e);return Number.isFinite(t)?(t=(t%360+360)%360,t>180?t-360:t):0};function Ar(e,t,i){return Dr(t)?[e.x,e.y]:i([e.x,e.y])}function Pr(e,t,i,n){const r=Math.abs(i[0]-t[0]),o=Math.abs(i[1]-t[1]);return"line"===e?Math.hypot(r,o)>=n:r>=n&&o>=n}const Fr=(e,t,i)=>{const n=Number(e),r=Number.isFinite(t)&&t>0?t:5;return Number.isFinite(n)&&n>0?n/r*i:0},zr=(e,t,i)=>{const n=Number(e),r=Number.isFinite(t)&&t>0?t:5;return Number.isFinite(n)&&i>0?n/i*r:0},Ir=(e,t,i,n=Cr.widthCm)=>{const r=Number(e?.width_cm);if(Number.isFinite(r)&&r>0)return r;const o=Number(e?.width);return Number.isFinite(o)&&o>0?zr(o,t,i):n};function Or(e){const t=Cr;return e.color===t.color&&e.opacity===t.opacity&&e.widthCm===t.widthCm&&e.fill===t.fill&&e.fillColor===t.fillColor&&e.fillOpacity===t.fillOpacity?null:{color:e.color,opacity:Tr(e.opacity),width_cm:Math.max(.1,Math.min(100,Number(e.widthCm)||.1)),fill:!!e.fill,fill_color:e.fillColor,fill_opacity:Tr(e.fillOpacity,.25)}}function Er(e,t){return{color:e.color,opacity:Tr(e.opacity),width_cm:Math.max(.1,Math.min(100,Number(e.widthCm)||.1)),...t?{fill:e.fill,fill_color:e.fillColor,fill_opacity:Tr(e.fillOpacity,.25)}:{}}}function Nr(e){const t=e.x+e.w/2,i=e.y+e.h/2,n=Dr(e.angle)*Math.PI/180,r=Math.cos(n),o=Math.sin(n),s=(e,n)=>{const s=e-t,a=n-i;return[t+s*r-a*o,i+s*o+a*r]};return[s(e.x,e.y),s(e.x+e.w,e.y),s(e.x+e.w,e.y+e.h),s(e.x,e.y+e.h)]}function Hr(e){const t=Nr(e),i=(e,t)=>[(e[0]+t[0])/2,(e[1]+t[1])/2],n=[(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]),n],segments:t.map((e,i)=>({a:e,b:t[(i+1)%4]}))}}function Lr(e,t,i,n,r,o,s,a){const l=Dr(e.angle)*Math.PI/180,c=Math.cos(l),h=Math.sin(l),d=-Math.sin(l),u=Math.cos(l),p=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=p+m*c+g*d,v=_+m*h+g*u,y=n-f,b=r-v;let w=(y*c+b*h)*(t>0?1:-1),k=(y*d+b*u)*(i>0?1:-1),x=null;if(o){const t=w/Math.max(e.w,a),i=k/Math.max(e.h,a);x=Math.max(a/Math.max(e.w,a),a/Math.max(e.h,a),t,i),w=e.w*x,k=e.h*x}if(s>0)if(o){const t=Math.max(1,Math.round(e.w/s)),i=Math.max(1,Math.round(e.h/s));if(Math.abs(e.w-t*s)<1e-6&&Math.abs(e.h-i*s)<1e-6){const n=(e,t)=>{let i=Math.abs(e),n=Math.abs(t);for(;n;)[i,n]=[n,i%n];return Math.max(1,i)},r=1/n(t,i),o=Math.max(a/e.w,a/e.h),s=Math.max(o,Math.round((x??1)/r)*r);w=e.w*s,k=e.h*s}else{e.w>=e.h?(w=Math.round(w/s)*s,k=w*(e.h/Math.max(e.w,a))):(k=Math.round(k/s)*s,w=k*(e.w/Math.max(e.h,a)))}}else w=Math.round(w/s)*s,k=Math.round(k/s)*s;w=Math.max(a,w),k=Math.max(a,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)*u-k/2,w:w,h:k,angle:Dr(e.angle)||void 0}}const Br=(e,t,i)=>{const n=i[0]-t[0],r=i[1]-t[1],o=n*n+r*r;if(o<1e-12)return[...t];const s=Math.max(0,Math.min(1,((e[0]-t[0])*n+(e[1]-t[1])*r)/o));return[t[0]+n*s,t[1]+r*s]};function qr(e,t,i,n){const r=n(e);let o=null;for(const r of t.points){const t=n(r),s=Math.hypot(t[0]-e[0],t[1]-e[1]);s<=i&&(!o||se.points),segments:e.flatMap(e=>e.segments)}}const Wr=Math.tan(.25*Math.PI/180);function Ur(e,t){const i=Math.abs(Number(t[0])-Number(e[0])),n=Math.abs(Number(t[1])-Number(e[1]));if(!([i,n].every(Number.isFinite)&&i>0&&n>0))return null;const r=i>=n?"horizontal":"vertical",o=Math.max(i,n),s=Math.min(i,n);return s/o>Wr?null:{axis:r,major:o,minor:s,angleDegrees:180*Math.atan2(s,o)/Math.PI}}function Gr(e,t){const i=Ur(e,t);return i?"horizontal"===i.axis?[Number(t[0]),Number(e[1])]:[Number(e[0]),Number(t[1])]:[Number(t[0]),Number(t[1])]}const Vr=e=>`${e[0]},${e[1]}`,Kr=(e,t)=>e[0]===t[0]&&e[1]===t[1],Yr=(e,t)=>{const i=Vr(e),n=Vr(t);return i{let t=0;for(let i=0;i{if(e.length<3)return!1;for(let t=0;t1e-12},Jr=(e,t)=>Kr(e,t.from)?[...t.to]:[...e],Qr=(e,t)=>e.map(e=>Array.isArray(e?.poly)?{...e,poly:e.poly.map(e=>Jr(e,t))}:e),eo=(e,t,i)=>{const n=e.flatMap((e,t)=>ni(e)?.some(e=>Kr(e,i.from))?[t]:[]);if(!n.length)return!1;for(const i of n){const n=ni(e[i]),r=ni(t[i]);if(!n||!r)continue;if(!Zr(r))return!1;const o=Math.sign(Xr(n)),s=Math.sign(Xr(r));if(o&&s&&o!==s)return!1}const r=new Set;for(const e of n){const i=ni(t[e]);if(i)for(let n=0;n{let i=0;for(const n of e){const e=ni(n);if(e)for(let n=0;n{const{a:i,b:n,axis:r}=e,o="horizontal"===r?{from:n,to:[n[0],i[1]]}:{from:n,to:[i[0],n[1]]},s="horizontal"===r?{from:i,to:[i[0],n[1]]}:{from:i,to:[n[0],i[1]]};return[{move:o,preservedDegree:to(t,i)},{move:s,preservedDegree:to(t,n)}].sort((e,t)=>t.preservedDegree-e.preservedDegree||Vr(e.move.to).localeCompare(Vr(t.move.to))||Vr(e.move.from).localeCompare(Vr(t.move.from))).map(e=>e.move)};function no(e){const t=JSON.parse(JSON.stringify(e||{}));let i=Array.isArray(t.rooms)?t.rooms:[];const n=new Map;for(const e of i){const t=ni(e);if(t)for(let e=0;ee.key.localeCompare(t.key))){let t=null;for(const n of io(e,i)){const e=a.get(Vr(n.from));if(e&&e!==Vr(n.to))continue;const r=Qr(i,n);if(eo(i,r,n)){t=n,i=r;break}}t?(a.set(Vr(t.from),Vr(t.to)),r++,s=Math.max(s,Math.hypot(t.to[0]-t.from[0],t.to[1]-t.from[1]))):o++}t.rooms=i;for(const e of t.partitions||[]){if(!Array.isArray(e?.a)||!Array.isArray(e?.b))continue;const i=Ur(e.a,e.b);if(!i)continue;const n={key:String(e.id||Yr(e.a,e.b)),a:[...e.a],b:[...e.b],axis:i.axis};let a=null;for(const i of io(n,[{poly:[e.a,e.b]}])){const n=Jr(e.a,i),r=Jr(e.b,i),o=Math.hypot(r[0]-n[0],r[1]-n[1]);if(!(o>0))continue;const s=(t.openings||[]).filter(t=>"partition"===t?.host?.kind&&t.host.id===e.id).every(e=>{const t=Number(e.host.t),i=Number(e.length);return Number.isFinite(t)&&t>=0&&t<=1&&Number.isFinite(i)&&i>0&&t*o-i/2>=-1e-12&&t*o+i/2<=o+1e-12});if(s){a=i,e.a=n,e.b=r;break}}a?(r++,s=Math.max(s,Math.hypot(a.to[0]-a.from[0],a.to[1]-a.from[1]))):o++}return{space:t,report:{wallsStraightened:r,wallsStraightenSkipped:o,maxStraightenShift:s},changed:r>0}}const ro=["rect","ellipse","furniture","image"],oo=10**9,so=240,ao=1e-4;function lo(e){if(Array.isArray(e))return e.map(e=>lo(e));if(null!==e&&"object"==typeof e){const t={};for(const[i,n]of Object.entries(e))t[i]=lo(n);return t}return e}function co(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)*oo+.5)/oo);return 0===t?0:t}function ho(e){if("number"!=typeof e||!Number.isFinite(e))return e;const t=e*so,i=Math.round(t);if(Math.abs(t-i)null!==po(e)):[]}function mo(e){return"string"==typeof e&&ro.includes(e)}function go(e,t){for(const i of t)Object.prototype.hasOwnProperty.call(e,i)&&(e[i]=co(e[i]))}function fo(e,t){for(const i of t)Object.prototype.hasOwnProperty.call(e,i)&&(e[i]=ho(e[i]))}function vo(e){if(Array.isArray(e))for(let t=0;t{for(const r of n){const n=t[r];"number"==typeof n&&Number.isFinite(n)&&i(n,e)}},n=t=>{if(Array.isArray(t))for(let n=0;n{if(Array.isArray(e))for(const t of e)n(t)};for(const i of _o(e.rooms))t(i,["x","y","w","h"]),r(i.poly);for(const t of _o(e.walls))n(t.a),n(t.b);for(const t of _o(e.wall_segments))n(t.a),n(t.b);for(const i of _o(e.openings))t(i,["x","y"]);for(const i of _o(e.decor))"line"===i.kind?t(i,["x1","y1","x2","y2"]):mo(i.kind)?t(i,["x","y","w","h"]):"text"===i.kind&&t(i,["x","y"]);for(const t of _o(e.room_drafts))r(t.points);for(const t of _o(e.partitions))n(t.a),n(t.b);for(const t of _o(e.wall_columns))n(t.center);for(const t of _o(e.open_spans))n(t.a),n(t.b)}const r=po(t);if(!r)return;const o=new Map;if(n)for(const e of _o(n.spaces))null!=e.id&&o.set(String(e.id),e);for(const e of Object.values(r)){const t=po(e);if(!t)continue;const n=null!=t.s&&o.get(String(t.s))||null;for(const e of["x","y"]){const r=t[e];"number"==typeof r&&Number.isFinite(r)&&i(r,n)}}}function wo(e){const t=Number(e?.cell_cm);return t>0?t:5}function ko(e,t={}){const i={canonicalized:0,far:0,maxShift:0,maxShiftCm:0,spaces:[],bySpace:new Map},n=_o(po(e)?.spaces);let r=5;for(const e of n)r=Math.max(r,wo(e));bo(e,t,(e,t)=>{const n=e*so,o=Math.abs(n-Math.round(n)),s=ho(e),a=o>0&&o=ao))return;const l=a&&"number"==typeof s?Math.abs(s-e):0;if(a?i.canonicalized++:i.far++,i.maxShift=Math.max(i.maxShift,l),i.maxShiftCm=Math.max(i.maxShiftCm,l*so*(t?wo(t):r)),!t?.id||!a)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*so*wo(t))}),i.bySpace.size&&bo(e,t,(e,t)=>{if(!t?.id)return;const n=i.bySpace.get(String(t.id));if(!n)return;const r=e*so;Math.abs(r-Math.round(r))>=ao&&n.far++}),i.spaces=[...i.bySpace.values()];const{bySpace:o,...s}=i;return s}function xo(e){return function(e){const t=e,i=po(t);i&&fo(i,["x","y"]);return t}(lo(e))}function So(e){const t=e,i=po(t);if(!i)return t;for(const e of Object.values(i)){const t=po(e);t&&fo(t,["x","y"])}return t}function $o(e){return Mo(lo(e))}function Mo(e){const t=e,i=po(t);if(!i)return t;for(const e of _o(i.spaces)){go(e,["plan_x","plan_y","plan_scale","plan_scale_x","plan_scale_y","plan_angle"]);for(const t of _o(e.rooms))fo(t,["x","y","w","h"]),yo(t.poly);for(const t of _o(e.walls))vo(t.a),vo(t.b);for(const t of _o(e.wall_segments))vo(t.a),vo(t.b);for(const t of _o(e.openings)){fo(t,["x","y"]),go(t,["angle","length"]);const e=po(t.host);e&&go(e,["t"])}for(const t of _o(e.decor))"line"===t.kind?fo(t,["x1","y1","x2","y2"]):mo(t.kind)?(fo(t,["x","y","w","h"]),go(t,["angle"])):"text"===t.kind&&(fo(t,["x","y"]),go(t,["scale","angle"]));for(const t of _o(e.room_drafts))yo(t.points);for(const t of _o(e.partitions))vo(t.a),vo(t.b);for(const t of _o(e.wall_columns))vo(t.center),"square"===t.shape&&go(t,["angle"]);for(const t of _o(e.open_spans))vo(t.a),vo(t.b)}for(const e of _o(i.markers))go(e,["angle"]);return t}const Ro=15,Co=8;function To(e,t,i,n,r){const o=i[0]-e[0],s=i[1]-e[1],a=Math.hypot(o,s);if(!(a>0)||a<=r+1e-9)return null;const l=o/a,c=s/a,h=t=>{const n=(t[0]-e[0])*l+(t[1]-e[1])*c,o=(r-n)/(a-n);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),u=h(n);return d&&u?[[e[0],e[1]],t,d,u,n]:null}const Do=Math.sin(.25*Math.PI/180);function Ao(e,t){return Number.isFinite(e)&&e>0&&Number.isFinite(t)&&t>0&&e*t<3}function Po(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 Fo(e,t){return Number.isFinite(e)&&e>0&&Number.isFinite(t)&&t>0&&e*t<2}function zo(e){return Number.isFinite(e)?Math.max(1,Math.min(100,e)):1}function Io(e,t){return!Number.isFinite(e)||e<0?"":String(t?Math.round(e/2.54*100)/100:Math.round(100*e)/100)}function Oo(e,t,i){if(!Number.isFinite(e)||e<=0)return 0;const n=Number(t)>0?Number(t):5;return zo(e)/n*i}function Eo(e,t){return t>0&&Number.isFinite(e)?Math.round(e/t)*t:e}function No(e){return Math.max(1e-6*Math.abs(e),1e-9)}function Ho(e,t){if(!(t>0&&Number.isFinite(e)))return e;const i=Eo(e,t);return Math.abs(i-e)<=No(t)?i:e}function Lo(e,t){let i=t[0]-e[0],n=t[1]-e[1];const r=Math.hypot(i,n);return r<1e-12?[1,0]:(i/=r,n/=r,(i<-1e-12||Math.abs(i)<=1e-12&&n<0)&&(i=-i,n=-n),[i,n])}function Bo(e,t,i){const n=[Ho(e[0],i),Ho(e[1],i)],r=[Ho(t[0],i),Ho(t[1],i)],o=Eo((n[0]+r[0])/2,i),s=Eo((n[1]+r[1])/2,i),[a,l]=Lo(n,r);let c=Math.atan2(l,a);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)},${s.toFixed(d)}@${h.toFixed(4)}`}function qo(e,t,i,n){return 1===n?Bo(e,t,i):Bo([e[0]/n,e[1]/n],[t[0]/n,t[1]/n],i)}function jo(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 n=t>0?t:1;return[[i[0]*n,i[1]*n],[i[2]*n,i[3]*n]]}function Wo(e,t,i,n,r){const o=r>0?r:1;return{key:qo(e,t,n,o),cm:zo(i),a:[e[0]/o,e[1]/o],b:[t[0]/o,t[1]/o]}}function Uo(e,t){const i=t>0?t:1,n=[];for(const t of e){const e=t.key.lastIndexOf("@");if(e<0)continue;const[r,o]=t.key.slice(0,e).split(",").map(Number),s=Number(t.key.slice(e+1));[r,o,s].every(Number.isFinite)&&n.push({w:t,x:r*i,y:o*i,ang:s})}return n}function Go(e,t){const[i,n]=Lo(e,t);let r=Math.atan2(n,i);return r<0&&(r+=Math.PI),r}function Vo(e,t){let i=Math.abs(e-t);return i>Math.PI/2&&(i=Math.PI-i),i<.02}function Ko(e,t,i,n,r=1){if(!e?.length)return null;const o=qo(t,i,n,r),s=e.find(e=>e.key===o);if(s)return s;const a=r>0?r:1,l=No(n)*a,c=(e,t)=>Math.abs(e[0]-t[0])<=l&&Math.abs(e[1]-t[1])<=l;for(const n of e){const e=jo(n,a);if(e&&(c(e[0],t)&&c(e[1],i)||c(e[0],i)&&c(e[1],t)))return n}const h=(t[0]+i[0])/2,d=(t[1]+i[1])/2,u=Go(t,i),p=Math.max(.5*n,1e-9)*a;for(const t of Uo(e,a))if(Vo(t.ang,u)&&Math.hypot(t.x-h,t.y-d)<=p)return t.w;return null}function Yo(e,t,i,n,r=1){const o=Ko(e,t,i,n,r);if(o&&o.cm>0)return zo(o.cm);const s=function(e,t,i,n,r){if(!e?.length)return null;const o=r>0?r:1,s=Math.hypot(i[0]-t[0],i[1]-t[1]);if(s<1e-12)return null;const a=Go(t,i),l=Math.max(.5*n,1e-9)*o;let c=null;for(const n of e){if(!(n.cm>0))continue;const e=jo(n,o);if(!e)continue;const r=Math.hypot(e[1][0]-e[0][0],e[1][1]-e[0][1]);if(r<1e-12||!Vo(Go(e[0],e[1]),a))continue;if(Ns(t[0],t[1],e[0][0],e[0][1],e[1][0],e[1][1])>l||Ns(i[0],i[1],e[0][0],e[0][1],e[1][0],e[1][1])>l)continue;if(r+l(o.has(e.key)||(e=>{const t=jo(e,n);if(!t)return!1;const[i,o]=t,a=o[0]-i[0],c=o[1]-i[1],h=Math.hypot(a,c);if(h<=l)return!1;if(!s.some(e=>{const t=[e[0],e[1]],n=[e[2],e[3]];return Vo(Go(i,o),Go(t,n))&&Ns(i[0],i[1],t[0],t[1],n[0],n[1])<=l&&Ns(o[0],o[1],t[0],t[1],n[0],n[1])<=l}))return!1;const d=(r||[]).some(e=>{const t=[e[0],e[1]],n=[e[2],e[3]];if(!Vo(Go(i,o),Go(t,n)))return!1;const r=e=>Math.abs((e[0]-i[0])*c-(e[1]-i[1])*a)/h;if(r(t)>l||r(n)>l)return!1;const s=h*h,d=((t[0]-i[0])*a+(t[1]-i[1])*c)/s,u=((n[0]-i[0])*a+(n[1]-i[1])*c)/s;return Math.min(1,Math.max(d,u))-Math.max(0,Math.min(d,u))>l/h});return!d})(e))&&e.cm>=1&&e.cm<=100)}function Zo(e,t,i,n=8){const[r,o]=Lo(e,t);let s=Math.atan2(o,r);s<0&&(s+=Math.PI);let a=i*Math.PI/180%Math.PI;a<0&&(a+=Math.PI);let l=Math.abs(s-a);return l>Math.PI/2&&(l=Math.PI-l),l<=n*Math.PI/180}function Jo(e,t,i,n,r=1,o="affine",s){if(!e?.length)return[];if(t.length!==i.length)return"fixed-topology"===o&&s?.(),e.slice();const a=r>0?r:1,l=Math.max(.5*n,1e-9)*a,c=Math.max(n*a*1e-6,1e-9),h=[],d=new Map,u=new Map,p=(e,t,i)=>{const n=e.get(t)||new Set;n.add(i),e.set(t,n)};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],n=t.na[1]-t.oa[1],r=t.nb[0]-t.ob[0],o=t.nb[1]-t.ob[1];return Math.hypot(i-r,n-o)<=c?[e[0]+i,e[1]+n]: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,n]=Lo(e,t);return(t[0]-e[0])*i+(t[1]-e[1])*n>=0?[[...e],[...t]]:[[...t],[...e]]},v=[],y=[],b=(e,t,i)=>{if(Math.hypot(t[0]-e[0],t[1]-e[1])<=c)return;const[r,o]=f(e,t),s=zo(i);if(y.some(e=>e.entry.cm===s&&m(e.span[0],r)&&m(e.span[1],o)))return;const l=Wo(r,o,s,n,a);v.push(l),y.push({entry:l,span:[r,o]})};for(const t of e){const e=jo(t,a);if(e){const[i,n]=f(e[0],e[1]),r=n[0]-i[0],s=n[1]-i[1],a=r*r+s*s,d=Math.sqrt(a);if(d<=c){v.push({...t,cm:zo(t.cm)});continue}const u=[];for(const e of h){if(!Vo(Go(i,n),Go(e.oa,e.ob)))continue;const t=e=>Math.abs((e[0]-i[0])*s-(e[1]-i[1])*r)/d;if(t(e.oa)>l||t(e.ob)>l)continue;const o=((e.oa[0]-i[0])*r+(e.oa[1]-i[1])*s)/a,h=((e.ob[0]-i[0])*r+(e.ob[1]-i[1])*s)/a,p=Math.max(0,Math.min(o,h)),_=Math.min(1,Math.max(o,h));(_-p)*d>c&&u.push({lo:p,hi:_,move:e})}if(!u.length){"fixed-topology"===o?v.push({...t}):b(i,n,t.cm);continue}const p=[0,1,...u.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),y=[];for(let e=0;e+1a>=e.lo-1e-12&&a<=e.hi+1e-12);if(!l.length){y.push([o,s]);continue}const h=[g(o,l[0].move),g(s,l[0].move)],f=l.slice(1).some(e=>{const t=g(o,e.move),i=g(s,e.move);return!m(h[0],t)||!m(h[1],i)});y.push(f?[o,s]:h)}const w=(e,t)=>{const i=e[1][0]-e[0][0],n=e[1][1]-e[0][1],r=t[1][0]-t[0][0],o=t[1][1]-t[0][1],s=Math.hypot(i,n);return!(s<=c||i*r+n*o<=0)&&Math.abs(i*o-n*r)/s<=c},k=[];for(const e of y){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,n]=k[0];if(m(i,e[0])&&m(n,e[1])||m(i,e[1])&&m(n,e[0])){v.push({...t});continue}}for(const[e,i]of k)b(e,i,t.cm);continue}if("fixed-topology"===o){const e=u.get(t.key);if(1===e?.size){const i=[...e][0];v.push(i===t.key?{...t}:{...t,key:i});continue}const i=[Uo([t],a)[0]];1!==a&&i.push(Uo([t],1)[0]);const n=i.filter(Boolean).some(e=>h.some(t=>{if(!Vo(e.ang,Go(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&&Ns(e.x,e.y,t.oa[0],t.oa[1],t.ob[0],t.ob[1])<=l}));((e?.size||0)>1||n)&&s?.(),v.push({...t});continue}let i="";const r=d.get(t.key);if(1===r?.size&&(i=[...r][0]),!i){const e=Uo([t],a)[0];if(e){const t=new Set;for(const i of h){if(!Vo(e.ang,Go(i.oa,i.ob)))continue;const r=((e.x-i.oa[0])*i.dx+(e.y-i.oa[1])*i.dy)/i.len2;if(r<-1e-6||r>1.000001)continue;if(Ns(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),[s,c]=Lo(i.na,i.nb),h=Math.max(n*a,1e-6);t.add(qo([o[0]-s*h,o[1]-c*h],[o[0]+s*h,o[1]+c*h],n,a))}1===t.size&&(i=[...t][0])}}v.push({...t,key:i||t.key,cm:zo(t.cm)})}return v}function Qo(e,t,i,n,r=1,o="affine"){return Jo(e,t,i,n,r,o)}function es(e,t,i,n,r=1,o="fixed-topology"){let s=!1;const a=Jo(e,t,i,n,r,o,()=>{s=!0});return{walls:s?(e||[]).map(e=>({...e})):a,rejected:s}}function ts(e,t,i,n=1,r=[]){const o=n>0?n:1,s=Math.abs(i),a=Math.max(s*o*ao,1e-9),l=(r||[]).flatMap(e=>{const t=jo(e,o);return t?t.map(e=>[...e]):[]}),c=e=>e.every((e,t)=>(e=>{if(!(s>0))return!0;const t=e/o/s;return Math.abs(t-Math.round(t))Math.abs(e-i[t])<=a)),h=[],d=e=>JSON.stringify([e.key,e.cm,e.a,e.b]);for(const i of e||[]){const e=jo(i,o);if(!e)continue;const[n,r]=e;if(![n[0],n[1],r[0],r[1]].every(Number.isFinite)||!c(n)||!c(r)){h.push(d(i));continue}const s=r[0]-n[0],l=r[1]-n[1],u=Math.hypot(s,l);if(u<=a){h.push(d(i));continue}const p=s/u,_=l/u,m=[];for(const e of t){const[t,i]=e;if(![t?.[0],t?.[1],i?.[0],i?.[1]].every(Number.isFinite))continue;const r=e=>Math.abs((e[0]-n[0])*_-(e[1]-n[1])*p);if(r(t)>a||r(i)>a)continue;const o=(t[0]-n[0])*p+(t[1]-n[1])*_,s=(i[0]-n[0])*p+(i[1]-n[1])*_,l=Math.max(0,Math.min(o,s)),c=Math.min(u,Math.max(o,s));c-l>a&&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+a)break;if(g=Math.max(g,t),g>=u-a)break}ge.key!==s);return null==n||n<1?a:[...a,Wo(t,i,n,r,o)]}function ns(e,t,i,n,r,o=[],s=1){let a=e?e.slice():[];for(const e of function(e,t,i,n,r=1,o=[]){const s=Ss(e,t,i,n,r,o);if(!s)return[];const a=[];for(let e=0;e0||(c=is(c,t,i,n,r,s)))}return c}function os(e){const{a:t,b:i,halfDepth:n}=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 r=i[0]-t[0],o=i[1]-t[1],s=Math.hypot(r,o);if(!(s>1e-9&&n>0&&Number.isFinite(n)))return null;const a=-o/s*n,l=r/s*n;return[[t[0]+a,t[1]+l],[i[0]+a,i[1]+l],[i[0]-a,i[1]-l],[t[0]-a,t[1]-l]]}function ss(e,t,i){return Math.hypot(e[0]-t[0],e[1]-t[1])<=i}function as(e,t,i){const n=t.b[0]-t.a[0],r=t.b[1]-t.a[1],o=n*n+r*r;if(!(o>i*i))return!1;const s=((e[0]-t.a[0])*n+(e[1]-t.a[1])*r)/o;if(!(s>0&&s<1))return!1;const a=[t.a[0]+n*s,t.a[1]+r*s];return Math.hypot(e[0]-a[0],e[1]-a[1])<=i}function ls(e,t,i,n){const r=Math.hypot(t,i);if(!(r>1e-9&&n>0))return;const o=[t/r,i/r],s=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);s?s.halfDepth=Math.max(s.halfDepth,n):e.push({u:o,halfDepth:n})}function cs(e,t){try{const i=Gt(Bs(e),Bs(t));let n=null,r=0;for(const e of i||[]){const t=e?.[0]||[],i=Math.abs(ms(t));t.length>=4&&i>r&&(r=i,n=t.slice(0,-1).map(e=>[e[0],e[1]]))}return n}catch{return null}}function hs(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 n=Math.max(Number.isFinite(t)?t:0,1e-9),r=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 r)o.some(t=>ss(t,e,n))||o.push(e);const s=[];for(const e of o){const t=[];let r=!1;for(const{segment:o,index:s}of i){const i=Math.hypot(o.b[0]-o.a[0],o.b[1]-o.a[1]);ss(e,o.a,n)?t.push({u:[(o.b[0]-o.a[0])/i,(o.b[1]-o.a[1])/i],halfDepth:o.halfDepth,length:i,index:s}):ss(e,o.b,n)?t.push({u:[(o.a[0]-o.b[0])/i,(o.a[1]-o.b[1])/i],halfDepth:o.halfDepth,length:i,index:s}):as(e,o,n)&&(r=!0)}if(r||2!==t.length)continue;const[o,a]=t,l=o.u[0]*a.u[1]-o.u[1]*a.u[0];if(Math.abs(l)<1e-9)continue;const c=l<0?1:-1,h=[-o.u[1],o.u[0]],d=[-a.u[1],a.u[0]],u=[e[0]+h[0]*o.halfDepth*c,e[1]+h[1]*o.halfDepth*c],p=[e[0]-d[0]*a.halfDepth*c,e[1]-d[1]*a.halfDepth*c];if(!vs(u,o.u,p,a.u))continue;const _=[[o,a,p,[d[0]*-c,d[1]*-c]],[a,o,u,[h[0]*c,h[1]*c]]];for(const[t,,i,r]of _){const o=Math.min(2*t.halfDepth,t.length),a=[-t.u[1]*t.halfDepth,t.u[0]*t.halfDepth],l=[[e[0]+a[0],e[1]+a[1]],[e[0]+t.u[0]*o+a[0],e[1]+t.u[1]*o+a[1]],[e[0]+t.u[0]*o-a[0],e[1]+t.u[1]*o-a[1]],[e[0]-a[0],e[1]-a[1]]],c=e=>(e[0]-i[0])*r[0]+(e[1]-i[1])*r[1],h=[];for(let e=0;e=-1e-12&&h.push(t),n>1e-12&&r<-1e-12||n<-1e-12&&r>1e-12){const e=n/(n-r);h.push([t[0]+(i[0]-t[0])*e,t[1]+(i[1]-t[1])*e])}}h.length>=3&&Math.abs(ms(h))>n*n&&s.push({segmentIndex:t.index,wedge:h})}}return s}function ds(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 n=Math.max(Number.isFinite(t)?t:0,1e-9),r=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 r)o.some(t=>ss(t,e,n))||o.push(e);const s=[],a=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=Ts(a,n);for(const e of Ds(l).fans)s.push(e);const c=e=>!!As(l,e);for(const e of o){if(c(e))continue;const t=[];for(const r of i)ss(e,r.a,n)?ls(t,r.b[0]-r.a[0],r.b[1]-r.a[1],r.halfDepth):ss(e,r.b,n)?ls(t,r.a[0]-r.b[0],r.a[1]-r.b[1],r.halfDepth):as(e,r,n)&&(ls(t,r.a[0]-e[0],r.a[1]-e[1],r.halfDepth),ls(t,r.b[0]-e[0],r.b[1]-e[1],r.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;in*n&&s.push(m)}}}return s}function us(e,t,i,n){if(!(t>0)||!e||e.length<2)return"";if(i&&e.length>=3){let i=e;const r=e[e.length-1];if(e.length>=4&&Math.hypot(e[0][0]-r[0],e[0][1]-r[1])<1e-9&&(i=e.slice(0,-1)),i.length>=3){const e=i.map((e,i)=>n?.[i]||t),r=aa(i,e),o=ws(i,e);if(r&&o)return`${ks(r)} ${ks(xs(o))}`}}const r=[];for(let i=0;i=1e-9&&a>0&&r.push({a:o,b:s,halfDepth:a})}const o=r.map(os);for(const{segmentIndex:e,wedge:t}of hs(r)){const i=o[e];if(!i)continue;const n=cs(i,t);n&&(o[e]=n)}const s=[...o.filter(e=>!!e),...ds(r)],a=function(e){let t=null;try{for(const i of e){if(i.length<3)continue;const e=Bs(i);t=t?Wt(t,e):[e]}return t}catch{return null}}(s);return a?Qs(a):s.map(e=>ks(e)).join(" ")}function ps(e,t,i,n,r=1){if(!i.length)return!1;const o=_s(n,r),s=(e[0]+t[0])/2,a=(e[1]+t[1])/2,[l,c]=Lo(e,t);for(const e of i){const[t,i]=Lo([e[0],e[1]],[e[2],e[3]]);if(!(Math.abs(l*i-c*t)>.05)&&Ns(s,a,e[0],e[1],e[2],e[3])<=o)return!0}return!1}function _s(e,t){return Math.max(e*(t>0?t:1)*.04,1e-9)}function ms(e){let t=0;for(let i=0;ie[1]!=l>e[1]&&e[0]<(a-o)*(e[1]-s)/(l-s+0)+o&&(i=!i)}return i}([c[0]+.001*a,c[1]+.001*l],e)||(a=-a,l=-l),[a,l]}function fs(e,t){const i=e[0]*t[1]-e[1]*t[0],n=e[0]*t[0]+e[1]*t[1];return Math.abs(i)<1e-9&&n>0}function vs(e,t,i,n){const r=t[0]*n[1]-t[1]*n[0];if(Math.abs(r)<1e-12)return null;const o=[i[0]-e[0],i[1]-e[1]],s=(o[0]*n[1]-o[1]*n[0])/r;return[e[0]+s*t[0],e[1]+s*t[1]]}function ys(e,t,i){const n=e?.length||0;if(n<3||!Array.isArray(i)||i.length!==n)return 0;const r=(Math.trunc(t)%n+n)%n,o=e[r],s=e[(r+1)%n],a=s[0]-o[0],l=s[1]-o[1],c=Math.hypot(a,l);if(!(c>0))return 0;const h=Math.max(0,Number(i[r])||0);if(!(h>0))return c;const d=[a/c,l/c],u=gs(e,r),p=[o[0]+u[0]*h,o[1]+u[1]*h],_=t=>{const r=Math.max(0,Number(i[t])||0);if(!(r>0))return null;const s=e[t],a=e[(t+1)%n],l=a[0]-s[0],c=a[1]-s[1],h=Math.hypot(l,c);if(!(h>0))return null;const u=gs(e,t),_=vs(p,d,[s[0]+u[0]*r,s[1]+u[1]*r],[l/h,c/h]);return _?(_[0]-o[0])*d[0]+(_[1]-o[1])*d[1]:null},m=_((r-1+n)%n)??0,g=(_((r+1)%n)??c)-m;return g>0?g:0}function bs(e,t,i,n,r,o,s,a=1){const l=(e||[]).find(e=>e?.id===t),c=ni(l);if(!c||c.length<3)return null;const h=Fs(e,t,i,n,r,o,s,a);if(!h)return c.map(()=>0);const d=4*_s(r,a);return c.map((e,t)=>{const i=c[(t+1)%c.length],n=[(e[0]+i[0])/2,(e[1]+i[1])/2];for(let e=0;e!(e>0)))return e.map(e=>[e[0],e[1]]);const r=[];for(let o=0;o0||u>0)){r.push([e[o][0],e[o][1]]);continue}if(d>0!=u>0){const t=e[o],i=d>0?[t[0]+p*d,t[1]+_*d]:[t[0],t[1]],n=u>0?[t[0]+m*u,t[1]+g*u]:[t[0],t[1]];r.push(i),Math.hypot(n[0]-i[0],n[1]-i[1])>1e-9&&r.push(n);continue}if(fs(w,k)){const t=e[o],i=[t[0]+p*d,t[1]+_*d],n=[t[0]+m*u,t[1]+g*u];r.push(i),Math.hypot(n[0]-i[0],n[1]-i[1])>1e-9&&r.push(n);continue}const $=vs(x,w,S,k),M=Math.max(d,u,1e-9),R=As(i,e[o])?.limit??4*M;if($){const i=Math.hypot($[0]-e[o][0],$[1]-e[o][1]);if(Number.isFinite(i)&&i<=R){r.push($);continue}if(ta(e,t,o)){r.push($);continue}}d>0&&r.push([e[o][0]+p*d,e[o][1]+_*d]),u>0&&r.push([e[o][0]+m*u,e[o][1]+g*u]),d>0||u>0||r.push([e[o][0],e[o][1]])}return r.length>=3?r:null}function ks(e,t=!0){if(!e.length)return"";let i=`M ${e[0][0]} ${e[0][1]}`;for(let t=1;te?.id===t),a=ni(s);if(!a||a.length<3)return null;const l=_s(n,r),c=[];for(const i of e||[]){if(!i||i.id===t)continue;const e=ni(i);if(e)for(const t of Fn(a,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=jo(e,r);t&&c.push(t[0],t[1])}const h=[],d=[];for(let e=0;el)continue;const s=((e[0]-t[0])*(i[0]-t[0])+(e[1]-t[1])*(i[1]-t[1]))/(n*n);s<=r||s>=1-r||(o.some(e=>Math.abs(e-s)*n<=2*l)||o.push(s))}o.sort((e,t)=>e-t);for(const n of o)h.push([t[0]+(i[0]-t[0])*n,t[1]+(i[1]-t[1])*n]),d.push(e)}return{poly:h,parent:d,orig:a}}function $s(e,t,i,n){const r=t.poly.length,o=new Array(r).fill(0);if(!e?.length)return o;const s=new Set,a=[];for(let l=0;l0?(o[l]=zo(c.cm),s.add(c.key)):a.push(l)}if(!a.length)return o;const l=n>0?n:1,c=Math.max(.5*i,1e-9)*l,h=Uo(e,l).filter(e=>e.w.cm>0);for(let e=a.length-1;e>=0;e--){const i=a[e],n=t.poly[i],s=t.poly[(i+1)%r],d=Go(n,s);let u=null;for(const e of h){const t=jo(e.w,l);if(!t||!Vo(Go(t[0],t[1]),d))continue;if(Ns(n[0],n[1],t[0][0],t[0][1],t[1][0],t[1][1])>c||Ns(s[0],s[1],t[0][0],t[0][1],t[1][0],t[1][1])>c)continue;const i=Math.hypot(s[0]-n[0],s[1]-n[1]),r=Math.hypot(t[1][0]-t[0][0],t[1][1]-t[0][1]),o=Math.max(0,r-i);(!u||oc||Ns(r[0],r[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(Ns(e.x,e.y,n[0],n[1],r[0],r[1])>c)continue;o=Math.hypot(e.x-d,e.y-u)}(!p||i&&!p.exact||i===p.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])>n).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),s=new Map;for(const e of o){const t=s.get(e.key);t?e.half>t.half&&s.set(e.key,{...t,half:e.half}):s.set(e.key,e)}const a=[...s.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 a){const[t,i]=Ms(e.point,n),r=Rs(t,i),o=l.get(r)||[];o.push(e),l.set(r,o)}const c=[],h=new Map;for(const e of a){const t=Cs(h,e.point,n).filter(t=>Math.hypot(t.point[0]-e.point[0],t.point[1]-e.point[1])<=n).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,r]=Ms(i.point,n),o=Rs(t,r),s=h.get(o)||[];s.push(i),h.set(o,s)}const r=e.other[0]-e.point[0],o=e.other[1]-e.point[1],s=Math.hypot(r,o);if(!(s>n))continue;const a=[r/s,o/s];let l=Math.atan2(a[1],a[0]);l<0&&(l+=2*Math.PI),i.rays.push({u:a,halfDepth:e.halfDepth,length:s,angle:l})}const d=[],u=e=>{const t=1e-9*Math.max(1,r),i=e.filter(e=>Number.isFinite(e.halfDepth)&&e.halfDepth>0&&Number.isFinite(e.length)&&e.length>n);return i.filter((e,n)=>!i.some((i,r)=>r!==n&&i.halfDepth>=e.halfDepth-t&&i.length>=e.length-t&&(i.halfDepth>e.halfDepth+t||i.length>e.length+t||re.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 r=i.map(t=>{const i=u(t.supports),r=new Set,o=[];for(const s of i){const i=[e.point[0]+t.u[0]*s.length,e.point[1]+t.u[1]*s.length];for(const t of Cs(l,i,n)){if("shared"!==t.kind||Math.hypot(t.point[0]-i[0],t.point[1]-i[1])>n)continue;const s=t.other[0]-t.point[0],a=t.other[1]-t.point[1],l=Math.hypot(s,a);if(!(l>n))continue;const c=s/l,h=a/l;if(Math.hypot(t.other[0]-e.point[0],t.other[1]-e.point[1])<=n)continue;const d=`${t.key}|${t.point[0]}|${t.point[1]}|${t.other[0]}|${t.other[1]}|${t.halfDepth}`;r.has(d)||(r.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>n);if(r.length<3)continue;const o=Math.max(...r.map(e=>e.halfDepth));o>0&&Number.isFinite(o)&&d.push({point:[...e.point],rays:r,halfDepth:o,limit:1.25*o})}d.sort((e,t)=>e.point[0]-t.point[0]||e.point[1]-t.point[1]);const p=new Map;for(const e of d){const[t,i]=Ms(e.point,n),r=Rs(t,i),o=p.get(r)||[];o.push(e),p.set(r,o)}return{epsilon:n,coordinateScale:r,nodes:d,index:p}}function Ds(e){const t={fans:[],supports:[]};if(!e?.nodes?.length)return t;const i=Math.max(e.epsilon,1e-9)**2;for(const n of e.nodes){const e=n.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 r=n.point;for(const i of e)for(const e of i.supports){if(!(e.halfDepth>0&&e.length>0))continue;const n=-i.u[1]*e.halfDepth,o=i.u[0]*e.halfDepth,s=[r[0]+i.u[0]*e.length,r[1]+i.u[1]*e.length];t.supports.push([[r[0]+n,r[1]+o],[s[0]+n,s[1]+o],[s[0]-n,s[1]-o],[r[0]-n,r[1]-o]])}for(let n=0;n{const e=s.angle-o.angle;return e>0?e:e+2*Math.PI})();if(a<1e-9)continue;const l=a>Math.PI+1e-9,c=4*Math.max(o.halfDepth,s.halfDepth),h=[r[0]-o.u[1]*o.halfDepth,r[1]+o.u[0]*o.halfDepth],d=[r[0]+s.u[1]*s.halfDepth,r[1]-s.u[0]*s.halfDepth],u=o.u[0]*s.u[1]-o.u[1]*s.u[0],p=e=>{let t=Math.atan2(e[1]-r[1],e[0]-r[0])-o.angle;for(;t<0;)t+=2*Math.PI;return t<=a+1e-9};let _=null;if(Math.abs(u)>1e-9){const e=((d[0]-h[0])*s.u[1]-(d[1]-h[1])*s.u[0])/u,t=((d[0]-h[0])*o.u[1]-(d[1]-h[1])*o.u[0])/u,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<=s.thickLength)&&Math.hypot(i[0]-r[0],i[1]-r[1])<=c&&p(i)&&(_=i)}const m=e=>{Math.abs(ms(e))>i&&t.fans.push(e)};if(_){const e=1.5*Math.max(o.halfDepth,s.halfDepth);m(To([r[0],r[1]],h,_,d,e)??[[r[0],r[1]],h,_,d]);continue}if(l){m([[r[0],r[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,s.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]+s.u[0]*g(s.halfDepth,s.thickLength),d[1]+s.u[1]*g(s.halfDepth,s.thickLength)];m([[r[0],r[1]],h,f,v,d])}}return t}function As(e,t){return!e||!Array.isArray(t)||t.length<2||!t.slice(0,2).every(Number.isFinite)?null:Cs(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 Ps(e,t,i,n,r,o,s){return Ts(zs(e,t,i,n,r,o,s),4*_s(n,s),s)}function Fs(e,t,i,n,r,o,s,a=1){const l=Ss(e,t,n,r,a,i);if(!l)return null;const c=function(e,t,i){const n=(e||[]).find(e=>e?.id===t),r=ni(n);if(!r)return[];const o=[];for(const n of e||[]){if(!n||n.id===t)continue;const e=ni(n);if(e)for(const t of Fn(r,e,i))o.push(t)}return o}(e,t,_s(r,a)),h=function(e,t,i,n,r){const o=_s(n,r),s=[];for(let a=0;aNs(h,d,e[0],e[1],e[2],e[3])<=o);s.push(u?"shared":"outer")}return s}(l.poly,c,n,r,a),d=$s(i,l,r,a),u=d.map((e,t)=>h[t]&&e>0?Oo(e,o,s)/2:0);return{...l,kinds:h,cms:d,offsets:u}}function zs(e,t,i,n,r,o,s=1){const a=[];for(const l of e||[]){if(!l?.id)continue;const c=Fs(e,l.id,t,i,n,r,o,s);if(c)for(let e=0;e0&&(a=is(a,e.a,e.b,e.cm,n,s));return a}function Os(e,t,i,n,r,o,s=1){if(!t?.length)return[];const a=zs(e,t,i,n,r,o,s),l=new Map;for(const e of a){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 a)!e.open&&e.cm>0&&!d.has(e.key)&&(d.add(e.key),h.push({...e,ownerSignature:c(e.key)}));const u=[];for(const a of e||[]){if(!a?.id)continue;const l=Fs(e,a.id,t,i,n,r,o,s);if(l)for(let e=0;e0)||null===l.kinds[i]){e++;continue}const o=c(qo(l.poly[i],l.poly[(i+1)%l.poly.length],n,s));let a=e;for(;a+10&&u.push({a:[d[0],d[1]],b:[p[0],p[1]],key:qo(d,p,n,s),cm:r,len:_,ownerSignature:o}),e=a+1}}}u.sort((e,t)=>t.len-e.len||e.key.localeCompare(t.key));const p=[],_=new Set,m=new Set,g=4*_s(n,s);for(const e of u){const t=h.filter(t=>!m.has(t.key)&&t.cm===e.cm&&t.ownerSignature===e.ownerSignature&&Vo(Go(t.a,t.b),Go(e.a,e.b))&&Ns(t.a[0],t.a[1],e.a[0],e.a[1],e.b[0],e.b[1])<=g&&Ns(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),p.push(Wo(e.a,e.b,e.cm,n,s)))}}for(const e of h)m.has(e.key)||_.has(e.key)||(_.add(e.key),p.push(Wo(e.a,e.b,e.cm,n,s)));return p}function Es(e,t,i,n,r,o,s,a=1){const l=_s(r,a),c=(n[0]+n[2])/2,h=(n[1]+n[3])/2,d=Go([n[0],n[1]],[n[2],n[3]]);let u=null;for(const n of zs(e,t,i,r,o,s,a)){if(!Vo(Go(n.a,n.b),d))continue;const e=Ns(c,h,n.a[0],n.a[1],n.b[0],n.b[1]);e>4*l||(!u||e[e[0],e[1]]),o=Math.abs(ms(r));r.length>=3&&o>i&&(t=r,i=o)}return t}function Ls(e,t,i,n,r,o,s,a=1,l,c){const h=(e||[]).find(e=>e?.id===t),d=ni(h);if(!d||d.length<3)return null;if(!i?.length)return d.map(e=>[e[0],e[1]]);const u=Fs(e,t,i,n,r,o,s,a);if(!u||!u.offsets.some(e=>e>0))return d.map(e=>[e[0],e[1]]);const p=c||Ps(e,i,n,r,o,s,a),_=ws(u.poly,u.offsets,p);if(!_)return d.map(e=>[e[0],e[1]]);if(!p.nodes.length)return _;const m=void 0===l?ia(e,i,n,[],r,o,s,a):null,g=l??("ok"===m?.status||"degraded-extra"===m?.status?m.roomGeom:void 0);if(g)try{const e=Hs(Gt(Bs(u.poly),g));if(e)return e}catch{}return function(e,t){try{return Hs(Ut(Bs(e),Bs(t)))}catch{return null}}(_,u.poly)||d.map(e=>[e[0],e[1]])}function Bs(e){const t=e.map(e=>[e[0],e[1]]);return t.push([e[0][0],e[0][1]]),[t]}function qs(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(Ci(e[0]))>1e-9)}function js(e,t,i,n){const r=n?new Set(n):null;let o=null;for(let n=0;nt.epsilon))continue;const l=Ks([[e.point[0]+a[0]*n.halfDepth,e.point[1]+a[1]*n.halfDepth],[e.point[0]+s.u[0]*r+a[0]*n.halfDepth,e.point[1]+s.u[1]*r+a[1]*n.halfDepth],[e.point[0]+s.u[0]*r-a[0]*n.halfDepth,e.point[1]+s.u[1]*r-a[1]*n.halfDepth],[e.point[0]-a[0]*n.halfDepth,e.point[1]-a[1]*n.halfDepth]],t.coordinateScale);if(!l)continue;const c=Bs(l);o=o?Wt(o,c):c}}return o}function Ws(e,t,i){let n=null;for(const r of e.rays)for(const e of r.continuations){const r=[-e.u[1],e.u[0]],o=[e.start[0]+e.u[0]*e.length,e.start[1]+e.u[1]*e.length],s=Ks([[e.start[0]+r[0]*e.halfDepth,e.start[1]+r[1]*e.halfDepth],[o[0]+r[0]*e.halfDepth,o[1]+r[1]*e.halfDepth],[o[0]-r[0]*e.halfDepth,o[1]-r[1]*e.halfDepth],[e.start[0]-r[0]*e.halfDepth,e.start[1]-r[1]*e.halfDepth]],t.coordinateScale);if(!s)continue;const a=Ut(Bs(s),i);Array.isArray(a)&&0!==a.length&&(n=n?Wt(n,a):a)}return n}function Us(e,t,i=2*(4*e.halfDepth+2*t.epsilon)){const n=function(e,t=Do){const i=new Set,n=Number.isFinite(t)&&t>=0?t:Do;for(let t=0;te-t)}(e);return n.length?js(e,t,i,n):null}function Gs(e,t,i,n,r){const o=function(e){let t=null;for(const i of e){const e=Bs(i);try{t=t?Wt(t,e):e}catch{}}return t}(function(e,t,i=!1){if(!e)return[];const n=[];for(const r of e.nodes)for(let o=0;o1e-9)||h>=Math.PI-1e-9)continue;const d=[-s.u[1],s.u[0]],u=[-a.u[1],a.u[0]],p=[r.point[0]+d[0]*s.halfDepth,r.point[1]+d[1]*s.halfDepth],_=[r.point[0]-u[0]*a.halfDepth,r.point[1]-u[1]*a.halfDepth],m=vs(p,s.u,_,a.u);if(!m)continue;const g=Math.hypot(m[0]-r.point[0],m[1]-r.point[1]);if(!Number.isFinite(g)||g<=r.limit)continue;const f=t?Math.sqrt(Math.max(0,r.limit*r.limit-s.halfDepth*s.halfDepth)):0,v=t?Math.sqrt(Math.max(0,r.limit*r.limit-a.halfDepth*a.halfDepth)):0,y=Ks([[p[0]+s.u[0]*f,p[1]+s.u[1]*f],[_[0]+a.u[0]*v,_[1]+a.u[1]*v],m],e.coordinateScale);if(y&&n.push(y),i){const t=m[0]-r.point[0],i=m[1]-r.point[1],o=Math.hypot(t,i),s=g-r.limit;if(o>e.epsilon&&s>e.epsilon){const a=Math.min(Math.max(8*e.epsilon,.05*r.halfDepth),.25*s),l=t/o,c=i/o,h=-c,d=l,u=Ks([[m[0]-l*a+h*a,m[1]-c*a+d*a],[m[0]-l*a-h*a,m[1]-c*a-d*a],[m[0]+l*a,m[1]+c*a]],e.coordinateScale);u&&n.push(u)}}}return n}({...t,nodes:[e]},i,n));return o&&r?Gt(o,r):o}function Vs(e,t,i,n){if(!e||!t.nodes.length)return e;let r=null;try{r=function(e){let t=null;for(const i of e.nodes){const n=Us(i,e);n&&(t=t?Wt(t,n):n)}return t}(t)}catch{return e}let o=e;for(const e of t.nodes){const s=4*e.halfDepth+2*t.epsilon,a=2*s,l=[[e.point[0]-s,e.point[1]-s],[e.point[0]+s,e.point[1]-s],[e.point[0]+s,e.point[1]+s],[e.point[0]-s,e.point[1]+s]];try{let s=o;const c=Gs(e,t,!1,!0,r);c&&(s=Gt(s,c));let h=js(e,t,a);const d=Gs(e,t,!0,!0,r);d&&(h=Gt(h,d)),r&&(h=Wt(h,r));const u=.02*Math.min(...e.rays.map(e=>e.halfDepth));if(h=Wt(h,Bs([[e.point[0]-u,e.point[1]-u],[e.point[0]+u,e.point[1]-u],[e.point[0]+u,e.point[1]+u],[e.point[0]-u,e.point[1]+u]])),!h)continue;let p=Ut(h,Bs(l));n?p=Ut(p,n):i&&(p=Ut(p,i));const _=Bs(l),m=Gt(s,_),g=i?Gt(Ut(s,_),i):null,f=Ws(e,t,_);o=Wt(m,...g?[g]:[],...f?[f]:[],p)}catch{}}if(r)try{let e=r;n?e=Ut(e,n):i&&(e=Ut(e,i)),o=Wt(o,e)}catch{}return o}function Ks(e,t=1){if(!Array.isArray(e)||e.length<3)return null;const i=Number.isFinite(t)&&t>0?t:1,n=1e-12*Math.max(1,i),r=[];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/n)*n,s=Math.round(i/n)*n;if(!Number.isFinite(o)||!Number.isFinite(s))return null;r.push([Object.is(o,-0)?0:o,Object.is(s,-0)?0:s])}return Math.abs(ms(r))>n*n?r:null}function Ys(e,t,i,n){if(Ns(e[0],e[1],t[0],t[1],i[0],i[1])>n)return!1;const r=i[0]-t[0],o=i[1]-t[1],s=(e[0]-t[0])*r+(e[1]-t[1])*o,a=r*r+o*o,l=n*Math.sqrt(a);return s>=-l&&s<=a+l}function Xs(e,t,i){const n=[],r=[];for(let o=0;oi*i))continue;const d=i/Math.sqrt(h),u=[0,1];for(const e of t)for(const t of[e.a,e.b]){if(!Ys(t,s,a,i))continue;const e=((t[0]-s[0])*l+(t[1]-s[1])*c)/h;e>d&&e<1-d&&u.push(e)}u.sort((e,t)=>e-t);const p=u.filter((e,t)=>0===t||Math.abs(e-u[t-1])>d);for(let e=0;e=3&&r.length===n.length?{poly:n,offsets:r}:null}function Zs(e,t,i,n,r,o,s,a){const l=(e||[]).map(ni).filter(e=>!!e&&e.length>=3);if(!l.length)return null;let c=Wt(Bs(l[0]));for(let e=1;e"outer"===e.kind&&e.half>0),u=4*_s(n,s),p=a||Ts(h,u,s);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=Xs(e,d,u);if(!t||!t.offsets.some(e=>e>0))continue;const i=aa(t.poly,t.offsets,p),n=ws(t.poly,t.offsets,p);if(!i||!n)continue;const r=Gt(Bs(i),Bs(n));_=_?Wt(_,r):r}return{centre:c,shell:_||[]}}function Js(e,t,i,n,r,o,s=1){try{const a=Zs(e,t,i,n,r,o,s,Ps(e,t,i,n,r,o,s));if(!a)return[];return a.shell?.length?Wt(a.centre,a.shell):a.centre}catch{return null}}function Qs(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?" ":"")+ks(i.map(e=>[e[0],e[1]])))}return t}const ea=15;function ta(e,t,i){const n=e?.length||0;if(n<3||t?.length!==n)return!1;const r=e[(i-1+n)%n],o=e[i],s=e[(i+1)%n],a=[r[0]-o[0],r[1]-o[1]],l=[s[0]-o[0],s[1]-o[1]],c=Math.hypot(a[0],a[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,(a[0]*l[0]+a[1]*l[1])/(c*h))),u=Math.acos(d);if(!(u>1e-9))return!1;if(u>=ea*Math.PI/180)return!1;const p=Math.max(0,t[(i-1+n)%n]),_=Math.max(0,t[i]);if(!(p>0||_>0))return!1;const m=Math.sin(u);if(!(m>1e-12))return!1;const g=(_+p*d)/m,f=(p+_*d)/m;return Number.isFinite(g)&&Number.isFinite(f)&&g>0&&f>0&&ge>0))continue;for(const e of l.offsets)e>0&&(u=Math.max(u,2*e));const c=aa(l.poly,l.offsets,d),p=ws(l.poly,l.offsets,d);c&&h.push({outset:c,inset:p})}for(const e of l){const t=e.map(e=>e[0]),i=e.map(e=>e[1]);if(t.length){const n=Math.min(Math.max(...t)-Math.min(...t),Math.max(...i)-Math.min(...i)),r=Math.min(...e.map((t,i)=>{const n=e[(i+1)%e.length];return Math.hypot(n[0]-t[0],n[1]-t[1])}));u=Math.max(u,e.length>16?n:r)}}const p=function(e,t,i,n,r,o,s,a){if(!t?.length||!i?.length)return[];const l=4*_s(n,s),c=new Map;for(const a of zs(e,t,i,n,r,o,s))!a.open&&a.half>0&&!c.has(a.key)&&c.set(a.key,a);const h=[...c.values()];if(h.length<2)return[];const d=a||Ts(h,l),u=[];for(const e of i)for(const t of[[e[0],e[1]],[e[2],e[3]]])u.some(e=>Math.hypot(e[0]-t[0],e[1]-t[1])<=l)||u.push(t);const p=[],_=(e,t)=>{let i=0,n=0;if(Math.hypot(e.a[0]-t[0],e.a[1]-t[1])<=l)i=e.b[0]-e.a[0],n=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],n=e.a[1]-e.b[1]}const r=Math.hypot(i,n);return r>l?[i/r,n/r]:null};for(const e of u){const t=h.map(t=>({iv:t,u:_(t,e)})).filter(e=>!!e.u);for(let i=0;i0?[e.slice(),u,m,_]:[e.slice(),_,m,u];else{if(!f)continue;{const t=[-r.u[1],r.u[0]],i=[-o.u[1],o.u[0]],n=s<0?1:-1,a=[e[0]+t[0]*r.iv.half*n,e[1]+t[1]*r.iv.half*n],l=[e[0]-i[0]*o.iv.half*n,e[1]-i[1]*o.iv.half*n];y=s>0?[e.slice(),a,l]:[e.slice(),l,a]}}Math.abs(ms(y))>l*l&&p.push(y)}}return p}(e,t,i,r,o,s,a,d),_=n.length?la(e,t,i,r,o,s,a):null;let m="exterior";try{const v=Zs(e,t,i,r,o,s,a,d);m="paper";const y=v?v.shell?.length?Wt(v.centre,v.shell):v.centre:[],b=e=>{const t=Bs(e.outset);if(!e.inset)return t;const i=Bs(e.inset);return Gt(t,i)};m="room-rings";let w=null;for(const e of h)try{const t=b(e);w=w?Wt(w,t):t}catch{}if(m="edge-bodies",v)for(const n of oa(e,t,i,r,o,s,a))try{const e=Ut(Bs(n.quad),v.centre);w=w?Wt(w,e):e}catch{}m="junctions",w=function(e,t,i=1,n=Wt){let r=e;for(const e of t||[]){const t=Ks(e,i);if(t)try{const e=Bs(t);r=r?n(r,e):e}catch{}}return r}(w,p,a),m="facade-clip",w&&v&&(w=Ut(w,v.centre)),m="exterior-shell";const k=[];let x=0;if(v?.shell?.length)if(w)try{const e=Wt(w,v.shell);if(!qs(e))throw new Error("invalid shell union");w=e}catch{if(!qs(w)||!qs(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=Vs(w,{...d,nodes:t},v?.centre,y)}}if(m="junction-corners",d.nodes.length){const n=Ds(d),l=function(e,t,i,n,r,o,s,a){try{const l=Zs(e,t,i,n,r,o,s,{epsilon:a.epsilon,coordinateScale:a.coordinateScale,nodes:[],index:new Map});return l?l.shell?.length?Wt(l.centre,l.shell):l.centre:null}catch{return null}}(e,t,i,r,o,s,a,d);for(const e of n.fans)try{let t=[Bs(e)];if(l&&(t=Ut(t,l)),!t?.length)continue;w=w?Wt(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(ms(t||[]))<=f?null:[t,...i.filter(e=>Math.abs(ms(e||[]))>f)]}).filter(e=>!!e):g}const S=w||[],$=[...qs(S)?[{id:"room-primary",geom:S}]:[],...k.map((e,t)=>({id:`room-isolated-${t}`,geom:e.geom}))];m="openings";for(const e of n){if(!(e.length>0))continue;const t=da(_,e,!0);if(!t.negative&&!t.positive)continue;const i=e.angle*Math.PI/180,n=Math.cos(i),o=Math.sin(i),s=-o,l=n,c=e.length/2,h=1.25*Math.max(u,r*a),d=[[e.x-n*c-s*h,e.y-o*c-l*h],[e.x+n*c-s*h,e.y+o*c-l*h],[e.x+n*c+s*h,e.y+o*c+l*h],[e.x-n*c+s*h,e.y-o*c+l*h]];w&&(w=Gt(w,Bs(d)));for(const e of k)e.geom=Gt(e.geom,Bs(d))}m="extras";const M=[];let R=0;const C=c.mergeExtra||((e,t)=>e?Wt(e,t):t);for(let e=0;ee.length>=2&&Number.isFinite(e[0])&&Number.isFinite(e[1]))||Math.abs(Ci(t))<=1e-9){R++;continue}const i=[Bs(t)];try{const t=C(w,i,e);if(!qs(t))throw new Error("invalid extra union");w=t}catch{R++,qs(i)&&M.push({id:`extra-${e}`,geom:i})}}M.push(...k),M.sort((e,t)=>Qs(e.geom).localeCompare(Qs(t.geom)));const T=w||[];return{status:R||x?"degraded-extra":"ok",geom:T,components:[...qs(T)?[{id:"primary",geom:T}]:[],...M.map((e,t)=>({...e,id:`isolated-${t}`}))],roomGeom:S,roomComponents:$,paperGeom:y,depthUnits:u,openingPadUnits:1.25*Math.max(u,r*a),openingIndex:_,multiWallNodes:d,degradedExtraCount:R+x}}catch{return c.onCoreFailure?.(m),{status:"failed-core",geom:[],components:[],roomGeom:[],paperGeom:[],roomComponents:[],depthUnits:u,openingIndex:null,multiWallNodes:d,degradedExtraCount:0}}var g,f}function na(e,t,i,n=[],r,o,s,a=1,l=[],c={}){if(!t?.length&&!l.length)return null;return ra(ia(e,t,i,n,r,o,s,a,l,c))}function ra(e){if("failed-core"===e.status||"not-applicable"===e.status)return null;const t=e.components.map(e=>({id:e.id,d:Qs(e.geom),fillRule:"evenodd"})).filter(e=>!!e.d),i=t[0]?.d||"",n=Qs(e.paperGeom);if(t.length){const r={status:e.status,d:i,paths:t,components:e.components,roomGeom:e.roomGeom,multiWallNodes:e.multiWallNodes,paperD:n,depthUnits:e.depthUnits,fillRule:"evenodd"};return Object.defineProperties(r,{roomComponents:{value:e.roomComponents||[],enumerable:!1},openingIndex:{value:e.openingIndex,enumerable:!1},openingPadUnits:{value:e.openingPadUnits,enumerable:!1}}),r}return null}function oa(e,t,i,n,r,o,s=1){if(!t?.length)return[];const a=new Set,l=[];for(const c of e||[]){if(!c?.id)continue;const h=Fs(e,c.id,t,i,n,r,o,s);if(!h)continue;const d=h.poly;for(let e=0;e0))continue;const p=qo(t,i,n,s);if(a.has(p))continue;a.add(p);const _=Oo(u,r,o),[m,g]=gs(d,e),f=-m,v=-g,y=_/2,b=[[t[0]+f*y,t[1]+v*y],[i[0]+f*y,i[1]+v*y],[i[0]+m*y,i[1]+g*y],[t[0]+m*y,t[1]+g*y]];l.push({key:p,kind:c,cm:u,quad:b,a:[t[0],t[1]],b:[i[0],i[1]],depthUnits:_})}}return l}function sa(e,t=[]){let i=ks(e.quad);const[n,r]=Lo(e.a,e.b),o=n,s=r,a=-s,l=o;for(const n of t){if(!Zo(e.a,e.b,n.angle))continue;if(Ns(n.x,n.y,e.a[0],e.a[1],e.b[0],e.b[1])>Math.max(.55*e.depthUnits,.001))continue;const t=n.length/2,r=e.depthUnits,c=n.x,h=n.y;i+=` ${ks(xs([[c-o*t-a*r,h-s*t-l*r],[c+o*t-a*r,h+s*t-l*r],[c+o*t+a*r,h+s*t+l*r],[c-o*t+a*r,h-s*t+l*r]]))}`}return i}function aa(e,t,i){const n=e?.length||0;if(n<3||t.length!==n)return null;if(t.every(e=>!(e>0)))return e.map(e=>[e[0],e[1]]);xs(e),t.slice().reverse();const r=[];for(let o=0;o0||l>0)){r.push([e[o][0],e[o][1]]);continue}if(a>0!=l>0){const t=e[o],i=a>0?[t[0]-c*a,t[1]-h*a]:[t[0],t[1]],n=l>0?[t[0]-d*l,t[1]-u*l]:[t[0],t[1]];r.push(i),Math.hypot(n[0]-i[0],n[1]-i[1])>1e-9&&r.push(n);continue}if(fs(w,k)){const t=e[o],i=[t[0]-c*a,t[1]-h*a],n=[t[0]-d*l,t[1]-u*l];r.push(i),Math.hypot(n[0]-i[0],n[1]-i[1])>1e-9&&r.push(n);continue}const $=vs(x,w,S,k),M=Math.max(a,l,1e-9),R=As(i,e[o])?.limit??4*M;if($){const i=Math.hypot($[0]-e[o][0],$[1]-e[o][1]);if(Number.isFinite(i)&&i<=R){r.push($);continue}if(ta(e,t,o)){r.push([e[o][0],e[o][1]]);continue}}a>0&&r.push([e[o][0]-c*a,e[o][1]-h*a]),l>0&&r.push([e[o][0]-d*l,e[o][1]-u*l])}return r.length>=3?r:null}function la(e,t,i,n,r,o,s=1){const a=[];for(const l of e||[]){if(!l?.id)continue;const c=Fs(e,l.id,t,i,n,r,o,s);if(!c)continue;const h=Math.abs(Ci(c.poly));for(let e=0;e[Math.max(t,e.x0),Math.min(i,e.x1)]).filter(e=>e[1]-e[0]>n).sort((e,t)=>e[0]-t[0]||e[1]-t[1]);if(!r.length)return{coverage:0,full:!1};let o=r[0][0],s=r[0][1],a=0,l=o<=t+n;for(let e=1;e=i-n,{coverage:a,full:l}}function ha(e,t){return Number(t.full)-Number(e.full)||e.faceDistance-t.faceDistance||e.area-t.area||e.roomId.localeCompare(t.roomId)}function da(e,t,i=!1){const n=Number(t?.x),r=Number(t?.y),o=Number(t?.angle),s=Number(t?.length);if(!([n,r,o,s].every(Number.isFinite)&&s>0))return{negative:null,positive:null};const a=o*Math.PI/180,l=Math.cos(a),c=Math.sin(a),h=-c,d=l,u=s/2,p=Math.max(1e-9,e.adjacencyEps),_=new Map;let m=0;for(const t of e.edges){if(i&&!(t.half>0))continue;if(!Zo(t.a,t.b,o))continue;const[e,s]=Lo(t.a,t.b);if(Math.abs((n-t.a[0])*s-(r-t.a[1])*e)>p)continue;const a=(t.a[0]-n)*l+(t.a[1]-r)*c,g=(t.b[0]-n)*l+(t.b[1]-r)*c,f=Math.max(-u,Math.min(a,g)),v=Math.min(u,Math.max(a,g));if(v-f<=p)continue;const y=t.inward[0]*h+t.inward[1]*d>=0?1:-1,b=((t.a[0]+t.b[0])/2-n)*h+((t.a[1]+t.b[1])/2-r)*d,w=Math.abs(b+y*t.half),k=`${y}|${t.roomId}`,x={x0:f,x1:v,half:t.half,cm:t.cm,key:t.key,axis:[e,s]},S=_.get(k);S?(S.pieces.push(x),S.faceDistance=Math.min(S.faceDistance,w)):_.set(k,{roomId:t.roomId,side:y,order:m++,pieces:[x],faceDistance:w,area:t.area,coverage:0,full:!1})}for(const e of _.values()){const t=ca(e.pieces,-u,u,p);e.coverage=t.coverage,e.full=t.full}const g=e=>{const t=[..._.values()].filter(t=>t.side===e&&t.coverage>p);return t.sort(ha),t[0]||null};return{negative:g(-1),positive:g(1)}}function ua(e,t,i,n,r,o,s=1,a=[]){return pa(la(e,i,a,n,r,o,s),t)}function pa(e,t){const i=da(e,t),n=[i.negative,i.positive].filter(e=>!!e);if(!n.length)return{ox:0,oy:0,cm:0,side:-1};const r=i.negative&&i.positive?-1:n[0].side,o=t.flip_v?-r:r,s=(-1===o?i.negative:i.positive)||n[0],a=[...s.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(!(a.half>0&&a.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*a.half,oy:h*o*a.half,cm:a.cm,side:o}}function _a(e,t){const i=1e-9,n=t.filter(e=>Number.isFinite(e.x0)&&Number.isFinite(e.x1)&&Number.isFinite(e.half)&&e.x1>e.x0&&e.half>0);if(!n.length)return"";const r=n.flatMap(e=>[e.x0,e.x1]).sort((e,t)=>e-t),o=[];for(const e of r){const t=o[o.length-1];(void 0===t||e>t+i)&&o.push(e)}const s=[];for(let e=0;e+1t+i))continue;const a=(t+r)/2,l=n.reduce((e,t)=>a>=t.x0-i&&a<=t.x1+i?Math.max(e,t.half):e,0);if(!(l>0))continue;const c=s[s.length-1];c&&t<=c.x1+i&&Math.abs(l-c.half)<=i?c.x1=r:s.push({x0:t,x1:r,half:l})}const a=[];for(const e of s){const t=a[a.length-1],n=t?.[t.length-1];n&&e.x0<=n.x1+i?(e.x0=n.x1,t.push(e)):a.push([e])}return a.map(t=>{const i=t[0],n=t[t.length-1],r=Math.min(.25*Math.min(...t.map(e=>e.half)),.75),o=-e*r,s=[];if(1===e){s.push(`M ${i.x0} ${o} L ${n.x1} ${o}`);for(let e=t.length-1;e>=0;e--){const i=t[e];s.push(`L ${i.x1} ${i.half} L ${i.x0} ${i.half}`)}}else{s.push(`M ${n.x1} ${o} L ${i.x0} ${o}`);for(const e of t)s.push(`L ${e.x0} ${-e.half} L ${e.x1} ${-e.half}`)}return s.push("Z"),s.join(" ")}).join(" ")}function ma(e,t,i,n){if(!n)return i;const r=e.angle*Math.PI/180,o=Math.cos(r),s=Math.sin(r),a=[],l=1e-9;for(const r of i){const[i,c]=r.axis,h=o*i+s*c;if(Math.abs(h)<=l)continue;const d=e.x*i+e.y*c,u=d+h*r.x0,p=d+h*r.x1,_=Math.min(u,p),m=Math.max(u,p),g=`${r.key}|${t}`,f=n.get(g)||[];let v=[[_,m]];for(const[e,t]of f){const i=[];for(const[n,r]of v)t<=n+l||e>=r-l?i.push([n,r]):(e>n+l&&i.push([n,Math.min(r,e)]),te[0]-t[0]||e[1]-t[1]),b=[];for(const e of y){const t=b[b.length-1];t&&e[0]<=t[1]+l?t[1]=Math.max(t[1],e[1]):b.push([e[0],e[1]])}n.set(g,b)}return a}function ga(e,t){const i=new Map;return t.map(t=>function(e,t,i){const n=da(e,t,!0),r=n.negative,o=n.positive;if(!r&&!o)return null;let s;if(r&&o)s=[{candidate:r,side:-1},{candidate:o,side:1}];else{const e=r||o;s=[{candidate:e,side:-1},{candidate:e,side:1}]}const a=s.map(({candidate:e,side:n})=>({candidate:e,side:n,pieces:ma(t,n,e.pieces,i)})),l=a.map(({candidate:e,side:t,pieces:i})=>({side:t,roomId:e.roomId,d:_a(t,i)})),c=a.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 fa=150,va=1e-6;function ya(e){return Number.isFinite(e)?Math.max(1,Math.min(fa,e)):1}function ba(e){return((Number.isFinite(Number(e))?Number(e):0)%90+90)%90}const wa=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]},ka=(e,t)=>e[0]===t[0]&&e[1]===t[1];function xa(e,t=1e-6){const i=Number.isFinite(t)&&t>0?t:va,n=[];for(const t of e||[]){if(!Array.isArray(t)||t.length<2)return null;const e=Number(t[0]),r=Number(t[1]);if(!Number.isFinite(e)||!Number.isFinite(r))return null;const o=Math.round(e/i)*i,s=Math.round(r/i)*i;if(!Number.isFinite(o)||!Number.isFinite(s))return null;const a=[Object.is(o,-0)?0:o,Object.is(s,-0)?0:s];n.length&&ka(n[n.length-1],a)||n.push(a)}return n.length>1&&ka(n[0],n[n.length-1])&&n.pop(),n.length<3||new Set(n.map(e=>`${e[0]},${e[1]}`)).size<3?null:Ci(n)>i*i?n:null}function Sa(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 $a(e,t,i,n,r){return os({a:e,b:t,halfDepth:Oo(i,n,r)/2})}function Ma(e,t,i){const n=Number(t)>0?Number(t):5,r=ya(e.cm)/n*i,o=e.center[0],s=e.center[1];if("circle"===e.shape){const e=r/2;return Array.from({length:96},(t,i)=>{const n=i/96*Math.PI*2;return[o+Math.cos(n)*e,s+Math.sin(n)*e]})}const a=r/2,l=ba(e.angle)*Math.PI/180,c=Math.cos(l),h=Math.sin(l);return[[-a,-a],[a,-a],[a,a],[-a,a]].map(([e,t])=>[o+e*c-t*h,s+e*h+t*c])}function Ra(e,t){const i=Number.isFinite(t)?Math.max(0,Math.min(1,t)):0,n=(e.a[0]+e.b[0])/2,r=(e.a[1]+e.b[1])/2,o=(e.b[0]-e.a[0])*i/2,s=(e.b[1]-e.a[1])*i/2;return{...e,a:[n-o,r-s],b:[n+o,r+s]}}function Ca(e,t,i=1e-9){if(!t.length)return[e];let n=[wa(e)];try{for(const e of t){const t=e.b[0]-e.a[0],r=e.b[1]-e.a[1],o=Math.hypot(t,r);if(!(o>i))continue;const s=t/o,a=r/o,l=-a,c=s,h=1.25*Math.max(Number(e.depth)||0,4*i),d=Math.max(2*i,1e-9*o),u=[[e.a[0]-s*d-l*h,e.a[1]-a*d-c*h],[e.b[0]+s*d-l*h,e.b[1]+a*d-c*h],[e.b[0]+s*d+l*h,e.b[1]+a*d+c*h],[e.a[0]-s*d+l*h,e.a[1]-a*d+c*h]];n=Gt(n,wa(u))}return Na(n)}catch{return[e]}}function Ta(e,t){try{const i=Gt([[...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 n=null,r=0;for(const e of i||[]){const t=e?.[0]||[],i=Math.abs(Ci(t));t.length>=4&&i>r&&(r=i,n=t.slice(0,-1).map(e=>[e[0],e[1]]))}return n}catch{return null}}function Da(e,t,i,n=Math.max(2e-4*i,1e-9),r=[]){const o=[],s=new Map;for(const e of r){const t=s.get(e.hostId)||[];t.push(e),s.set(e.hostId,t)}const a=[],l=[],c=[];for(const n of e.partitions||[]){const e={a:n.a,b:n.b,halfDepth:Oo(n.cm,t,i)/2};if(!(e.halfDepth>0))continue;const r=os(e);r&&(o.push(e),a.push(r),c.push({id:n.id,body:r}))}const h=o;for(const{segmentIndex:e,wedge:t}of hs(h,n)){const i={list:a,at:e},n=Ta(i.list[i.at],t);n&&(i.list[i.at]=n,c[i.at].body=n)}for(const e of c)l.push(...Ca(e.body,s.get(e.id)||[],n));const d=(e.wall_columns||[]).map(e=>Ma(e,t,i)),u=ds(o,n).flatMap(e=>Ca(e,r,n));return{partitions:a,columns:d,patches:u,all:[...l,...u,...d]}}function Aa(e){try{const t=e.map(e=>xa(e)).filter(e=>!!e).map(e=>wa(e));return t.length?Wt(t[0],...t.slice(1)):null}catch{return null}}const Pa=e=>`M ${e.map(e=>`${e[0]} ${e[1]}`).join(" L ")} Z`;function Fa(e){const t=[];for(const i of e||[]){if(Oa([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(Pa(i.slice(0,-1)))}e.length&&t.push(e.join(" "))}return t}function za(e,t,i={}){const n=Aa(e.filter(e=>e.length>=3)),r=t.some(e=>!xa(e))?null:Aa(t);if(!n)return[];if(r)try{return Fa(Ut(n,r))}catch{}return function(e,t,i){let n=null;for(let r=0;r=4&&t.push(e.slice(0,-1).map(e=>[e[0],e[1]]));return t}function Na(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 Ha(e,t){let i=!1;for(let n=0,r=t.length-1;ne[1]!=l>e[1]&&e[0]<(a-o)*(e[1]-s)/(l-s||1e-12)+o&&(i=!i)}return i}function La(e,t){for(const i of t||[]){const t=i?.[0];if(!t?.length||!Ha(e,t))continue;let n=!1;for(let t=1;ti)return!1;if(Math.abs(ya(e.cm)-ya(t.cm))>1e-6)return!1;if(e.shape!==t.shape)return!0;if("circle"===e.shape||"circle"===t.shape)return!0;const n=Math.abs(ba(e.angle)-ba(t.angle));return Math.min(n,90-n)<=1e-6}const qa=2.54;function ja(e){const t="number"==typeof e?e:NaN;return!Number.isFinite(t)||t<=0||5===t?1:5/t}function Wa(e,t){return e*ja(t)}function Ua(e){return e?qa:1}function Ga(e,t){if(!t)return String(e);const i=e/qa;return String(Math.round(1e6*i)/1e6)}function Va(e,t){return t?e*qa:e}const Ka=1e3;function Ya(e,t){const i=Number(e),n=Number.isFinite(i)&&i>0?i:1,r=n>=1?t:t*n,o=n>=1?t/n:t;return{x:(t-r)/2,y:(t-o)/2,w:r,h:o}}const Xa=.01,Za=100;function Ja(e,t=1e3){const i=Ya(e?.plan_aspect,t),n=Number(e?.plan_scale),r=Number.isFinite(n)&&n>0?Math.min(Za,Math.max(Xa,n)):1,o=Number(e?.plan_scale_x),s=Number(e?.plan_scale_y),a=Number.isFinite(o)&&o>0?Math.min(Za,Math.max(Xa,o)):r,l=Number.isFinite(s)&&s>0?Math.min(Za,Math.max(Xa,s)):r,c=Number(e?.plan_x),h=Number(e?.plan_y),d=Dr(e?.plan_angle);return{x:i.x+(Number.isFinite(c)?cl(c):0)*t,y:i.y+(Number.isFinite(h)?cl(h):0)*t,w:i.w*a,h:i.h*l,...d?{angle:d}:{}}}function Qa(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 el(e){return e&&Array.isArray(e.spaces)?e.spaces.map(e=>{const t=Ka,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]*Ka,i[1]*t,i[2]*Ka,i[3]*t],bg:e.plan_url?{href:Hn(e.plan_url),...Ja(e,Ka)}:null,rooms:(e.rooms||[]).map(e=>{const i={...e,...Qa(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*Ka:void 0,y:null!=i.y?i.y*t:void 0,w:null!=i.w?i.w*Ka:void 0,h:null!=i.h?i.h*t:void 0,poly:i.poly?i.poly.map(e=>[e[0]*Ka,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])*Ka,Number(e.a?.[1])*t],b:[Number(e.b?.[0])*Ka,Number(e.b?.[1])*t],cm:Number(e.cm)})),partitions:(e.partitions||[]).map(e=>({id:e.id,a:[e.a[0]*Ka,e.a[1]*t],b:[e.b[0]*Ka,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]*Ka,e.center[1]*t],cm:Number(e.cm),..."circle"===e.shape?{}:{angle:ba(e.angle)}}))}}):[]}const tl=5e3,il=tl*Ka,nl=240,rl=Ka/nl,ol=1/nl;function sl(e){if(!Number.isFinite(e))return e;const t=Math.round(e*nl/Ka)*Ka/nl;return Math.abs(t-e)<=1e-9*rl?e:t}function al(e){return{x:sl(e.x),y:sl(e.y)}}function ll(e){return Number.isFinite(e)?Math.min(il,Math.max(-il,e)):0}function cl(e){return Number.isFinite(e)?Math.min(tl,Math.max(-tl,e)):0}const hl=1/3,dl=200;function ul(e){return"house"===e?"house":"content"}function pl(e){let t=1/0,i=1/0,n=-1/0,r=-1/0;for(const o of e){const e=Number(o[0]),s=Number(o[1]);Number.isFinite(e)&&Number.isFinite(s)&&(en&&(n=e),s>r&&(r=s))}return t>n?null:{minX:t,minY:i,maxX:n,maxY:r}}function _l(e){const t=[],i=e=>{if(Array.isArray(e))if(e.length>=2&&Number.isFinite(Number(e[0]))&&Number.isFinite(Number(e[1])))t.push([Number(e[0]),Number(e[1])]);else for(const t of e)i(t)};return i(e),pl(t)}function ml(e,t){const i=Number.isFinite(t)&&t>0?t:0;return{minX:e.minX-i,minY:e.minY-i,maxX:e.maxX+i,maxY:e.maxY+i}}function gl(e){return e.poly&&e.poly.length?pl(e.poly):null==e.x||null==e.y?null:pl([[e.x,e.y],[e.x+(e.w||0),e.y+(e.h||0)]])}function fl(e,t=1e3,i=1e3){const n=Number(e.x)*t,r=Number(e.y)*i,o=Number(e.w)*t,s=Number(e.h)*i;return![n,r,o,s].every(Number.isFinite)||o<=0||s<=0?null:pl(Nr({x:n,y:r,w:o,h:s,angle:Dr(e.angle)||void 0}))}function vl(e,t){const i=[];for(const t of e.rooms||[]){const e=gl(t);e&&i.push(e)}if(e.bg){const t=pl(Nr(e.bg));t&&i.push(t)}for(const e of t||[])if(Array.isArray(e)){const t=pl([e]);t&&i.push(t)}else i.push(e);return i}const yl=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},bl=e=>{let t=1/0,i=1/0,n=-1/0,r=-1/0;for(const o of e)o.minXn&&(n=o.maxX),o.maxY>r&&(r=o.maxY);return t>n||i>r?null:{x:t,y:i,w:n-t,h:r-i}};function wl(e,t){let{x:i,y:n,w:r,h:o}=e;r<30&&(i=i+r/2-100,r=dl),o<30&&(n=n+o/2-100,o=dl);const s="number"==typeof t?{top:t,right:t,bottom:t,left:t}:t,a=Math.max(r,o),l=a*s.top,c=a*s.right,h=a*s.bottom,d=a*s.left;return{x:i-d,y:n-l,w:r+d+c,h:o+l+h}}function kl(e,t={}){const i=t.pad??.05,n=t.k??10,r=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)<=il&&Math.abs(e.maxX)<=il&&Math.abs(e.minY)<=il&&Math.abs(e.maxY)<=il);if(!o.length)return{core:null,all:null,outliers:0};const s=bl(o);if(o.length<4){const e=wl(s,i);return{core:e,all:e,outliers:0}}const a=o.map(e=>(e.minX+e.maxX)/2),l=o.map(e=>(e.minY+e.maxY)/2),c=yl(a),h=yl(l),d=o.map((e,t)=>Math.max(Math.abs(a[t]-c),Math.abs(l[t]-h))),u=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),r),p=d.map(e=>e>n*u),_=p.filter(Boolean).length,m=_&&_<=o.length*hl?o.filter((e,t)=>!p[t]):o;return{core:wl(bl(m)||s,i),all:wl(s,i),outliers:m===o?0:_}}function xl(e){return kl(e,{pad:0}).all}function Sl(e,t,i=.05){const n=kl(vl(e,t),{pad:i});if(n.core)return n.core;const r=e.vb&&4===e.vb.length&&e.vb[2]>0&&e.vb[3]>0?e.vb:[0,0,Ka,Ka];return{x:r[0],y:r[1],w:r[2],h:r[3]}}function $l(e){const t=Sl(e);return{x:t.x+t.w/2,y:t.y+t.h/2}}function Ml(e){const t=[];for(const i of e.rooms||[]){const e=gl(i);e&&t.push(e)}const i=kl(t,{pad:0}).core,n=Ka*ja(e.cellCm??5);return i?Math.max(n,Math.min(il,Math.max(i.w,i.h))):n}function Rl(e,t,i,n=1){const r=Number(i),o=Number.isFinite(n)&&n>0?n:1;return!Number.isFinite(r)||r<=0?e*o:e*Ml(t)*o/r}const Cl=[1,2,5,10,20,50,100,200,500,1e3];function Tl(e,t,i=7){if(!(e>0&&t>0&&Number.isFinite(t)))return null;const n=Cl.find(n=>e*n*t>=i);if(void 0===n)return null;const r=Cl.find(e=>e>=5*n)??5*n;return{fine:n,coarse:r}}function Dl(e){if(e.poly&&e.poly.length){const t=e.poly.map(e=>e[0]),i=e.poly.map(e=>e[1]),n=Math.min(...t),r=Math.min(...i);return{x:n,y:r,w:Math.max(...t)-n,h:Math.max(...i)-r}}return{x:e.x??0,y:e.y??0,w:e.w??0,h:e.h??0}}function Al(e,t,i,n,r,o=new Set){const s=t[e.id];return!o.has(e.id)&&s&&s.s===e.space?{x:s.x*Ka,y:s.y*Ka}:n[e.id]?n[e.id]:al($l(r))}function Pl(e,t,i,n){const r=i["rl_"+(e.id||"")];if(r&&r.s===t)return{x:r.x*Ka,y:r.y*Ka};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 al({x:o[0],y:o[1]})}function Fl(e,t){for(const i of e?.spaces??[])for(const e of i?.decor??[])if("furniture"===e?.kind&&"string"==typeof e.symbol&&t(e.symbol))return!0;return!1}let zl=0;const Il=new Set;const Ol=new class{constructor(e){this.options=e,this._art=null,this._failed=!1,this._terminal=!1,this._inFlight=null,this._hosts=new Set,this._settled=[]}state(){return this._art?"ready":this._failed?"fallback":"pending"}get terminal(){return this._terminal}art(e,t){if(this._art)return this._art[e];t&&!this._failed&&this._hosts.add(t)}adopt(e,t){return!!this._art||(t!==this.options.expectedFingerprint?((this.options.warn??console.warn)("[houseplan] furniture artwork from another build ignored",{fingerprint:t}),!1):(this._install(e),!0))}ensure(){return"pending"!==this.state()?Promise.resolve():(this._inFlight||(this._inFlight=this._loadWithRetry().finally(()=>{this._inFlight=null})),this._inFlight)}onSettled(e){"pending"===this.state()?this._settled.push(e):Promise.resolve().then(e)}async _loadWithRetry(){let e=new Error("furniture artwork did not load");for(const t of[0,1])try{const i=await this.options.load(t);if(i.FURNITURE_ART_FINGERPRINT!==this.options.expectedFingerprint){this._terminal=!0,e=new Error(`furniture artwork fingerprint mismatch: expected ${this.options.expectedFingerprint}, got ${i.FURNITURE_ART_FINGERPRINT}`);break}if(this._art)return;return void this._install(i.GENERATED_FURNITURE_ART)}catch(t){e=t}this._art||(this._failed=!0,(this.options.warn??console.warn)("[houseplan] furniture artwork unavailable",e),this.options.loadFailed?.(this._terminal),this._flush())}_install(e){this._art=e,this._failed=!1,this._flush()}_flush(){const e=[...this._hosts];this._hosts.clear();for(const t of e)t.isConnected&&t.requestUpdate();const t=this._settled.splice(0);for(const e of t)e()}}({expectedFingerprint:"34d1dbfc181acaf58842dfced0e6aa3a899aef6b8d1eeba53732ef729a63137e",load:async e=>0===e?await import("./furniture-plan-art.generated-BfO1XOcD.js"):await import((()=>{const e=new URL("./furniture-plan-art.generated-BfO1XOcD.js",import.meta.url);return e.searchParams.set("hp_retry","art-"+ ++zl),e.href})()),loadFailed:e=>{for(const t of Il)t(e)}}),El=["furniture","appliance","sanitary","other"],Nl=[{id:"sofa",group:"furniture",category:"sofa",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",category:"armchair",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",category:"coffee_table",w:110,h:60,g:[["r",0,0,1,1],["r",.08,.14,.84,.72]]},{id:"table_dining",group:"furniture",category:"dining_table",w:140,h:80,g:[["r",0,0,1,1],["r",.06,.11,.88,.78]]},{id:"table_round",group:"furniture",category:"dining_table",w:120,h:120,g:[["e",.5,.5,.5,.5],["e",.5,.5,.41,.41]]},{id:"chair",group:"furniture",category:"chair",w:45,h:45,g:[["r",0,0,1,.18],["r",.06,.18,.88,.8]]},{id:"desk",group:"furniture",category:"work_table",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",category:"bed",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",category:"bed",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",category:"nightstand",w:45,h:40,g:[["r",0,0,1,1],["r",.12,.14,.76,.33],["r",.12,.53,.76,.33]]},{id:"wardrobe",group:"furniture",category:"wardrobe",w:100,h:60,g:[["r",0,0,1,1],["l",0,.72,1,.72],["l",.5,.72,.5,1]]},{id:"bookshelf",group:"furniture",category:"wardrobe",w:80,h:30,g:[["r",0,0,1,1],["l",.34,0,.34,1],["l",.67,0,.67,1]]},{id:"fridge",group:"appliance",category:"fridge",w:60,h:65,g:[["r",0,0,1,1],["l",0,.36,1,.36],["l",.83,.44,.83,.64]]},{id:"stove",group:"appliance",category:"cooktop",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",category:"dishwasher",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",category:"washer",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",category:"dryer",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",category:"tv",w:120,h:30,g:[["r",0,0,1,.42],["l",.5,.42,.5,.72],["l",.3,.72,.7,.72]]},{id:"ac",group:"appliance",category:"air_conditioner",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",category:"boiler",w:45,h:45,g:[["e",.5,.5,.5,.5],["e",.5,.5,.31,.31]]},{id:"toilet",group:"sanitary",category:"toilet",w:40,h:70,g:[["r",.06,0,.88,.2],["e",.5,.58,.37,.35],["e",.5,.58,.22,.2]]},{id:"bathtub",group:"sanitary",category:"bathtub",w:170,h:75,g:[["r",0,0,1,1],["r",.05,.11,.77,.78],["e",.89,.5,.045,.1]]},{id:"shower",group:"sanitary",category:"shower",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",category:"sink",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",category:"kitchen_sink",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",category:"bidet",w:40,h:55,g:[["e",.5,.5,.44,.5],["e",.5,.5,.26,.3]]},{id:"stairs",group:"other",category:"stairs",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",category:"fireplace",w:120,h:40,g:[["r",0,0,1,1],["p",.22,1,.22,.42,.78,.42,.78,1]]},{id:"plant",group:"other",category:"plant",w:40,h:40,g:[["e",.5,.5,.22916667,.22916667],["l",.5,.27083333,.5,0],["l",.5,.72916667,.5,1],["l",.27083333,.5,0,.5],["l",.72916667,.5,1,.5],["l",.33333333,.33333333,.11458333,.11458333],["l",.66666667,.66666667,.88541667,.88541667],["l",.66666667,.33333333,.88541667,.11458333],["l",.33333333,.66666667,.11458333,.88541667]]},{id:"rug",group:"other",category:"rug",w:200,h:140,g:[["r",0,0,1,1],["r",.06,.09,.88,.82]]}],Hl=new Set(["fridge","dishwasher","washer","dryer","ac","water_heater","shower","sink","stairs","fireplace","plant","rug"]),Ll=[...[{id:"coffee_table",group:"furniture",category:"coffee_table",w:120,h:60},{id:"coffee_table_round",group:"furniture",category:"coffee_table",w:80,h:80},{id:"coffee_table_oval",group:"furniture",category:"coffee_table",w:120,h:60},{id:"coffee_table_rounded",group:"furniture",category:"coffee_table",w:120,h:60},{id:"table_dining",group:"furniture",category:"dining_table",w:160,h:90},{id:"table_round",group:"furniture",category:"dining_table",w:110,h:110},{id:"table_dining_oval",group:"furniture",category:"dining_table",w:180,h:100},{id:"table_dining_rounded",group:"furniture",category:"dining_table",w:160,h:90},{id:"desk",group:"furniture",category:"work_table",w:140,h:70},{id:"desk_corner",group:"furniture",category:"work_table",w:160,h:160},{id:"chair",group:"furniture",category:"chair",w:50,h:50},{id:"chair_bar",group:"furniture",category:"chair",w:45,h:48},{id:"armchair",group:"furniture",category:"armchair",w:90,h:90},{id:"armchair_office",group:"furniture",category:"armchair",w:65,h:65},{id:"sofa",group:"furniture",category:"sofa",w:180,h:90},{id:"sofa_three_seat",group:"furniture",category:"sofa",w:240,h:90},{id:"sofa_corner_right",group:"furniture",category:"sofa",w:260,h:170},{id:"bed_single",group:"furniture",category:"bed",w:90,h:200},{id:"bed_double",group:"furniture",category:"bed",w:160,h:200},{id:"nightstand",group:"furniture",category:"nightstand",w:50,h:40},{id:"cabinet_tv",group:"furniture",category:"nightstand",w:140,h:45},{id:"cabinet_shoe",group:"furniture",category:"nightstand",w:80,h:35},{id:"cabinet_sink",group:"furniture",category:"nightstand",w:80,h:50},{id:"bookshelf",group:"furniture",category:"wardrobe",w:100,h:35},{id:"wall_unit",group:"furniture",category:"wardrobe",w:240,h:45},{id:"wardrobe",group:"furniture",category:"wardrobe",w:180,h:60},{id:"kitchen_floor",group:"furniture",category:"kitchen_cabinet",w:60,h:60},{id:"kitchen_floor_corner",group:"furniture",category:"kitchen_cabinet",w:90,h:90},{id:"kitchen_wall",group:"furniture",category:"kitchen_cabinet",w:60,h:35},{id:"kitchen_wall_corner",group:"furniture",category:"kitchen_cabinet",w:60,h:60},{id:"shelf_floor",group:"furniture",category:"shelving",w:100,h:35},{id:"shelf_wall",group:"furniture",category:"shelving",w:100,h:25},{id:"cooktop_two",group:"appliance",category:"cooktop",w:30,h:50},{id:"stove",group:"appliance",category:"cooktop",w:60,h:60},{id:"tv",group:"appliance",category:"tv",w:120,h:28},{id:"tv_wall",group:"appliance",category:"tv",w:120,h:15},{id:"toilet",group:"sanitary",category:"toilet",w:40,h:70},{id:"toilet_built_in",group:"sanitary",category:"toilet",w:40,h:55},{id:"bathtub",group:"sanitary",category:"bathtub",w:170,h:75},{id:"bathtub_corner",group:"sanitary",category:"bathtub",w:140,h:140},{id:"bidet",group:"sanitary",category:"bidet",w:40,h:60},{id:"bidet_built_in",group:"sanitary",category:"bidet",w:40,h:50},{id:"kitchen_sink",group:"sanitary",category:"kitchen_sink",w:60,h:50},{id:"kitchen_sink_double",group:"sanitary",category:"kitchen_sink",w:90,h:50}].map(e=>({id:e.id,group:e.group,category:e.category,w:e.w,h:e.h,designer:!0})),...Nl.filter(e=>Hl.has(e.id))],Bl=new Map(Ll.map(e=>[e.id,e]));function ql(e){return e&&Bl.get(e)||null}function jl(e){return!0===Bl.get(e)?.designer}function Wl(e){return Ll.filter(t=>t.group===e)}function Ul(e){const t=ql(e);return t?{w:t.w,h:t.h}:{w:60,h:60}}function Gl(e,t,i=rl,n=1e3){const r=Number(t)>0?Number(t):5;return(Number(e)||0)/r*i/n}const Vl=5e-4,Kl=tl;function Yl(e){return Number.isFinite(e)?Math.max(Vl,Math.min(Kl,e)):Vl}function Xl(e){return Number.isFinite(e)?Math.max(1,Math.min(1e4,e)):1}const Zl=e=>{const t=Math.round(1e3*e)/1e3;return Object.is(t,-0)?"0":String(t)};function Jl(e,t){const i=ql(e);if(!i)return null;if(i.designer)return Ol.art(e,t)??null;const n=function(e,t,i){if(!e.g)return"";const n=e=>Zl(e*t),r=e=>Zl(e*i),o=[];for(const s of e.g)if("r"===s[0]){const[,e,t,i,a]=s;o.push(`M${n(e)} ${r(t)}H${n(e+i)}V${r(t+a)}H${n(e)}Z`)}else if("l"===s[0]){const[,e,t,i,a]=s;o.push(`M${n(e)} ${r(t)}L${n(i)} ${r(a)}`)}else if("e"===s[0]){const[,e,a,l,c]=s;o.push(`M${n(e-l)} ${r(a)}A${Zl(l*t)} ${Zl(c*i)} 0 0 1 ${n(e+l)} ${r(a)}A${Zl(l*t)} ${Zl(c*i)} 0 0 1 ${n(e-l)} ${r(a)}Z`)}else{const e=s.slice(1);if(e.length<4)continue;let t=`M${n(e[0])} ${r(e[1])}`;for(let i=2;i+10?n:Number.isFinite(r)&&r>0?r:1,s=Number(t),a=o*(Number.isFinite(s)&&s>0?s:1);return Number.isFinite(a)&&a>0?a:o}function ec(e,t,i,n,r){const o=e+i/2,s=t+n/2,a=(Number(r)||0)*Math.PI/180,l=Math.cos(a),c=Math.sin(a),h=(e,t)=>{const i=e-o,n=t-s;return[o+i*l-n*c,s+i*c+n*l]};return[h(e,t),h(e+i,t),h(e+i,t+n),h(e,t+n)]}function tc(e,t,i,n,r,o,s){const a=Number.isFinite(s)&&s>0?s:1e-6,l=(Number(e.angle)||0)*Math.PI/180,c=Math.cos(l),h=Math.sin(l),d=-Math.sin(l),u=Math.cos(l),p=e.x+e.w/2,_=e.y+e.h/2,m=t>0?-e.w/2:t<0?e.w/2:0,g=i>0?-e.h/2:i<0?e.h/2:0,f=p+m*c+g*d,v=_+m*h+g*u,y=n-f,b=r-v,w=t?(y*c+b*h)*(t>0?1:-1):e.w,k=i?(y*d+b*u)*(i>0?1:-1):e.h;let x=t?Math.abs(w):e.w,S=i?Math.abs(k):e.h;if(o&&t&&i){const t=x/Math.max(e.w,a),i=S/Math.max(e.h,a),n=Math.abs(t-1)>=Math.abs(i-1)?t:i,r=Math.max(a/e.w,a/e.h),o=Math.max(r,Number.isFinite(n)?n:r);x=e.w*o,S=e.h*o}x=Math.max(a,Number.isFinite(x)?x:a),S=Math.max(a,Number.isFinite(S)?S:a);const $=!!t&&w<0,M=!!i&&k<0,R=t?(t>0?1:-1)*($?-1:1):0,C=i?(i>0?1:-1)*(M?-1:1):0,T=f+R*(x/2)*c+C*(S/2)*d,D=v+R*(x/2)*h+C*(S/2)*u,A=!!e.flip_h!==$,P=!!e.flip_v!==M;return{x:T-x/2,y:D-S/2,w:x,h:S,...Number(e.angle)?{angle:Number(e.angle)}:{},...A?{flip_h:!0}:{},...P?{flip_v:!0}:{}}}function ic(e,t,i,n){let r=Number(e)+(Number(i)-Number(t));if([r,t,i].every(Number.isFinite)||(r=0),n){const e=r/45;r=45*(e<0?-Math.round(Math.abs(e)):Math.round(e))}return r=(r%360+360)%360,r>180?r-360:r}function nc(e,t,i,n,r){const o=e.x*t,s=e.y*i,a=e.w*t,l=e.h*i,c=o+a/2,h=s+l/2,d=o+(e.flip_h?a:0),u=s+(e.flip_v?l:0),p=(e.flip_h?-1:1)*a/n,_=(e.flip_v?-1:1)*l/r,m=Number(e.angle)||0;return(m?`rotate(${m} ${c} ${h}) `:"")+`translate(${d} ${u}) scale(${p} ${_})`}function rc(e,t,i,n=.1){if("string"==typeof e&&!e.trim())return null;const r=Number(e);if(!Number.isFinite(r)||0===r)return null;const o=r*(t?30.48:100),s=Math.abs(o);return si?null:o}function oc(e,t,i){const n=Math.abs(Number(e))/(i?30.48:100),r=Number(n.toFixed(6));return String(t?-r:r)}const sc=15e3,ac=2e3,lc=new WeakMap;function cc(e,t){let i=lc.get(e);if(!i){const t=new Set;i={hiddenAt:"hidden"===e.visibilityState?Date.now():0,token:0,subscribers:t,onVisibility:()=>{const t=lc.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 n=t.hiddenAt?Math.max(0,i-t.hiddenAt):0;t.hiddenAt=0,t.token++;const r={kind:"visible",token:t.token,at:i,hiddenFor:n,long:n>=sc};for(const e of[...t.subscribers])e(r)},onPageShow:t=>{const i=lc.get(e);if(!i)return;const n=Date.now();i.token++;const r={kind:"pageshow",token:i.token,at:n,hiddenFor:0,long:!!t.persisted,persisted:!!t.persisted};for(const e of[...i.subscribers])e(r)}},lc.set(e,i),e.addEventListener("visibilitychange",i.onVisibility),e.defaultView?.addEventListener("pageshow",i.onPageShow)}return i.subscribers.add(t),()=>{const i=lc.get(e);i&&(i.subscribers.delete(t),i.subscribers.size||(e.removeEventListener("visibilitychange",i.onVisibility),e.defaultView?.removeEventListener("pageshow",i.onPageShow),lc.delete(e)))}}const hc={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 dc{constructor(e,t=hc){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 n=(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 r=0;const o=new Promise(e=>{r=this.clock.setTimeout(()=>e({ready:!1,timedOut:!0}),ac)}),s=await Promise.race([n.then(e=>({ready:e,timedOut:!1})),o]);return i=!1,this.clock.clearTimeout(r),!this._disposed&&e===this._token&&(!(!s.ready&&!s.timedOut)&&(s.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 uc(e){let t=2166136261,i=2654435769;const n=new WeakSet,r=e=>{for(let n=0;n>>0)+(i>>>2)}},o=e=>{if(null===e)return void r("n");const t=typeof e;if("string"===t)return void r(`s${e.length}:${e}`);if("number"===t)return void r(`d${Number.isNaN(e)?"NaN":String(e)}`);if("boolean"===t)return void r(e?"t":"f");if("undefined"===t)return void r("u");if("object"!==t)return void r(`${t}:${String(e)}`);const i=e;if(n.has(i))r("[cycle]");else{if(n.add(i),Array.isArray(e)){r("[");for(const t of e)o(t);return r("]"),void n.delete(i)}r("{");for(const t of Object.keys(e).sort())r(t),o(e[t]);r("}"),n.delete(i)}};return o(e),`${(t>>>0).toString(16).padStart(8,"0")}${(i>>>0).toString(16).padStart(8,"0")}`}function pc(e){return uc(e)}const _c=new WeakMap;class mc{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=_c.get(e);return t||(t={signed:{},queued:new Set,inFlight:new Map,retry:new Map,listeners:new Set,settlers:new Set,references:new Map},_c.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=Hn(t);if(!i.startsWith("/api/houseplan/content/"))return i;const n=this.bind(e);this.referenced.add(i),n.references.set(this.referenceOwner,new Set(this.referenced));const r=n.signed[i],o=r?this.now()-r.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 n of function(e,t){const i=Math.max(1,Math.floor(t)),n=[];for(let t=0;t{const n=i.inFlight.get(e);return!(void 0!==n&&t-n<15e3)&&(i.inFlight.set(e,t),!0)});r.length&&e.callWS({type:"houseplan/content/sign",paths:r}).then(e=>{const t=this.now();let n=0,o=!1;for(const s of r){const r=e?.urls?.[s];if("string"==typeof r&&r){const e=i.signed[s];e?.loaded&&e.url!==r?(e.pending={url:r,at:t},this.preloadReplacement(i,s,r,t)):(i.signed[s]={url:r,at:t,loaded:e?.url===r&&!!e.loaded},o=!0),i.retry.delete(s),n++}else this.backOff(i,s)}if(n&&(this.trimShared(i),o))for(const e of[...i.listeners])e()}).catch(()=>{for(const e of r)this.backOff(i,e)}).finally(()=>{for(const e of r)i.inFlight.get(e)===t&&i.inFlight.delete(e);for(const e of[...i.settlers])e()})}}preloadReplacement(e,t,i,n){const r=()=>{const r=e.signed[t];if(r?.pending?.url===i){e.signed[t]={url:i,at:n,loaded:!0},e.retry.delete(t),this.trimShared(e);for(const t of[...e.listeners])t()}},o=()=>{const n=e.signed[t];n?.pending?.url===i&&(delete n.pending,this.backOff(e,t))};if("undefined"==typeof Image)return void r();const s=new Image;s.onload=()=>{("function"==typeof s.decode?s.decode():Promise.resolve()).then(r).catch(o)},s.onerror=o,s.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 n=i.url;return i.preload=new Promise(r=>{const o=new Image;let s=!1;const a=o=>{if(s)return;s=!0,clearTimeout(l);const a=e.signed[t];if(a===i&&delete a.preload,o&&a===i&&a.url===n){a.loaded=!0;for(const t of[...e.listeners])t();r(!0)}else o||a!==i||this.backOff(e,t),r(!1)};o.onload=()=>{("function"==typeof o.decode?o.decode():Promise.resolve()).then(()=>a(!0)).catch(()=>a(!1))},o.onerror=()=>a(!1);const l=setTimeout(()=>a(!1),ac);o.src=n}),i.preload}prepareImage(e,t){const i=Hn(t);if(!i.startsWith("/api/houseplan/content/"))return Promise.resolve(!0);const n=this.bind(e),r=()=>{const t=n.signed[i];if(t&&this.now()-t.atthis.now()&&!n.inFlight.has(i)&&!n.queued.has(i)?Promise.resolve(!1):null},o=r();return o?(s=o,new Promise(e=>{let t=!1;const i=i=>{t||(t=!0,clearTimeout(n),e(i))},n=setTimeout(()=>i(!1),ac);s.then(i).catch(()=>i(!1))})):new Promise(e=>{let t=!1,i=null;const o=i=>{t||(t=!0,clearTimeout(a),n.settlers.delete(s),e(i))},s=()=>{t||i||(i=r(),i&&i.then(o).catch(()=>o(!1)))},a=setTimeout(()=>o(!1),ac);n.settlers.add(s),s()});var s}backOff(e,t){const i=e.retry.get(t)?.delay||0,n=Math.min(6e4,i?2*i:2e3);e.retry.set(t,{notBefore:this.now()+n,delay:n})}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,n]of t)(n.pending||n.preload)&&i.add(e);t.sort((e,t)=>t[1].at-e[1].at);const n=t.filter(([e])=>i.has(e));for(const e of t){if(n.length>=512)break;i.has(e[0])||n.push(e)}e.signed=Object.fromEntries(n)}resign(e,t){const i=this.bind(e);this.referenced=new Set(t),i.references.set(this.referenceOwner,new Set(this.referenced));const n=this.now(),r=new Set;for(const e of i.references.values())for(const t of e)r.add(t);const o={};for(const[e,t]of Object.entries(i.signed))r.has(e)&&n-t.at!!o[e]&&!o[e].pending))}markLoaded(e,t,i){const n=Hn(t);if(!n.startsWith("/api/houseplan/content/"))return;const r=this.bind(e).signed[n];if(r&&(!i||r.url===i)&&!r.loaded){r.loaded=!0;for(const t of[...this.bind(e).listeners])t()}}isReady(e,t){const i=Hn(t);if(!i.startsWith("/api/houseplan/content/"))return!0;const n=this.bind(e).signed[i];return!!n&&this.now()-n.at=2&&(this._sequenceMultitouch=!0,this._postGestureClickBlocked=!0))}pointerTerminal(e,t){if("touch"!==t)return!1;const i=this._sequenceMultitouch;return this._activeTouchPointers.delete(e),0===this._activeTouchPointers.size&&(this._sequenceMultitouch=!1),i}reset(){this._activeTouchPointers.clear(),this._sequenceMultitouch=!1,this._postGestureClickBlocked=!1}}const fc=1e-7,vc=(e,t)=>{const i=e.x-t.x,n=e.y-t.y;return i*i+n*n};function yc(e){const t=Math.max(0,e.floorRadius);return{left:Math.min(e.painted.left,e.center.x-t),top:Math.min(e.painted.top,e.center.y-t),right:Math.max(e.painted.right,e.center.x+t),bottom:Math.max(e.painted.bottom,e.center.y+t)}}function bc(e,t){let i=null,n=Number.POSITIVE_INFINITY;for(const r of e){const e=vc(t,r.center);(efunction(e,t){const i=Math.max(0,t.right-t.left),n=Math.max(0,t.bottom-t.top);if(i<=0||n<=0)return!1;const r=Math.min(i,n)/2,o=Math.max(t.left+r,Math.min(t.right-r,e.x)),s=Math.max(t.top+r,Math.min(t.bottom-r,e.y));return vc(e,{x:o,y:s})<=r*r+fc}(t,e.painted));if(i.length)return bc(i,t);return bc(e.filter(e=>{const i=Math.max(0,e.floorRadius);return vc(t,e.center)<=i*i+fc}),t)}class kc{constructor(e,t=44){this.cellSize=t,this.buckets=new Map;const i=Number.isFinite(t)&&t>0?t:44;this.cellSize=i;for(const t of e){const e=yc(t),n=Math.floor(e.left/i),r=Math.floor(e.right/i),o=Math.floor(e.top/i),s=Math.floor(e.bottom/i);for(let e=n;e<=r;e++)for(let i=o;i<=s;i++){const n=`${e}:${i}`,r=this.buckets.get(n);r?r.push(t):this.buckets.set(n,[t])}}}resolve(e){const t=`${Math.floor(e.x/this.cellSize)}:${Math.floor(e.y/this.cellSize)}`;return wc(this.buckets.get(t)||[],e)}}class xc{constructor(){this.active=new Map,this.released=new Map}begin(e,t){this.released.delete(e),this.active.set(e,t)}owner(e){return this.active.get(e)||null}release(e){const t=this.active.get(e)||null;if(!t)return this.released.get(e)||null;for(this.active.delete(e),this.released.set(e,t);this.released.size>16;){const e=this.released.keys().next().value;if(void 0===e)break;this.released.delete(e)}return t}consumeClick(e){const t=this.released.get(e)||null;return this.released.delete(e),t}cancel(e){const t=this.active.get(e)||null;return this.active.delete(e),t}clear(){this.active.clear(),this.released.clear()}}class Sc{constructor(){this.index=null,this.pointers=new xc,this.hoverId=null,this.hoverElement=null}invalidate(){this.index=null}reset(e){this.invalidate(),this.pointers.clear(),this.hover(e,null)}clearPointers(){this.pointers.clear()}cancel(e){return this.pointers.cancel(e)}release(e){return this.pointers.release(e)}indexFor(e){if(this.index)return this.index;const t=[];for(const i of e.querySelectorAll('.devlayer > .dev[data-hp="device"][data-id]')){const e=i.querySelector(".device-shell-frame"),n=i.getBoundingClientRect(),r=e?.getBoundingClientRect();!i.dataset.id||!i.isConnected||!r||n.width<=0||n.height<=0||r.width<=0||r.height<=0||t.push({id:i.dataset.id,center:{x:n.left+n.width/2,y:n.top+n.height/2},painted:{left:r.left,top:r.top,right:r.right,bottom:r.bottom},floorRadius:Math.max(22,Math.min(r.width,r.height)/2)})}return this.index=new kc(t),this.index}at(e,t,i,n,r){const o=this.indexFor(e).resolve({x:n,y:r})?.id;return o&&t.find(e=>e.id===o&&e.space===i)||null}byId(e,t,i){return i&&e.find(e=>e.id===i&&e.space===t)||null}begin(e,t,i,n,r){const o=this.at(e,t,i,n.clientX,n.clientY)||r;return this.pointers.begin(n.pointerId,o.id),o}pointer(e,t,i,n,r){const o=n.pointerId;return(Number.isFinite(o)?this.byId(t,i,this.pointers.owner(o)):null)||this.at(e,t,i,n.clientX,n.clientY)||r}click(e,t,i,n,r){if(!(n instanceof PointerEvent))return r;const o=n,s=Number.isFinite(o.pointerId)?this.pointers.consumeClick(o.pointerId):null;return this.byId(t,i,s)||this.at(e,t,i,o.clientX,o.clientY)||r}hover(e,t){this.hoverId===t&&this.hoverElement?.isConnected||(this.hoverElement?.removeAttribute("data-hp-device-hover"),this.hoverId=t,this.hoverElement=t&&[...e.querySelectorAll('.devlayer > .dev[data-hp="device"][data-id]')].find(e=>e.dataset.id===t)||null,this.hoverElement?.setAttribute("data-hp-device-hover",""))}}function $c(e,t){if(t)return e.find(e=>e.id===t)}function Mc(e,t){return{id:e,title:t,plan_url:null,view_box:[0,0,1,1],rooms:[],wall_segments:[]}}function Rc(e="file"){const t="draw"===e;return{source:e,showBorders:t,showNames:t,displayTouched:!1}}function Cc(e,t){if(e.displayTouched)return{...e,source:t};const i="draw"===t;return{...e,source:t,showBorders:i,showNames:i}}function Tc(e,t,i){return{...e,[t]:i,displayTouched:!0}}function Dc(e){const t=String(e??"").trim().replace(",",".");if(!/^[+-]?(?:\d+(?:\.\d*)?|\.\d+)$/.test(t))return null;const i=Number(t);return Number.isFinite(i)?i:null}function Ac(e,t){const i=e=>{if(""===String(e??"").trim())return{valid:!0,value:null};const t=Dc(e);return{valid:null!==t,value:t}},n=i(e),r=i(t);return n.valid&&r.valid?null!==n.value&&null!==r.value&&n.value>r.value?{valid:!0,min:r.value,max:n.value}:{valid:!0,min:n.value,max:r.value}:{valid:!1,min:n.value,max:r.value}}function Pc(e,t,i,n,r,o){const s=Ac(n,r);return pn(e,t,o&&s.valid?{settings:{...i.settings||{},temp_min:s.min,temp_max:s.max}}:i)}function Fc(e){const t=e=>"number"==typeof e&&Number.isFinite(e)?String(e):"";return[t(e?.temp_min),t(e?.temp_max)]}function zc(e,t,i){const n=Ac(t,i);return!!n.valid&&(null===n.min?delete e.temp_min:e.temp_min=n.min,null===n.max?delete e.temp_max:e.temp_max=n.max,!0)}var Ic="M11,18H13V16H11V18M12,2A10,10 0 0,0 2,12A10,10 0 0,0 12,22A10,10 0 0,0 22,12A10,10 0 0,0 12,2M12,20C7.59,20 4,16.41 4,12C4,7.59 7.59,4 12,4C16.41,4 20,7.59 20,12C20,16.41 16.41,20 12,20M12,6A4,4 0 0,0 8,10H10A2,2 0 0,1 12,8A2,2 0 0,1 14,10C14,12 11,11.75 11,15H13C13,12.75 16,12.5 16,10A4,4 0 0,0 12,6Z";function Oc(e,t,i){return[e[0]*t+e[1]*i+e[2],e[3]*t+e[4]*i+e[5]]}function Ec(e,t){let i=0;for(const[n,r]of t){const t=Oc(e,n[0],n[1]);i=Math.max(i,Math.hypot(t[0]-r[0],t[1]-r[1]))}return i}const Nc=e=>{if(null==e||""===e)return null;const t=Number(e);return Number.isFinite(t)?t:null},Hc=e=>{const t=e,i=Nc(Array.isArray(t)?t[0]:t?.x),n=Nc(Array.isArray(t)?t[1]:t?.y);return null==i||null==n?null:[i,n]};function Lc(e){if(!Array.isArray(e))return null;const t=[];for(const i of e){const e=Hc(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,n=0,r=0;for(let e=0;ee+t[0],0)/t.length,t.reduce((e,t)=>e+t[1],0)/t.length]:[n/(3*i),r/(3*i)]}function Bc(e){if(!Array.isArray(e))return null;const t=[];for(const i of e){const e=Hc(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=Lc(t);if(!i)return null;const n=t.map(e=>e[0]),r=t.map(e=>e[1]);return{centroid:i,bbox:[Math.min(...n),Math.min(...r),Math.max(...n),Math.max(...r)]}}function qc(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(Hc).filter(e=>null!=e)).filter(e=>e.length>=2);i.length>64&&(i=i.slice(-64));const n=i.reduce((e,t)=>e+t.length,0);if(n<=4e3)return i.map(e=>e.slice());const r=4e3-2*i.length,o=i.map(e=>e.length-2),s=o.reduce((e,t)=>e+t,0),a=o.map(e=>r*e/s),l=a.map(Math.floor);let c=r-l.reduce((e,t)=>e+t,0);const h=a.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 n=0;ne.slice()),i=t[t.length-1];return i?(i.length>2?i.pop():t.pop(),t):[]}const Uc=e=>Number.isFinite(e[0])&&Number.isFinite(e[1]),Gc=(e,t)=>e[0]===t[0]&&e[1]===t[1];function Vc(e){if(!e)return null;const t=e.vacuum_position||e.robot_position||null,i=t&&null!=Nc(t.x)&&null!=Nc(t.y)?{x:Nc(t.x),y:Nc(t.y),a:Nc(t.a??t.angle??t.theta)}:null,n=qc(e.path?.path??e.path?.points??e.path),r=[],o=e.rooms,s=Array.isArray(o)?o.map((e,t)=>[String(e?.id??t),e]):o&&"object"==typeof o?Object.entries(o):[];for(const[e,t]of s){if(!t||"object"!=typeof t)continue;const i=String(t.name??t.label??"").trim(),n=[[Nc(t.cx),Nc(t.cy)],[Nc(t.center?.x),Nc(t.center?.y)],[Nc(t.x),Nc(t.y)]].find(([e,t])=>null!=e&&null!=t);let o=n?.[0]??null,s=n?.[1]??null;const a=Bc(t.outline),l=Nc(t.x0),c=Nc(t.y0),h=Nc(t.x1),d=Nc(t.y1),u=(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)||a?.bbox||null;if(null!=o&&null!=s||!a||([o,s]=a.centroid),null!=o&&null!=s||!u||(o=(u[0]+u[2])/2,s=(u[1]+u[3])/2),i&&null!=o&&null!=s){const t={id:e,name:i,cx:o,cy:s};u&&([t.x0,t.y0,t.x1,t.y1]=u),r.push(t)}}const a=function(e){return String(e.map_name??e.current_map??e.map_index??e.selected_map??"default")}(e);return i||r.length||n.length?{pos:i,path:n,rooms:r,mapId:a}:null}function Kc(e,t,i){return![e,t,i].every(Number.isFinite)||e<0||t<=0||i<=0?Number.POSITIVE_INFINITY:e/t*i}const Yc=40;function Xc(e,t,i){if(!e||!t)return null;const n=t.attributes||{},r=e.split(".")[0]||"",o=null!=i?.platform?String(i.platform):null,s=!!Hc(n.vacuum_position??n.robot_position),a=!(!n.rooms||"object"!=typeof n.rooms),l=qc(n.path?.path??n.path?.points??n.path).length>0,c=[n.map_name,n.current_map,n.map_index,n.selected_map].some(e=>null!=e),h="xiaomi_cloud_map_extractor"===o,d=a||l||c;let u=null;if(s?u="compatible":h?u="known_xcme_incomplete":d?u="partial":"camera"===r&&(u="camera"),!u)return null;const p=s?"camera"===r?300:200:h?100:d?50:0;return{entityId:e,name:String(n.friendly_name||e),platform:o,category:u,hasPosition:s,hasRooms:a,hasPath:l,hasMapId:c,score:p}}const Zc=e=>e.toLowerCase().replace(/[\s_\-.,]+/g,"");function Jc(e,t){const i=new Set(t.map(Zc).filter(Boolean)),n=new Set;for(const t of e){const e=Zc(t.name||"");e&&i.has(e)&&n.add(e)}return n.size}function Qc(e,t){const i=new Map(t.map(e=>[Zc(e.name),e])),n=[],r=[];for(const t of e){const e=i.get(Zc(t.name));e&&(n.push([[t.cx,t.cy],[e.cx,e.cy]]),r.push(t.name))}if(n.length<3)return null;const o=function(e){if(e.length<3)return null;let t=0,i=0,n=0,r=0,o=0,s=0,a=0,l=0,c=0,h=0,d=0,u=0;for(const[[p,_],[m,g]]of e){if(![p,_,m,g].every(Number.isFinite))return null;t+=p*p,i+=p*_,n+=p,r+=_*_,o+=_,s+=1,a+=p*m,l+=_*m,c+=m,h+=p*g,d+=_*g,u+=g}const p=[t,i,n,i,r,o,n,o,s],_=e=>{const[t,i,n,r,o,s,a,l,c]=p,h=t*(o*c-s*l)-i*(r*c-s*a)+n*(r*l-o*a);if(!Number.isFinite(h)||Math.abs(h)<1e-9)return null;const d=[(o*c-s*l)/h,(n*l-i*c)/h,(i*s-n*o)/h,(s*a-r*c)/h,(t*c-n*a)/h,(n*r-t*s)/h,(r*l-o*a)/h,(i*a-t*l)/h,(t*o-i*r)/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=_([a,l,c]),g=_([h,d,u]);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}(n);return o?{matrix:o,matched:r,residual:Ec(o,n)}:null}function eh(e,t,i){const n=e[e.length-1];if(n&&n[0]===t[0]&&n[1]===t[1])return e;if(e.push(t),e.length<=600)return e;let r=function(e,t){if(e.length<3)return e.slice();const i=new Uint8Array(e.length);i[0]=i[e.length-1]=1;const n=[[0,e.length-1]];for(;n.length;){const[r,o]=n.pop(),[s,a]=e[r],[l,c]=e[o],h=l-s,d=c-a,u=Math.hypot(h,d)||1e-9;let p=0,_=-1;for(let t=r+1;tp&&(p=i,_=t)}_>0&&p>t&&(i[_]=1,n.push([r,_],[_,o]))}const r=[];for(let t=0;t600&&(r=r.filter((e,t)=>t%2==0||t===r.length-1)),r}function th(e){return"cleaning"===e||"returning"===e||"on"===e}const ih={0:[1,0],90:[0,1],180:[-1,0],270:[0,-1]};function nh(e){const[t,i]=ih[e.rot]||[1,0],n=e.mir?-1:1;return[e.s*t*n,-e.s*i,e.ox,e.s*i*n,e.s*t,e.oy]}function rh(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,n=Math.sqrt(Math.abs(t));let r=180*Math.atan2(-e[1],e[4])/Math.PI;return r=(90*Math.round(r/90)%360+360)%360,{ox:e[2],oy:e[5],s:n,rot:r,mir:i}}function oh(e,t){const i=[],n=[];for(const t of e)null!=t.x0?(i.push(t.x0,t.x1),n.push(t.y0,t.y1)):(i.push(t.cx),n.push(t.cy));if(!i.length)return{ox:t[0]+t[2]/2,oy:t[1]+t[3]/2,s:t[2]/1e4,rot:0,mir:!0};const r=Math.min(...i),o=Math.max(...i),s=Math.min(...n),a=Math.max(...n),l=Math.max(o-r,a-s)||1,c={ox:0,oy:0,s:.6*Math.min(t[2],t[3])/l,rot:0,mir:!0},h=nh(c),[d,u]=Oc(h,(r+o)/2,(s+a)/2);return c.ox=t[0]+t[2]/2-d,c.oy=t[1]+t[3]/2-u,c}function sh(e,t,i,n){const[r,o]=Oc(nh(t),i,n),s=nh({...e,ox:0,oy:0}),[a,l]=Oc(s,i,n);return{...e,ox:r-a,oy:o-l}}function ah(e){const t=e?.trail_mode;return"never"===t||"cleaning"===t||"always"===t?t:!1===e?.trail?"never":"cleaning"}const lh=e=>"number"==typeof e&&Number.isFinite(e);function ch(e){return Array.isArray(e)&&6===e.length&&e.every(lh)?[e[0],e[1],e[2],e[3],e[4],e[5]]:null}function hh(e,t,i){return"legacy:"+e+" "+t+" "+i}function dh(e,t,i,n){const r=t?.map_routes;if(Array.isArray(r))return r.filter(e=>e&&"string"==typeof e.id&&e.id).map(e=>({id:e.id,source:String(e.source??""),map_id:String(e.map_id??""),space:String(e.space??""),calibration:ch(e.calibration)}));const o="string"==typeof t?.source&&t.source?t.source:n||"";if(!o)return[];const s=t?.calibration;if(!s||"object"!=typeof s)return[];const a=[];for(const t of Object.keys(s)){const n=ch(s[t]);n&&a.push({id:hh(e,o,t),source:o,map_id:t,space:i,calibration:n})}return a}const uh=(e,t)=>e instanceof Map?e.get(t):e?.[t];function ph(e){const t=[];let i=!1,n="",r="";for(const o of e.routes){const s=uh(e.observed,o.source);void 0!==s&&(i=!0,n||(n=o.source,r=s),s===o.map_id&&t.push(o))}if(t.length>1)return{kind:"ambiguous",routeIds:t.map(e=>e.id).sort()};if(1===t.length){const i=t[0];if(e.spaceIds&&!e.spaceIds.has(i.space))return{kind:"missing_space",route:i};const n=ch(i.calibration);return n?{kind:"ready",route:{...i,calibration:n}}:{kind:"needs_calibration",route:i}}if(i)return{kind:"unmapped",source:n,mapId:r};const o=e.observed instanceof Map?[...e.observed.entries()]:Object.entries(e.observed||{});if(o.length){const e=o.slice().sort((e,t)=>e[0].localeCompare(t[0]))[0];return{kind:"unmapped",source:e[0],mapId:e[1]}}return{kind:"none"}}function _h(e,t,i){const n=new Set;for(const t of e)t.source&&n.add(t.source);for(const e of t)e&&n.add(e);const r={};for(const e of[...n].sort()){const t=i(e);void 0!==t&&(r[e]=t)}return r}function mh(e,t,i){if(!e)return null;const n="string"==typeof e.route_id?e.route_id:"";if(n)return t.find(e=>e.id===n)||null;const r=function(e,t,i){if(!e||"string"!=typeof e.map_id)return{kind:"orphan_run"};const n=e.map_id,r="string"==typeof i?i:"";let o=t.filter(e=>e.map_id===n);return r&&(o=o.filter(e=>e.source===r)),1===o.length?{kind:"adopted",route:o[0]}:0===o.length?{kind:"orphan_run"}:{kind:"ambiguous_run",routeIds:o.map(e=>e.id).sort()}}(e,t,i);return"adopted"===r.kind?r.route:null}function gh(e){const t="ready"===e.resolution.kind?e.resolution.route:null,i=t&&t.space===e.renderSpace?ch(t.calibration):null,n=mh(e.serverCurrent,e.routes,e.rootSource),r=!!t&&!!n&&n.id===t.id,o=mh(e.serverPrevious,e.routes,e.rootSource);return{live:i,currentRunMatches:r,previous:!!o&&o.space===e.renderSpace&&(e.explicitRoutes||!!t&&o.id===t.id)?ch(o.calibration):null}}const fh={availability:"available",status:"alarm",activity:"none"},vh=new Set(["motion","vibration","sound"]),yh=new Set(["occupancy","presence"]),bh=new Set(["door","window","garage_door","opening"]),wh=new Set(["running","power"]),kh=new Set(["smoke","gas","carbon_monoxide","moisture","safety","tamper","problem"]);const xh=new Set(["running","working","washing","rinsing","spinning","drying","heating","cooling","cleaning","cooking","playing","recording","pumping","irrigating","humidifying","dehumidifying","fan","preheating","defrosting"]),Sh=new Set([...xh,"start","started","run","active","in_progress","wash","rinse","spin","dry"]),$h=new Set(["off","idle","paused","standby","docked","finished","complete","completed","stopped","ready","sleeping","stop","end","done","inactive"]),Mh=new Set(["heat","cool","heat_cool","auto","dry","fan_only"]),Rh=e=>""===e||"unknown"===e||"unavailable"===e||"__missing__"===e,Ch=e=>String(e??"").trim().toLowerCase(),Th=e=>Ch(e).replace(/[\s-]+/g,"_").replace(/_+/g,"_").replace(/^_|_$/g,""),Dh=new Map([["run_state",0],["job_state",0],["operation_state",0],["activity_state",0],["machine_state",1],["running_state",1],["status",2],["device_status",2],["machine_status",2]]),Ah=new Set(["wifi","connection","signal","battery"]);function Ph(e,t){const i=e?.entities?.[t]||{};if("config"===i.entity_category)return null;const n=String(t||"").split(".").slice(1).join("."),r=[i.translation_key,i.original_name,i.name],o=[...r,n];r.some(e=>Ch(e))||o.push(e?.states?.[t]?.attributes?.friendly_name);const s=o.map(Th).filter(Boolean);if(s.some(e=>e.split("_").some(e=>Ah.has(e))))return null;let a=null;for(const e of s)for(const[t,i]of Dh)(e===t||e.endsWith(`_${t}`))&&(a=null==a?i:Math.min(a,i));return a}const Fh=(e,t)=>null!=Ph(e,t);function zh(e,t){if(!t.startsWith("switch."))return!1;const i=e?.entities?.[t]||{},n=e?.states?.[t],r=t.slice(7).toLowerCase();if(/(?:^|_)(?:main_)?power$/.test(r))return!0;if([i.translation_key,i.original_name,i.name].map(Ch).some(e=>["power","main power","power switch","питание"].includes(e)))return!0;const o=Ch(n?.attributes?.friendly_name);return/(?:^|[\s._-])(?:main[\s._-]+)?power$/.test(o)||/(?:^|[\s._-])питание$/.test(o)}function Ih(e){for(const t of["hvac_action","action","current_operation","run_state","job_state","operation","activity"]){const i=Ch(e?.[t]);if(xh.has(i)||$h.has(i))return i}return""}function Oh(e,t){const i=e?.states?.[t],n=i?Ch(i.state):"__missing__",r=String(t||"").split(".")[0],o=Ch(i?.attributes?.device_class),s={eid:t,state:n,availability:Rh(n)?"unavailable":"available",status:"neutral",activity:"none",edge:"none"};if("unavailable"===s.availability)return s;if(function(e,t,i){return"alarm_control_panel"===e?"triggered"===i:"on"===i&&Yn(e,t)}(r,o,n))return{...s,status:"alarm"};if("binary_sensor"===r)return vh.has(o)?{...s,edge:"rising"}:yh.has(o)?{...s,activity:"on"===n?"presence":"none"}:bh.has(o)?{...s,status:"on"===n?"open":"neutral",edge:"rising"}:"moving"===o?{...s,activity:"on"===n?"transition":"none"}:wh.has(o)&&"on"===n?{...s,status:"working",activity:"running"}:s;if("cover"===r)return{...s,activity:"opening"===n||"closing"===n?"transition":"none",edge:"terminal_transition"};if("lock"===r)return{...s,status:"unlocked"===n||"open"===n?"open":"neutral",activity:"locking"===n||"unlocking"===n?"transition":"none",edge:"terminal_transition"};if("valve"===r)return{...s,status:["open","opening","closing"].includes(n)?"open":"neutral",activity:"opening"===n||"closing"===n?"transition":"none",edge:"terminal_transition"};if("climate"===r){const e=Ih(i.attributes),t=Array.isArray(i.attributes?.hvac_modes)?i.attributes.hvac_modes.map(Ch):[],r=!$h.has(n)&&(Mh.has(n)||xh.has(n)||t.includes(n));return(e?xh.has(e):r)?{...s,status:"working",activity:"running"}:s}if(["light","switch","fan","humidifier"].includes(r))return"on"===n?{...s,status:"working",activity:"running"}:s;if("media_player"===r)return"off"===n?{...s,availability:"unavailable"}:s;if("vacuum"===r)return"cleaning"===n?{...s,status:"working",activity:"running"}:"returning"===n?{...s,status:"working",activity:"transition"}:s;if("script"===r)return"on"===n?{...s,status:"working",activity:"running"}:s;if("automation"===r)return s;if("button"===r||"event"===r)return{...s,edge:"change"};const a=Ih(i.attributes);return xh.has(a)||xh.has(n)&&!$h.has(n)?{...s,status:"working",activity:"running"}:s}function Eh(e,t,i){const n=i.filter(t=>t.startsWith("switch.")&&!e?.entities?.[t]?.entity_category),r=t.find(t=>zh(e,t));if(!(n.length>1&&!!r))return t.map(t=>Oh(e,t));const o=t.find(t=>t!==r&&Fh(e,t)),s=Oh(e,r);return"unavailable"===s.availability||"off"===s.state?t.map(t=>({eid:t,state:e?.states?.[t]?Ch(e.states[t].state):"__missing__",availability:"unavailable",status:"neutral",activity:"none",edge:"none"})):t.map(t=>{if(t===o)return function(e,t){const i=e?.states?.[t],n=i?Ch(i.state):"__missing__",r={eid:t,state:n,availability:Rh(n)?"unavailable":"available",status:"neutral",activity:"none",edge:"none"};if("unavailable"===r.availability)return r;const o=Ih(i?.attributes);return xh.has(o)||Sh.has(n)&&!$h.has(n)?{...r,status:"working",activity:"running"}:r}(e,t);return{...t===r?s:Oh(e,t),status:"neutral",activity:"none",edge:"none"}})}function Nh(e){if(!e.length)return{availability:"available",status:"neutral",activity:"none"};const t=e.filter(e=>"available"===e.availability);if(!t.length)return{availability:"unavailable",status:"neutral",activity:"none"};if(t.some(e=>"alarm"===e.status))return fh;const i=t.some(e=>"working"===e.status)?"working":t.some(e=>"open"===e.status)?"open":"neutral",n=t.some(e=>"transition"===e.activity)?"transition":t.some(e=>"presence"===e.activity)?"presence":t.some(e=>"running"===e.activity)?"running":"none";return{availability:"available",status:i,activity:n}}function Hh(e,t){if(!(e=>!!e&&!Rh(e))(e)||"unavailable"===t.availability||e===t.state)return null;if("rising"===t.edge)return"off"===e&&"on"===t.state?"event":null;if("change"===t.edge)return"event";if("terminal_transition"===t.edge){const i=new Set([e,t.state]);if(i.has("closed")&&i.has("open")||i.has("locked")&&i.has("unlocked"))return"transition"}return null}const Lh=(e,t=0)=>{const i=Number(e);return Number.isInteger(i)&&i>=0?i:t},Bh=(e,t)=>{const i={rev:0,configRev:Lh(t),off:new Set};if(null==e)return{snapshot:i,valid:!1};const n=e.off;return!Number.isInteger(e.rev)||Number(e.rev)<0||!Number.isInteger(e.config_rev)||Number(e.config_rev)<0||!Array.isArray(n)||n.some(e=>"string"!=typeof e||!e)?{snapshot:i,valid:!1}:{snapshot:{rev:Number(e.rev),configRev:Number(e.config_rev),off:new Set(n)},valid:!0}};function qh(e,t=0){return Bh(e,t).snapshot}function jh(e,t,i,n){const r=Bh(t,i);return n&&r.valid&&r.snapshot.configRev===i?e.configRev===i&&r.snapshot.rev{try{const[i,n]=await Promise.all([e.callWS({type:"config/device_registry/list"}),e.callWS({type:"config/entity_registry/list"})]),r=ed(i,"id"),o=ed(n,"entity_id");if(!r||!o)throw new Error("invalid_registry_response");t.devices=r,t.entities=o,t.authoritative=!0,t.access="full",t.lastSuccess=Date.now(),t.error=void 0}catch(e){t.authoritative=!1,t.access="limited",t.error=function(e){if(e&&"object"==typeof e){const t=e;return String(t.message||t.code||t.error||"registry_unavailable")}return String(e||"registry_unavailable")}(e)}finally{t.revision++,t.loading=void 0,function(e){for(const t of[...e.listeners])try{t()}catch{}}(t)}})()),t.loading}function id(e,t){void 0===t.reloadTimer&&(t.reloadTimer=globalThis.setTimeout(()=>{t.reloadTimer=void 0,td(e,t)},80))}async function nd(e,t){if(t.subscribing||t.unsubDevice&&t.unsubEntity)return t.subscribing;const i=e?.connection?.subscribeEvents;return"function"==typeof i?(t.subscribing=(async()=>{try{t.unsubDevice||(t.unsubDevice=await i.call(e.connection,()=>id(e,t),"device_registry_updated")),t.unsubEntity||(t.unsubEntity=await i.call(e.connection,()=>id(e,t),"entity_registry_updated"))}catch{}finally{0===t.refs&&(t.unsubDevice?.(),t.unsubEntity?.(),t.unsubDevice=void 0,t.unsubEntity=void 0),t.subscribing=void 0}})(),t.subscribing):void 0}function rd(e,t){const i=Qh(e);if(!i)return()=>{};const n=0===i.refs;i.refs++,i.listeners.add(t),("pending"===i.access||n)&&td(e,i),nd(e,i);let r=!1;return()=>{r||(r=!0,i.listeners.delete(t),i.refs=Math.max(0,i.refs-1),i.refs>0||(i.unsubDevice?.(),i.unsubEntity?.(),i.unsubDevice=void 0,i.unsubEntity=void 0,void 0!==i.reloadTimer&&globalThis.clearTimeout(i.reloadTimer),i.reloadTimer=void 0))}}function od(e){const t=Qh(e);t&&(id(e,t),nd(e,t))}function sd(e){const t=Qh(e);if(!t)return{revision:0,authoritative:!1,access:"limited",devices:e?.devices||{},entities:e?.entities||{},lastSuccess:0,error:"registry_unavailable"};let i=e?.devices||{},n=e?.entities||{};if(t.authoritative){const r=t.liveDevices!==i||t.liveEntities!==n,o=void 0!==t.liveDevices||void 0!==t.liveEntities;if(r&&(t.liveDevices=i,t.liveEntities=n,t.projectedRevision=void 0,o&&id(e,t)),t.projectedRevision!==t.revision||!t.projectedDevices||!t.projectedEntities){const e={...t.devices},r={...t.entities};for(const[t,n]of Object.entries(i))Object.prototype.hasOwnProperty.call(e,t)||(e[t]=n);for(const[e,t]of Object.entries(n))Object.prototype.hasOwnProperty.call(r,e)||(r[e]=t);t.projectedDevices=e,t.projectedEntities=r,t.projectedRevision=t.revision}i=t.projectedDevices,n=t.projectedEntities}return{revision:t.revision,authoritative:t.authoritative,access:t.access,devices:i,entities:n,lastSuccess:t.lastSuccess,error:t.error}}function ad(e){if(!e||"object"!=typeof e&&"function"!=typeof e)return 0;let t=Yh.get(e);return t||(t=Xh++,Yh.set(e,t)),t}function ld(e,t=sd(e)){return[t.revision,t.access,ad(t.devices),ad(t.entities)].join(":")}function cd(e){return!!e&&null==e.disabled_by}function hd(e,t=sd(e)){const i={},n={},r={};for(const[e,n]of Object.entries(t.devices||{}))cd(n)&&(i[e]=n);for(const[e,i]of Object.entries(t.entities||{})){if(!cd(i))continue;const r=i.device_id?t.devices?.[i.device_id]:null;t.authoritative&&i.device_id&&!r||(r&&!cd(r)||(n[e]=i))}for(const[i,n]of Object.entries(e?.states||{})){const e=t.entities?.[i];if(e&&!cd(e))continue;const o=e?.device_id?t.devices?.[e.device_id]:null;t.authoritative&&e?.device_id&&!o||(o&&!cd(o)||(r[i]=n))}return{...e,devices:i,entities:n,states:r}}function dd(e,t=sd(e)){return{...e,devices:t.devices||{},entities:t.entities||{}}}function ud(e,t){const i=[];for(const[n,r]of Object.entries(e||{}))r?.device_id===t&&i.push(n);return i}function pd(){if(Jh)return Jh;if("undefined"==typeof localStorage)return{};try{const e=JSON.parse(localStorage.getItem(Zh)||"{}");if(!e||"object"!=typeof e||Array.isArray(e))return{};const t=Date.now(),i={};for(const[n,r]of Object.entries(e))!r||"active"!==r.kind&&"ha_disabled"!==r.kind||!Number.isFinite(r.ts)||t-r.ts>7776e6||(i[n]=r);return Jh=i,Jh}catch{return{}}}function _d(e,t,i=sd(e)){if(!t||"virtual"===t)return{kind:"active",enabledEntityIds:[],allEntityIds:[]};const n=t.indexOf(":");if(n<1)return{kind:"unverified",reason:"registry_unavailable",enabledEntityIds:[],allEntityIds:[]};const r=t.slice(0,n),o=t.slice(n+1);if("device"!==r&&"entity"!==r||!o)return{kind:"unverified",reason:"registry_unavailable",enabledEntityIds:[],allEntityIds:[]};const s=i.devices||{},a=i.entities||{};if(i.authoritative){if("device"===r){const e=s[o];if(!e)return{kind:"orphaned",reason:"device_missing",enabledEntityIds:[],allEntityIds:[]};const t=ud(a,o);if(!cd(e))return{kind:"ha_disabled",reason:"device",enabledEntityIds:[],allEntityIds:t};const i=t.filter(e=>cd(a[e]));return t.length&&!i.length?{kind:"ha_disabled",reason:"all_entities",enabledEntityIds:[],allEntityIds:t}:{kind:"active",enabledEntityIds:i,allEntityIds:t}}const t=a[o];return t&&!cd(t)?{kind:"ha_disabled",reason:"entity",enabledEntityIds:[],allEntityIds:[o]}:t?.device_id&&!s[t.device_id]?{kind:"orphaned",reason:"device_missing",enabledEntityIds:[],allEntityIds:[o]}:t?.device_id&&!cd(s[t.device_id])?{kind:"ha_disabled",reason:"device",enabledEntityIds:[],allEntityIds:[o]}:t||e?.states?.[o]?{kind:"active",enabledEntityIds:[o],allEntityIds:[o]}:{kind:"orphaned",reason:"entity_missing",enabledEntityIds:[],allEntityIds:[]}}const l=function(e){return pd()[e]||null}(t);if("device"===r){const t=s[o],i=ud(a,o);if(null!=t?.disabled_by)return{kind:"ha_disabled",reason:"device",enabledEntityIds:[],allEntityIds:i};const n=i.filter(e=>{const t=a[e];return null==t?.disabled_by&&(!t.device_id||null==s[t.device_id]?.disabled_by)});if(i.length&&!n.length&&i.every(e=>null!=a[e]?.disabled_by))return{kind:"ha_disabled",reason:"all_entities",enabledEntityIds:[],allEntityIds:i};if("ha_disabled"===l?.kind)return{kind:"ha_disabled",reason:l.reason||"device",enabledEntityIds:[],allEntityIds:i};if(t||n.some(t=>!!e?.states?.[t]))return{kind:"active",enabledEntityIds:n,allEntityIds:i}}else{const t=a[o];if(null!=t?.disabled_by)return{kind:"ha_disabled",reason:"entity",enabledEntityIds:[],allEntityIds:[o]};if(t?.device_id&&null!=s[t.device_id]?.disabled_by)return{kind:"ha_disabled",reason:"device",enabledEntityIds:[],allEntityIds:[o]};if("ha_disabled"===l?.kind)return{kind:"ha_disabled",reason:l.reason||"entity",enabledEntityIds:[],allEntityIds:[o]};if(t||e?.states?.[o])return{kind:"active",enabledEntityIds:[o],allEntityIds:[o]}}return{kind:"unverified",reason:"registry_unavailable",enabledEntityIds:[],allEntityIds:[]}}function md(e){const t=sd(e);return{access:t.access,authoritative:t.authoritative,revision:t.revision,lastSuccess:t.lastSuccess,error:t.error}}function gd(e){const t={};for(const[i,n]of Object.entries(e.entities)){if(!n?.device_id||!cd(n))continue;const r=e.devices?.[n.device_id];r&&!cd(r)||(t[n.device_id]=t[n.device_id]||[]).push(i)}return t}function fd(e,t){const i=new Map;for(const n of e){if(!0===n?.removed)continue;const e=n?.binding||"";if(!e.startsWith("entity:"))continue;const r=e.slice(7);if(!r)continue;const o=t?.entities?.[r]?.device_id;if(!o)continue;const s=i.get(o)||new Set;s.add(r),i.set(o,s)}return{byDevice:i}}function vd(e,t,i,n){const r=n.byDevice.get(t);return r?.size?{partial:!0,entityIds:i.filter(t=>!r.has(t)&&!e?.entities?.[t]?.hidden)}:{partial:!1,entityIds:[...i]}}function yd(e,t,i){if(t.identifiers?.[0]?.[0])return t.identifiers[0][0];for(const t of i){const i=e.entities[t]?.platform;if(i)return i}return""}function bd(e,t){if(/_device_temperature$/.test(t))return!1;if(e.entities?.[t]?.entity_category)return!1;const i=e.states[t];if(!i)return/_temperature$/.test(t);const n=i.attributes||{};return"temperature"===n.device_class||/°C|°F/.test(n.unit_of_measurement||"")||/_temperature$/.test(t)}const wd=["vacuum","lawn_mower","climate","media_player","light","cover","lock","valve","alarm_control_panel","water_heater","fan","humidifier","siren","camera","remote"],kd=e=>[...e.filter(e=>!e.reg?.hidden),...e.filter(e=>!!e.reg?.hidden)];function xd(e,t){const i=t.map(t=>({eid:t,reg:e?.entities?.[t]})).filter(e=>!!e.reg);if(!i.length)return[];const n=i.filter(e=>!e.reg.entity_category),r=n.length?n:i;for(const e of wd){const t=r.filter(t=>t.eid.startsWith(e+"."));if(t.length)return kd(t).map(e=>e.eid)}const o=r.filter(t=>function(e,t){if(!t.startsWith("binary_sensor."))return!1;const i=Ch(e?.states?.[t]?.attributes?.device_class||e?.entities?.[t]?.device_class||e?.entities?.[t]?.original_device_class);return vh.has(i)||yh.has(i)||bh.has(i)||wh.has(i)||"moving"===i||kh.has(i)}(e,t.eid));if(o.length)return kd(o).map(e=>e.eid);const s=r.filter(e=>e.eid.startsWith("switch."));if(s.length){const t=kd(s),n=t.find(t=>zh(e,t.eid));if(s.length>1&&n){const t=i.filter(t=>t.eid!==n.eid&&"config"!==t.reg?.entity_category&&null!=Ph(e,t.eid)),r=t.filter(e=>!e.reg?.entity_category),o=r.length?r:t;for(const t of[0,1,2]){const i=kd(o.filter(i=>Ph(e,i.eid)===t));if(i.length)return[i[0].eid,n.eid]}}return[(n||t[0]).eid]}const a=[];for(const e of je)a.push(...kd(r.filter(t=>t.eid.startsWith(e+"."))));return a.push(...kd(r.filter(e=>!je.includes(e.eid.split(".")[0])))),a.map(e=>e.eid)}function Sd(e,t,i){const n=t.map(t=>({eid:t,reg:e.entities[t],st:e.states[t]})).filter(e=>e.reg),r=[n.filter(e=>!e.reg.hidden&&!e.reg.entity_category),n.filter(e=>!e.reg.entity_category),n.filter(e=>!e.reg.hidden),n];if("mdi:thermometer"===i||"mdi:air-filter"===i)for(const t of r){const i=t.find(t=>bd(e,t.eid));if(i)return i.eid}const o=xd(e,t);return o.find(Pn)||o[0]}function $d(e,t,i=[]){return[...new Set(Md(e,t,i))].filter(e=>Pn(e))}function Md(e,t,i=[]){const n=e?.startsWith("entity:")?new Set([e.slice(7)]):new Set(i);return(t||[]).filter(e=>"string"==typeof e&&!n.has(e))}function Rd(e,t){if("string"==typeof t)return e.area===t;const i=e.marker?.room_id;return i?!!t.id&&i===t.id:!!t.area&&e.area===t.area}function Cd(e){const t=e.marker?.binding?.startsWith("entity:")?e.marker.binding.slice(7):null,i=e.entities.filter(Pn),n=e.primary&&Pn(e.primary)?e.primary:null;return[...new Set([t,n,...i].filter(e=>!!e&&Pn(e)))]}function Td(e){const t=Cd(e),i=e.marker?.light_entity;return i&&t.includes(i)?i:t[0]||null}function Dd(e,t){if(!1===t.marker?.is_light)return[];if(!0===t.marker?.is_light){return[{eid:Td(t),via:"forced"}]}const i=t.primary||xd(e,t.entities)[0];return i&&!i.startsWith("light.")?[]:t.entities.filter(t=>t.startsWith("light.")&&!!e.states?.[t]).map(e=>({eid:e,via:"light"}))}const Ad=new WeakMap,Pd=new WeakMap;function Fd(e){return e.map(e=>[e.id||"",!0===e.hidden?1:0,e.primary||"",[...e.entities].join(","),void 0===e.controls?"":[...e.controls].join(","),e.marker?.id||"",e.marker?.binding||"",e.marker?.is_light,e.marker?.tap_action||"",!0===e.marker?.removed?1:0,e.marker?.light_entity||"",null==e.marker?.controls?"":[...e.marker.controls].join(",")].join("")).join("")}function zd(e){const t=Fd(e),i=Ad.get(e);if(i?.fingerprint===t)return i;const n=e.filter(e=>!e.hidden),r=new Map,o=new Map;for(const t of e){o.set(t,Md(t.marker?.binding,t.marker?.controls??t.controls,t.entities));const e=t.hidden||!0!==t.marker?.is_light?null:t.marker?.id||t.id;e&&r.set(String(e),t)}const s=new Map;for(const t of e){const e=o.get(t)||[],i=new Set(void 0===t.controls?e.filter(Pn):t.controls.filter(Pn)),n=Td(t),a=i.size?[...i]:n?[n]:[];for(const i of e){if(!i.startsWith("marker:"))continue;const e=i.slice(7);if(!e||e===String(t.marker?.id||t.id||""))continue;if(!r.has(e))continue;const n=s.get(e)||{markerId:e,controllers:[],driverEids:[]};n.controllers.push({device:t,driverEids:[...a]}),n.driverEids=[...new Set([...n.driverEids,...a])],s.set(e,n)}}const a={fingerprint:t,visible:n,markerById:r,persistedByDevice:o,incomingByMarker:s};return Ad.set(e,a),a}function Id(e){return zd(e).incomingByMarker}function Od(e,t){const i=$d(t.marker?.binding,t.controls??t.marker?.controls,t.entities),n=Md(t.marker?.binding,t.marker?.controls??t.controls,t.entities);return(null!=t.marker?.is_light||!i.length&&!n.some(e=>e.startsWith("marker:")))&&Dd(e,t).length>0}function Ed(e,t){return Dd(e,t).some(e=>!!e.eid)}function Nd(e,t,i,n){const r="always"===e||"auto"===e&&t,o=r&&!i;return{sourceExists:r,fromSourceEnabled:r&&i,manualEnabled:r,radiusEnabled:r,passive:o,effectiveMode:o&&"auto"===n?"fixed":n}}function Hd(e,t){const i=$d(t.marker?.binding,t.controls??t.marker?.controls,t.entities).map(e=>({eid:e,via:"controls"})),n=Od(e,t)?Dd(e,t):[];for(const e of n)e.eid&&i.some(t=>t.eid===e.eid)||i.push(e);return i}function Ld(e,t,i,n){if(null!=i)return Ld(e,t,null,n).filter(e=>Rd(e.device,i));const r=Fd(t),o=function(e,t){const i=new Set;for(const e of t){for(const t of e.entities)i.add(t);for(const t of e.controls||e.marker?.controls||[])"string"!=typeof t||t.startsWith("marker:")||i.add(t)}return[...i].sort().map(t=>`${t}:${e?.states?.[t]?.state??""}`).join("|")}(e,t),s=Wh(n),a=Pd.get(t);if(a?.graphFingerprint===r&&a.stateFingerprint===o&&a.virtualLightFingerprint===s&&a.registry===e?.entities)return a.sources;const{visible:l,markerById:c,persistedByDevice:h,incomingByMarker:d}=zd(t),u=null==i?l:l.filter(e=>Rd(e,i)),p=new Map,_=new Map;for(const t of u){const i=Hd(e,t).filter(e=>"controls"!==e.via);for(const n of i){const i=!0===t.marker?.is_light?String(t.marker?.id||t.id||""):"",r=i?`marker:${i}`:`entity:${n.eid}`,o=n.eid?[n.eid]:[],s={key:r,eid:n.eid||"",stateEids:o,serviceEids:o,device:t,via:n.via,castsGlow:!0,passive:!n.eid,on:!n.eid||"on"===e.states?.[n.eid]?.state};p.set(t,[...p.get(t)||[],s]),n.eid&&_.set(n.eid,s)}}const m=new Map;for(const e of t){const t=h.get(e)||[],i=new Set(void 0===e.controls?t.filter(Pn):e.controls);m.set(e,i)}for(const t of p.values())for(const i of t){if(!i.passive)continue;const t=i.key.slice(7),r=d.get(t);i.on=!r||r.driverEids.some(t=>"on"===e.states?.[t]?.state),!r&&Uh(i.device.marker)&&(i.on=Gh(i.device.marker,n))}const g=new Map,f=e=>{const t=g.get(e.key);(!t||e.castsGlow&&!t.castsGlow)&&g.set(e.key,e)};for(const t of l){const n=h.get(t)||[],r=null==i||Rd(t,i);for(const i of n){if(i.startsWith("marker:")){const e=c.get(i.slice(7)),t=e?p.get(e):null;if(t)for(const e of t)f(e);continue}if(!Pn(i)||!m.get(t)?.has(i))continue;const n=_.get(i);n?f(n):r&&f({key:`entity:${i}`,eid:i,stateEids:[i],serviceEids:[i],device:t,via:"controls",castsGlow:!1,passive:!1,on:"on"===e.states?.[i]?.state})}for(const e of p.get(t)||[])f(e)}const v=[...g.values()];return Pd.set(t,{graphFingerprint:r,stateFingerprint:o,virtualLightFingerprint:s,registry:e?.entities,sources:v}),v}function Bd(e){const t=e.filter(e=>e.castsGlow);return t.find(e=>e.on)||t[0]||null}function qd(e){return e.length?e.some(e=>e.on)?"on":"off":"none"}function jd(e,t){const i=[];for(const n of t){const t=e.states[n];if(!t)continue;const r=(t.attributes?.unit_of_measurement||"").toLowerCase();if(/_(linkquality|lqi)$/.test(n)||"lqi"===r){const e=parseFloat(t.state);isNaN(e)||i.push(e);continue}const o=t.attributes?.linkquality??t.attributes?.lqi;if(null!=o){const e=parseFloat(o);isNaN(e)||i.push(e)}}return Ii(i)}function Wd(e,t){for(const i of t){if(!bd(e,i))continue;const t=e.states[i];if(!t)continue;const n=parseFloat(t.state);if(!isNaN(n))return Math.round(10*n)/10}return null}function Ud(e,t){for(const i of t){if(!i.startsWith("climate."))continue;const t=e.states[i];if(!t||"unavailable"===t.state||"unknown"===t.state)continue;const n=parseFloat(t.attributes?.current_temperature);if(Number.isFinite(n))return Math.round(10*n)/10}return null}function Gd(e,t){if(e.entities?.[t]?.entity_category)return!1;const i=e.states[t];if(!i)return/_humidity$/.test(t);const n=i.attributes||{};return"humidity"===n.device_class||"%"===n.unit_of_measurement&&/_humidity$/.test(t)||/_humidity$/.test(t)}function Vd(e,t){for(const i of t){if(!Gd(e,i))continue;const t=e.states[i];if(!t)continue;const n=parseFloat(t.state);if(!isNaN(n))return Math.round(n)}return null}function Kd(e,t){if(!t)return[];const i=[];for(const[t,n]of Object.entries(e.entities)){if(!t.startsWith("light.")||n.hidden||!cd(n))continue;let r=null;if("group"===n.platform)r=n.area_id||null;else{if(!n.device_id)continue;{const t=e.devices[n.device_id];if(!cd(t))continue;if("Group"!==t?.model)continue;r=t.area_id||n.area_id||null}}if(!r)continue;const o=e.states[t];i.push({eid:t,name:n.name||o?.attributes?.friendly_name||t,area:r})}return i}function Yd(e,t,i,n,r){const o=qe(t,i,r);if(o!==Be)return o;const s=[];for(const t of n){const i=e.states[t]?.attributes?.device_class;i&&s.push(i)}return function(e){for(const t of e){const e=Le[t];if(e)return e}return null}(s)??Be}function Xd(e,t){return e.map(e=>{if(!Array.isArray(e.controls))return e;const i=e.controls.filter(e=>!("string"==typeof e&&e.startsWith("marker:")&&t.has(e.slice(7))));return i.length===e.controls.length?e:{...e,controls:i.length?i:null}})}function Zd(e,t,i){if(!t||!i||t===i)return[...e];const n=`marker:${t}`,r=`marker:${i}`;return e.map(e=>{const t=Array.isArray(e.controls)?e.controls.map(e=>e===n?r:e):e.controls,i="derived_marker_state"===e.value_badge?.source?.kind&&e.value_badge.source.ref===n?{...e.value_badge,source:{...e.value_badge.source,ref:r}}:e.value_badge,o="derived_marker_state"===e.value_source?.kind&&e.value_source.ref===n?{...e.value_source,ref:r}:e.value_source;return t===e.controls&&i===e.value_badge&&o===e.value_source?e:{...e,controls:t,...void 0!==i?{value_badge:i}:{},...void 0!==o?{value_source:o}:{}}})}function Jd(e,t,i){if(!t||t===i)return!0;const n=new Map;for(const t of e)n.set(t.id,(t.controls||[]).filter(e=>"string"==typeof e&&e.startsWith("marker:")).map(e=>e.slice(7)));const r=new Set,o=[i];for(;o.length;){const e=o.pop();if(e===t)return!0;r.has(e)||(r.add(e),o.push(...n.get(e)||[]))}return!1}function Qd(e,t,i,n){const r=new Set([t]),o=e.filter(e=>{const o=e.id===t||!n&&e.binding===i;return o&&r.add(e.id),!o});return{markers:n?o:[...o,{id:t,binding:i,removed:!0,hidden:!0}],cleanupIds:r}}function eu(e){const t=new Set,i=new Set,n=new Set;for(const r of e||[]){const e=String(r.binding||"").indexOf(":");if(e<1)continue;const o=r.binding.slice(0,e),s=r.binding.slice(e+1);s&&(!0===r?.removed?"device"===o?t.add(s):"entity"===o&&i.add(s):"entity"===o&&n.add(s))}return{devices:t,entities:i,liveEntities:n}}function tu(e,t,i){if(i.liveEntities.has(t))return!1;if(i.entities.has(t))return!0;const n=e?.entities?.[t]?.device_id;return!!n&&i.devices.has(n)}function iu(e,t,i,n,r){const o=$d(t.binding,t.controls,e.entities).filter(e=>!tu(i,e,n)).filter(e=>"active"===_d(i,"entity:"+e,r).kind);e.marker=t,e.controls=o,e.userHidden=!0===t.hidden,e.hidden=e.userHidden||"ha_disabled"===e.bindingStatus?.kind,t.name&&(e.name=t.name),t.icon&&(e.icon=t.icon),null!=t.model&&(e.model=t.model),e.link=t.link??null,e.description=t.description??null,e.pdfs=t.pdfs||[],e.tapAction=t.tap_action??null}function nu(e){const t=e.hass,i=e.registry||sd(t),n=hd(t,i),r=dd(t,i),{areaToSpace:o,markers:s,settings:a,excluded:l,iconRules:c}=e,h=!1!==a.group_lights,d=eu(s),u=Kd(n,h).filter(e=>!tu(n,e.eid,d)),p=new Set(u.map(e=>e.area)),_=gd(n),m=fd(s,r),g=new Set(s.map(e=>e.binding)),f=[];for(const e of Object.values(n.devices)){const r=e.area_id;if(!r||!o[r])continue;if("service"===e.entry_type)continue;if(g.has("device:"+e.id))continue;if("active"!==_d(t,"device:"+e.id,i).kind)continue;const s=vd(n,e.id,_[e.id]||[],m);if(s.partial&&!s.entityIds.length)continue;const a=s.entityIds,d=yd(n,e,a);let u=l.has(d)||"Group"===e.model||/scene/i.test(e.model||"")||/bridge/i.test((e.model||"")+(e.name||""))||"myheat"===d&&!!e.via_device_id;if(!u&&h&&p.has(r)){const t=(e.name_by_user||e.name||"").trim();"mdi:lightbulb"===Yd(n,t,e.model,a,c)&&(u=!0)}u&&f.push("device:"+e.id)}return f}function ru(e,t,i,n){if("string"==typeof e.room_id&&e.room_id.length>0&&null===e.area)return{area:"",space:e.space||n};const r=e.area||t||"";return{area:r,space:r&&i[r]||e.space||n}}function ou(e){const t=e.hass,i=e.registry||sd(t),n=hd(t,i),r=dd(t,i),{areaToSpace:o,markers:s,settings:a,excluded:l,showAll:c,firstSpaceId:h,loc:d,iconRules:u}=e,p=!1!==a.group_lights,_=eu(s),m=Kd(n,p).filter(e=>!tu(n,e.eid,_)),g=new Set(m.map(e=>e.area)),f=gd(n),v=function(e){const t={};for(const[i,n]of Object.entries(e.entities||{}))n?.device_id&&(t[n.device_id]=t[n.device_id]||[]).push(i);return t}(r),y=fd(s,r),b=new Set;for(const e of s){const[t,i]=e.binding.split(":");"device"!==t&&"entity"!==t||!i||b.add(e.binding)}const w=(e,t)=>s.find(i=>i.binding===e+":"+t),k={},x=[];for(const e of Object.values(n.devices)){const r=e.area_id;if(!r||!o[r])continue;if("service"===e.entry_type)continue;if(b.has("device:"+e.id))continue;const s=_d(t,"device:"+e.id,i);if("active"!==s.kind)continue;const h=w("device",e.id);if(h&&h.hidden&&!a.filter_seeded)continue;const _=vd(n,e.id,f[e.id]||[],y);if(_.partial&&!_.entityIds.length)continue;const m=_.entityIds,v=_.partial?{kind:"active",enabledEntityIds:m,allEntityIds:m}:s,S=yd(n,e,m),$=!a.filter_seeded;if($&&!c){if(l.has(S))continue;if("Group"===e.model)continue;if(/scene/i.test(e.model||""))continue;if(/bridge/i.test((e.model||"")+(e.name||"")))continue;if("myheat"===S&&e.via_device_id)continue}const M=(e.name_by_user||e.name||d("device.unnamed")).trim(),R=M+"|"+r;let C=Yd(n,M,e.model,m,u);if(m.some(e=>e.startsWith("lock."))&&(C="mdi:lock"),$&&!c&&p&&"mdi:lightbulb"===C&&g.has(r))continue;k[R]=(k[R]||0)+1;const T=k[R]>1?M+" "+k[R]:M,D={id:e.id,name:T,model:e.model||"",area:r,space:o[r],icon:C,entities:m,allEntities:v.allEntityIds,bindingStatus:v,bindingKind:"device",bindingRef:e.id,pdfs:[]};D.primary=Sd(n,m,C),"mdi:thermometer"!==C&&"mdi:air-filter"!==C||(D.temp=Wd(n,m)),D.primary&&Gd(n,D.primary)&&(D.hum=Vd(n,m)),x.push(D)}for(const e of m)o[e.area]&&(b.has("entity:"+e.eid)||x.push({id:"lg_"+e.eid,name:e.name,model:d("device.light_group"),area:e.area,space:o[e.area],icon:"mdi:lightbulb-group",entities:[e.eid],allEntities:[e.eid],bindingStatus:{kind:"active",enabledEntityIds:[e.eid],allEntityIds:[e.eid]},primary:e.eid,bindingKind:"entity",bindingRef:e.eid,pdfs:[]}));for(const e of s){if(e.removed)continue;const[s,l]=e.binding.split(":"),c="device"===s||"entity"===s?_d(t,e.binding,i):null;if(!e.hidden||a.filter_seeded||"ha_disabled"===c?.kind)if("device"===s){const t=c;if("unverified"===t.kind)continue;const s=r.devices[l],{area:a,space:p}=ru(e,s?.area_id,o,h),m="active"===t.kind?t.enabledEntityIds:[];let g=s?Yd(n,s.name_by_user||s.name||"",s.model,m,u):"mdi:help-circle";m.some(e=>e.startsWith("lock."))&&(g="mdi:lock");const f={id:e.id,name:s?.name_by_user||s?.name||d("device.fallback"),model:s?.model||"",area:a,space:p,icon:g,entities:m,allEntities:t.allEntityIds.length?t.allEntityIds:s&&v[s.id]||[],bindingStatus:t,bindingKind:"device",bindingRef:l};f.primary=Sd(n,m,g),"mdi:thermometer"!==g&&"mdi:air-filter"!==g||(f.temp=Wd(n,m)),f.primary&&Gd(n,f.primary)&&(f.hum=Vd(n,m)),iu(f,e,r,_,i),x.push(f)}else if("entity"===s){if(tu(r,l,_))continue;const t=c;if("unverified"===t.kind)continue;const s=r.entities[l],a=s?.area_id||s?.device_id&&r.devices[s.device_id]?.area_id||"",{area:d,space:p}=ru(e,a,o,h),m=n.states[l],g=s?.name||m?.attributes?.friendly_name||l;let f=Yd(n,g,"",[l],u);l.startsWith("lock.")&&(f="mdi:lock");const v={id:e.id,name:g,model:"",area:d,space:p,icon:f,entities:"active"===t.kind?[l]:[],allEntities:[l],bindingStatus:t,primary:"active"===t.kind?l:void 0,bindingKind:"entity",bindingRef:l};"mdi:thermometer"!==f&&"mdi:air-filter"!==f||!v.entities.length||(v.temp=Wd(n,v.entities)),v.entities.length&&Gd(n,l)&&(v.hum=Vd(n,v.entities)),iu(v,e,r,_,i),x.push(v)}else{const t=e.area||"",n=e.space||t&&o[t]||h,s={id:e.id,name:e.name||d("device.virtual"),model:e.model||"",area:t,space:n,icon:e.icon||"mdi:map-marker",entities:[],allEntities:[],bindingStatus:{kind:"active",enabledEntityIds:[],allEntityIds:[]},bindingKind:"virtual",virtual:!0};iu(s,e,r,_,i),x.push(s)}}return x}function su(e){const{marker:t,siblingMarkers:i=[],...n}=e;return ou({...n,markers:[...i.filter(e=>e.id!==t.id),t]}).find(e=>e.id===t.id)||null}function au(e,t,i,n){if(!t)return null;if(function(e,t,i){if(!t)return!1;const n=t.indexOf(":");if(n<1)return!1;const r=t.slice(0,n),o=t.slice(n+1),s=eu(i);return"device"===r?s.devices.has(o):"entity"===r&&tu(e,o,s)}(e,t,n))return null;const r=t.indexOf(":");if(r<0)return null;const o=t.slice(0,r),s=t.slice(r+1);if(!s)return null;if("entity"===o){const t=parseFloat(e.states[s]?.state);return Number.isFinite(t)?"temp"===i?Math.round(10*t)/10:Math.round(t):null}if("device"===o){const t=Object.entries(e.entities).filter(([,e])=>e.device_id===s).map(([e])=>e);return"temp"===i?Wd(e,t):Vd(e,t)}return null}const lu=new RegExp(["water","voda","coolant","flow_?temp","return_?temp","target","setpoint","chip","cpu","processor","board","core_temp","device_temp","batter","akkum","freezer","fridge","oven","kettle","boiler"].join("|"),"i");function cu(e,t){return t.area?t.area:e&&t.id?`@room/${encodeURIComponent(e)}/${encodeURIComponent(t.id)}`:null}function hu(e){return null==e.area&&e.space&&e.room_id?cu(e.space,{id:e.room_id,area:null}):e.area||null}function du(e){const t=e?.exclude_integrations;return t?new Set(t):Ie}function uu(e,t,i,n=Ie){const r=new Map;if(!e?.entities)return r;const o=eu(i),s=new Set,a=new Map,l=new Map;for(const e of i||[]){if(e?.removed)continue;const t=(e.binding||"").indexOf(":");if(t<=0)continue;const i=e.binding.slice(0,t),n=e.binding.slice(t+1);if(!n)continue;!0===e.use_climate_temp&&s.add(n);const r=hu(e);r&&("entity"!==i||a.has(n)?"device"!==i||l.has(n)||l.set(n,r):a.set(n,r))}const c=new Map;for(const[t,i]of Object.entries(e.entities)){if(i.device_id&&o.devices.has(i.device_id)&&!o.liveEntities.has(t)||!i.device_id&&o.entities.has(t)&&!o.liveEntities.has(t))continue;const r=i.device_id?e.devices?.[i.device_id]:null;if(!cd(i)||r&&!cd(r))continue;const h=a.get(t)||(i.device_id?l.get(i.device_id):null)||i.area_id||r?.area_id||null;if(!h)continue;if(i.entity_category)continue;if(!(s.size>0&&t.startsWith("climate.")&&(s.has(t)||i.device_id&&s.has(i.device_id)))){if(n.has(i.platform))continue;if(lu.test(t))continue}let d=c.get(h);d||(d=new Map,c.set(h,d));const u=i.device_id||t;let p=d.get(u);if(!p){const n=e.states?.[t];p={name:(r?r.name_by_user||r.name:i.name||n?.attributes?.friendly_name||t)||t,model:r?.model,ents:[]},d.set(u,p)}p.ents.push(t)}for(const[i,n]of c){const o=[],a=[];for(const[i,r]of n){const n=Yd(e,r.name,r.model,r.ents,t),l="mdi:thermometer"===n||"mdi:air-filter"===n;if(l){const t=Wd(e,r.ents);null!=t&&o.push(t)}if(s.size>0&&(s.has(i)||r.ents.some(e=>s.has(e)))){const t=Ud(e,r.ents);null!=t&&o.push(t)}if(l||"mdi:water-percent"===n){const t=Vd(e,r.ents);null!=t&&a.push(t)}}(o.length||a.length)&&r.set(i,{temp:o.length?Math.round(o.reduce((e,t)=>e+t,0)/o.length*10)/10:null,hum:a.length?Math.round(a.reduce((e,t)=>e+t,0)/a.length):null})}return r}function pu(e,t,i){const n=[];for(const r of t){if(r.area!==i||r.virtual)continue;const t=jd(e,r.entities);null!=t&&n.push(t)}return Ii(n)}const _u={offStates:["off"],unknownUsesToggle:!0},mu={light:_u,switch:_u,fan:_u,humidifier:_u,input_boolean:_u,automation:_u,remote:_u,group:_u,climate:{..._u,featureMasks:{turn_on:256,turn_off:128,toggle:384}},media_player:{..._u,featureMasks:{turn_on:128,turn_off:256,toggle:384}},siren:{..._u,featureMasks:{turn_on:1,turn_off:2,toggle:3}},vacuum:{..._u,featureMasks:{turn_on:1,turn_off:2,toggle:3}},water_heater:{..._u,featureMasks:{turn_on:8,turn_off:8,toggle:8}},camera:{..._u,featureMasks:{turn_on:1,turn_off:1,toggle:1}}};function gu(e){return e.slice(0,e.indexOf("."))}function fu(e,t,i){if(!e?.services||"object"!=typeof e.services)return!1;const n=e.services?.[t];return!!n&&Object.prototype.hasOwnProperty.call(n,i)}function vu(e,t,i){return fu(e,t,i)?{domain:t,service:i}:fu(e,"homeassistant",i)?{domain:"homeassistant",service:i}:null}function yu(e,t){return e?.entities?.[t]||null}function bu(e,t,i){const n=e?.states?.[i],r=yu(t,i);return n?.attributes?.friendly_name||r?.name||r?.original_name||i}function wu(e,t){const i=yu(e,t);if(null!=i?.disabled_by)return!0;const n=i?.device_id?e?.devices?.[i.device_id]:null;return null!=n?.disabled_by}function ku(e,t){const i=e?.attributes?.supported_features;if(null==i||""===i)return!1;const n=Number(i);return Number.isFinite(n)&&(n&t)===t}function xu(e,t,i){const n=gu(i);if("lock"===n||"alarm_control_panel"===n)return!0;if("cover"!==n)return!1;const r=e?.states?.[i],o=yu(t,i),s=String(r?.attributes?.device_class||o?.device_class||o?.original_device_class||"");return Gi.has(s)}function Su(e,t,i,n,r){return{ref:i,entityId:n,name:n?bu(e,t,n):null,reason:r}}function $u(e,t,i,n,r,o=null){return{target:null,skipped:Su(e,t,i,n,r),semantics:o,nextEffect:null,command:null}}function Mu(e,t,i,n,r=i){const o=gu(i);if("cover"!==o&&"valve"!==o)return function(e,t,i,n,r=i){const o=gu(i),s=e?.states?.[i];if(wu(t,i))return $u(e,t,r,i,"ha-disabled","power");if(xu(e,t,i))return $u(e,t,r,i,"secure");if(!s)return $u(e,t,r,i,"missing","power");if("unavailable"===s.state)return $u(e,t,r,i,"unavailable","power");const a=mu[o];if(!a)return $u(e,t,r,i,"unsupported");let l,c;if("unknown"===s.state||""===s.state){if(!a.unknownUsesToggle)return $u(e,t,r,i,"unsupported","power");l="toggle",c="toggle"}else a.offStates.includes(String(s.state))?(l="turn-on",c="turn_on"):(l="turn-off",c="turn_off");const h=a.featureMasks?.[c];if(h&&!ku(s,h))return $u(e,t,r,i,"unsupported","power");const d=vu(e,o,c);return d?{target:{entityId:i,name:bu(e,t,i),state:String(s.state||""),via:n},skipped:null,semantics:"power",nextEffect:l,command:{...d,data:{entity_id:i}}}:$u(e,t,r,i,"unsupported","power")}(e,t,i,n,r);if(wu(t,i))return $u(e,t,r,i,"ha-disabled",o);if(xu(e,t,i))return $u(e,t,r,i,"secure",o);const s=e?.states?.[i];if(!s)return $u(e,t,r,i,"missing",o);if("unavailable"===s.state)return $u(e,t,r,i,"unavailable",o);const a=function(e,t,i){const n=String(i?.state||""),r="closed"===n?{service:`open_${t}`,effect:"open",feature:1}:"open"===n?{service:`close_${t}`,effect:"close",feature:2}:"opening"===n||"closing"===n?{service:`stop_${t}`,effect:"stop",feature:8}:null;return r&&ku(i,r.feature)&&fu(e,t,r.service)?r:ku(i,3)&&fu(e,t,"toggle")?{service:"toggle",effect:"toggle"}:null}(e,o,s);if(!a)return $u(e,t,r,i,"unsupported",o);return{target:{entityId:i,name:bu(e,t,i),state:String(s.state||""),via:n},skipped:null,semantics:o,nextEffect:a.effect,command:{domain:o,service:a.service,data:{entity_id:i}}}}function Ru(e){return"entity"===e.bindingKind?e.bindingRef&&Pn(e.bindingRef)?[e.bindingRef]:[]:"virtual"===e.bindingKind?[]:Cd(e)}function Cu(e){const t=e.marker?.toggle_entity;return t&&Ru(e).includes(t)?t:null}function Tu(e,t,i){const n=function(e,t){if("entity"===e.bindingKind&&e.bindingRef){const t=e.marker?.light_entity?Td(e):null;return[...new Set([t,e.bindingRef].filter(e=>!!e))]}const i=e.entities.length?e.entities:e.allEntities||[],n=e.marker?.light_entity||e.primary&&Pn(e.primary)?Td(e):null;return[...new Set([n,...xd(t,i)].filter(e=>!!e))]}(i,t);if(!n.length)return null;const r="entity"===i.bindingKind?"binding":"device-role";if("binding"===r)return Mu(e,t,n[0],r);let o=null,s=null;for(const i of n){const n=Mu(e,t,i,r);if(n.command)return n;const a=n.skipped?.reason;if("missing"===a||"unavailable"===a||"secure"===a)return n;"ha-disabled"!==a?o||=n:s||=n}return o||s}function Du(e){const t=e.skipped?.reason;return"missing"===t?"unavailable":t||"unsupported"}function Au(e,t){return{origin:e,kind:"none",semantics:null,targets:[],skippedTargets:[],noneReason:t,nextEffect:null,command:null}}function Pu(e,t){return"cover"===e||"toggle"===e?"toggle":"more-info"===e||"run"===e||"info"===e||"none"===e?e:(null==e||""===e)&&"light"===t?"toggle":"info"}function Fu(e,t){return{origin:e,kind:"single",semantics:t.semantics,targets:t.target?[t.target]:[],skippedTargets:t.skipped?[t.skipped]:[],noneReason:t.command?null:Du(t),nextEffect:t.nextEffect,command:t.command}}function zu(e,t,i,n=[]){const r=new Map,o=[],s=new Set,a=e=>{const t=`${e.ref}\n${e.entityId||""}\n${e.reason}`;s.has(t)||(s.add(t),o.push(e))};for(const e of n)a(e);for(const n of i){const i=Mu(e,t,n.entityId,n.via,n.ref);i.target?r.set(n.entityId,r.get(n.entityId)||i.target):i.skipped&&a(i.skipped)}const l=[...r.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=vu(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=>Su(e,t,i.entityId,i.entityId,"unsupported"))],noneReason:"unsupported",nextEffect:null,command:null}}function Iu(e){return String(e.marker?.id||e.id||"")}function Ou(e){const{hass:t,device:i}=e,n=e.registryHass||t,r=function(e){return"toggle"===e.tapAction?"explicit-toggle":"cover"===e.tapAction?"legacy-cover":!e.tapAction&&e.primary?.startsWith("light.")?"default-light":null}(i);if(!r)return null;const o=i.marker;if("explicit-toggle"===r&&Uh(o)){const t=String(o?.id||i.id||""),n=Id(e.devices).get(t);if(n)return function(e,t){const i=e.registryHass||e.hass;return zu(e.hass,i,t.driverEids.map(e=>({entityId:e,via:"control-marker-driver",ref:`marker:${t.markerId}`})))}(e,n);const s=Gh(o,e.virtualLights);return{origin:r,kind:"single",semantics:"power",targets:[{entityId:"",name:i.name,state:s?"on":"off",via:"virtual-light"}],skippedTargets:[],noneReason:null,nextEffect:s?"turn-off":"turn-on",command:null,operation:{kind:"virtual-light",markerId:o.id}}}if("explicit-toggle"===r){if(Md(i.marker?.binding,i.marker?.controls??i.controls,i.entities).length)return function(e,t=null){const{hass:i,device:n,devices:r}=e,o=e.registryHass||i,s=Md(n.marker?.binding,n.marker?.controls??n.controls,n.entities),a=e.lightSources||Ld(i,r,null,e.virtualLights),l=new Map;for(const e of a){if(!e.key.startsWith("marker:"))continue;const t=l.get(e.key)||[];t.push(e),l.set(e.key,t)}const c=Id(r),h=new Map;for(const e of r){const t=String(e.marker?.id||e.id||"");t&&h.set(t,e)}const d=[],u=[];t&&d.push({entityId:t,via:"entity"===n.bindingKind?"binding":"device-role",ref:t});for(const e of s){if(!e.startsWith("marker:")){Pn(e)?d.push({entityId:e,via:"control-entity",ref:e}):u.push(Su(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 n=t.bindingStatus.allEntityIds[0]||null;u.push({ref:e,entityId:n,name:t.name||(n?bu(i,o,n):null),reason:"ha-disabled"})}else u.push(Su(i,o,e,null,"missing"));continue}const r=[...new Set(t.flatMap(e=>e.serviceEids))];if(r.length){for(const t of r)d.push({entityId:t,via:"control-entity",ref:e});continue}const s=t.some(e=>e.passive),a=e.slice(7),p=Iu(n),_=c.get(a)?.controllers.find(e=>Iu(e.device)===p);if(s&&_?.driverEids.length)for(const t of _.driverEids)d.push({entityId:t,via:"control-marker-driver",ref:e});else u.push(Su(i,o,e,null,s?"missing":"unsupported"))}return zu(i,o,d,u)}(e,Cu(i))}if("legacy-cover"===r){const e=i.entities.find(e=>e.startsWith("cover."))||i.allEntities?.find(e=>e.startsWith("cover."));return e?Fu(r,Mu(t,n,e,"device-role")):Au(r,"no-actionable-entity")}const s=Cu(i),a=s?Mu(t,n,s,"entity"===i.bindingKind?"binding":"device-role"):Tu(t,n,i);return a?Fu(r,a):Au(r,i.virtual||"virtual"===i.bindingKind?"no-actionable-entity":"no-binding")}function Eu(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 Nu(e){return e?e.operation?e.operation:e.command?{kind:"ha-service",command:e.command}:null:null}const Hu=new Set(["missing","ha-disabled","unavailable"]);function Lu(e,t){const i=Nu(e),n=Nu(t);return!(!i||!n||i.kind!==n.kind)&&("virtual-light"===i.kind&&"virtual-light"===n.kind?i.markerId===n.markerId:"ha-service"===i.kind&&"ha-service"===n.kind&&function(e,t){const i=Eu(e),n=Eu(t);return i.length===n.length&&i.every((e,t)=>e===n[t])}(i.command,n.command))}function Bu(e,t){const i=e.targets[0]||e.skippedTargets[0],n=[];return"group"===e.kind?e.targets.length&&n.push(t.group(e.targets)):i&&n.push(t.single(i)),e.nextEffect&&e.targets.length&&n.push("group"===e.kind?t.groupCurrentNext(e.targets,e.nextEffect):t.currentNext(e.targets[0],e.nextEffect)),e.skippedTargets.length&&n.push(t.skipped(e.skippedTargets)),!e.command&&e.noneReason&&n.push(t.none(e.noneReason)),n}function qu(e,t){return e.catch(()=>{}).then(t)}const ju=e=>{const t=e?.config;return t&&Array.isArray(t.spaces)?t:null},Wu=(e,t)=>"number"==typeof e&&Number.isFinite(e)?e:t;class Uu{constructor(e){this.onBodyReplaced=e,this.config=null,this.configRev=0,this.configFingerprint="",this.layout={},this.layoutRev=0,this.layoutFingerprint=""}setConfig(e){const t=this.config;e!==t&&(this.config=e,this.onBodyReplaced?.("_serverCfg",t))}setLayout(e){const t=this.layout;e!==t&&(this.layout=e,this.onBodyReplaced?.("_layout",t))}currentConfigFingerprint(){return this.configFingerprint||uc(this.config)}currentLayoutFingerprint(){return this.layoutFingerprint||uc(this.layout)}adoptResponses(e,t,i,n){const r=ju(e),o=uc(r),s=o!==this.currentConfigFingerprint();s&&(i(),this.setConfig(r),this.configFingerprint=o),this.configRev=e?.rev??this.configRev;let a=!1;if(void 0!==t){const e=t?.layout??{},i=uc(e);a=i!==this.currentLayoutFingerprint(),a&&(n(),this.setLayout(e),this.layoutFingerprint=i),this.layoutRev=t?.rev??this.layoutRev}return{configChanged:s,layoutChanged:a}}adoptMergedLayout(e,t,i){const n=uc(e),r=n!==uc(this.layout);return r&&(i?.(),this.setLayout(e)),this.layoutFingerprint=n,this.layoutRev=t?.rev??this.layoutRev,r}stageConfigCandidate(e){const t=uc(e);t!==uc(this.config)&&this.setConfig(e),this.configFingerprint=t}acceptConfigWrite(e,t){this.configFingerprint=uc(e),this.configRev=Wu(t?.rev,this.configRev+1)}acceptPairWrite(e,t,i){this.setConfig(e),this.configFingerprint=uc(e),this.setLayout(t),this.layoutFingerprint=uc(t),this.configRev=Wu(i?.config_rev,this.configRev+1),this.layoutRev=Wu(i?.layout_rev,this.layoutRev+1)}noteLayoutRevision(e){"number"==typeof e&&e>this.layoutRev&&(this.layoutRev=e)}stageLocalConfig(e){this.setConfig(e)}stageLocalLayout(e){this.setLayout(e)}seedIdentity(e){Object.assign(this,e)}refreshConfigFingerprint(){this.configFingerprint=uc(this.config)}refreshLayoutFingerprint(){this.layoutFingerprint=uc(this.layout)}beginOptimistic(e,t){return function(e,t,i,n,r){return{previous:JSON.parse(JSON.stringify(e)),previousFingerprint:i,revision:n,attempted:t,attemptedFingerprint:r(t)}}(e,t,this.configFingerprint,this.configRev,uc)}rollbackOptimistic(e){const t=this.config;return!(!t||this.configRev!==e.revision||uc(t)!==e.attemptedFingerprint)&&(this.setConfig(e.previous),this.configFingerprint=e.previousFingerprint,!0)}restoreCached(e){const t=e?.config;return!(!t||!Array.isArray(t.spaces))&&(this.setConfig(t),this.configRev=e?.rev||0,this.configFingerprint=e?.config_fingerprint||uc(t),this.setLayout(e?.layout||{}),this.layoutRev=e?.layout_rev||0,this.layoutFingerprint=e?.layout_fingerprint||uc(this.layout),!0)}snapshot(e){return this.config?(this.refreshConfigFingerprint(),this.refreshLayoutFingerprint(),{config:this.config,rev:this.configRev,config_fingerprint:this.configFingerprint,layout:this.layout,layout_rev:this.layoutRev,layout_fingerprint:this.layoutFingerprint,virtual_lights:e}):null}}async function Gu(e,t){const i=t.isCurrent??(()=>!0);if(!i())return{status:"superseded"};const{cfgResp:n,layResp:r}=t,o=e._adoption,s=ju(n),a=null!=n&&uc(s)!==o.currentConfigFingerprint()||null!=r&&uc(r.layout??{})!==o.currentLayoutFingerprint();if(a){const t=await e._signer.prepareImage(e.hass,e._candidateBackdrop(s));if(!i())return{status:"superseded"};if(!t)return e._continuity.note("asset-failed"),e._scheduleLoadRetry(!0),{status:"asset-wait"}}if(!i())return{status:"superseded"};a&&e._continuity.hasCompleteFrame&&"steady"===e._continuity.state&&e._beginContinuityCandidate(t.reason,!0),t.beforeAdopt?.();const l=e._space;return function(e,t,i){const n=e._adoption,r=!!n.config,{configChanged:o,layoutChanged:s}=n.adoptResponses(t??{},i,()=>{e._geometryHistory.clear(),e._devicePositionHistory.clear(),e._cancelDeviceDrag(),e._pendingPhysicalWrites.clear(),e._clearRoomFocus(!0),e._cancelCameraTransition(!1),r&&e._clearGeometryGesture()},()=>{e._cancelCameraTransition(!1),e._devicePositionHistory.clear(),e._cancelDeviceDrag()});if(o&&e._seedDecorStyle(n.config),t&&("virtual_lights"in t||"config"in t)){const i=jh(e._virtualLights,t.virtual_lights,n.configRev,"virtual_lights"in t);Wh(i)!==Wh(e._virtualLights)&&(e._virtualLights=i,e._capturedSnapshotVirtual="")}e._canOptimizeUndo=!(!t?.can_optimize_undo&&!i?.can_optimize_undo),e._adoptConfigCapabilities(t),e._undoKind=t?.undo_kind||i?.undo_kind||null,"boolean"==typeof t?.can_write&&(e._serverCanWrite=t.can_write),o&&e._continuity.note("config-candidate",{configRev:n.configRev}),s&&e._continuity.note("layout-candidate",{layoutRev:n.layoutRev})}(e,n,r),"reload"===t.profile&&(e._syncDecorAssets(s).catch(()=>{}),e._adoptInitialSpace(e._model,!0),e._resumePendingNavMode(),e._cacheSnapshot()),t.afterAdopt?.(),{status:"adopted",spaceChanged:e._space!==l}}const Vu=(e,t)=>e.connection===t.connection&&e.userId===t.userId&&e.route===t.route,Ku=e=>"number"==typeof e&&Number.isFinite(e)?e:null;class Yu{constructor(){this.sequence=0,this.currentSequence=0,this.lifecycle=0,this.observedHighWater=null,this.context=null}observeContext(e){this.context?Vu(this.context,e)||(this.context={...e},this.invalidateLifecycle()):this.context={...e}}invalidateLifecycle(){this.lifecycle+=1,this.currentSequence=++this.sequence,this.observedHighWater=null}observeRevision(e,t,i){this.observeContext(i);const n=Ku(e);if(null===n)return null;const r=Ku(t)??Number.NEGATIVE_INFINITY;return n<=Math.max(r,this.observedHighWater??Number.NEGATIVE_INFINITY)?null:(this.observedHighWater=n,Object.freeze({sequence:this.currentSequence,lifecycle:this.lifecycle,context:{...i},observedRevision:n}))}isReservationCurrent(e,t,i){this.observeContext(t);const n=Ku(i)??Number.NEGATIVE_INFINITY;return e.sequence===this.currentSequence&&e.lifecycle===this.lifecycle&&Vu(e.context,t)&&e.observedRevision===this.observedHighWater&&e.observedRevision>n}begin(e){this.observeContext(e.context),e.force&&this.invalidateLifecycle();const t=++this.sequence;return this.currentSequence=t,Object.freeze({sequence:t,lifecycle:this.lifecycle,force:e.force,context:{...e.context},baselineRevision:e.baselineRevision,baselineFingerprint:e.baselineFingerprint})}isCurrent(e){this.observeContext(e.context);const t=e.claim;return e.connected&&(t.force||!e.writePending)&&t.sequence===this.currentSequence&&t.lifecycle===this.lifecycle&&Vu(t.context,e.context)&&t.baselineRevision===e.baselineRevision&&t.baselineFingerprint===e.baselineFingerprint}}const Xu=e=>{const t=e.hass,i=t?.user?.id;return{connection:t?.connection??null,userId:"string"==typeof i?i:null,route:location.pathname}};async function Zu(e,t=!1,i){let n=null;const r=e._configReloadAuthority;if(!t){if(void 0!==i&&(n=r.observeRevision(i,e._cfgRev,Xu(e)),!n))return;if(e._saveConfigDebounced.pending()&&e._saveConfigDebounced.flush(),e._cfgWriting)return clearTimeout(e._reloadRetry),void(e._reloadRetry=window.setTimeout(()=>{n&&!r.isReservationCurrent(n,Xu(e),e._cfgRev)||Zu(e,!1)},400))}const o=r.begin({force:t,context:Xu(e),baselineRevision:e._cfgRev,baselineFingerprint:e._adoption.currentConfigFingerprint()}),s=()=>((e,t)=>e._configReloadAuthority.isCurrent({claim:t,context:Xu(e),connected:e.isConnected,baselineRevision:e._cfgRev,baselineFingerprint:e._adoption.currentConfigFingerprint(),writePending:e._saveConfigDebounced.pending()||e._cfgWriting}))(e,o);let a=!1;try{const t=await e._getAuthoritativeConfig();if(!s())return;const i=await e._adoptAuthoritative({cfgResp:t,reason:"config-reload",profile:"reload",isCurrent:s,afterAdopt:()=>{e._regSignature="",e._maybeRebuildDevices()}});if("superseded"===i.status)return;if(a=!0,"adopted"!==i.status)return;i.spaceChanged&&e._restoreZoom(),e.requestUpdate()}catch(t){if(!s())return;a=!0,e._showToast(e._t("toast.cfg_reload_failed",{err:e._errText(t)}))}finally{(a||s())&&(e._continuityDataReady=!0,e.requestUpdate())}}const Ju=e=>!!e&&e.length>=2&&Number.isFinite(e[0])&&Number.isFinite(e[1]);function Qu(e,t=5,i=5){return Oo(e.cm,t,i)/2}function ep(e,t,i=1,n=5,r=5,o=0){const s=e.host;if(!s||"partition"!==s.kind||"string"!=typeof s.id||!s.id)return{resolved:null,reason:"invalid-host"};const a=t.find(e=>e.id===s.id);if(!a)return{resolved:null,reason:"missing-partition"};if(!Ju(a.a)||!Ju(a.b)||!Number.isFinite(s.t)||s.t<0||s.t>1)return{resolved:null,reason:"invalid-position"};const l=a.b[0]-a.a[0],c=a.b[1]-a.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 u=s.t*h;if(u-d/2h-o+1e-9)return{resolved:null,reason:"does-not-fit"};const p=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:s,partition:a,center:[a.a[0]+l*s.t,a.a[1]+c*s.t],angle:m,length:d,depth:Oo(a.cm,n,r),t:s.t,axis:{a:[a.a[0],a.a[1]],b:[a.b[0],a.b[1]],ux:p,uy:_,length:h}}}}function tp(e,t,i=1,n=5,r=5){return ep(e,t,i,n,r,0)}function ip(e,t,i=1,n=5,r=5){const o=e.host,s="partition"===o?.kind?t.find(e=>e.id===o.id):void 0;if(!s)return tp(e,t,i,n,r);const a=ep(e,t,i,n,r,Qu(s,n,r));return"does-not-fit"===a.reason?{resolved:null,reason:"does-not-fit-jamb"}:a}function np(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 rp(e){const{center:t,length:i,axis:n,host:r}=e,o=i/2;return{hostId:r.id,a:[t[0]-n.ux*o,t[1]-n.uy*o],b:[t[0]+n.ux*o,t[1]+n.uy*o],depth:e.depth}}function op(e,t=!1){const i=t?1:-1,n=e.depth/2;return{ox:-e.axis.uy*i*n,oy:e.axis.ux*i*n,cm:e.partition.cm,side:i}}function sp(e,t,i){return e.flatMap(e=>!Ju(e.a)||!Ju(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:Oo(e.cm,t,i)/2,partitionHost:{kind:"partition",id:e.id}}])}function ap(e,t,i){const{center:n,length:r,axis:o}=e,s=r/2,a=t.flatMap(e=>{if(!e.kind||e.open)return[];const t=e.b[0]-e.a[0],r=e.b[1]-e.a[1],a=Math.hypot(t,r);if(!(a>i))return[];const l=t/a,c=r/a;if(Math.abs(o.ux*c-o.uy*l)>1e-6)return[];if(Math.abs((n[0]-e.a[0])*c-(n[1]-e.a[1])*l)>i)return[];const h=e=>(e[0]-n[0])*o.ux+(e[1]-n[1])*o.uy,d=h(e.a),u=h(e.b),p=Math.max(-s,Math.min(d,u)),_=Math.min(s,Math.max(d,u));return _>=p-i?[[p,_]]:[]});if(!a.length)return!1;a.sort((e,t)=>e[0]-t[0]||e[1]-t[1]);let l=-s;for(const[e,t]of a){if(e>l+i)return!1;if(l=Math.max(l,t),l>=s-i)return!0}return!1}function lp(e,t,i=1e-9){const n=e.length/(2*e.axis.length),r=e.t-n,o=e.t+n;return t.some(t=>{if(t.host.id!==e.host.id||t.opening.id===e.opening.id)return!1;const n=t.length/(2*t.axis.length);return Math.max(r,t.t-n)ha-icon{align-self:start;color:var(--hp-accent);}.version-recovery-copy{min-width:0;display:flex;flex-direction:column;gap:var(--sp-2);font-size:var(--fs-m);line-height:1.35;}.version-recovery-copy>span{color:var(--hp-muted);}.version-recovery-versions{display:flex;flex-wrap:wrap;gap:var(--sp-2) var(--sp-5);}.version-recovery-versions span,.version-recovery-versions b{overflow-wrap:anywhere;}.version-recovery-reload{min-height:44px;white-space:normal;}@keyframes hp-version-recovery-in{from{opacity:0;}to{opacity:1;}}@keyframes hp-version-recovery-out{from{opacity:1;}to{opacity:0;}}@media (max-width:520px){.version-recovery-card{grid-template-columns:auto minmax(0,1fr);}.version-recovery-reload{grid-column:1 / -1;width:100%;}}@keyframes fixedfloor-spin{to{transform:rotate(360deg);}}.spacer{flex:1;}.bootveil{position:absolute;inset:0;z-index:40;display:flex;align-items:center;justify-content:center;background:var(--hp-bg,#16212e);opacity:1;transition:opacity 0.15s ease;pointer-events:none;}.bootveil.off{opacity:0;}.bootveil .boothouse{position:static;width:56px;height:56px;fill:var(--hp-accent);opacity:0.85;animation:hp-boot-pulse 1.3s ease-in-out infinite;}@keyframes hp-boot-pulse{0%,100%{opacity:0.3;transform:scale(0.94);}50%{opacity:0.9;transform:scale(1);}}@media (prefers-reduced-motion:reduce){.bootveil .boothouse{animation:none;opacity:0.7;}.version-recovery.phase-visible,.version-recovery.phase-leaving{animation:none;}}@keyframes hp-pulse-short{0%{transform:scale(1);opacity:0.55;}70%{opacity:0.22;}100%{transform:scale(var(--ripple-scale,1.5));opacity:0;}}@keyframes hp-pulse-short-b{0%{transform:scale(1);opacity:0.55;}70%{opacity:0.22;}100%{transform:scale(var(--ripple-scale,1.5));opacity:0;}}@keyframes hp-pulse-continuous{0%{transform:scale(1);opacity:0.55;}65%{opacity:0.18;}100%{transform:scale(var(--ripple-scale,1.5));opacity:0;}}@keyframes hp-pulse-alarm{0%{transform:scale(1);opacity:0.72;}100%{transform:scale(1.5);opacity:0;}}@keyframes hp-slide-left{0%{transform:translateX(4%);opacity:0.72;}100%{transform:translateX(0);opacity:1;}}@keyframes hp-slide-right{0%{transform:translateX(-4%);opacity:0.72;}100%{transform:translateX(0);opacity:1;}}@keyframes hp-sunfade-in{from{opacity:0;}to{opacity:1;}}@keyframes hp-sunfade-out{from{opacity:1;}to{opacity:0;}}.sr-only{position:absolute !important;width:1px !important;height:1px !important;padding:0 !important;margin:-1px !important;overflow:hidden !important;clip:rect(0,0,0,0) !important;white-space:nowrap !important;border:0 !important;}.toast{position:fixed;pointer-events:none;left:50%;bottom:22px;transform:translateX(-50%);background:var(--hp-bg);border:1px solid var(--hp-accent);color:var(--hp-txt);padding:var(--sp-4) var(--sp-6);border-radius:var(--rad-l);font-size:var(--fs-m);box-shadow:var(--shadow-2);z-index:120;max-width:90vw;}`,o`.fixedfloor-loading{animation:fixedfloor-spin 1.1s linear infinite;}.fixedfloor-error p{max-width:42rem;margin:0;overflow-wrap:anywhere;}@media (prefers-reduced-motion:reduce){.fixedfloor-loading{animation:none;}.radar-target{transition:none;}}.stage.noplan{background:#ffffff;}.stage.mode-plan,.stage.mode-devices,.stage.mode-decor{background:#ffffff;}.stage{position:relative;width:100%;container-type:inline-size;overflow:hidden;touch-action:none;background:var(--ha-card-background,var(--card-background-color,#111));}.zoomwrap{position:absolute;inset:0;z-index:1;}.stage.mode-transition,.stage.mode-transition .zoomwrap{transition:none !important;}.stage.mode-transition .hp-view-only-layer,.stage.mode-transition .hp-editor-only-layer{pointer-events:none;will-change:opacity;}.stage.mode-transition .hp-paper{fill:var(--hp-mode-paper) !important;}.hp-day-cycle-env{position:absolute;inset:0;z-index:0;overflow:hidden;pointer-events:none;isolation:isolate;}.hp-day-cycle-bg{position:absolute;inset:0;opacity:0;overflow:hidden;transition:opacity 1100ms cubic-bezier(.22,.61,.36,1);}.hp-day-cycle-bg.active{opacity:1;}.hp-day-cycle-sun{position:absolute;left:var(--hp-day-cycle-sun-x);top:var(--hp-day-cycle-sun-y);width:clamp(140px,25cqw,250px);height:clamp(140px,25cqw,250px);transform:translate(-50%,-50%);border-radius:50%;filter:blur(10px);opacity:var(--hp-day-cycle-sun-opacity);transition:left 1100ms cubic-bezier(.22,.61,.36,1),top 1100ms cubic-bezier(.22,.61,.36,1),opacity 1100ms cubic-bezier(.22,.61,.36,1);}.stage.mode-transition .hp-day-cycle-env{transition:none;}.stage.daycycle .hp-paperg,.stage.daycycle.hp-safe-daycycle-outline .hp-paper-outline-svg,.hp-static-stage.daycycle .hp-paper-outline-svg{filter:drop-shadow(0 0 1px var(--hp-day-cycle-outline-near)) drop-shadow(0 0 5px var(--hp-day-cycle-outline-mid)) drop-shadow(0 0 10px var(--hp-day-cycle-outline-far));will-change:filter;transition:filter 1100ms cubic-bezier(.22,.61,.36,1);}.stage.daycycle.hp-safe-daycycle-outline .hp-paperg{filter:none;will-change:auto;transition:none;}.hp-static-stage.daycycle .hp-paperg{filter:none;will-change:auto;transition:none;}.stage.daycycle.hp-safe-daycycle-outline .hp-paper-outline-svg{transition:none;}.stage.daycycle.hp-safe-daycycle-outline .plan-svg{will-change:transform;}@media (prefers-reduced-motion:reduce){.hp-day-cycle-bg,.hp-day-cycle-sun,.stage.daycycle .hp-paperg,.stage.daycycle.hp-safe-daycycle-outline .hp-paper-outline-svg,.hp-static-stage.daycycle .hp-paper-outline-svg{transition:none;}}.sunlayer{pointer-events:none;}.compass{width:120px;height:120px;flex:none;touch-action:none;cursor:grab;user-select:none;}.compass:active{cursor:grabbing;}.compass .cring{fill:rgba(255,255,255,0.04);stroke:var(--divider-color,#444);stroke-width:2;}.compass .ctick{stroke:var(--secondary-text-color,#9aa4ad);stroke-width:2;}.compass .ctick.minor{stroke-width:1;opacity:0.6;}.compass .cneedle line{stroke:var(--primary-color,#3ea6ff);stroke-width:2.5;stroke-linecap:round;}.compass .cneedle path{fill:var(--primary-color,#3ea6ff);}.compass .cneedle text{fill:var(--text-primary-color,#fff);font-size:11px;font-weight:700;}.compass .cdeg{fill:var(--secondary-text-color,#9aa4ad);font-size:13px;}.compass.unset .cneedle{opacity:0.35;}.stage.hpboot .zoomwrap,.stage.hpboot .zoombadge{visibility:hidden;}.stage.hpsettle{transition:height 0.25s ease;}@media (prefers-reduced-motion:reduce){.stage.hpsettle{transition:none;}}.zoomctl{display:inline-flex;gap:var(--sp-1);background:rgba(127,127,127,0.12);border-radius:var(--rad-m);padding:var(--sp-1);}.zoomctl .zb{border:none;padding:var(--sp-3) var(--sp-4);}.zoomctl .zb[disabled]{opacity:0.4;pointer-events:none;}.projection-toggle{min-width:44px;min-height:44px;justify-content:center;padding:var(--sp-3);}.header-action{min-width:44px;min-height:44px;justify-content:center;padding:var(--sp-3);}.homearrow{position:absolute;z-index:12;transform:translate(-50%,-50%);width:40px;height:40px;border-radius:50%;display:flex;align-items:center;justify-content:center;cursor:pointer;background:var(--card-background-color,var(--hp-bg));color:var(--hp-accent);border:1px solid var(--hp-accent);opacity:0.9;padding:0;}.homearrow ha-icon{--mdc-icon-size:22px;line-height:1;}.zoombadge{position:absolute;z-index:12;left:var(--sp-4);bottom:var(--sp-4);background:var(--card-background-color,var(--hp-bg));opacity:0.92;color:var(--hp-txt);border:1px solid var(--hp-accent);border-radius:var(--rad-m);padding:var(--sp-1) var(--sp-4);font-size:var(--fs-s);font-weight:600;pointer-events:none;}.zoomwrap>svg{position:absolute;inset:0;width:100%;height:100%;display:block;}.plan-svg{z-index:1;}.hp-paper-outline-svg{z-index:0;overflow:visible;pointer-events:none;visibility:hidden;}.stage.hp-safe-daycycle-outline .hp-paper-outline-svg{visibility:visible;}.hp-static-stage .hp-paper-outline-svg{visibility:visible;}.iso-underlay-svg{z-index:0;overflow:visible;}.iso-shadows-svg{z-index:3;overflow:visible;}.iso-walls-svg{z-index:4;overflow:visible;}.iso-overlays-svg{z-index:5;overflow:visible;}.iso-underlay-svg,.iso-shadows-svg,.iso-walls-svg,.iso-overlays-svg,.iso-underlay,.iso-shadows,.iso-walls,.iso-openings{pointer-events:none;}.iso-side-hi{stop-color:#b9bdbe;}.iso-side-lo{stop-color:#969c9f;}.iso-top-hi{stop-color:#fafaf7;}.iso-top-lo{stop-color:#e2e4e2;}.iso-wall-side{fill:url(#hp-iso-wall-side) #a8acae;stroke:#92989b;stroke-width:0.7;vector-effect:non-scaling-stroke;}.iso-wall-top{fill:url(#hp-iso-wall-top) #f3f3f1;stroke:#d7d9d8;stroke-width:0.8;vector-effect:non-scaling-stroke;}.iso-material-texture{fill:url(#hp-iso-wall-texture);stroke:none;opacity:0.12;pointer-events:none;}.iso-floor-texture{fill:url(#hp-iso-floor-texture);opacity:0.1;}.iso-texture-mark{fill:rgba(36,43,47,0.34);}.iso-texture-line{fill:none;stroke:rgba(36,43,47,0.24);stroke-width:0.55;}.iso-floor-side{fill:#858b8d;stroke:#71787b;stroke-width:0.7;vector-effect:non-scaling-stroke;}.iso-opening-panel{fill:#d7d9d7;fill-opacity:0.96;stroke:#7f878b;stroke-width:0.9;vector-effect:non-scaling-stroke;}.iso-opening-panel.iso-window{fill:#dfeff4;fill-opacity:0.72;stroke:#8aa7b1;}.iso-opening-panel.iso-material-reveal{fill:#c7cbca;stroke:#8b9294;}.iso-opening-panel.iso-material-matte-leaf{fill:#a6abad;stroke:none;}.iso-opening-panel.iso-opening-leaf-edge,.iso-opening-panel.iso-opening-leaf-top{fill:#8d9497;}.iso-opening-panel.iso-material-light-frame,.iso-opening-panel.iso-material-light-sill{fill:#fffef8;fill-opacity:0.94;stroke:#b3b5ae;}.iso-opening-panel.iso-material-light-window,.iso-opening-panel.iso-material-glass-side{fill:#c9e4f3;fill-opacity:0.88;stroke:#8fb4c7;}.iso-opening-panel.iso-material-glass-top{fill:#e3f2fa;fill-opacity:0.96;stroke:#9fc4d5;}.iso-ambient-shadow{fill:rgba(15,21,25,0.22);filter:url(#hp-iso-ambient-shadow);}.stage.theme-dark .iso-side-hi{stop-color:#4c555a;}.stage.theme-dark .iso-side-lo{stop-color:#343c40;}.stage.theme-dark .iso-top-hi{stop-color:#687176;}.stage.theme-dark .iso-top-lo{stop-color:#50585d;}.stage.theme-dark .iso-wall-side{stroke:#30373b;}.stage.theme-dark .iso-wall-top{stroke:#7b858a;}.stage.theme-dark .iso-floor-side{fill:#2d3438;stroke:#20272a;}.stage.theme-dark .iso-opening-panel{fill:#626b70;stroke:#899399;}.stage.theme-dark .iso-opening-panel.iso-window{fill:#75919b;stroke:#abc6ce;}.stage.theme-dark .iso-opening-panel.iso-material-reveal{fill:#454e52;stroke:#727d82;}.stage.theme-dark .iso-opening-panel.iso-material-matte-leaf{fill:#626a6e;stroke:none;}.stage.theme-dark .iso-opening-panel.iso-opening-leaf-edge,.stage.theme-dark .iso-opening-panel.iso-opening-leaf-top{fill:#4b5458;}.stage.theme-dark .iso-opening-panel.iso-material-light-frame,.stage.theme-dark .iso-opening-panel.iso-material-light-sill{fill:#e8e7df;stroke:#a9aca7;}.stage.theme-dark .iso-opening-panel.iso-material-light-window,.stage.theme-dark .iso-opening-panel.iso-material-glass-side{fill:#8fbfd5;stroke:#bad9e6;}.stage.theme-dark .iso-opening-panel.iso-material-glass-top{fill:#c9e6f2;stroke:#d9eef6;}.stage.theme-dark .iso-ambient-shadow{fill:rgba(0,0,0,0.34);}.stage.theme-dark .iso-texture-mark{fill:rgba(255,255,255,0.24);}.stage.theme-dark .iso-texture-line{stroke:rgba(255,255,255,0.18);}@media (prefers-color-scheme:dark){.stage:not(.theme-light) .iso-side-hi{stop-color:#4c555a;}.stage:not(.theme-light) .iso-side-lo{stop-color:#343c40;}.stage:not(.theme-light) .iso-top-hi{stop-color:#687176;}.stage:not(.theme-light) .iso-top-lo{stop-color:#50585d;}.stage:not(.theme-light) .iso-wall-side{stroke:#30373b;}.stage:not(.theme-light) .iso-wall-top{stroke:#7b858a;}.stage:not(.theme-light) .iso-floor-side{fill:#2d3438;stroke:#20272a;}.stage:not(.theme-light) .iso-opening-panel{fill:#626b70;stroke:#899399;}.stage:not(.theme-light) .iso-opening-panel.iso-window{fill:#75919b;stroke:#abc6ce;}.stage:not(.theme-light) .iso-opening-panel.iso-material-reveal{fill:#454e52;stroke:#727d82;}.stage:not(.theme-light) .iso-opening-panel.iso-material-matte-leaf{fill:#626a6e;stroke:none;}.stage:not(.theme-light) .iso-opening-panel.iso-opening-leaf-edge,.stage:not(.theme-light) .iso-opening-panel.iso-opening-leaf-top{fill:#4b5458;}.stage:not(.theme-light) .iso-opening-panel.iso-material-light-frame,.stage:not(.theme-light) .iso-opening-panel.iso-material-light-sill{fill:#e8e7df;stroke:#a9aca7;}.stage:not(.theme-light) .iso-opening-panel.iso-material-light-window,.stage:not(.theme-light) .iso-opening-panel.iso-material-glass-side{fill:#8fbfd5;stroke:#bad9e6;}.stage:not(.theme-light) .iso-opening-panel.iso-material-glass-top{fill:#c9e6f2;stroke:#d9eef6;}.stage:not(.theme-light) .iso-ambient-shadow{fill:rgba(0,0,0,0.34);}.stage:not(.theme-light) .iso-texture-mark{fill:rgba(255,255,255,0.24);}.stage:not(.theme-light) .iso-texture-line{stroke:rgba(255,255,255,0.18);}}@media (forced-colors:active){.iso-wall-side,.iso-wall-top,.iso-floor-side,.iso-opening-panel{fill:Canvas;stroke:CanvasText;forced-color-adjust:auto;}.iso-ambient-shadow,.iso-material-texture{display:none;}}@supports not (filter:blur(1px)){.iso-ambient-shadow,.iso-material-texture{display:none;}}.hp-paper{fill:var(--ha-card-background,var(--card-background-color,#111));stroke:none;}.stage.noplan .hp-paper,.stage.mode-plan .hp-paper,.stage.mode-devices .hp-paper,.stage.mode-decor .hp-paper{fill:#ffffff;}.room{transition:0.12s;cursor:default;stroke-linejoin:round;stroke-linecap:round;}.stage.mode-view .room{cursor:pointer;}.room.overlay{fill:transparent;stroke:transparent;stroke-width:calc(2px * var(--hp-cell-visual-scale,1));}:host([data-pointer-hover]) .stage.mode-view .room.overlay:not(.styled):hover{stroke:var(--hp-accent);stroke-opacity:1;}.room.yard{fill:rgba(75,140,90,0.14);stroke:#4b8c5a;stroke-width:calc(2px * var(--hp-cell-visual-scale,1));}:host([data-pointer-hover]) .stage.mode-view .room.yard:not(.styled):hover{stroke:var(--hp-accent);stroke-opacity:1;}.room.styled{stroke:var(--room-stroke,transparent);stroke-opacity:var(--room-stroke-op,0);stroke-width:calc(2.5px * var(--hp-cell-visual-scale,1));fill:var(--room-fill,transparent);fill-opacity:var(--room-fill-op,0);}.glow-base-layer,.glow-base-tunnels,.glow-pools-frame,.glow-pools,.glow-spot{pointer-events:none;}.glow-pools-frame,.glow-pools,.glow-spot{isolation:isolate;}.glow-pools.blend-screen .glow-spot{mix-blend-mode:screen;}.glow-spot{opacity:1;transition:opacity 500ms ease;}.glow-spot.is-entering,.glow-spot.is-leaving{opacity:0;}@media (prefers-reduced-motion:reduce){.glow-spot{transition:none;}}:host([data-pointer-hover]) .stage.mode-view .room.styled:hover{stroke:var(--hp-accent);stroke-opacity:1;}.op-leaf{transition:transform 0.6s ease;}.op-arc{stroke-width:calc(1.5px * var(--hp-cell-visual-scale,1));transition:stroke-dashoffset 0.6s ease;}.op-outline{fill:none;stroke:var(--hp-accent);stroke-width:calc(1.5px * var(--hp-cell-visual-scale,1));opacity:0;transition:opacity 0.15s;pointer-events:none;}:host([data-pointer-hover]) .stage.markup g.opening:hover .op-outline{opacity:0.9;}.op-hit{fill:transparent;pointer-events:none;cursor:default;}.stage.markup .op-hit{pointer-events:auto;cursor:grab;touch-action:none;}.stage.markup .op-hit:active{cursor:grabbing;}.stage.markup .opening.orphan{pointer-events:auto;cursor:pointer;color:var(--error-color,#db4437);}.stage.markup .opening.orphan circle{fill:var(--hp-bg);stroke:currentColor;stroke-width:calc(2px * var(--hp-cell-visual-scale,1));}.stage.markup .opening.orphan text{fill:currentColor;font-weight:800;font-size:calc(12px * var(--hp-cell-visual-scale,1));pointer-events:none;}.stage.markup.tool-resize .op-hit{pointer-events:none;cursor:default;}.stage.mode-view .oplock{pointer-events:auto;cursor:pointer;}.stage.projection-iso.mode-view .oplock::before{content:'';position:absolute;left:50%;top:50%;width:max(44px,100%);height:max(44px,100%);transform:translate(-50%,-50%);border-radius:50%;pointer-events:auto;}@media (prefers-reduced-motion:reduce){.op-leaf,.op-arc{transition:none;}}.roomlabel{pointer-events:none;position:absolute;transform:translate(-50%,-50%);font-size:calc(var(--rl-icon-size,var(--icon-size,2.5cqw)) * 0.5 * var(--rl-scale,1) * var(--rl-font,1) * var(--rl-space,1));font-weight:700;letter-spacing:0.04em;white-space:nowrap;cursor:grab;user-select:none;z-index:1;display:flex;flex-direction:column;align-items:center;gap:0.15em;text-align:center;}.rlname{display:inline-flex;align-items:center;gap:0.25em;font-size:calc(1em * var(--rl-name,1));}.zoomwrap.slide-left{animation:hp-slide-left 0.18s cubic-bezier(0.2,0.7,0.2,1);}.zoomwrap.slide-right{animation:hp-slide-right 0.18s cubic-bezier(0.2,0.7,0.2,1);}@media (prefers-reduced-motion:reduce){.zoomwrap.slide-left,.zoomwrap.slide-right{animation:none;}}.rlgearbtn{--gear-h:calc(var(--icon-size,2.5cqw) * 0.77);position:absolute;transform:translate(-50%,-50%);display:inline-flex;align-items:center;gap:0.35em;height:var(--gear-h);padding:0 calc(var(--gear-h) * 0.38);border:0;border-radius:999px;background:var(--hp-accent);color:var(--text-primary-color,#fff);font:inherit;font-size:calc(var(--gear-h) * 0.42);font-weight:600;line-height:1;white-space:nowrap;cursor:pointer;pointer-events:auto;opacity:0.92;box-shadow:var(--shadow-1);z-index:2;}.rlgearbtn{transition:opacity 0.15s,filter 0.15s;}:host([data-pointer-hover]) .rlgearbtn:hover{opacity:1;filter:brightness(1.18);}.rlgearbtn ha-icon{--mdc-icon-size:calc(var(--gear-h) * 0.55);display:inline-flex;}.rlgear{--mdc-icon-size:0.9em;display:inline-flex;margin-right:0.2em;opacity:0.6;cursor:pointer;pointer-events:auto;}:host([data-pointer-hover]) .rlgear:hover{opacity:1;}.rlgo{--mdc-icon-size:0.85em;display:inline-flex;opacity:0.55;}.stage.mode-view .rlgo{pointer-events:auto;cursor:pointer;}:host([data-pointer-hover]) .stage.mode-view .rlgo:hover{opacity:1;}.roomlabel .rlmetrics{position:absolute;top:calc(100% + 0.15em);left:50%;transform:translateX(-50%);white-space:nowrap;display:flex;align-items:center;gap:0.55em;font-size:calc(0.75em * var(--rl-meta,1));font-weight:600;letter-spacing:0.02em;opacity:0.9;}.roomlabel .rlm{display:inline-flex;align-items:center;gap:0.12em;}.roomlabel .rlm ha-icon{--mdc-icon-size:1.05em;display:inline-flex;}.roomlabel .rlm.lit{opacity:1;}.rlhandle{display:none;position:absolute;width:9px;height:9px;border-radius:2px;background:var(--hp-accent);border:1px solid var(--card-background-color,#fff);z-index:2;}.rlhandle.tl{left:-6px;top:-6px;cursor:nwse-resize;}.rlhandle.br{right:-6px;bottom:-6px;cursor:nwse-resize;}.rlhandle.tr{right:-6px;top:-6px;cursor:nesw-resize;}.rlhandle.bl{left:-6px;bottom:-6px;cursor:nesw-resize;}:host([data-pointer-hover]) .stage.markup .roomlabel:hover .rlhandle{display:block;}.stage.markup .roomlabel{pointer-events:auto;}.stage.mode-view .roomlabel{pointer-events:auto;cursor:pointer;border-radius:0.2em;}.stage.projection-iso.mode-view .roomlabel{box-sizing:border-box;min-width:44px;min-height:44px;justify-content:center;text-shadow:none;filter:none;-webkit-text-stroke:0 transparent;color:#303936 !important;}.stage.projection-iso.mode-view .dev,.stage.projection-iso.mode-view .oplock{z-index:2;}.stage.projection-iso.theme-dark.mode-view .roomlabel{color:#f2f0e8 !important;}@media (prefers-color-scheme:dark){.stage.projection-iso:not(.theme-light).mode-view .roomlabel{color:#f2f0e8 !important;}}.stage.mode-view .roomlabel:focus-visible{outline:2px solid var(--hp-accent);outline-offset:4px;}.roomlabel:active{cursor:grabbing;}.measurelayer{position:absolute;inset:0;pointer-events:none;}.alignline{stroke:var(--hp-accent);stroke-width:calc(1.2px * var(--hp-cell-visual-scale,1));stroke-dasharray:calc(4px * var(--hp-cell-visual-scale,1)) calc(4px * var(--hp-cell-visual-scale,1));pointer-events:none;opacity:0.9;}.aligndot{fill:var(--hp-accent);pointer-events:none;}.measurelabel.on45{color:#4bd28f;border-color:#4bd28f;}.measurelabel{position:absolute;transform:translate(12px,-150%);font-size:var(--fs-s);font-weight:600;padding:1px var(--sp-3);border-radius:var(--rad-s);background:rgba(0,0,0,0.72);color:#fff;white-space:nowrap;pointer-events:none;user-select:none;z-index:3;}.measurelabel.opdimension{transform:translate(calc(-50% + var(--op-label-shift-x,0px)),calc(-50% + var(--op-label-shift-y,-12px)));border:1px solid var(--hp-open,#ff9800);}.decorlayer .dshape{pointer-events:none;}.stage.mode-decor .decorlayer .dshape{pointer-events:visiblePainted;cursor:pointer;}.stage.mode-decor.dtool-select .decorlayer .dshape{cursor:move;}.stage.mode-decor.dtool-line .decorlayer .dshape,.stage.mode-decor.dtool-rect .decorlayer .dshape,.stage.mode-decor.dtool-ellipse .decorlayer .dshape,.stage.mode-decor.dtool-text .decorlayer .dshape,.stage.mode-decor.dtool-furniture .decorlayer .dshape,.stage.mode-decor.dtool-image .decorlayer .dshape,.stage.mode-decor.dtool-backdrop .decorlayer .dshape{pointer-events:none;}.stage.mode-decor.dtool-furniture,.stage.mode-decor.dtool-image{cursor:copy;}.stage.mode-decor.dtool-select .decorlayer .dimage,.stage.mode-decor.dtool-erase .decorlayer .dimage,.stage.mode-decor.dtool-select .decorlayer .dimage-missing,.stage.mode-decor.dtool-erase .decorlayer .dimage-missing{pointer-events:bounding-box;}.decorlayer .dimage-missing rect{fill:rgba(127,127,127,0.12);stroke:var(--hp-accent);stroke-dasharray:8 5;vector-effect:non-scaling-stroke;}.decorlayer .dimage-missing path{fill:none;stroke:var(--hp-accent);vector-effect:non-scaling-stroke;}.decorlayer .decor-image-placement-preview{opacity:0.65;}.stage.mode-decor.dtool-text .decorlayer .dshape.dtext,.stage.mode-decor.dtool-select .decorlayer .dshape.dtext,.stage.mode-decor.dtool-erase .decorlayer .dshape.dtext{pointer-events:visiblePainted;pointer-events:bounding-box;}.stage.mode-decor.dtool-text .decorlayer .dshape.dtext{cursor:text;}.decorlayer .derasehit{fill:none;stroke:transparent;stroke-width:16px;stroke-linecap:round;stroke-linejoin:round;vector-effect:non-scaling-stroke;pointer-events:none;}.stage.mode-decor.dtool-erase .decorlayer .derasehit{pointer-events:stroke;}.decorlayer .dselecthit{fill:none;stroke:transparent;stroke-width:16px;stroke-linecap:round;vector-effect:non-scaling-stroke;pointer-events:none;}.stage.mode-decor.dtool-select .decorlayer .dselecthit{pointer-events:stroke;cursor:move;}.stage.mode-decor .decorlayer .dshape.dfurniturehit{fill:none;stroke:transparent;pointer-events:none;}.stage.mode-decor.dtool-select .decorlayer .dshape.dfurniturehit{pointer-events:stroke;cursor:move;}.decorlayer .dsel{filter:drop-shadow(0 0 3px var(--hp-accent));}.decorlayer .ddraft{stroke-dasharray:calc(6px * var(--hp-cell-visual-scale,1)) calc(5px * var(--hp-cell-visual-scale,1));pointer-events:none;}.decorlayer .furniture-placement-preview{opacity:0.55;pointer-events:none;}.decorlayer text{font-weight:600;user-select:none;dominant-baseline:middle;text-anchor:middle;}.stage.mode-decor{outline:2px solid #26a69a;outline-offset:-2px;}.bdframe .bdbox{fill:none;stroke:var(--hp-accent);stroke-width:2;stroke-dasharray:10 7;vector-effect:non-scaling-stroke;pointer-events:none;opacity:0.9;}.bdframe .bdhandle{fill:transparent;stroke:none;pointer-events:all;touch-action:none;}.bdframe .bdknob{fill:var(--hp-accent);stroke:#fff;stroke-width:1;vector-effect:non-scaling-stroke;pointer-events:none;}:host([data-pointer-hover]) .bdframe .bdhandle:hover + .bdknob{fill:#fff;stroke:var(--hp-accent);}.bdframe .bd-nwse{cursor:nwse-resize;}.bdframe .bd-nesw{cursor:nesw-resize;}.stage.mode-decor.bdgrab{cursor:grab;}.stage.mode-decor.bdgrabbing,.stage.mode-decor.bdgrabbing .bdframe .bdhandle{cursor:grabbing;}.measurelabel.bdmeasure{transform:translate(-50%,-50%);border:1px solid var(--hp-accent);}.dtframe .dtbox{fill:none;stroke:var(--hp-accent);stroke-width:1.5;stroke-dasharray:7 5;vector-effect:non-scaling-stroke;pointer-events:none;opacity:0.85;}.dtframe .dtstem,.bdframe .dtstem{stroke:var(--hp-accent);stroke-width:1.5;vector-effect:non-scaling-stroke;pointer-events:none;opacity:0.85;}.dtframe .dthandle{fill:transparent;stroke:none;pointer-events:all;touch-action:none;}.dtframe .dtknob{fill:var(--hp-accent);stroke:#fff;stroke-width:1;vector-effect:non-scaling-stroke;pointer-events:none;}:host([data-pointer-hover]) .dtframe .dthandle:hover + .dtknob{fill:#fff;stroke:var(--hp-accent);}.dtframe .dt-nwse{cursor:nwse-resize;}.dtframe .dt-nesw{cursor:nesw-resize;}.dtframe .dtrot{cursor:grab;}.dtframe .dt-ew{cursor:ew-resize;}.dtframe .dt-ns{cursor:ns-resize;}.dtfurnitureframe .dtrot{cursor:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24'%3E%3Cpath d='M18.4 7.2A8 8 0 1 0 20 12' fill='none' stroke='%23000' stroke-width='2' stroke-linecap='round'/%3E%3Cpath d='m15.5 3.8 3.2 3.5-4.6.8' fill='none' stroke='%23000' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E") 12 12,grab;}.dtfurnitureframe .dtrot:active{cursor:grabbing;}.dtframe .dtendpoint{cursor:crosshair;}.bdframe .dtrot{cursor:grab;}.dtarea{resize:vertical;min-height:3.4em;font:inherit;line-height:1.35;}.stage.mode-decor.dtool-line,.stage.mode-decor.dtool-rect,.stage.mode-decor.dtool-ellipse,.stage.mode-decor.dtool-text{cursor:crosshair;}.stage.mode-decor.dtool-erase,.stage.mode-decor.dtool-erase .decorlayer .dshape{cursor:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24'%3E%3Cg transform='rotate(-45 12 12)'%3E%3Crect x='7' y='2' width='10' height='18' rx='2' fill='%23fff' stroke='%23111' stroke-width='1.5'/%3E%3Cpath d='M7 13h10v5a2 2 0 0 1-2 2H9a2 2 0 0 1-2-2z' fill='%23ff9f43' stroke='%23111' stroke-width='1.5'/%3E%3C/g%3E%3C/svg%3E") 5 22,pointer;}.stage.mode-decor .room{pointer-events:none;}.stage.mode-decor .devlayer,.stage.mode-decor .devlayer *,.stage.mode-decor .dev::before{pointer-events:none;}.stage .room,.stage .devlayer,.stage .opening,.stage .room-outline,.stage .wallbodies,.stage .opening-tunnels,.stage .glow-base-layer,.stage .glow-pools-frame,.stage .zero-walls{opacity:var(--hp-mode-architecture-opacity,1);}.opening-preview{opacity:0.5;pointer-events:none;}.opening-preview[data-kind="passage"]{opacity:1;}.passage-preview-cut{fill:var(--wall-fill,#ffffff);fill-opacity:0.35;stroke:none;pointer-events:none;}.passage-preview-boundary{stroke:var(--hp-open,#ff9800);stroke-width:calc(2.5px * var(--hp-cell-visual-scale,1));pointer-events:none;}.opening-preview .op-leaf,.opening-preview .op-arc{transition:none;}.opening-preview-dot{fill:var(--hp-open,#ff9800);pointer-events:none;}.opening-dimensions,.opening-dimension{pointer-events:none;}.opening-dimension-line,.opening-dimension-tick{fill:none;stroke:var(--hp-open,#ff9800);stroke-width:1.5;vector-effect:non-scaling-stroke;pointer-events:none;}.opening-dimension-tick{stroke-width:2;}.stage.edit .room{pointer-events:none;}.stage.markup{cursor:crosshair;}.stage.markup.tool-merge,.stage.markup.tool-split.pickstage,.stage.markup.tool-delroom{cursor:pointer;}.stage.markup.tool-wallthick{cursor:default;}.stage.markup.tool-wallthick.wallhot{cursor:pointer;}.wallbody-fill{fill:var(--wall-fill,#ffffff);fill-opacity:var(--wall-fill-op,1);fill-rule:evenodd;stroke:none;pointer-events:none;}.wallbody{fill:url(#hp-wall-hatch);fill-rule:evenodd;stroke:var(--room-stroke,var(--hp-muted));stroke-width:calc(0.6px * var(--hp-cell-visual-scale,1));pointer-events:none;}.wallbody.solid{fill:none;}.wallthick-hover{fill:var(--accent-color,#03a9f4);fill-opacity:0.38;stroke:var(--accent-color,#03a9f4);stroke-width:calc(2.5px * var(--hp-cell-visual-scale,1));stroke-linejoin:round;stroke-linecap:round;pointer-events:none;}.wallthick-hover.isopen{fill:var(--error-color,#f44336);stroke:var(--error-color,#f44336);}.zero-wall{stroke:var(--zero-wall-stroke,var(--hp-muted));stroke-width:calc(2.5px * var(--hp-cell-visual-scale,1));stroke-dasharray:calc(7px * var(--hp-cell-visual-scale,1)) calc(7px * var(--hp-cell-visual-scale,1));stroke-linecap:butt;pointer-events:none;opacity:0.9;}.zero-walls.solid .zero-wall{stroke-dasharray:none;}.room.noedge{stroke-opacity:0 !important;}.room-outline{fill:none;stroke-width:calc(2.5px * var(--hp-cell-visual-scale,1));stroke-linejoin:round;stroke-linecap:round;pointer-events:none;}.room-outline.outlined{stroke:rgba(62,166,255,0.55);stroke-opacity:1;}.room-hover-fill{fill:#000;fill-opacity:0.22;pointer-events:none;}.room-hover-halo{fill:none;stroke:var(--hp-accent);stroke-opacity:0.28;stroke-width:calc(8px * var(--hp-cell-visual-scale,1));stroke-linejoin:round;stroke-linecap:round;pointer-events:none;}.room-hover-outline{fill:none;stroke:var(--hp-accent);stroke-width:calc(3px * var(--hp-cell-visual-scale,1));stroke-linejoin:round;stroke-linecap:round;pointer-events:none;}.stage.markup .room{pointer-events:none;}.stage.markup .devlayer .dev{display:none;}.stage.mode-plan{outline:2px solid #ffc14d;outline-offset:-2px;}.stage.mode-devices{outline:2px solid var(--hp-accent);outline-offset:-2px;}.room.outlined{stroke:rgba(62,166,255,0.55);fill:rgba(62,166,255,0.06);}.room.picked{stroke:#ffc14d;stroke-width:calc(3px * var(--hp-cell-visual-scale,1));fill:rgba(255,193,77,0.25);}.griddot{fill:var(--hp-accent);opacity:0.35;stroke:rgba(0,0,0,0.35);stroke-width:0.4;}.griddot.major{opacity:0.5;stroke-width:0;}.seg{stroke:var(--hp-accent);stroke-width:calc(2.5px * var(--hp-cell-visual-scale,1));stroke-linecap:round;stroke-linejoin:round;}.pathline{stroke:#ffc14d;stroke-width:calc(3px * var(--hp-cell-visual-scale,1));fill:none;stroke-linecap:round;stroke-linejoin:round;}.preview{stroke:#ffc14d;stroke-width:calc(2px * var(--hp-cell-visual-scale,1));stroke-dasharray:calc(6px * var(--hp-cell-visual-scale,1)) calc(5px * var(--hp-cell-visual-scale,1));opacity:0.7;}.active-axis{stroke:#ffc14d;stroke-width:2;stroke-linecap:round;vector-effect:non-scaling-stroke;pointer-events:none;}.active-vertex{fill:#ffc14d;stroke:#171006;stroke-width:2;vector-effect:non-scaling-stroke;pointer-events:none;}.wall-repair-preview{stroke:#d93025;stroke-width:4;stroke-linecap:round;stroke-dasharray:5 4;vector-effect:non-scaling-stroke;pointer-events:none;}.drawwall-preview-fill{fill:var(--wall-fill,#ffffff);fill-opacity:calc(var(--wall-fill-op,1) * 0.55);fill-rule:evenodd;stroke:none;pointer-events:none;}.drawwall-preview{fill:url(#hp-wall-hatch);fill-opacity:0.55;fill-rule:evenodd;stroke:var(--accent-color,#03a9f4);stroke-width:calc(0.5px * var(--hp-cell-visual-scale,1));stroke-opacity:0.7;pointer-events:none;}.drawwall-zero-preview{fill:none;stroke:var(--accent-color,#03a9f4);stroke-width:calc(3px * var(--hp-cell-visual-scale,1));stroke-linecap:butt;stroke-linejoin:round;opacity:0.72;pointer-events:none;}.drawwall-zero-preview.dashed{stroke-dasharray:calc(7px * var(--hp-cell-visual-scale,1)) calc(7px * var(--hp-cell-visual-scale,1));}.vertex{fill:#ffc14d;stroke:#4a2800;stroke-width:calc(1px * var(--hp-cell-visual-scale,1));}.vertex.first{fill:#4bd28f;stroke:#04121f;}.plan-snap-overlay,.plan-snap-overlay *,.hidden-wall-diagnostic,.hidden-wall-diagnostic *{pointer-events:none;}.plan-snap-line,.hidden-wall-line{fill:none;stroke:color-mix(in srgb,var(--hp-accent) 82%,white 18%);stroke-width:1;stroke-linecap:round;opacity:0.92;}.plan-snap-node,.hidden-wall-node{fill:var(--ha-card-background,var(--card-background-color,#fff));stroke:color-mix(in srgb,var(--hp-accent) 88%,#07131c 12%);stroke-width:1;vector-effect:non-scaling-stroke;}.plan-snap-node.active{fill:#ffc14d;stroke:#171006;stroke-width:2;}.plan-snap-node.active.dynamic{fill:#4bd28f;stroke:#04121f;}.plan-snap-node.conflict{fill:#fff;stroke:#d93025;stroke-width:3;}@media (prefers-color-scheme:dark){.plan-snap-line{stroke:color-mix(in srgb,var(--hp-accent) 72%,white 28%);}.hidden-wall-line{stroke:color-mix(in srgb,var(--hp-accent) 72%,white 28%);}.plan-snap-node,.hidden-wall-node{fill:#17242c;stroke:#9bdcf5;}.plan-snap-node.active{fill:#ffc14d;stroke:#fff4d6;}.plan-snap-node.active.dynamic{fill:#4bd28f;stroke:#eafff4;}}@media (forced-colors:active){.plan-snap-line,.hidden-wall-line{stroke:CanvasText;opacity:1;forced-color-adjust:auto;}.plan-snap-node,.hidden-wall-node{fill:Canvas;stroke:CanvasText;forced-color-adjust:auto;}.plan-snap-node.active,.plan-snap-node.active.dynamic{fill:Highlight;stroke:HighlightText;forced-color-adjust:auto;}}.sunlayer{animation:hp-sunfade-in 2s linear both;}.sunlayer.out{animation:hp-sunfade-out 2s linear both;}@media (prefers-reduced-motion:reduce){.sunlayer,.sunlayer.out{animation:none;}.sunlayer.out{opacity:0;}}.devlayer{position:absolute;inset:0;pointer-events:none;z-index:6;}.radar-target{position:absolute;width:8px;height:8px;box-sizing:border-box;transform:translate(-50%,-50%);border-radius:50%;background:var(--success-color,#43a047);border:2px solid var(--primary-text-color,#1f1f1f);box-shadow:0 0 0 1px color-mix(in srgb,var(--card-background-color,#fff) 80%,transparent);pointer-events:none;z-index:0;}.radar-target.smooth{transition:left 200ms linear,top 200ms linear;}.radar-ranges{position:absolute;inset:0;width:100%;height:100%;overflow:visible;pointer-events:none;z-index:0;}.radar-ranges path,.radar-ranges polyline{fill:none;stroke:var(--success-color,#43a047);stroke-width:2px;stroke-dasharray:5 4;vector-effect:non-scaling-stroke;opacity:0.72;}.radar-ranges .radar-zone{fill:color-mix(in srgb,var(--success-color,#43a047) 8%,transparent);stroke:var(--success-color,#43a047);stroke-width:2px;vector-effect:non-scaling-stroke;opacity:0.8;}.stage.mode-devices .dev{cursor:grab;}.stage.mode-devices .dev:active{cursor:grabbing;}.physical-hit{fill:transparent;stroke:transparent;pointer-events:none;cursor:grab;}.stage.tool-select .physical-hit{pointer-events:all;}.physical-hit:active{cursor:grabbing;}line.physical-hit{cursor:pointer;}.physical-hit.selected{fill:rgba(255,193,77,0.24);stroke:transparent;}line.physical-hit.selected{stroke:transparent;}.physical-drag{fill:rgba(255,193,77,0.38);stroke:#ffc14d;stroke-width:2.5;vector-effect:non-scaling-stroke;pointer-events:none;}.physical-chrome{pointer-events:none;}.physical-chrome .frame,.physical-chrome .stem{fill:none;stroke:#ffc14d;stroke-width:2;vector-effect:non-scaling-stroke;}.physical-chrome .frame{fill:rgba(255,193,77,0.22);}.physical-chrome polyline.frame{fill:none;}.physical-chrome .move-dot{fill:#ffc14d;stroke:#24262d;stroke-width:1.5;vector-effect:non-scaling-stroke;}.physical-chrome .rotate-handle{fill:#24262d;stroke:#ffc14d;stroke-width:2.5;vector-effect:non-scaling-stroke;pointer-events:all;cursor:crosshair;}.drawwall.invalid input{border-color:var(--error-color,#db4437);}.drawwall .rangehint{margin-inline-start:4px;font-size:0.78em;opacity:0.72;}.drawwall.invalid .rangehint{color:var(--error-color,#db4437);opacity:1;}.stage.markup.tool-partition,.stage.markup.tool-column{cursor:crosshair;}.rszhandle{fill:transparent;stroke:none;pointer-events:all;cursor:grab;touch-action:none;}.rszhandle:active{cursor:grabbing;}.rszhandle.disabled,.rszhandle.disabled:active{cursor:not-allowed;}.rszicon{pointer-events:none;}.rszicon path{fill:none;stroke-linecap:round;stroke-linejoin:round;vector-effect:non-scaling-stroke;}.rszhalo{stroke:var(--hp-bg);stroke-width:6;}.rszink{stroke:var(--hp-accent);stroke-width:2;}:host([data-pointer-hover]) .rszhandle:hover + .rszicon .rszink{stroke-width:3;}.rszicon.disabled{opacity:0.38;}:host([data-pointer-hover]) .rszhandle.disabled:hover + .rszicon .rszink{stroke-width:2;}.rszmeasurelayer,.rszmeasurelayer *{pointer-events:none;}.rszmeasurehalo,.rszmeasureink,.rszleader{fill:none;stroke-linecap:round;vector-effect:non-scaling-stroke;}.rszmeasurehalo{stroke:var(--hp-bg);stroke-width:7px;opacity:0.9;}.rszmeasureink{stroke:var(--hp-accent);stroke-width:3px;}.rszleader{stroke:var(--hp-accent);stroke-width:2px;opacity:0.95;}.measurelabel.dmeasure{transform:translate(-50%,-160%);}.measurelabel.rszarea{transform:translate(calc(-50% + var(--rsz-label-x,0px)),calc(-50% + var(--rsz-label-y,0px)));background:rgba(0,0,0,0.6);border:1px solid var(--hp-accent);}.measurelabel.furnmeasure{transform:translate(-50%,-50%);border:1px solid var(--hp-accent);}.alignmsg{margin:0 0 8px;font-size:13px;line-height:1.45;}`,o`.dev ha-icon{position:relative;z-index:1;}.device-pulse{position:absolute;left:50%;top:50%;width:var(--dev-size);height:var(--dev-size);transform:translate(-50%,-50%);pointer-events:none;z-index:0;}.device-pulse i{position:absolute;inset:0;border-radius:50%;border:2px solid var(--ripple-color,var(--hp-accent));opacity:0;}.device-pulse.short i{animation:hp-pulse-short 1.1s cubic-bezier(.22,.61,.36,1) 1 forwards;}.device-pulse.short i:nth-child(2){animation-delay:1.1s;}.device-pulse.short i:nth-child(3){animation-delay:2.2s;}.device-pulse.short.gen2 i{animation-name:hp-pulse-short-b;}.device-pulse.continuous i:nth-child(n + 2),.device-pulse.alarm i:nth-child(n + 3){display:none;}.device-pulse.continuous i:first-child{animation:hp-pulse-continuous 3.6s cubic-bezier(.45,.05,.55,.95) infinite;}.device-pulse.alarm i{border-width:3px;border-color:#F0410C;animation:hp-pulse-alarm 2.4s cubic-bezier(.22,.61,.36,1) infinite;}.device-pulse.alarm i:nth-child(2){animation-delay:1.2s;}.activity-dot{position:absolute;right:8%;bottom:8%;width:18%;height:18%;min-width:4px;min-height:4px;border-radius:50%;background:var(--ripple-color,var(--hp-accent));border:1px solid color-mix(in srgb,var(--hp-bg) 82%,transparent);pointer-events:none;z-index:3;}.kioskdots{position:absolute;left:50%;bottom:var(--sp-5);transform:translateX(-50%);display:flex;gap:var(--sp-4);z-index:5;pointer-events:none;}.kdot{width:9px;height:9px;border-radius:50%;background:var(--hp-muted);opacity:0.55;}.kdot.on{background:var(--hp-accent);opacity:1;}.dev.valonly{width:var(--dev-size,var(--icon-size,2.5cqw));}.dev.valonly .device-core{width:max-content;min-width:var(--dev-size,var(--icon-size,2.5cqw));padding-inline:calc(var(--dev-size,var(--icon-size,2.5cqw)) * 0.16);border-radius:calc(var(--dev-size,var(--icon-size,2.5cqw)) / 2);}.dev .valtext{overflow:visible;font-size:calc(var(--dev-size,var(--icon-size,2.5cqw)) * var(--value-font-scale,.45));font-weight:600;white-space:nowrap;}@media (prefers-reduced-motion:reduce){.device-pulse{display:none;}}.dev .newdot{position:absolute;top:calc(var(--dev-size,var(--icon-size,2.5cqw)) * -0.12);right:calc(var(--dev-size,var(--icon-size,2.5cqw)) * -0.12);width:calc(var(--dev-size,var(--icon-size,2.5cqw)) * 0.34);height:calc(var(--dev-size,var(--icon-size,2.5cqw)) * 0.34);border-radius:50%;background:#f0301f;border:2px solid var(--card-background-color,var(--hp-bg));pointer-events:none;z-index:2;}.dev{position:absolute;--dev-size:calc(var(--device-base-size,2.25cqw) * var(--dev-scale,1));--device-shell-size:calc(var(--dev-size) * 1.26875);--device-shell-inset:calc(var(--dev-size) * 0.134375);--device-shell-stroke-ratio:0.01875;--device-shell-border-width:max(1px,calc(var(--dev-size) * var(--device-shell-stroke-ratio)));--device-core-bg:var(--card-background-color,#fff);--device-core-fg:var(--primary-text-color,#252525);--device-core-bg:light-dark(#fff,#252525);--device-core-fg:light-dark(#252525,#fff);--device-face-bg:var(--device-core-bg);--device-face-fg:var(--device-core-fg);--device-shell-base-stroke:light-dark(#BCBCBC,rgb(37 37 37 / 75%));--device-shell-stroke:var(--device-shell-base-stroke);--device-shell-shadow:0 calc(var(--dev-size) * .025) calc(var(--dev-size) * .05) rgb(37 40 45 / 12%),0 calc(var(--dev-size) * .1) calc(var(--dev-size) * .175) calc(var(--dev-size) * -.025) rgb(37 40 45 / 18%);--device-core-inset-shadow:0 0 0 0 transparent;--device-ring-color:transparent;--device-ring-width:0px;width:var(--dev-size);height:var(--dev-size);margin:calc(var(--dev-size) / -2) 0 0 calc(var(--dev-size) / -2);border:0;background:transparent;display:block;color:var(--device-core-fg);cursor:pointer;pointer-events:none;transition:opacity 0.2s;box-shadow:none;outline:none;z-index:auto;}.dev.theme-light{--device-core-bg:#fff;--device-core-fg:#000;--device-shell-base-stroke:#BCBCBC;--device-shell-stroke:var(--device-shell-base-stroke);--device-shell-shadow:0 calc(var(--dev-size) * .025) calc(var(--dev-size) * .05) rgb(37 40 45 / 12%),0 calc(var(--dev-size) * .1) calc(var(--dev-size) * .175) calc(var(--dev-size) * -.025) rgb(37 40 45 / 18%);--device-core-inset-shadow:0 0 0 0 transparent;}.dev.theme-dark{--device-core-bg:#252525;--device-core-fg:#fff;--device-shell-base-stroke:rgb(37 37 37 / 75%);--device-shell-stroke:var(--device-shell-base-stroke);--device-shell-shadow:0 calc(var(--dev-size) * .025) calc(var(--dev-size) * .0375) rgb(37 40 45 / 12%),0 calc(var(--dev-size) * .1) calc(var(--dev-size) * .175) calc(var(--dev-size) * -.025) rgb(37 40 45 / 18%);--device-core-inset-shadow:inset 0 calc(var(--dev-size) * 0.0125) calc(var(--dev-size) * 0.0125) rgb(255 255 255 / 70%);}.dev::before{content:'';position:absolute;left:50%;top:50%;width:max(44px,var(--device-shell-size));height:max(44px,var(--device-shell-size));transform:translate(-50%,-50%);border-radius:50%;pointer-events:auto;z-index:1;}.device-shell{position:absolute;box-sizing:border-box;display:flex;align-items:center;gap:calc(var(--dev-size) * 0.1);padding:0;min-width:var(--dev-size);min-height:var(--dev-size);border:0;background:transparent;box-shadow:none;transition:opacity .2s;pointer-events:none;z-index:2;}.device-shell-frame{position:absolute;z-index:0;box-sizing:border-box;inset:calc(var(--device-shell-inset) / -1);border:var(--device-shell-border-width) solid var(--device-shell-stroke);border-radius:9999px;background:transparent;box-shadow:var(--device-shell-shadow);transition:border-color .15s,opacity .2s;pointer-events:auto;backdrop-filter:none;}.device-shell:not(.with-values){left:0;top:0;}.device-shell:not(.with-values):not(.text-shell) .device-shell-frame{border-radius:50%;}.device-shell.with-values.pos-right{left:0;top:50%;transform:translateY(-50%);}.device-shell.with-values.pos-left{right:0;top:50%;transform:translateY(-50%);flex-direction:row-reverse;}.device-shell.with-values.pos-bottom{left:50%;top:0;transform:translateX(-50%);flex-direction:column;}.device-shell.with-values.pos-top{left:50%;bottom:0;transform:translateX(-50%);flex-direction:column-reverse;}.device-core{position:relative;z-index:1;box-sizing:border-box;flex:0 0 auto;width:var(--dev-size);height:var(--dev-size);display:flex;align-items:center;justify-content:center;border-radius:50%;background:var(--device-face-bg);color:var(--device-face-fg);box-shadow:var(--device-core-inset-shadow),0 0 0 var(--device-ring-width) var(--device-ring-color);line-height:0;transition:background .15s,color .15s,opacity .2s;pointer-events:none;}.device-sections{display:flex;flex-direction:column;align-items:stretch;justify-content:center;gap:calc(var(--dev-size) * .08);min-width:0;pointer-events:none;}.device-shell.pos-top .device-sections,.device-shell.pos-bottom .device-sections{flex-direction:row;}.dev ha-icon{--mdc-icon-size:calc(var(--dev-size,var(--device-base-size,2.25cqw)) * 0.55);display:flex;align-items:center;justify-content:center;line-height:0;}.dev.on{--device-face-bg:#F0A00C;--device-face-fg:light-dark(#fff,#252525);--device-shell-stroke:#F0A00C;}.dev.theme-light.on{--device-face-fg:#fff;}.dev.theme-dark.on{--device-face-fg:#252525;--device-shell-stroke-ratio:.0375;}.dev.open{--device-face-bg:var(--hp-open);--device-face-fg:light-dark(#fff,#252525);}.dev.theme-light.open{--device-face-fg:#fff;}.dev.theme-dark.open{--device-face-fg:#252525;}.dev.lock-locked{--device-face-bg:#66D17A;--device-face-fg:light-dark(#fff,#252525);--device-shell-stroke:#66D17A;}.dev.theme-light.lock-locked{--device-face-fg:#fff;}.dev.theme-dark.lock-locked{--device-face-fg:#252525;--device-shell-stroke-ratio:.025;}.dev.lock-unlocked{--device-face-bg:#F0410C;--device-face-fg:light-dark(#fff,#252525);--device-shell-stroke:#F0410C;}.dev.theme-light.lock-unlocked{--device-face-fg:#fff;}.dev.theme-dark.lock-unlocked{--device-face-fg:#252525;--device-shell-stroke-ratio:.025;}:host([data-pointer-hover]) .dev:not(.unavail)[data-hp-device-hover]{--device-face-bg:#0C82F0;--device-face-fg:light-dark(#fff,#252525);--device-shell-stroke:var(--device-shell-base-stroke);}:host([data-pointer-hover]) .dev.theme-light:not(.unavail)[data-hp-device-hover]{--device-face-fg:#fff;}:host([data-pointer-hover]) .dev.theme-dark:not(.unavail)[data-hp-device-hover]{--device-face-fg:#252525;}:host([data-pointer-hover]) .dev[data-hp-device-hover],.dev:focus-visible{z-index:5;}.dev[data-hp-zigbee-topology-endpoint]{z-index:8;}:host([data-pointer-hover]) .dev[data-hp-zigbee-topology-endpoint][data-hp-device-hover]{z-index:8;}.dev.unavail{opacity:0.35;--device-face-bg:#B5BAC1;--device-shell-stroke:var(--device-shell-base-stroke);}.dev.virtual .device-shell-frame{border-style:dashed;}.dev.ghost{opacity:0.6;color:var(--hp-accent);}.dev.ghost .device-shell-frame{border-style:dashed;border-color:var(--hp-accent);box-shadow:none;}.dev.ghost .device-core{background:rgba(62,166,255,0.22);background:color-mix(in srgb,var(--hp-accent) 30%,var(--card-background-color,#1c2530));color:var(--hp-accent);}.dev.ghost.ha-disabled{opacity:0.62;color:var(--secondary-text-color,#9aa0aa);}.dev.ghost.ha-disabled .device-shell-frame{border-color:var(--secondary-text-color,#9aa0aa);}.dev.ghost.ha-disabled .device-core{background:rgba(120,124,134,0.2);background:color-mix(in srgb,var(--secondary-text-color,#9aa0aa) 24%,var(--card-background-color,#1c2530));color:var(--secondary-text-color,#9aa0aa);}.dev .habadge{position:absolute;right:-18%;bottom:-18%;display:grid;place-items:center;width:46%;height:46%;min-width:12px;min-height:12px;border-radius:50%;background:var(--card-background-color,#242832);border:1px solid currentColor;}.dev .habadge ha-icon{width:72%;height:72%;}.dev.sel{--device-ring-color:#F0A00C;--device-ring-width:calc(var(--dev-size) * 0.0375);}.dev:focus-visible{--device-ring-color:#0C82F0;--device-ring-width:calc(var(--dev-size) * 0.0375);}.dev:not(.on):not(.open):not(.alarm):not(.lock-locked):not(.lock-unlocked):not(.unavail):focus-visible{--device-face-fg:#0C82F0;}.dev.alarm,:host([data-pointer-hover]) .dev.alarm[data-hp-device-hover],.dev.alarm:focus-visible{--device-face-bg:#F0410C;--device-face-fg:light-dark(#fff,#252525);--device-shell-stroke:#F0410C;}.dev.theme-light.alarm{--device-face-fg:#fff;}.dev.theme-dark.alarm{--device-face-fg:#252525;--device-shell-stroke-ratio:.025;}.dev .value-badge{position:relative;z-index:2;box-sizing:border-box;width:max-content;min-width:calc(var(--dev-size,var(--icon-size,2.5cqw)) * .7875);height:calc(var(--dev-size,var(--icon-size,2.5cqw)) * .7875);display:flex;align-items:center;justify-content:center;overflow:visible;background:var(--device-core-bg);border:0;border-radius:calc(var(--dev-size,var(--icon-size,2.5cqw)) * 0.39375);padding:0 calc(var(--dev-size,var(--icon-size,2.5cqw)) * 0.14);font-size:calc(var(--dev-size,var(--icon-size,2.5cqw)) * var(--value-font-scale,.45));font-weight:600;line-height:1;color:var(--device-core-fg);white-space:nowrap;pointer-events:none;}.dev .value-badge.unavailable,.dev .value-badge.missing{opacity:0.66;}.dev .lqi{position:absolute;top:calc(50% + var(--device-shell-size) / 2 + var(--dev-size) * .05);left:50%;transform:translateX(-50%);margin-top:calc(var(--dev-size,var(--icon-size,2.5cqw)) * 0.05);font-size:calc(var(--dev-size,var(--icon-size,2.5cqw)) * 0.38);font-weight:600;line-height:1;text-shadow:0 0 3px rgba(0,0,0,0.9),0 0 2px rgba(0,0,0,0.9);white-space:nowrap;pointer-events:none;}.dev .lqi.below-value-badge{margin-top:calc(var(--dev-size,var(--icon-size,2.5cqw)) * 0.8875);}.temprange{display:inline-flex;align-items:center;gap:var(--sp-3);margin-left:auto;color:var(--hp-muted);font-size:var(--fs-s);}.vacwarn{position:absolute;top:-12%;right:-12%;width:calc(var(--device-base-size,2.25cqw) * 0.42);height:calc(var(--device-base-size,2.25cqw) * 0.42);border-radius:50%;display:flex;align-items:center;justify-content:center;background:light-dark(#fff,#252525);border:1px solid #E5A100;color:#E5A100;z-index:7;pointer-events:none;}.vacwarn ha-icon{--mdc-icon-size:calc(var(--device-base-size,2.25cqw) * 0.32);color:inherit;}.vacpuck{position:absolute;--puck-size:calc(var(--device-base-size,2.25cqw) * 0.8);width:var(--puck-size);height:var(--puck-size);border-radius:50%;transform:translate(-50%,-50%);--vac-core-bg:light-dark(#fff,#252525);--vac-core-fg:light-dark(#252525,#fff);background:var(--vac-core-bg);border:1px solid #BCBCBC;box-shadow:0 1px 2px rgb(37 40 45 / 12%),0 4px 8px -1.07px rgb(37 40 45 / 18%);color:var(--vac-core-fg);display:flex;align-items:center;justify-content:center;cursor:pointer;z-index:6;transition:left 1.2s linear,top 1.2s linear;animation:vacpulse 2.2s ease-out infinite;}.vacpuck.theme-light{--vac-core-bg:#fff;--vac-core-fg:#252525;}.vacpuck.theme-dark{--vac-core-bg:#252525;--vac-core-fg:#fff;}.vacpuck.jump{transition:none;}.vacpuck.stale{opacity:0.45;animation:none;}.vacpuck ha-icon{--mdc-icon-size:calc(var(--puck-size) * 0.68);color:var(--vac-core-fg);display:flex;align-items:center;justify-content:center;line-height:0;width:var(--mdc-icon-size);height:var(--mdc-icon-size);}@keyframes vacpulse{0%{box-shadow:0 0 0 0 color-mix(in srgb,var(--hp-accent) 45%,transparent);}70%{box-shadow:0 0 0 12px transparent;}100%{box-shadow:0 0 0 0 transparent;}}@media (prefers-reduced-motion:reduce){.vacpuck{animation:none;}}.vactrail{position:absolute;inset:0;width:100%;height:100%;pointer-events:none;z-index:5;overflow:visible;}.vactrail polyline,.vactrail path{fill:none;stroke-linejoin:round;stroke-linecap:round;vector-effect:non-scaling-stroke;}.vactrail g.prev{opacity:0.4;}.vactrail .case{stroke:rgba(0,0,0,0.4);stroke-width:2.25;}.vactrail .core{stroke:rgba(255,255,255,0.82);stroke-width:0.9;}.devicepreview-empty{min-height:82px;margin:4px 0 14px;padding:var(--sp-4);display:flex;align-items:center;justify-content:center;gap:var(--sp-3);border:1px dashed var(--hp-line);border-radius:var(--rad-m);color:var(--hp-muted);text-align:center;}`,o`.hdr{position:sticky;top:var(--header-height,56px);z-index:20;background:var(--card-background-color,var(--hp-bg));border-radius:var(--ha-card-border-radius,12px) var(--ha-card-border-radius,12px) 0 0;}.tabs{display:flex;gap:var(--sp-2);background:rgba(127,127,127,0.12);padding:var(--sp-2);border-radius:var(--rad-l);flex-wrap:wrap;}.tab{border:0;background:transparent;color:var(--hp-muted);display:inline-flex;align-items:center;padding:var(--sp-3) var(--sp-5);border-radius:var(--rad-m);font-size:var(--fs-m);font-weight:600;cursor:pointer;transition:0.15s;font-family:inherit;}:host([data-pointer-hover]) .tab:hover{color:var(--hp-txt);}.tab.active{background:var(--hp-accent);color:var(--text-primary-color,#fff);}.farhint{position:absolute;left:50%;transform:translateX(-50%);bottom:var(--sp-4);z-index:12;display:flex;align-items:center;gap:var(--sp-2);max-width:calc(100% - var(--sp-8));background:var(--card-background-color,var(--hp-bg));opacity:0.94;color:var(--hp-txt);border:1px solid var(--divider-color,#33404d);border-radius:var(--rad-m);padding:var(--sp-1) var(--sp-3);font-size:var(--fs-s);}.farhint ha-icon{--mdc-icon-size:18px;color:var(--hp-warn,#e2a03f);flex:none;}.farhint span{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}.dropbtn{display:flex;align-items:center;gap:var(--sp-4);width:100%;text-align:left;border:1px solid var(--hp-muted);border-radius:var(--rad-m);background:transparent;color:var(--hp-txt);padding:var(--sp-4) 10px;cursor:pointer;font-family:inherit;font-size:var(--fs-m);margin-top:var(--sp-3);}.dropbtn .ref{color:var(--hp-muted);font-size:var(--fs-s);margin-left:auto;}.dropbtn ha-icon{--mdc-icon-size:18px;margin-left:var(--sp-2);}.dropbtn.open{border-color:var(--hp-accent);}.droppanel{border:1px solid var(--hp-accent);border-top:none;border-radius:0 0 var(--rad-m) var(--rad-m);padding:var(--sp-3);margin-top:-4px;}.hdr.kioskhide{display:none;}.decorbar .dcolor{width:30px;height:26px;padding:0;border:none;background:none;cursor:pointer;}.decorbar .dwidth{font-family:inherit;font-size:var(--fs-s);border-radius:var(--rad-s);background:var(--hp-bg2,transparent);color:var(--hp-txt);border:1px solid var(--hp-muted);padding:var(--sp-2) var(--sp-3);}.decorbar .bdhint{font-size:var(--fs-s);color:var(--hp-muted);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}.decorbar .dfill{display:inline-flex;align-items:center;gap:var(--sp-2);font-size:var(--fs-s);cursor:pointer;}.decorbar .dfill input[type="checkbox"]{width:16px;height:16px;flex:none;margin:0;padding:0;}.decorbar hp-color-opacity{flex:0 0 auto;}.modes{display:inline-flex;gap:var(--sp-1);background:rgba(127,127,127,0.12);border-radius:var(--rad-l);padding:var(--sp-2);}.modetab{display:inline-flex;align-items:center;gap:var(--sp-3);border:0;background:transparent;color:var(--hp-muted);padding:var(--sp-3) 10px;border-radius:var(--rad-m);font-size:var(--fs-m);font-weight:600;cursor:pointer;font-family:inherit;transition:background-color 0.14s ease,color 0.14s ease,transform 0.14s ease;}.modetab:active{transform:scale(0.97);}.modetab ha-icon{--mdc-icon-size:15px;}.tab[data-reorderable]{cursor:grab;}.tab.dragging{cursor:grabbing;opacity:0.55;}.tab.drop-before{box-shadow:inset 2px 0 0 0 var(--primary-color,#03a9f4);}.tab.drop-after{box-shadow:inset -2px 0 0 0 var(--primary-color,#03a9f4);}.modetab .closex{--mdc-icon-size:13px;box-sizing:border-box;display:inline-flex;align-items:center;justify-content:center;width:24px;height:24px;min-width:24px;min-height:24px;margin:-5.5px -5.5px -5.5px -3.5px;opacity:0.75;cursor:pointer;border-radius:var(--rad-s);}:host([data-pointer-hover]) .modetab .closex:hover{opacity:1;}.editbar .barclose{box-sizing:border-box;width:40px;height:40px;padding:0;margin:0;min-width:40px;min-height:40px;justify-content:center;gap:0;line-height:0;}.editbar .barclose ha-icon{flex:none;margin:0;}.modetab.active{background:var(--hp-accent);color:var(--text-primary-color,#fff);}@media (max-width:720px){.modetab .ml{display:none;}}.editbar{display:grid;grid-template-columns:minmax(0,1fr) auto;align-items:stretch;border-bottom:1px solid var(--hp-line);font-size:var(--fs-m);}.editbar-tools{display:flex;align-items:center;gap:10px;padding:var(--sp-4) var(--sp-5);flex-wrap:wrap;min-width:0;outline:none;}.editbar-end{display:flex;align-items:center;padding:var(--sp-4) var(--sp-5);border-inline-start:1px solid var(--hp-line);background:var(--card-background-color,var(--hp-bg));position:relative;z-index:2;}.tab .tabedit{--mdc-icon-size:13px;display:inline-flex;align-items:center;margin-left:var(--sp-3);opacity:0.4;}:host([data-pointer-hover]) .tab:hover .tabedit{opacity:0.9;}.tab.tabadd{padding:var(--sp-3) var(--sp-4);}.tab.tabadd ha-icon{--mdc-icon-size:15px;}.rhint{font-size:var(--fs-s);color:var(--hp-muted);margin-bottom:var(--sp-3);}.togglehint{overflow-wrap:anywhere;}.togglehint>div + div{margin-top:var(--sp-1);}.editorchrome{display:block;height:0;opacity:0;visibility:hidden;overflow:hidden;}.editorchrome:not(.open){pointer-events:none;}.editorchrome.open{height:auto;opacity:1;visibility:visible;overflow:visible;}.editorchrome.transitioning{overflow:hidden;will-change:height;pointer-events:none;}.editorchrome.transitioning .barclose{pointer-events:auto;}.editorchrome-inner{min-height:0;transform-origin:top center;}.editorchrome.transitioning .editorchrome-inner{will-change:opacity;}@media (prefers-reduced-motion:reduce){.modetab{transition:none;}}.editbar .warn{color:#ffc14d;}.editbar .sname{font-weight:600;}.editbar input{width:74px;background:transparent;border:1px solid var(--hp-line);color:var(--hp-txt);border-radius:var(--rad-s);padding:var(--sp-3) var(--sp-4);font-size:var(--fs-m);}.editbar label,.editbar .hint{color:var(--hp-muted);font-size:var(--fs-s);}.editbar .drawwall{display:inline-flex;align-items:center;gap:var(--sp-3);white-space:nowrap;}.editbar .wallsgroup{display:inline-flex;align-items:center;gap:10px;white-space:nowrap;}.editbar .drawwall input{width:4.2em;}.editbar .drawwall .opl{color:var(--hp-muted);font-size:var(--fs-s);}.menuwrap{position:fixed;inset:0;z-index:80;}.menu{position:fixed;background:var(--hp-bg);border:1px solid var(--hp-accent);border-radius:var(--rad-l);box-shadow:var(--shadow-2);min-width:210px;max-width:300px;overflow:hidden;transform:translate(0,8px);}.menu .hd{padding:var(--sp-4) var(--sp-5);font-weight:600;font-size:var(--fs-m);border-bottom:1px solid var(--hp-line);display:flex;align-items:center;gap:var(--sp-3);}.menu .hd ha-icon,.menu .it.all ha-icon{color:var(--hp-accent);--mdc-icon-size:16px;}.menu .it{padding:var(--sp-4) var(--sp-5);font-size:var(--fs-m);cursor:pointer;display:flex;align-items:center;gap:var(--sp-4);}.menu .it ha-icon{--mdc-icon-size:16px;color:var(--hp-muted);}:host([data-pointer-hover]) .menu .it:hover{background:rgba(127,127,127,0.15);}.menu .it.all{color:var(--hp-accent);font-weight:600;}.tip{position:fixed;pointer-events:none;background:var(--hp-bg);border:1px solid var(--hp-accent);color:var(--hp-txt);padding:var(--sp-3) 10px;border-radius:var(--rad-m);font-size:var(--fs-m);box-shadow:var(--shadow-2);z-index:60;max-width:260px;}.tip .m{color:var(--hp-muted);font-size:var(--fs-s);display:block;}`,o`.head{display:flex;align-items:center;gap:10px;padding:10px var(--sp-5);border-bottom:1px solid var(--hp-line);flex-wrap:wrap;}.title{font-size:var(--fs-l);font-weight:600;display:flex;align-items:center;gap:var(--sp-3);white-space:nowrap;}.title ha-icon{color:var(--hp-accent);--mdc-icon-size:18px;}@media (max-width:1100px){.head .count{display:none;}}@media (max-width:620px){.head{gap:var(--sp-3);padding:var(--sp-4) 10px;}.head .title{font-size:var(--fs-m);}}.count{font-size:var(--fs-s);color:var(--hp-muted);}.btn{display:inline-flex;align-items:center;gap:var(--sp-3);border:1px solid var(--hp-line);background:transparent;color:var(--hp-txt);padding:var(--sp-3) 10px;border-radius:var(--rad-m);cursor:pointer;transition:0.15s;font-family:inherit;font-size:var(--fs-m);}.btn ha-icon{--mdc-icon-size:17px;}:host([data-pointer-hover]) .btn:hover{border-color:var(--hp-accent);}.btn.on{background:var(--hp-accent);color:var(--text-primary-color,#fff);border-color:var(--hp-accent);}.btn.ghost{border:none;}.btn[disabled]{opacity:0.5;pointer-events:none;}.sunrow{display:flex;align-items:center;gap:var(--sp-5);margin:var(--sp-3) 0;}.suncol{flex:1;display:flex;flex-direction:column;gap:var(--sp-3);min-width:0;}.recoveryoverlay{position:absolute;inset:0;z-index:75;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:var(--sp-4);padding:var(--sp-6);box-sizing:border-box;background:linear-gradient(var(--ha-card-background,var(--card-background-color,#111)),var(--ha-card-background,var(--card-background-color,#111))),#111;color:var(--primary-text-color,#fff);text-align:center;pointer-events:auto;transition:opacity 0.15s ease;}.recoveryoverlay.phase-entering,.recoveryoverlay.phase-leaving{opacity:0;}.recoveryoverlay.phase-fading-in,.recoveryoverlay.phase-opaque{opacity:1;}.recoveryoverlay ha-icon{--mdc-icon-size:44px;color:var(--hp-accent);}.editorloading{position:absolute;z-index:74;left:50%;top:50%;display:flex;align-items:center;gap:var(--sp-3);padding:var(--sp-3) var(--sp-5);border:1px solid color-mix(in srgb,var(--hp-accent) 45%,transparent);border-radius:999px;background:color-mix(in srgb,var(--ha-card-background,var(--card-background-color,#111)) 92%,transparent);color:var(--primary-text-color);box-shadow:0 6px 22px rgb(0 0 0 / 18%);transform:translate(-50%,-50%);pointer-events:none;animation:editor-loading-in 0.15s ease both;}.editorloading ha-icon{--mdc-icon-size:22px;color:var(--hp-accent);animation:editor-loading-spin 0.9s linear infinite;}@keyframes editor-loading-in{from{opacity:0;transform:translate(-50%,calc(-50% + 4px));}to{opacity:1;transform:translate(-50%,-50%);}}@keyframes editor-loading-spin{to{transform:rotate(360deg);}}@media (prefers-reduced-motion:reduce){.recoveryoverlay,.editorloading,.editorloading ha-icon{transition:none;animation:none;}}.oplock{--oplock-size:calc(var(--icon-size,2.5cqw) * 0.62);--oplock-core-size:calc(var(--oplock-size) / 1.26875);--oplock-stroke-ratio:0.01875;--oplock-stroke-width:max(1px,calc(var(--oplock-core-size) * var(--oplock-stroke-ratio)));--oplock-core-bg:light-dark(#fff,#252525);--oplock-core-fg:light-dark(#252525,#fff);--oplock-shell-stroke:light-dark(#BCBCBC,rgb(37 37 37 / 75%));--oplock-shell-shadow:0 calc(var(--oplock-core-size) * .025) calc(var(--oplock-core-size) * .05) rgb(37 40 45 / 12%),0 calc(var(--oplock-core-size) * .1) calc(var(--oplock-core-size) * .175) calc(var(--oplock-core-size) * -.025) rgb(37 40 45 / 18%);--oplock-core-shadow:0 0 0 0 transparent;pointer-events:none;position:absolute;transform:translate(-50%,-50%);width:var(--oplock-size);height:var(--oplock-size);display:grid;place-items:center;border:0;background:transparent;z-index:1;}.oplock.theme-light{--oplock-core-bg:#fff;--oplock-core-fg:#252525;--oplock-shell-stroke:#BCBCBC;}.oplock.theme-dark{--oplock-core-bg:#252525;--oplock-core-fg:#fff;--oplock-shell-stroke:rgb(37 37 37 / 75%);--oplock-core-shadow:inset 0 calc(var(--oplock-core-size) * .0125) calc(var(--oplock-core-size) * .0125) rgb(255 255 255 / 70%);}.oplock-shell{box-sizing:border-box;width:100%;height:100%;border:var(--oplock-stroke-width) solid var(--oplock-shell-stroke);border-radius:50%;background:transparent;box-shadow:var(--oplock-shell-shadow);display:grid;place-items:center;pointer-events:none;backdrop-filter:none;}.oplock-core{width:var(--oplock-core-size);height:var(--oplock-core-size);border-radius:50%;background:var(--oplock-core-bg);color:var(--oplock-core-fg);box-shadow:var(--oplock-core-shadow);display:grid;place-items:center;pointer-events:none;}.oplock ha-icon{--mdc-icon-size:calc(var(--oplock-core-size) * 0.55);display:flex;line-height:0;}.oplock.locked{--oplock-core-bg:#66D17A;--oplock-core-fg:light-dark(#fff,#252525);--oplock-shell-stroke:#66D17A;}.oplock.theme-light.locked{--oplock-core-fg:#fff;}.oplock.theme-dark.locked{--oplock-core-fg:#252525;--oplock-stroke-ratio:.025;}.oplock.unlocked{--oplock-core-bg:#F0410C;--oplock-core-fg:light-dark(#fff,#252525);--oplock-shell-stroke:#F0410C;}.oplock.theme-light.unlocked{--oplock-core-fg:#fff;}.oplock.theme-dark.unlocked{--oplock-core-fg:#252525;--oplock-stroke-ratio:.025;}.oplock.unknown{--oplock-core-fg:var(--hp-muted);}.btn.lockact{width:100%;justify-content:center;display:flex;align-items:center;gap:var(--sp-3);margin-top:var(--sp-4);}.btn.lockact.warn{color:var(--error-color,#d33);border-color:var(--error-color,#d33);}.oprow{display:flex;align-items:center;gap:var(--sp-4);padding:var(--sp-3) 0;}.oprow b{margin-left:auto;}.oprow.ok b{color:#66d17a;}.oprow.warn b{color:var(--hp-open);}.bindharow{display:flex;align-items:center;gap:var(--sp-5);flex-wrap:wrap;}.bindharow .entcheck{opacity:0.9;}.ctrlchips{display:flex;flex-wrap:wrap;gap:var(--sp-3);margin:var(--sp-2) 0;}.ctrlchip{display:inline-flex;align-items:center;gap:var(--sp-2);background:var(--hp-accent);color:var(--text-primary-color,#fff);border-radius:var(--rad-l);padding:var(--sp-2) var(--sp-4);font-size:var(--fs-s);}.ctrlchip ha-icon{--mdc-icon-size:14px;cursor:pointer;}.ctrllist{display:flex;flex-direction:column;gap:var(--sp-1);margin-top:var(--sp-2);}.ctrlopt{display:flex;align-items:center;gap:var(--sp-4);text-align:left;border:0;background:transparent;color:var(--hp-txt);padding:var(--sp-3) var(--sp-4);border-radius:var(--rad-s);cursor:pointer;font-family:inherit;font-size:var(--fs-m);}:host([data-pointer-hover]) .ctrlopt:hover{background:var(--secondary-background-color,rgba(128,128,128,0.15));}.ctrlopt .sub{color:var(--hp-muted);font-size:var(--fs-s);margin-left:auto;}.ctrlopt ha-icon{--mdc-icon-size:16px;}.ctrlstates{display:flex;flex-direction:column;gap:var(--sp-2);}.ctrlstate{display:inline-flex;align-items:center;gap:var(--sp-3);color:var(--hp-muted);}.ctrlstate.on{color:var(--hp-txt);}.ctrlstate ha-icon{--mdc-icon-size:15px;}.cardpreview{display:flex;flex-direction:column;align-items:center;gap:var(--sp-2);margin:var(--sp-4) 0 var(--sp-1);padding:10px;border:1px dashed var(--hp-muted);border-radius:var(--rad-m);}.cardpreview .cpname{font-weight:700;letter-spacing:0.04em;}.cardpreview .cpmeta{display:inline-flex;align-items:center;gap:0.3em;font-weight:600;opacity:0.85;}.cardpreview .cpmeta ha-icon{--mdc-icon-size:1.05em;}.iconauto{display:flex;align-items:center;gap:var(--sp-3);font-size:var(--fs-s);margin:var(--sp-2) 0 0;}.iconauto ha-icon{--mdc-icon-size:18px;}.iconauto span{flex:1;}.iconauto .btn{min-height:32px;padding:0 var(--sp-3);}hp-dialog .dfill{display:inline-flex;align-items:center;gap:var(--sp-3);cursor:pointer;}.wallthick-dlg{position:absolute;z-index:40;min-width:200px;transform:translate(-50%,8px);padding:10px 12px;border-radius:10px;background:var(--card-background-color,#fff);box-shadow:0 8px 28px rgba(0,0,0,.22);display:flex;flex-direction:column;gap:8px;pointer-events:auto;}.wallthick-dlg .row{display:flex;align-items:center;gap:8px;}.wallthick-dlg input[type="number"]{width:5.5em;padding:4px 6px;border:1px solid var(--divider-color,#ccc);border-radius:6px;background:var(--input-fill,transparent);color:var(--primary-text-color);}.areasel,.namein{background:var(--hp-bg);border:1px solid var(--hp-line);color:var(--hp-txt);border-radius:var(--rad-s);padding:var(--sp-3) var(--sp-4);font-size:var(--fs-m);font-family:inherit;}.namein{width:130px;}.habindingbanner{display:flex;align-items:center;gap:var(--sp-3);padding:var(--sp-3) var(--sp-4);margin-bottom:var(--sp-4);border:1px solid var(--warning-color,#ff9800);border-radius:var(--rad-m);background:color-mix(in srgb,var(--warning-color,#ff9800) 12%,transparent);color:var(--primary-text-color,#f1f3f6);}.habindingbanner>span{flex:1;min-width:0;}.habindingbanner>ha-icon{color:var(--warning-color,#ff9800);flex:0 0 auto;}.habindingbanner.limited{border-color:var(--secondary-text-color,#9aa0aa);background:color-mix(in srgb,var(--secondary-text-color,#9aa0aa) 10%,transparent);}.habindingbanner.limited>ha-icon{color:var(--secondary-text-color,#9aa0aa);}.srcrow{display:flex;align-items:center;gap:var(--sp-4);font-size:var(--fs-m);cursor:pointer;padding:var(--sp-1) 0;}.dispsection{margin-top:var(--sp-5) !important;padding-top:var(--sp-4);border-top:1px solid var(--hp-line);font-weight:600;color:var(--hp-txt) !important;}.colorrow{display:flex;align-items:center;gap:var(--sp-4);}.roomtemprange{display:grid;gap:8px;min-width:0;}.roomtemprange-head{display:flex;flex-wrap:wrap;align-items:center;gap:6px;}.roomtemprange-fields{display:flex;flex-wrap:wrap;align-items:center;gap:8px;min-width:0;}.roomtemprange-fields input{flex:0 1 104px;min-width:72px;}.roomtemprange-fields input[aria-invalid='true']{border-color:var(--error-color,#db4437);}.gsrow>hp-color-opacity{min-width:min(100%,210px);justify-content:space-between;}.ripple-colorrow>hp-color-opacity{width:100%;justify-content:space-between;}.ripple-sizerow>.opl{min-width:0;}.colorrow input[type='range']{flex:1;}.colorrow .tempin{width:70px;flex:none;}hp-dialog .body .temprange .tempin{width:56px;flex:none;padding:var(--sp-2) var(--sp-3);}hp-dialog .body .colorrow .tempin{width:72px;flex:none;}.srcrow{flex-wrap:nowrap;}.srcrow ha-switch{flex:none;}.colorrow ha-slider{flex:1;min-width:0;}.srcrow>span:first-of-type{white-space:nowrap;}.colorrow .opl{color:var(--hp-muted);font-size:var(--fs-s);}.colorrow .opv{font-size:var(--fs-s);min-width:34px;text-align:right;}.markerlightgroup{min-width:0;margin:var(--sp-5) 0 0;padding:var(--sp-4);border:1px solid var(--hp-line);border-radius:var(--rad-m);}.markerlightgroup legend{display:flex;align-items:center;flex-wrap:wrap;gap:var(--sp-1);padding:0 var(--sp-2);color:var(--hp-txt);font-weight:600;}.markerlightgroup legend>span{min-width:0;overflow-wrap:anywhere;}.markerlightgroup[disabled]>:not(legend){opacity:.62;}.radargroup{display:grid;gap:var(--sp-2);}.radargroup>p{margin:0;}.radargroup>label:not(.srcrow){margin-top:var(--sp-2);}.radarcoordinates{align-items:flex-end;flex-wrap:wrap;}.radarcoordinates>label{display:grid;flex:1 1 92px;gap:var(--sp-1);min-width:0;margin:0;}hp-dialog .body .radarcoordinates .tempin{box-sizing:border-box;width:100%;}.radaradditional{margin-top:var(--sp-5);}.radaradditional summary{cursor:pointer;font-weight:600;}.radaradditional .btn{margin-top:var(--sp-3);}.radarinspection{display:grid;gap:6px;padding:10px 12px;border-radius:10px;background:color-mix(in srgb,var(--primary-color) 7%,transparent);}.radarinspection code{overflow-wrap:anywhere;font-size:12px;}.radarsetup{display:grid;gap:10px;margin-top:10px;padding:12px;border:1px solid var(--hp-accent);border-radius:var(--rad-m);background:color-mix(in srgb,var(--secondary-background-color) 88%,transparent);}.radarsetup-head{display:flex;align-items:center;gap:8px;}.radarsetup-head strong{flex:1;}.radarsetup>svg{width:min(100%,460px);aspect-ratio:1;justify-self:center;border-radius:var(--rad-m);background:var(--primary-background-color);touch-action:none;cursor:crosshair;}.radarsetup .room{fill:color-mix(in srgb,var(--hp-accent) 8%,transparent);stroke:var(--divider-color);stroke-width:3;vector-effect:non-scaling-stroke;}.radarsetup .heading{stroke:var(--hp-accent);stroke-width:4;vector-effect:non-scaling-stroke;}.radarsetup .trail{fill:none;stroke:var(--success-color,#43a047);stroke-width:3;stroke-linecap:round;stroke-linejoin:round;vector-effect:non-scaling-stroke;opacity:.55;}.radarsetup g circle{fill:var(--hp-bg);stroke:var(--hp-accent);stroke-width:3;vector-effect:non-scaling-stroke;}.radarsetup g.pending circle{stroke-dasharray:5 4;}.radarsetup g text{fill:var(--hp-txt);font-size:22px;font-weight:700;text-anchor:middle;dominant-baseline:middle;pointer-events:none;}.markerhelpfield{margin-top:var(--sp-4);}.markerhelplabel{display:flex;align-items:center;flex-wrap:wrap;gap:var(--sp-1);margin-bottom:var(--sp-1);}.markerhelplabel>label{min-width:0;overflow-wrap:anywhere;}.helpfieldlabel{display:flex;align-items:center;flex-wrap:wrap;gap:var(--sp-1);min-width:0;margin-top:var(--sp-3);color:var(--hp-muted);font-size:var(--fs-s);}.helpfieldlabel.compact{margin-top:0;}hp-dialog .body .helpfieldlabel>label{min-width:0;margin-top:0;overflow-wrap:anywhere;}.help-inline-label{display:inline-flex;align-items:center;flex-wrap:wrap;gap:var(--sp-1);}hp-dialog .body .help-inline-label>label{min-width:0;margin-top:0;overflow-wrap:anywhere;}.markerradios{display:grid;gap:var(--sp-1);min-width:0;}.markerlightgroup .srcrow>span:first-of-type{min-width:0;white-space:normal;overflow-wrap:anywhere;}.markerglowvalue{margin:var(--sp-3) 0;flex-wrap:wrap;}.markerglowvalue hp-color-opacity{flex:none;}.markerlightdisabled{display:flex;align-items:center;gap:var(--sp-2);margin-top:var(--sp-2) !important;}.markerlightdisabled ha-icon{--mdc-icon-size:18px;flex:none;}.markerbadgetechnical{min-width:0;margin:var(--sp-1) 0 var(--sp-2) !important;overflow-wrap:anywhere;}.markerbadgetechnical code{white-space:normal;}.planrow{display:flex;align-items:center;gap:10px;}.savedplans{display:flex;flex-direction:column;gap:var(--sp-3);max-height:240px;overflow:auto;margin:var(--sp-3) 0 var(--sp-1);padding:var(--sp-3);border:1px solid var(--hp-line);border-radius:var(--rad-m);background:var(--hp-bg2,rgba(255,255,255,0.03));flex:0 0 auto;min-height:2.6em;}.savedplan{display:flex;align-items:center;gap:10px;}.savedplan.cur{outline:1px solid var(--hp-accent);border-radius:var(--rad-s);}.savedplan img{width:56px;height:40px;object-fit:contain;border:1px solid var(--hp-line);border-radius:var(--rad-s);background:#fff;flex:none;}.savedmeta{display:flex;flex-direction:column;min-width:0;flex:1;}.savedmeta b{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}.savedmeta .muted{font-size:var(--fs-s);}.savedplan .btn.danger ha-icon{color:#f25a4a;}.savedplan .btn[disabled]{opacity:0.4;pointer-events:none;}.planprev{max-width:120px;max-height:70px;border:1px solid var(--hp-line);border-radius:var(--rad-s);background:#fff;}.planname{font-size:var(--fs-m);max-width:150px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}.planname.muted{color:var(--hp-muted);}.filebtn{cursor:pointer;}.fileupload{display:inline-flex;min-width:0;}.fileupload>input{display:none;}.btn.danger{border-color:#b3402a;color:#ff7a5c;}hp-dialog .row .spacer{flex:1;}hp-dialog .body{max-height:66vh;overflow-y:auto;}hp-confirm{display:contents;}hp-dialog .danger-confirm-body{display:flex;flex-direction:column;gap:var(--sp-4);}hp-dialog .danger-confirm-body p{margin:0;line-height:1.45;}hp-dialog .danger-confirm-object{overflow-wrap:anywhere;font-size:var(--fs-l);line-height:1.3;}.descin{width:100%;box-sizing:border-box;background:var(--hp-bg);border:1px solid var(--hp-line);color:var(--hp-txt);border-radius:var(--rad-s);padding:var(--sp-3) var(--sp-4);font-size:var(--fs-m);font-family:inherit;resize:vertical;min-height:92px;flex-shrink:0;line-height:1.35;}.bindsel{display:flex;flex-direction:column;gap:var(--sp-3);border:1px solid var(--hp-line);border-radius:var(--rad-m);padding:var(--sp-4);}.bindsel .opt{display:flex;align-items:center;gap:var(--sp-3);border:1px solid var(--hp-line);background:transparent;color:var(--hp-txt);border-radius:var(--rad-s);padding:var(--sp-3) var(--sp-4);cursor:pointer;font-size:var(--fs-m);font-family:inherit;}.bindsel .opt.on{background:var(--hp-accent);color:var(--text-primary-color,#fff);border-color:var(--hp-accent);}.curbind{display:flex;align-items:center;gap:var(--sp-3);font-size:var(--fs-m);color:var(--hp-txt);flex-wrap:wrap;}.curbind .ref{color:var(--hp-muted);font-size:var(--fs-s);}.vacbox .vacbtns{display:flex;gap:var(--sp-4);margin:var(--sp-3) 0;flex-wrap:wrap;}.vacdiag{display:grid;gap:4px;margin-bottom:var(--sp-3);}.vacdiag>div{display:flex;justify-content:space-between;gap:var(--sp-5);}.vacdiag>div>span{color:var(--secondary-text-color);}.vacdiag>div>b{text-align:right;overflow-wrap:anywhere;}.vacroute-missing-group{margin-top:var(--sp-4);padding-top:var(--sp-4);border-top:1px solid var(--hp-line);}.vacroute-group-title{margin:0 0 var(--sp-3);color:var(--secondary-text-color);font-size:var(--fs-m);font-weight:600;}.vacroute-missing-group .vacroute-list{margin-top:0;}.vacpicker{margin:var(--sp-3) 0;}.vacsource-warning{display:grid;gap:8px;}.vacsource-warning .btn{justify-self:start;}.vacpicker>summary{display:inline-flex;width:auto;list-style:none;cursor:pointer;}.vacpicker>summary::-webkit-details-marker{display:none;}.vacsource-list{display:grid;gap:6px;margin-top:8px;}.vacsource-list details{padding:6px 0 0;}.vacsource-list details>summary{cursor:pointer;font-weight:600;}.vacsource{display:flex;align-items:center;justify-content:space-between;gap:12px;width:100%;min-width:0;padding:9px 10px;border:1px solid var(--divider-color);border-radius:10px;color:var(--primary-text-color);background:var(--secondary-background-color);text-align:left;cursor:pointer;}.vacsource.on{border-color:var(--accent-color);box-shadow:inset 3px 0 var(--accent-color);}.vacsource>span:first-child{min-width:0;display:grid;gap:2px;}.vacsource small{color:var(--secondary-text-color);overflow-wrap:anywhere;}.vacsource-meta{color:var(--secondary-text-color);text-align:right;font-size:0.82em;}.vacxcme pre{margin:8px 0 0;white-space:pre-wrap;user-select:text;}.vacfit{position:absolute;inset:0;width:100%;height:100%;z-index:12;overflow:visible;touch-action:none;cursor:grab;pointer-events:auto;}.vacfit:active{cursor:grabbing;}.vacfit polygon{fill:color-mix(in srgb,var(--hp-accent) 16%,transparent);stroke:var(--hp-accent);stroke-width:2;vector-effect:non-scaling-stroke;stroke-dasharray:6 4;}.vacfit text{fill:var(--hp-accent);font-size:26px;text-anchor:middle;dominant-baseline:middle;pointer-events:none;user-select:none;}.furnpalette{display:flex;flex-direction:column;max-height:38vh;border-top:1px solid var(--hp-border,rgba(255,255,255,0.12));background:var(--card-background-color,var(--hp-bg));font-size:0.85em;}.furnhd{display:flex;align-items:center;gap:6px;padding:4px 8px;font-weight:600;opacity:0.9;}.furnhd .spacer{flex:1;}.furnbody{overflow:auto;padding:0 8px 6px;}.furngroup{margin:6px 0 3px;font-size:0.85em;text-transform:uppercase;letter-spacing:0.04em;opacity:0.6;}.furnrow{display:flex;flex-wrap:wrap;gap:4px;}.furnback{min-height:34px;gap:5px;margin:2px 0 4px;}.furnitem{display:flex;flex-direction:column;align-items:center;gap:2px;width:74px;padding:4px 2px;border:1px solid transparent;border-radius:8px;background:rgba(127,127,127,0.08);color:inherit;font:inherit;font-size:0.8em;line-height:1.15;text-align:center;cursor:pointer;}:host([data-pointer-hover]) .furnitem:hover{background:rgba(127,127,127,0.18);}.furnitem.on{border-color:var(--hp-accent);background:rgba(38,166,154,0.18);}.furnprev{width:40px;height:40px;color:var(--primary-text-color,currentColor);}.furncategory{width:92px;min-height:76px;}.furncatprev{width:48px;height:48px;}.furnvariants .furnitem{min-height:74px;}.furnsize{display:flex;align-items:center;flex-wrap:wrap;gap:6px;padding:6px 8px;border-top:1px solid var(--hp-border,rgba(255,255,255,0.12));}.furnsize label{display:flex;align-items:baseline;gap:3px;opacity:0.8;}.furnsize .furnunit{opacity:0.6;font-size:0.85em;}.furnsize input{width:5.5em;padding:3px 5px;}.furnhint{opacity:0.6;}.imageupload{display:inline-flex;gap:6px;margin:4px 0 8px;cursor:pointer;}.imageupload.disabled{opacity:0.55;pointer-events:none;}.imageupload input{display:none;}.imageassets{align-items:stretch;}.imageempty{padding:12px 6px;}.imageasset{position:relative;}.imageasset .furnitem{width:104px;min-height:92px;}.imageasset img{width:64px;height:54px;object-fit:contain;border-radius:4px;background:repeating-conic-gradient(#ddd 0 25%,#fff 0 50%) 50% / 12px 12px;}.imageasset .furnitem span{max-width:96px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}.imageasset .furnitem small{opacity:0.65;font-size:0.72em;}.imageassetdelete{position:absolute;top:0;right:0;min-width:30px;width:30px;min-height:30px;padding:3px;}.imagepropertypreview{display:flex;align-items:center;gap:10px;min-width:0;}.imagepropertypreview img{width:72px;height:54px;object-fit:contain;border-radius:4px;background:repeating-conic-gradient(#ddd 0 25%,#fff 0 50%) 50% / 12px 12px;}.imagepropertypreview span{overflow-wrap:anywhere;}.vacfitdot{fill:var(--hp-accent);pointer-events:none;}.vacfithandle{fill:transparent;stroke:none;cursor:nwse-resize;}.vacfitknob{fill:var(--hp-bg);stroke:var(--hp-accent);stroke-width:2;vector-effect:non-scaling-stroke;pointer-events:none;}.vaccalbar{position:fixed;left:50%;bottom:24px;transform:translateX(-50%);display:flex;gap:var(--sp-5);align-items:center;background:var(--hp-bg);color:var(--hp-txt);border:1px solid var(--hp-accent);border-radius:var(--rad-l);padding:10px var(--sp-5);z-index:60;box-shadow:var(--shadow-2);}.candlist{max-height:160px;overflow-y:auto;border-top:1px solid var(--hp-line);flex:0 0 auto;min-height:2.6em;}.cand{display:flex;justify-content:space-between;gap:var(--sp-4);padding:var(--sp-3) var(--sp-4);cursor:pointer;border-radius:var(--rad-s);font-size:var(--fs-m);}:host([data-pointer-hover]) .cand:hover{background:rgba(127,127,127,0.15);}.cand.sel{background:var(--hp-accent);color:var(--text-primary-color,#fff);}.cand .cs{color:var(--hp-muted);font-size:var(--fs-s);white-space:nowrap;}.opening-entity-candidate{width:100%;border:0;background:transparent;color:inherit;font:inherit;text-align:left;}.opening-entity-candidate.sel{background:var(--hp-accent);color:var(--text-primary-color,#fff);}.opening-entity-empty{cursor:default;}.cand.sel .cs{color:var(--text-primary-color,#fff);opacity:0.85;}.cand.muted{color:var(--hp-muted);cursor:default;}.pdfedit{display:flex;flex-wrap:wrap;gap:var(--sp-3);align-items:center;}.pdftag{display:inline-flex;align-items:center;gap:var(--sp-2);border:1px solid var(--hp-line);border-radius:var(--rad-s);padding:var(--sp-2) var(--sp-3);font-size:var(--fs-s);}.pdftag a{color:var(--hp-txt);text-decoration:none;max-width:150px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}.pdftag .x{--mdc-icon-size:15px;cursor:pointer;color:var(--hp-muted);}:host([data-pointer-hover]) .pdftag .x:hover{color:#ff7a5c;}.entlist{display:flex;flex-direction:column;gap:var(--sp-2);margin-bottom:10px;}.entrow{display:flex;align-items:center;gap:var(--sp-4);padding:var(--sp-3) var(--sp-4);border-radius:var(--rad-m);background:var(--secondary-background-color,rgba(128,128,128,0.12));}.entrow ha-icon{--mdc-icon-size:20px;color:var(--hp-muted);}.entrow.on ha-icon{color:var(--hp-accent);}.entrow .en{flex:1;font-size:var(--fs-m);}.entrow .ev{font-size:var(--fs-m);color:var(--hp-muted);}.entbtn{min-width:74px;min-height:32px;padding:var(--sp-2) var(--sp-5);border:1px solid var(--hp-muted);border-radius:999px;background:transparent;color:var(--hp-txt);font:inherit;font-size:var(--fs-m);cursor:pointer;}.entbtn.on{background:var(--hp-accent);border-color:var(--hp-accent);color:var(--text-primary-color,#fff);font-weight:600;}.inforow{display:flex;gap:10px;font-size:var(--fs-m);margin:var(--sp-2) 0;}.inforow .k{color:var(--hp-muted);min-width:84px;}.inforow a{color:var(--hp-accent);word-break:break-all;}.infodesc{font-size:var(--fs-m);white-space:pre-wrap;margin-top:var(--sp-3);}.infodesc.muted{color:var(--hp-muted);}.pdflist{display:flex;flex-direction:column;gap:var(--sp-2);}.pdf{display:inline-flex;align-items:center;gap:var(--sp-2);color:var(--hp-accent);text-decoration:none;}ha-icon-picker{display:block;}.floorrow{display:flex;align-items:center;gap:var(--sp-4);padding:var(--sp-3) var(--sp-2);font-size:var(--fs-m);cursor:pointer;}.floorrow .floorlvl{color:var(--hp-muted);font-size:var(--fs-s);border:1px solid var(--hp-line);border-radius:var(--rad-s);padding:0 var(--sp-3);}.rtest{display:flex;align-items:center;gap:var(--sp-4);margin-bottom:var(--sp-4);}.rtest .namein{flex:1;}.rtest ha-icon{color:var(--hp-accent);}.rtesticon{font-size:var(--fs-s);color:var(--hp-muted);}.rrow{display:flex;align-items:center;gap:var(--sp-3);margin:var(--sp-1) 0;}.rrow .rpat{flex:2;}.rrow .ricon{flex:1.4;}.rrow .rpat.bad{border-color:#ff7a5c;}.rrow .rprev{--mdc-icon-size:18px;color:var(--hp-txt);min-width:18px;}.rrow .ract{--mdc-icon-size:16px;color:var(--hp-muted);cursor:pointer;}:host([data-pointer-hover]) .rrow .ract:hover{color:var(--hp-txt);}:host([data-pointer-hover]) .rrow .ract.del:hover{color:#ff7a5c;}.gsrow .gsl{min-width:150px;font-size:var(--fs-m);color:var(--hp-muted);}.optimize-live{display:grid;justify-items:start;gap:var(--sp-2);margin-bottom:var(--sp-3);}.optimize-live .alignmsg,.optimize-live .rhint{margin-bottom:0;}.optimize-cleanup{min-height:44px;}.optimize-selected{color:var(--hp-txt);}.optimize-details{margin-top:var(--sp-3);color:var(--hp-muted);font-size:var(--fs-s);overflow-wrap:anywhere;}.optimize-details>summary{width:fit-content;color:var(--hp-txt);cursor:pointer;font-weight:600;}.optimize-details>summary:focus-visible{outline:2px solid var(--hp-accent);outline-offset:3px;border-radius:var(--rad-s);}.optimize-details ul{margin:var(--sp-3) 0;padding-inline-start:22px;}.optimize-details li + li{margin-top:var(--sp-1);}.btn.alignall{width:100%;justify-content:center;}.backupactions{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:var(--sp-3);}.backupactions .btn{justify-content:center;min-width:0;}.backupupload{display:inline-flex;min-width:0;}.backupupload>.btn{width:100%;justify-content:center;}.backupupload input{display:none;}.backupbody{min-width:0;}.backupplanonly{margin-inline-start:var(--sp-4) !important;align-items:flex-start !important;}.backupplanonly>span:first-of-type{display:grid;gap:2px;white-space:normal;}.backupplanonly small{color:var(--secondary-text-color);line-height:1.35;}.backupplanonlystatus{color:var(--hp-accent) !important;font-weight:700;}.backupfile,.backupsummary,.backupcontent{display:flex;flex-direction:column;min-width:0;gap:var(--sp-1);}.backupfile b,.backupcontent span{overflow-wrap:anywhere;}.backupfile span,.backupsummary span,.backupcontent span{color:var(--hp-muted);font-size:var(--fs-s);}.backupcounts{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:var(--sp-2) var(--sp-4);font-size:var(--fs-s);}.backupwarn,.backuperror{border-radius:var(--rad-s);padding:var(--sp-3);font-size:var(--fs-s);line-height:1.45;overflow-wrap:anywhere;}.backupwarn{background:color-mix(in srgb,var(--hp-accent) 12%,transparent);}.backuperror{background:rgba(179,64,42,.16);color:#ff7a5c;}.backupdetails{border:1px solid var(--hp-line);border-radius:var(--rad-s);padding:var(--sp-2) var(--sp-3);font-size:var(--fs-s);}.backupdetails summary{cursor:pointer;font-weight:700;}.backupdetails>div{display:grid;gap:var(--sp-1);padding-block-start:var(--sp-2);}.backupdetails code{overflow-wrap:anywhere;color:var(--hp-muted);}.backupchoices{display:flex;flex-direction:column;gap:var(--sp-2);border:1px solid var(--hp-line);border-radius:var(--rad-s);min-width:0;}.backupchoices label{margin:0 !important;display:flex;gap:var(--sp-2);}.backupconfirm{align-items:flex-start !important;}.backupconfirm>span:first-of-type{min-width:0;white-space:normal;overflow-wrap:anywhere;}@media (max-width:520px){.backupactions,.backupcounts{grid-template-columns:1fr;}}.aboutver{font-size:var(--fs-s);color:var(--hp-muted);margin:var(--sp-2) 0 var(--sp-3);}.aboutlink{display:flex;align-items:center;gap:var(--sp-3);width:fit-content;color:var(--hp-accent);text-decoration:none;font-size:var(--fs-m);padding:var(--sp-1) 0;}:host([data-pointer-hover]) .aboutlink:hover{text-decoration:underline;}.aboutlink ha-icon{--mdc-icon-size:18px;line-height:1;}hp-dialog .supportbody{min-width:0;overflow-x:hidden;gap:var(--sp-5);}.supportsection{display:grid;min-width:0;gap:var(--sp-2);}.supportsection + .supportsection{padding-top:var(--sp-4);border-top:1px solid var(--hp-line);}.supportsection h3{margin:0;color:var(--hp-txt);font-size:var(--fs-m);}.supportlinks,.supportactions{display:flex;align-items:center;flex-wrap:wrap;gap:var(--sp-2) var(--sp-4);min-width:0;}.supportform>label:not(.srcrow){margin-top:var(--sp-2);color:var(--hp-muted);font-size:var(--fs-s);}.supportmessage,.supportraw{width:100%;min-width:0;box-sizing:border-box;resize:vertical;border:1px solid var(--hp-line);border-radius:var(--rad-s);padding:var(--sp-3);color:var(--hp-txt);background:color-mix(in srgb,var(--card-background-color,var(--hp-bg)) 92%,var(--hp-txt));font:inherit;}.supportmessage{min-height:120px;background:var(--hp-bg);}.supportraw{min-height:220px;margin-top:var(--sp-2);resize:none;white-space:pre;overflow:auto;font-family:ui-monospace,SFMono-Regular,Consolas,monospace;font-size:12px;}.supportattach{min-width:0;align-items:flex-start;margin:var(--sp-2) 0 0 !important;}.supportattach>span:first-of-type{min-width:0;white-space:normal;overflow-wrap:anywhere;}.supportwarning,.supportstatus,.supportupdate{display:flex;align-items:flex-start;gap:var(--sp-2);min-width:0;margin:0;padding:var(--sp-3);border-radius:var(--rad-s);background:color-mix(in srgb,var(--hp-accent) 14%,transparent);overflow-wrap:anywhere;font-size:var(--fs-s);line-height:1.45;}.supportwarning ha-icon,.supportstatus ha-icon,.supportupdate ha-icon{flex:none;color:var(--hp-accent);--mdc-icon-size:20px;}.supportpreview,.supportmanual,.supporterror,.supportsuccess{display:grid;min-width:0;gap:var(--sp-2);padding:var(--sp-3);border:1px solid var(--hp-line);border-radius:var(--rad-s);}.supportsummary{font-weight:600;overflow-wrap:anywhere;}.supporthash{display:grid;min-width:0;gap:var(--sp-1);color:var(--hp-muted);font-size:var(--fs-s);}.supporthash code{overflow-wrap:anywhere;color:var(--hp-txt);}.supportpreview details{min-width:0;}.supportpreview summary{cursor:pointer;color:var(--hp-accent);}.supportprivacy{margin:0 !important;line-height:1.45;}.supporterror{background:color-mix(in srgb,var(--error-color,#db4437) 12%,transparent);border-color:color-mix(in srgb,var(--error-color,#db4437) 45%,var(--hp-line));}.supportsuccess{background:color-mix(in srgb,var(--success-color,#43a047) 12%,transparent);border-color:color-mix(in srgb,var(--success-color,#43a047) 45%,var(--hp-line));}.supportfooter{flex-wrap:wrap;}@media (max-width:520px){hp-dialog .supportbody{padding-inline:var(--sp-4);}hp-dialog .supportfooter{padding-inline:var(--sp-4);}.supportactions .btn,.supportactions .aboutlink{max-width:100%;}}hp-dialog .body{padding:var(--sp-5) var(--sp-6);display:flex;flex-direction:column;gap:var(--sp-3);}hp-dialog .tapconfirm-body{min-width:0;overflow-x:hidden;}hp-dialog .tapconfirm-body p{max-width:100%;min-width:0;margin:0;overflow-wrap:anywhere;white-space:normal;}hp-dialog .tapconfirm-line{color:var(--hp-muted);}hp-dialog .body label{font-size:var(--fs-s);color:var(--hp-muted);margin-top:var(--sp-3);}hp-dialog .body .namein,hp-dialog .body .areasel{width:100%;box-sizing:border-box;}hp-dialog.roomdialog .body{min-width:0;overflow-x:hidden;}hp-dialog.roomdialog .body>*{min-width:0;max-width:100%;box-sizing:border-box;}hp-dialog.roomdialog .srcrow{min-width:0;align-items:flex-start;}hp-dialog.roomdialog .srcrow>span:first-of-type{min-width:0;white-space:normal;overflow-wrap:anywhere;line-height:1.35;}hp-dialog.roomdialog .dropbtn>b,hp-dialog.roomdialog .dropbtn>.ref{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}hp-dialog .row{display:flex;justify-content:flex-end;gap:var(--sp-4);width:100%;min-width:0;box-sizing:border-box;padding:var(--sp-5) var(--sp-6);border-top:1px solid var(--hp-line);}hp-dialog>.row[slot='footer'] button{min-height:44px;}hp-dialog .row.dialog-action-footer{align-items:center;justify-content:flex-start;flex-wrap:wrap;row-gap:var(--sp-4);}hp-dialog .dialog-action-group{display:flex;flex:0 1 auto;flex-wrap:wrap;align-items:center;gap:var(--sp-4);max-width:100%;min-width:0;}hp-dialog .dialog-action-group .btn{flex:0 0 auto;min-height:44px;}hp-dialog .dialog-action-danger{margin-right:auto;}hp-dialog .dialog-action-commit{margin-left:auto;justify-content:flex-end;}hp-dialog .row.markerfooter{justify-content:space-between;align-items:center;flex-wrap:wrap;}hp-dialog .row.roomfooter{align-items:center;flex-wrap:wrap;}hp-dialog .row.infofooter{align-items:center;justify-content:flex-start;flex-wrap:wrap;gap:var(--sp-3);}hp-dialog .row.infofooter .btn{flex-shrink:0;}hp-dialog .row.infofooter .infofooter-close{margin-left:auto;}@media (max-width:480px){hp-dialog .row.infofooter{padding:var(--sp-4) var(--sp-5);}}.markeractions,.markersaveactions{display:flex;align-items:center;gap:var(--sp-4);}.markeractions:empty{display:none;}.markersaveactions{margin-left:auto;}.device-inbox{display:flex;flex-direction:column;gap:var(--sp-4);padding:var(--sp-5) var(--sp-6);min-width:0;}.device-inbox-dialog{--hp-dialog-wide-width:920px;}.device-inbox-head{display:grid;grid-template-columns:minmax(180px,1fr) auto;align-items:center;gap:var(--sp-4);}.device-inbox-search{width:100%;min-width:0;box-sizing:border-box;border:1px solid var(--hp-line);border-radius:var(--rad-m);background:transparent;color:var(--hp-txt);font:inherit;padding:11px 14px;}.device-inbox-tabs{display:flex;gap:var(--sp-2);overflow-x:auto;scrollbar-width:thin;padding-bottom:var(--sp-1);}.device-inbox-tabs button{flex:0 0 auto;border:1px solid var(--hp-line);border-radius:999px;background:transparent;color:var(--hp-txt);font:inherit;padding:8px 12px;cursor:pointer;}.device-inbox-tabs button.on{border-color:var(--hp-accent);background:color-mix(in srgb,var(--hp-accent) 18%,transparent);}.device-inbox-tabs button span{color:var(--hp-muted);margin-inline-start:4px;}.device-inbox-discovery{margin:8px 0;padding:8px 10px;border:1px solid var(--divider-color,#e0e0e0);border-radius:8px;}.device-inbox-discovery summary{cursor:pointer;font-weight:600;}.device-inbox-discovery .srcrow{display:flex;gap:6px;align-items:center;margin:8px 0;}.device-inbox-excluded{display:flex;flex-wrap:wrap;gap:6px;align-items:center;}.device-inbox-excluded>span{font-weight:500;}.device-inbox-chips{display:flex;flex-wrap:wrap;gap:4px;}.device-inbox-chips .chip{display:inline-flex;align-items:center;gap:2px;padding:1px 6px;border-radius:10px;background:var(--secondary-background-color,#f0f0f0);font-size:12px;}.device-inbox-chips .chip button{border:none;background:none;cursor:pointer;padding:0 2px;color:var(--secondary-text-color,#666);}.device-inbox-excluded input[type="text"]{flex:1 1 140px;min-width:120px;padding:4px 6px;border:1px solid var(--divider-color,#e0e0e0);border-radius:6px;background:var(--card-background-color,#fff);color:var(--primary-text-color,#212121);}.device-inbox-preview{margin:8px 0 4px;font-size:13px;opacity:0.85;}.device-inbox-filters{display:flex;flex-wrap:wrap;gap:var(--sp-4) var(--sp-6);color:var(--hp-muted);}.device-inbox-filters label{display:inline-flex;align-items:center;gap:var(--sp-2);cursor:pointer;}.device-inbox-filter-help{display:inline-flex;align-items:center;gap:var(--sp-1);min-width:0;}.device-inbox-results{display:grid;gap:var(--sp-3);min-width:0;}.device-inbox-row{display:grid;grid-template-columns:42px minmax(180px,1fr) minmax(180px,auto);align-items:center;gap:var(--sp-4);min-width:0;border:1px solid var(--hp-line);border-radius:var(--rad-m);padding:var(--sp-4);background:color-mix(in srgb,var(--hp-txt) 3%,transparent);}.device-inbox-icon{--mdc-icon-size:28px;color:var(--hp-txt);justify-self:center;}.device-inbox-copy{min-width:0;}.device-inbox-name{display:flex;align-items:center;flex-wrap:wrap;gap:var(--sp-2);}.device-inbox-new{border-radius:999px;background:var(--hp-accent);color:var(--text-primary-color,#fff);font-size:var(--fs-s);padding:2px 7px;}.device-inbox-meta,.device-inbox-reason,.device-inbox-copy code{display:block;color:var(--hp-muted);font-size:var(--fs-s);overflow-wrap:anywhere;white-space:normal;}.device-inbox-status{color:var(--error-color,#db4437);margin-inline-start:var(--sp-2);}.device-inbox-actions{display:flex;justify-content:flex-end;align-items:center;flex-wrap:wrap;gap:var(--sp-2);}.device-inbox-actions .btn{min-height:36px;padding:7px 10px;}.device-inbox-menu{position:relative;}.device-inbox-menu summary{list-style:none;cursor:pointer;}.device-inbox-menu summary::-webkit-details-marker{display:none;}.device-inbox-menu-items{position:absolute;z-index:2;inset-inline-end:0;top:calc(100% + var(--sp-1));display:grid;gap:var(--sp-1);min-width:180px;padding:var(--sp-2);border:1px solid var(--hp-line);border-radius:var(--rad-m);background:var(--hp-panel,var(--card-background-color,#fff));box-shadow:0 8px 24px rgba(0,0,0,.22);}.device-inbox-menu-items .btn{justify-content:flex-start;width:100%;}.device-inbox-empty{color:var(--hp-muted);text-align:center;padding:var(--sp-8);}.device-inbox-more{align-self:center;}@media (max-width:680px){.device-inbox{padding:var(--sp-4);}.device-inbox-head{grid-template-columns:minmax(0,1fr);}.device-inbox-head .btn{justify-self:stretch;}.device-inbox-tabs{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));overflow-x:visible;}.device-inbox-tabs button{min-width:0;overflow-wrap:anywhere;}.device-inbox-row{grid-template-columns:36px minmax(0,1fr);}.device-inbox-actions{grid-column:1 / -1;justify-content:flex-start;}}`];var dp={"editor.context_actions":"Actions: {object}","editor.tool_options":"Tool options: {tool}","editor.palette":"Palette: {tool}","editor.open_group":"Tool group: {group}","editor.group_active":"{group} — active: {item}","editor.disabled_action":"{action} is unavailable: {reason}","editor.loading":"Loading editor…","editor.loading_aria":"The plan editor is loading","editor.load_failed":"Could not load the editor.","editor.refresh_advice":"Refresh the page and try again.","editor.retry_advice":"Check your connection and press again.","version_mismatch.title":"House Plan versions do not match","version_mismatch.body":"If Home Assistant is still restarting, let it finish, then reload this page.","version_mismatch.frontend":"Card","version_mismatch.backend":"Integration","version_mismatch.reload":"Reload page","color_picker.title":"Color picker","color_picker.hue":"Hue","color_picker.saturation":"Saturation","color_picker.value":"Brightness","color_picker.hex":"Hex color","color_picker.invalid_hex":"Enter a 3- or 6-digit hex color","color_picker.confirm":"OK","btn.properties":"Properties","btn.keep_as_walls":"Keep as walls","btn.delete_room_keep_walls":"Delete room, keep walls","btn.delete_room_with_walls":"Delete room and walls","title.markup_select":"Select and edit walls and columns","title.markup_column":"Column: click a grid point to place a square column","markup.partition":"Partition","markup.column":"Column","markup.hint_column":"click a grid point to place a square column","history.wall_segment":"Add wall segment","history.column_add":"Add column","history.physical_edit":"Change physical object","history.physical_delete":"Delete physical object","history.physical_move":"Move physical object","history.wall_face_batch":"Create rooms from walls","toast.column_duplicate":"A column with the same centre and outer size already exists","physical.partition_properties":"Partition properties","physical.column_properties":"Column properties","physical.shape":"Shape","physical.square":"Square","physical.circle":"Circle","physical.diameter":"Diameter","physical.side":"Side","physical.rotation":"Rotation angle","physical.length":"Length","physical.allowed_range":"Allowed: {min}–{max} {unit}","physical.column_size_title":"Outer side of the square column placed by the click (1–150 cm).","card.title":"House plan","count.devices":"{n} dev.","empty.no_spaces":"No spaces yet.","nav.spaces":"House Plan spaces","empty.add_first":"Add the first space and upload a floor plan.","empty.read_only":"No spaces are configured. Ask an administrator to add one.","empty.install":'Install the House Plan integration and add it in "Devices & services".',"btn.add_space":"Add space","btn.cancel":"Cancel","btn.save":"Save","btn.close":"Close","btn.delete":"Delete","btn.copy":"Copy","btn.edit":"Edit","btn.open_in_ha":"Open in HA","btn.reset":"Reset","btn.attach":"Attach…","btn.upload":"Upload…","btn.replace":"Replace…","title.zoom_in":"Zoom in","title.zoom_out":"Zoom out","title.zoom_fit":"Fit all","title.configure_space":"Configure space","title.add_space":"Add space","title.markup_add":"Walls: draw a continuous chain; each accepted segment is saved independently. Shift locks to 45°","title.markup_merge":"Merge: click one room, then the neighbour it shares a wall with","title.markup_split":"Split a room: click the room, then two points on its walls","title.markup_delroom":"Delete room: click inside a room and confirm","title.need_plan":"Upload a floor-plan image","markup.add":"Walls","markup.merge":"Merge","markup.split":"Split","markup.resize":"Resize","title.markup_resize":"Resize rooms: drag an available horizontal or vertical wall handle","markup.hint_resize":"drag an available wall handle · the wall stops at the first unsafe position · Esc cancels · Ctrl+Z — undo","resize.disabled.diagonal":"This wall is angled; Resize supports only horizontal and vertical walls","resize.disabled.side-angle":"An adjoining wall is angled; Resize requires both adjoining walls to meet this wall at right angles","resize.disabled.duplicate-physical-wall":"A separate partition or column overlaps this wall; remove or move it before resizing","resize.disabled.partial-shared":"A neighbouring room uses only part of this wall, so it cannot be moved safely as one shared wall","resize.disabled.unequal-shared":"The neighbouring room uses different endpoints or wall length, so the walls cannot move together safely","resize.disabled.multiple-rooms":"Moving this wall would affect more than two rooms","resize.disabled.thickness-conflict":"The wall thickness cannot be preserved safely","resize.disabled.opening-conflict":"An opening on this wall cannot be moved safely","resize.disabled.invalid-geometry":"This wall cannot be resized without changing the plan structure","resize.limit_stopped":"Wall stopped: the next step would break a junction limit","resize.commit_failed":"Resize was cancelled because the final plan did not pass the geometry check","resize.preview_failed":"Resize stopped at the last safe position because the plan geometry could not be preserved","markup.opening":"Opening","markup.delete_room":"Delete room","history.undo":"Undo","history.redo":"Redo","history.undo_named":"Undo: {name} (Ctrl+Z)","history.redo_named":"Redo: {name} (Ctrl+Shift+Z / Ctrl+Y)","history.undo_empty":"Nothing to undo","history.redo_empty":"Nothing to redo","history.undone":"Undone: {name}","history.redone":"Redone: {name}","history.add_room":"Create room","history.split_room":"Split room","history.merge_rooms":"Merge rooms","history.resize_room":"Resize room","history.wall_thickness":"Change wall thickness","history.add_opening":"Add door or window opening","history.edit_opening":"Edit opening","history.move_opening":"Move opening","history.delete_opening":"Delete opening","history.delete_room_keep_walls":"Delete room, keep walls","history.delete_room_with_walls":"Delete room and walls","history.decor_add":"Add decor object","history.decor_edit":"Edit decor object","history.decor_move":"Move decor object","history.decor_transform":"Transform decor object","history.decor_delete":"Delete decor object","history.backdrop_transform":"Transform plan backdrop","history.device_move":"Move {name}","history.device_stale":"Device position history is no longer applicable and was cleared","opening.new":"New opening","opening.edit":"Opening","opening.door":"Door","opening.window":"Window","opening.gate":"Gate","opening.passage":"Open passage","opening.passage_binding_warning":"Saving will remove the open/close sensor and lock.","opening.invalid_passage_fields":"The open passage on plan “{room}” has unsupported settings: {fields}.","opening.type_label":"Type","opening.length_label":"Length, cm","opening.contact_label":"Open/close sensor","opening.lock_label":"Lock","opening.none":"— none —","opening.search_ph":"Search: name or entity id…","opening.invert":"Invert open/closed","opening.flip_h":"Hinge on the other jamb","opening.flip_v":"Opens to the other side","opening.open":"Open","opening.closed":"Closed","opening.locked":"Locked","opening.unlocked":"Unlocked","opening.state_unknown":"unavailable","opening.no_entities":"No sensors bound — a static symbol on the plan.","toast.opening_no_wall":"Click next to a room wall or independent wall","opening.host_partition":"Independent wall","opening.partition_orphan":"The independent wall for this opening no longer exists","opening.partition_jamb_margin":"Leave at least {distance} between the opening and the end of the wall","opening.rebind_partition":"Attach to another independent wall","confirm.delete_partition_openings_title":"Delete wall and openings?","confirm.delete_partition_openings_body":"This wall contains {count} opening(s). They will be deleted together.","confirm.delete_partition_openings_item":"• {type}, {length}","markup.hint_points":"points: {n} · Shift — 45° steps · Esc — finish chain · Ctrl+Z — undo a point · closing an area offers a room","markup.hint_start":"click a grid dot to start a wall chain","tip.lqi":"average zigbee signal:","tip.area":"area: {value}","info.device_header":"Device on the plan","info.model":"Model","info.state":"State","info.link":"Link","info.manuals":"Manuals","info.none":"No additional information","marker.new_device":"New device","marker.name_label":"Name (shown on the plan)","marker.name_ph":"Name","marker.binding_label":"Bind to an HA device","marker.binding_disabled":"disabled in Home Assistant","marker.virtual_option":"Virtual device (no binding)","marker.search_ph":"Search device / group…","marker.nothing_found":"nothing found","marker.room_label":"Room","marker.room_override":" (override placement)","marker.room_choose":"— select a room —","marker.room_auto":"— by device area (auto) —","marker.icon_label":"Icon","marker.icon_ph":"mdi:… (empty = auto)","marker.display_label":"Display","display.badge":"Icon + state","display.icon_ripple":"Icon + state and activity","display.static_icon":"Always static icon","display.value_static_icon":"Value + static icon","marker.display_hint_badge":"The icon and dynamic plate show device state without the ordinary activity pulse. Red alarms remain visible.","marker.display_hint_icon_ripple":"The icon, dynamic plate and pulse show a short pulse for events and a continuous pulse for work, motion or presence. Red alarms have separate priority.","marker.display_hint_value":"A selected or automatically resolved Home Assistant value replaces the icon while the plate continues to show state. Red alarms remain visible.","marker.display_hint_static_icon":"The theme-aware shell and icon always stay the same. State, activity, unavailability and alarms do not change the face.","marker.display_hint_value_static_icon":"The marker shows the selected value while the shell stays theme-aware. State, activity, unavailability and alarms do not change the marker colour.","marker.static_alarm_warning":"This device can report alarms. Static display hides the marker's visual alarm indication.","marker.preview.title":"Display preview","marker.preview.actual":"Now","marker.preview.example":"Example","marker.preview.integration":"Provided by","marker.preview.source":"Display source","marker.preview.current_state":"Current state","marker.preview.result":"On the plan","marker.preview.details":"Source details","marker.preview.select_source":"Choose a Home Assistant device or entity to see its actual display.","marker.preview.unknown_provider":"Unknown integration","marker.preview.virtual_provider":"House Plan · virtual device","marker.preview.no_source":"No active source","marker.preview.no_state":"No current state","marker.preview.mixed_states":"Several different states","marker.preview.multiple_sources":"{n} sources","marker.preview.more_sources":"+{n} more","marker.preview.scaled":"The preview is scaled to {n}% to fit. The saved size is unchanged.","marker.preview.demo_short":"Show short activity","marker.preview.demo_continuous":"Show continuous activity","marker.preview.stop_continuous":"Stop continuous activity","marker.preview.demo_short_notice":"Short activity example; the actual device state is unchanged.","marker.preview.demo_continuous_notice":"Continuous activity example; the actual device state is unchanged.","marker.preview.demo_already_visible":"The current state already shows a real activity or alarm effect.","marker.preview.reduced_motion":"System reduced-motion is enabled, so ordinary activity is shown as a dot.","marker.preview.reason.neutral":"Neutral dark plate","marker.preview.reason.working":"Yellow plate: the device is working now","marker.preview.reason.working_activity":"Yellow plate and activity effect: the device is working now","marker.preview.reason.open":"Orange plate: physically open or unlocked","marker.preview.reason.cover_icon_state":"Neutral plate; the cover entity controls the displayed state and icon","marker.preview.reason.presence":"Activity effect while presence is detected","marker.preview.reason.event":"Short activity effect after a detected event","marker.preview.reason.transition":"Activity effect while the device is moving or changing state","marker.preview.reason.media_neutral":"Media devices stay on a neutral dark plate while available","marker.preview.reason.unavailable":"Subdued neutral plate: unavailable or off","marker.preview.reason.alarm":"Red alarm plate; alarm indication is always shown","marker.preview.reason.live_states_disabled":"Live-state styling is disabled for this card","marker.preview.reason.value_no_state":"No usable state value; the icon is shown instead","marker.preview.reason.value_ambiguous_sources":"Several possible value sources; the icon is shown instead","marker.preview.reason.value_non_scalar":"The source did not return a simple value; the icon is shown instead","marker.preview.reason.value_virtual":"A virtual device has no Home Assistant value; the icon is shown instead","marker.preview.reason.vacuum_live_plan_only":"Live vacuum position and trail are available only on the full plan","marker.preview.reason.hidden_design_preview":"The device is hidden on the plan; this design preview remains visible","marker.preview.reason.composite_power_source":"State comes from the device Power entity; auxiliary switches are ignored","marker.preview.reason.activity_display_disabled":"The selected display mode does not show ordinary activity effects","marker.preview.reason.ha_disabled":"The Home Assistant binding is disabled and will be hidden on the plan","marker.preview.reason.orphaned":"The saved Home Assistant binding can no longer be found","marker.preview.reason.static_icon":"Static mode: device state does not change the icon","marker.preview.reason.value_static_icon":"Static mode with a value: device state does not change the marker colour","marker.activity_color":"Activity pulse color","marker.ripple_size":"Activity pulse size","marker.activity_alarm_note":"Color and size affect ordinary activity only and do not change red alarms.","marker.pulse_a11y_alarm":"Alarm","marker.pulse_a11y_event":"Recent event","marker.pulse_a11y_presence":"Presence detected","marker.pulse_a11y_transition":"Changing state","marker.pulse_a11y_running":"Working","marker.state_a11y_neutral":"Default state","marker.state_a11y_working":"Working","marker.state_a11y_open":"Open","marker.state_a11y_locked":"Locked","marker.state_a11y_unlocked":"Unlocked","marker.state_a11y_alarm":"Alarm","marker.state_a11y_unavailable":"Unavailable","marker.lqi_a11y_low":"LQI {value}, low signal","marker.lqi_a11y_mid":"LQI {value}, medium signal","marker.lqi_a11y_high":"LQI {value}, high signal","marker.size_label":"Icon size / rotation","marker.angle_label":"Rotate","marker.model_label":"Model","marker.model_ph":"e.g. Aqara T&H","marker.link_label":"Link","marker.desc_label":"Description","marker.desc_ph":"Notes, specs…","marker.manuals_label":"Manuals (PDF etc.)","marker.sub_device":"device","marker.sub_z2m_group":" · Z2M group","marker.sub_group":"group","marker.sub_helper":"helper","space.new":"New space","space.copy_title":"Copy space","space.copy_name":"New space name","space.copy_fallback":"Space","space.copy_create":"Create copy","space.copy_optimize_title":"Optimize before copying?","space.copy_optimize_body":"Before creating “{name}”, House Plan must optimize the entire plan, including other spaces. Continue?","space.copy_optimize_confirm":"Optimize and copy","space.copy_error_changed":"The plan changed while confirmation was open. Review it and try again.","space.copy_error_source_missing":"The source space no longer exists. Reopen its settings and try again.","space.copy_error_source_invalid":"House Plan could not validate every wall in this space. Fix the source space and try again.","space.copy_error_spaces_limit":"House Plan already has the maximum number of spaces.","space.copy_error_partitions_limit":"This space has too many walls to copy.","space.copy_error_openings_limit":"This space has too many openings to copy.","space.copy_error_decor_limit":"This space has too many background objects to copy.","space.copy_error_columns_limit":"This space has too many columns to copy.","space.copy_error_opening_host":"One of the openings is no longer attached to a wall. Fix or delete it before copying.","space.copy_error_geometry":"The copy would create unsafe wall geometry. Fix the source space and try again.","space.copy_error_optimize_geometry":"Copy stopped because optimizing the entire plan is unsafe for one of the spaces.","space.header":"Space","space.title_label":"Title","space.title_ph":"e.g. Garage","space.plan_label":"Floor plan (background)","space.no_plan":"no plan image","space.plan_alt":"plan","room.new":"New room","room.name_label":"Display name","room.name_ph":"e.g. Terrace","room.area_label":"Home Assistant area (unassigned)","room.no_area_option":"— no area —","room.default_name":"Room","device.unnamed":"unnamed","device.light_group":"light group","device.fallback":"device","device.virtual":"virtual device","confirm.delete_room_title":'Delete room "{name}"?',"confirm.delete_room_body":"Choose whether the room's exclusive physical walls should remain. Walls shared with another room are always kept.","confirm.remove_marker_title":"Delete device from the plan?","confirm.remove_marker_body":"The device will disappear completely and stop contributing to plan data. You can add it again later.","confirm.erase_decor":"Erase the {kind} object? You can undo this action from the editor history.","confirm.delete_space_title":"Delete space?","confirm.delete_space_body":"The space, all its rooms and all its plan markup will be deleted.","confirm.delete_space_vac_routes":"Robot map assignments will also be removed: {count}.","space.delete_blocked":"This space is still used by {n} device(s). Move them to another space or delete them first.","toast.pos_save_failed":"Failed to save position: {err}","toast.no_entity":"The device has no suitable entity","toast.ha_disabled_action":"A Home Assistant object that is disabled cannot be used on the plan.","toast.ha_disabled_show_device":"A device disabled in Home Assistant cannot be shown on the plan. Enable it in Home Assistant first.","toast.ha_disabled_show_entity":"An entity disabled in Home Assistant cannot be shown on the plan. Enable it in Home Assistant first.","toast.ha_disabled_add":"A disabled Home Assistant object cannot be added to the plan. Enable it in Home Assistant first.","toast.ha_binding_unverified":"The object status could not be verified through the Home Assistant registry. Display and actions are temporarily unavailable.","toast.markup_needs_server":"Markup is available after the config is moved to the server","toast.space_order_changed":"Order changed. If any card pins its floor by number, check those panels.","toast.conflict":"Config was changed in another window — data refreshed, repeat your last action","toast.cfg_save_failed":"Failed to save config: {err}","toast.room_overlap":"The outline overlaps room “{name}” — rooms must not overlap","toast.contour_cannot_close":"The outline cannot close because it is degenerate or intersects itself","toast.merge_not_adjacent":"Only rooms that share a wall can be merged","toast.rooms_merged":"Rooms merged into “{name}”","toast.split_pick_wall":"Start the cut on the room’s wall","toast.split_bad_cut":"The cut must run wall to wall inside the room, without crossing walls or itself","merge.header":"Merge rooms","merge.hint":"The merged room keeps one name and one area. The other area is released — its devices leave the plan until another room claims it.","merge.keep":"Keep","merge.no_area":"no area","toast.room_saved":"Room saved ({n}). Devices added: {added}. Outline the next one or exit markup.","toast.room_saved_no_area":"Room saved ({n}, no area). Outline the next one or exit markup.","toast.marker_needs_server":"Device editing is available after the config is moved to the server","toast.virtual_name_required":"Enter a name for the virtual device","toast.marker_saved":"Device saved","toast.marker_removed":"Device deleted from the plan","toast.integration_missing":"The House Plan integration is not installed — management unavailable","toast.plan_formats":"Supported formats: SVG, PNG, JPG, WebP","toast.plan_required":"Upload a floor plan — it is required","toast.space_added_onboard":"Space added. Outline the rooms: click grid dots and close the contour.","toast.space_added":"Space added","toast.space_copied":"Space “{name}” created","toast.space_saved":"Space saved","toast.space_deleted":"Space deleted","toast.delete_failed":"Delete failed: {err}","toast.error":"Error: {err}","toast.toggle_target_unavailable":"Target “{name}” is unavailable — no action was performed","toast.toggle_targets_unavailable":"Targets are unavailable: {names}. No action was performed","toast.file_failed":'File "{name}" was not uploaded: {err}',"toast.files_attached":"Files attached: {n}","err.unknown":"unknown error","err.code":"code {code}","err.too_large":"file larger than {mb} MB","err.bad_ext":"unsupported type (PDF/image expected)","err.unauthorized":"administrator rights required","editor.title":"Title","editor.default_floor":"Initial space","editor.default_floor_missing":"Initial space “{id}” no longer exists. Choose another space.","editor.floor":"Fixed space","editor.floor_none":"— not fixed —","editor.floor_index":"YAML index {index} (preserved)","fixed_floor.loading":"Loading the fixed space…","fixed_floor.invalid_title":"The fixed space is unavailable","fixed_floor.invalid_body":"Check floor in the card configuration. The configured value is: {value}","editor.icon_size":"Icon size, % of plan width","editor.show_temperature":"Show temperature","editor.live_states":"Live states (on/off, open…)","editor.light_pools":"Light pools and wall shadows","editor.show_signal":"Show zigbee signal (LQI)","editor.language":"Interface language","editor.lang_auto":"Auto (HA profile)","title.icon_rules":"Icon rules: which MDI icon devices get by name","rules.title":"Icon rules","rules.hint":"Rules are checked top-down against “device name + model” (case-insensitive regex); the first match wins. When nothing matches, the entity device class decides, then the generic chip icon.","rules.pattern_ph":"regex, e.g. plug|socket","rules.icon_ph":"mdi:power-socket-de","rules.add":"Add rule","rules.reset":"Reset to defaults","rules.test_ph":"Try a device name…","rules.invalid":"invalid regex","rules.saved":"Icon rules saved","btn.up":"Up","btn.down":"Down","tap.info":"Device card","tap.more_info":"HA more-info dialog","tap.toggle":"Toggle state","marker.tap_label":"Tap action for this device","tap.toggle_note":"The resolved state is shown below. Secure devices are never toggled from the plan.","import.title":"Create spaces from HA floors","import.hint":"Your Home Assistant already knows these floors. Pick the ones to turn into plan spaces — you will upload a floor-plan image for each one next. Rooms are then outlined by hand on the plan.","import.start":"Create {n} space(s)","import.manual":"Start from scratch","import.progress":"Floor {i} of {n}","import.done":"Spaces created. Outline the rooms: click grid dots and close the contour.","btn.skip":"Skip","space.scale_label":"Scale (grid cell size)","space.cell_cm.help":"Links the grid to real dimensions: lengths, areas, wall thickness, opening sizes and glow radius depend on it. Changing it after drawing changes the calculated dimensions of the whole space without moving its points on the plan.","space.cell_cm.help.aria":"Help: space scale","space.scale_unit":"cm per cell","space.scale_unit_imperial":"in per cell","space.display_section":"Display","space.show_borders":"Always show room borders","space.zero_wall_style":"Zero-thickness walls","space.zero_wall_style.help":"Dashed zero-thickness walls pass Glow and sun rays, while solid ones block them as zero-area barriers. The choice affects every such wall in the space even when its line is hidden in View.","space.zero_wall_style.help.aria":"Help: zero-thickness wall style","space.zero_wall_dashed":"Dashed","space.zero_wall_solid":"Solid","space.show_names":"Show room names (drag to move)","space.room_color":"Border & name color","space.opacity":"Opacity","space.fill_label":"Room fill","space.fill_mode.help":"“Custom colour” is styling, while “Light”, “Temperature” and “LQI” use current Home Assistant data; Glow is enabled separately.","space.fill_mode.help.aria":"Help: room fill mode","fill.none":"None","fill.lqi":"Zigbee signal","fill.light":"Lights","fill.custom":"Custom color","space.custom_fill":"Fill color","space.source_file":"I have a floor-plan image","space.source_draw":"No image — I'll outline rooms by hand","fill.temp":"Temperature","tip.temp_avg":"average temperature:","tip.hum_avg":"average humidity:","space_card.button":"Open the space plan","space_card.not_found":"Space “{id}” not found","space_card.loading":"Loading…","continuity.restore_plan":"Restoring floor plan…","continuity.restore_connection":"Restoring device connection…","continuity.retry":"Try again","editor.space":"Space","editor.framing":"Framing","editor.fit_content":"All visible content","editor.fit_house":"Tight to house geometry","editor.show_button":"Show button","editor.button_label":"Button label","editor.button_target":"Target dashboard path","marker.sub_entity":"entity","title.general_settings":"General settings","title.export_pdf":"Save as PDF","pdf.title":"Save as PDF","pdf.dimensions":"Show dimensions and areas","pdf.decor":"Show furniture and other decor","pdf.room_names":"Show room names","pdf.backdrop":"Show backdrop","pdf.save":"Save","pdf.saving":"Creating…","pdf.failed":"Could not create the PDF.","pdf.too_large":"The images exceed the 25 MB PDF limit.","pdf.asset_failed":"A backdrop or decor image could not be loaded.","pdf.scale":"Scale 1:{n}","pdf.north":"North","gs.title":"General settings","gs.light_group":"Fill: lights","gs.light_on":"Lights on","gs.light_off":"All lights off","gs.temp_group":"Fill: temperature","gs.temp_cold":"Cold","gs.temp_ok":"Comfortable","gs.temp_hot":"Hot","gs.lqi_group":"Fill: zigbee signal","gs.lqi_low":"Weak signal","gs.lqi_high":"Strong signal","gs.reset":"Reset to defaults","gs.saved":"General settings saved","gs.radar_show_live":"Show live presence on the plan","gs.radar_show_live_hint":"Hides or shows all live radar targets. This does not start or stop observation recording.","radar.title":"Presence on the plan","radar.help":"Connect this marker to exact Home Assistant radar entities, place the sensor and choose its coordinate profile. Live positions are clipped to the selected room.","radar.help.aria":"Help: presence radar settings","radar.enabled":"Use this presence radar","radar.show_live":"Show live targets","radar.configure":"Configure radar","radar.configure_on_plan":"Configure on plan","radar.change_installation":"Change installation","radar.no_contour":"This room has no boundary. Radar points will not be clipped.","radar.discard_setup_title":"Discard radar setup?","radar.discard_setup":"The unsaved radar setup will be lost.","radar.step_place_mount":"Mark the physical sensor position","radar.step_place_heading":"Mark a point straight ahead of the sensor","radar.step_reference":"Mark reference position {n}, then start measurement","radar.step_check_reference":"Mark an independent check position","radar.start_measure":"Start measurement","radar.countdown":"Stand at the mark in {seconds} s","radar.capturing":"Stand still and alone while measuring…","radar.fit_ready":"Calibration is ready","radar.check_third":"Check at another position","radar.check_complete":"Independent check completed","radar.error_distance":"Position difference: {distance}","radar.ambiguous_target":"More than one target was reported. Repeat the measurement alone.","radar.insufficient_samples":"Not enough current coordinates. Retry or use manual setup.","radar.bad_references":"Choose separated references in different directions from the sensor.","radar.ambiguous_sources":"The measurements allow two equally plausible directions. Choose reference points that distinguish left from right.","radar.bad_fit":"Measurements do not match. Check units, mounting point and references.","radar.desktop_hint":"Use a computer for precise setup. Editing on touch devices is best effort.","radar.detected":"House Plan recognized radar metadata for this device. Review the exact sources before saving.","radar.detected_ld2450":"House Plan found an ESPHome LD2450 coordinate set. Review the exact X/Y sources before saving.","radar.additional_actions":"Additional actions","radar.declare":"This is a presence radar","radar.profile":"Data profile","radar.profile_esphome_ld2450_v1":"ESPHome LD2450 (X/Y targets)","radar.profile_cartesian_v1":"Cartesian targets (X/Y)","radar.profile_polar_v1":"Polar target (distance/angle)","radar.profile_range_v1":"Distance only","radar.profile_zones_v1":"Zone states","radar.profile_presence_v1":"Presence only","radar.room":"Radar room","radar.room_choose":"Choose a room","radar.target":"Target {n}","radar.axis_x":"X coordinate entity","radar.axis_y":"Y coordinate entity","radar.add_target":"Add target slot","radar.range_channel":"Range channel {n}","radar.add_range":"Add range channel","radar.presence_gate":"Presence gate entity","radar.swap_axes":"Swap X and Y axes","radar.axis_x_sign":"X direction","radar.axis_y_sign":"Y direction","radar.distance_source":"Distance entity","radar.angle_source":"Angle entity","radar.angle_unit":"Angle unit","radar.degrees":"Degrees","radar.radians":"Radians","radar.angle_zero":"Zero-angle direction","radar.angle_forward":"Forward","radar.angle_right":"Right","radar.angle_clockwise":"Angles increase clockwise","radar.zone_source":"Zone entity","radar.occupancy_source":"Presence entity","radar.count_source":"Target count entity","radar.availability_source":"Availability entity","radar.source_choose":"Choose an entity","radar.source_optional":"Optional","radar.source_missing":"currently unavailable","radar.saved_unsupported":"This saved radar setup is unsupported or incomplete. It remains inactive; remove it or update House Plan before configuring it again.","radar.occupancy":"Presence (on/off)","radar.count":"Count","radar.mount":"Position and direction","radar.mount_hint":"This is the physical sensor position. Moving its decorative marker does not change it.","radar.heading":"Direction, °","radar.range_cm":"Range, cm","radar.fov_deg":"Field of view, °","radar.unit":"Source unit","radar.mirror":"Mirror the left/right axis","radar.remove":"Remove radar settings","radar.invalid":"Complete the radar room, sources and position before saving.","radar.check_sources":"Check live data","radar.checking":"Checking…","radar.health":"Connection status","radar.live_summary":"Current targets: {targets}; range arcs: {ranges}","radar.health_ok":"Current data received","radar.health_off":"No targets detected","radar.health_stale":"Some coordinate data is out of date","radar.health_partial":"Some sources are current; others are out of date","radar.health_restricted":"Access to one or more sources is restricted","radar.health_incomplete":"The current radar report is incomplete","radar.health_position_unavailable":"Presence reported; current position unavailable","radar.health_unavailable":"Sensor data unavailable","radar.health_needs_setup":"Installation needs setup","radar.health_inconsistent":"The sources report conflicting values","radar.health_unknown":"Current state is unknown","radar.health_disabled":"Radar is disabled","radar.error_invalid_radar":"Check the radar settings.","radar.error_invalid_selection":"Select an existing room and valid sources.","radar.error_source_restricted":"You do not have access to all selected sources.","radar.error_rate_limited":"Too many requests. Try again shortly.","radar.error_not_ready":"Radar processing is not ready.","radar.error_conflict":"The plan changed. Reopen the radar setup and try again.","radar.error_source_unavailable":"One or more selected radar sources are unavailable.","radar.error_unsupported_capability":"This radar capability is not supported by the installed integration.","radar.report_age":"{seconds} s ago","space.show_lqi":"Show zigbee signal (LQI) next to devices","space.hide_decor":"Hide the decorative layer","space.hide_decor_tip":"Lines, shapes, labels and furniture stay where they are — visible in the backdrop editor, not on the plan.","space.hide_openings":"Hide openings","space.hide_openings_tip":"Door, window and gate symbols are not drawn, but the openings keep working: light passes through, the sun comes in at a window, contact sensors still open them. The plan editor always shows them.","gs.light_none":"No light sources","mode.plan":"Plan editor","mode.devices":"Device editor","display.value":"Value + state","marker.subarea":"no area, manual","device.new":"New device — open its editor to dismiss","opening.unlock_action":"Unlock","opening.lock_action":"Lock","opening.lock_pending":"Working…","title.close_editor":"Close editor (back to view)","title.add_device":"Add a device to the plan","devbar.add":"Add","devbar.rules":"Icon rules","device_inbox.button":"Devices","device_inbox.title":"Devices on the plan","device_inbox.search":"Search devices, entities and integrations…","device_inbox.add_virtual":"Add virtual device","device_inbox.tab_on_plan":"On plan","device_inbox.tab_available":"Available","device_inbox.tab_hidden":"Hidden","device_inbox.tab_readd":"Available again","device_inbox.only_new":"New only","device_inbox.show_entities":"Show entities","device_inbox.show_hidden":"Show hidden on plan","device_inbox.show_hidden.help":"Temporarily shows hidden and disabled markers as editor-only ghosts on the plan. Saved device visibility does not change.","device_inbox.show_hidden.help.aria":"Help: show hidden devices on the plan","device_inbox.new":"New","device_inbox.find":"Find on plan","device_inbox.edit":"Edit","device_inbox.hide":"Hide","device_inbox.show":"Show","device_inbox.add":"Add","device_inbox.readd":"Add again","device_inbox.hide_available":"Hide from list","device_inbox.show_more":"Show more","device_inbox.more_actions":"More actions","device_inbox.find_hidden_hint":"Enable “Show hidden on plan” first","device_inbox.show_disabled":"Activate this binding in Home Assistant before showing it","device_inbox.empty_on_plan":"No matching devices are on the plan yet.","device_inbox.empty_available":"No devices are available to add.","device_inbox.empty_hidden":"There are no hidden devices.","device_inbox.empty_readd":"No removed devices are available to add again.","device_inbox.reason_visible_auto":"Discovered automatically","device_inbox.reason_visible_explicit":"Added explicitly","device_inbox.reason_manual_hidden":"Hidden by user","device_inbox.reason_automatic_hidden":"Hidden automatically","device_inbox.reason_service_entry":"Service-only registry entry","device_inbox.reason_excluded_integration":"Integration “{integration}” excluded by discovery filters","device_inbox.reason_excluded_domain":"Non-spatial entity type","device_inbox.reason_grouped_light":"Represented by a room light group","device_inbox.reason_represented_by_parent":"Represented by its parent device","device_inbox.reason_removed":"Previously removed from the plan","device_inbox.reason_available":"Available to add to the plan","device_inbox.reason_no_bound_room":"HA area is not linked to a plan room","device_inbox.status_ha_disabled":"Disabled in Home Assistant","device_inbox.status_orphaned":"Binding is no longer present in Home Assistant","device_inbox.status_unverified":"Home Assistant registry is temporarily unavailable","device_inbox.saved":"Device list updated","device_inbox.filters_excluded":"Excluded integrations","device_inbox.filters_group_lights":"Group room lights into one marker","device_inbox.filters_preview_appear":"will appear: {count}","device_inbox.filters_preview_hide":"will disappear: {count}","device_inbox.filters_preview_lights":"lights affected: {count}","device_inbox.filters_reset":"Restore recommended","device_inbox.filters_save":"Save filters","device_inbox.filters_search_ph":"Add an integration…","device_inbox.filters_title":"Discovery filters","space.roomcard_section":"Room card shows:","space.label_temp":"Temperature","space.label_hum":"Humidity","space.label_lqi":"Average Zigbee signal","space.label_light":"Lights on/off","roomcard.light_on":"On","roomcard.light_off":"Off","roomcard.light_partial":"{on} of {total}","toast.split_pick_inside":"Intermediate cut points must be inside the room","mode.decor":"Background editor","decor.select":"Select","decor.line":"Line","decor.rect":"Rectangle","decor.ellipse":"Oval","decor.text":"Text","decor.erase":"Erase","decor.erase_confirm_title":"Erase object?","decor.color":"Color","decor.width":"Line width","decor.line_style":"Line style","decor.line_style_solid":"Solid","decor.line_style_dashed":"Dashed","decor.fill":"Fill","decor.fill_color":"Fill color","decor.length":"Length","decor.size":"Size","decor.flip_h":"Flip horizontally","decor.flip_v":"Flip vertically","decor.angle":"Rotation angle, °","decor.text_size":"Text size","decor.backdrop_properties":"Plan backdrop properties","decor.text_title":"Text label","decor.object_title":"Edit {kind}","decor.text_label":"Text","decor.live_group":"Insert HA variable","decor.live_entity":"Entity","decor.live_entity_ph":"choose an entity","decor.live_attr":"Value","decor.live_attr_ph":"choose state or attribute","decor.live_state":"State","decor.backdrop":"Backdrop image","decor.backdrop_hint":"Drag to move; pull a corner to resize; use the top handle to rotate. Shift changes proportions or frees the angle.","decor.backdrop_reset":"Reset the picture","decor.backdrop_reset_done":"The picture is back at its original place and size","marker.icon_auto":"Auto: {icon} (by icon rules; pick one to override)","marker.icon_pin_auto":"Pin","mode.plan_tip":"Plan editor — the geometry of the home: draw and split/merge rooms, bind them to HA areas, place doors, windows and gates, move room cards, set the scale","mode.devices_tip":"Device editor — everything about icons: drag to position, click to edit binding/icon/display, add virtual devices, icon rules","mode.decor_tip":"Background editor — purely visual decor under the plan: lines, rectangles, ovals and text labels that never react to clicks","space.glow_enabled":"Light-source glow","gs.glow_group":"Light-source glow","gs.glow_base":"House darkness","gs.glow_light":"Default light color / intensity","gs.wall_group":"Walls","gs.wall_fill":"Wall fill","gs.glow_radius":"Glow radius","gs.glow_radius.help":"Sets the default glow radius in metres or feet; a device-specific radius overrides it.","gs.glow_radius.help.aria":"Help: default glow radius","gs.unit_m":"m","gs.unit_ft":"ft","marker.controls_label":"Controls other light sources","marker.controls.help":"With the “Toggle state” action, the listed sources toggle together with this marker. Their glow stays at their own markers, and the link alone does not turn the controlling marker into a light source.","marker.controls.help.aria":"Help: controlling other light sources","marker.controls_filter":"Search lights and switches…","info.controls":"Controls","marker.glow_radius_label":"Glow radius","marker.glow_radius.help":"Sets the glow radius in metres or feet; an empty value uses the radius from general settings.","marker.glow_radius.help.aria":"Help: glow radius","markup.wallthick":"Thickness","markup.select":"Select","title.markup_wallthick":"Thickness — click a wall to set its thickness from 0 to 100 cm.","markup.hint_wallthick":"click a wall · Esc closes without applying","wallthick.field":"Thickness","wallthick.unit_cm":"cm","wallthick.unit_in":"in","wallthick.apply_room":"Apply to all walls of this room","markup.draw_wall_title":"Thickness of each new wall segment (0–100 cm). Shared walls keep the existing value.","room.queue_progress":"Room {current} of {total}","toast.wall_rooms_saved":"Created rooms: {n}","toast.wall_chain_saved":"Wall chain saved","toast.wallthick_pick":"Click a wall","toast.wallthick_set":"Wall thickness set","toast.wallthick_cleared":"Wall thickness removed","toast.physical_range":"Enter a value from {min} to {max} {unit}","toast.zero_wall_opening_conflict":"Remove the opening on this wall segment first.","toast.zero_wall_ambiguous":"The wall segment is ambiguous. Simplify or adjust the junction.","toast.zero_wall_migration_blocked":"The space was not converted: {reason}. No data was changed.","toast.physical_angle":"Enter a rotation angle from 0° up to, but not including, 90°","toast.physical_limit":"The space has reached the limit for this type of geometry","toast.geometry_unsafe":"Change canceled: wall geometry could not be built safely.","junction.limit_angle":"The angle between walls is too sharp: {actual}°, minimum {limit}°.","junction.limit_valence":"Too many walls meet in one node: {actual}, maximum {limit}.","junction.limit_length":"The wall segment is too short: {actual} cm, minimum {limit} cm.","junction.limit_distance":"Walls and nodes are too close: {actual} cm, minimum {limit} cm.","junction.limit_clearance":"No room interior is left: {actual} cm², minimum {limit} cm².","junction.limit_check_failed":"The junction check could not run — the change was not saved","toast.wall_model_migration_blocked":"The wall model could not be updated: {reason}. The plan was not changed. Run “Optimize plans”; if the error repeats, fix the conflicting wall geometry.","toast.wall_model_client_outdated":"Update the card and reload the page before editing the plan.","wall_model.reason.invalid-room":"invalid room contour","wall_model.reason.zero-length":"zero-length wall segment","wall_model.reason.third-owner":"wall shared by more than two rooms","wall_model.reason.duplicate-id":"conflicting wall identifiers","wall_model.reason.thickness-conflict":"conflicting wall thickness values","wall_model.reason.opening-host":"opening cannot be assigned to one wall","toast.delete_room_pick":"Click inside the room you want to delete","toast.plan_snap_ambiguous":"Zoom in to choose the wall node","toast.wall_repair_ambiguous":"The room outline has more than one possible connection. Zoom in and connect it explicitly.","toast.wall_repair_too_large":"The gap is larger than 2 cm. Connect the walls before creating the room.","toast.wall_repair_changed":"The wall geometry changed. Try creating the room again.","toast.opening_on_zero_wall":"Openings cannot sit on a zero-thickness wall","marker.from_ha_option":"Pick from the HA list","marker.show_entities":"Show entities","marker.show_entities_tip":"Adds not only devices to the list, but all their entities too","marker.pick_ph":"Choose a device…","room.open_area":"Open the HA area","room.fit_action":"Fit room {name}","view.volumetric":"Volumetric view","view.flat":"Flat view","kiosk.title":"This screen's sizes","kiosk.hint":"Stored on this device only — every wall tablet or TV can have its own comfortable sizes.","kiosk.icon_scale":"Device icon size","kiosk.font_scale":"Room card text size","editor.kiosk":"Wall device (kiosk) mode","editor.cycle":"Auto-switch spaces every N seconds (kiosk, 0 = off)","room.settings_title":"Room settings","room.settings_section":"Room settings (override the space)","room.fill_label":"Fill in THIS room","fill.inherit":"As the space","room.custom_fill_space":"Space color","room.custom_fill_own":"Room color","room.temp_range_label":"Comfort range","room.temp_range_min":"Lower comfort-temperature bound","room.temp_range_max":"Upper comfort-temperature bound","room.temp_range_reset":"As the space","room.temp_range.help":"This range applies only to this room. Empty fields inherit the corresponding space bounds; if the bounds are reversed, House Plan uses the smaller value as the lower bound and the larger value as the upper bound.","room.temp_range.help.aria":"About the room comfort range","room.temp_src_label":"Temperature source","room.hum_src_label":"Humidity source","room.src_average":"Average over the room's sensors (default)","room.src_pick":"A specific HA device or entity","room.src_ph":"Choose a source…","toast.room_updated":"Room updated","space.card_font":"Room-card font size (whole space)","room.sizes_section":"Font sizes","room.name_scale":"Room name size","room.label_scale":"Metrics size","preview.room_name":"Living room","toast.cfg_reload_failed":"Could not reload the plan from the server: {err}","toast.locale_load_failed":"Could not load the language pack. English is used until the page reloads.","toast.furniture_art_load_failed":"Could not load the furniture drawings. Reload the page to show them.","room.settings_short":"Room settings","room.unnamed":"Unnamed room","marker.use_climate_temp":"Include the device temperature in the room","marker.use_climate_temp_tip":"Adds an air conditioner or thermostat current_temperature to the room average. Configure the external value badge separately below.","marker.value_badge_title":"Value badge","marker.value_badge.help":"Shows one selected value next to the icon. It does not affect room metrics, light, Glow or the tap action.","marker.value_badge.help.aria":"Help: device value badge","marker.value_badge_enabled":"Show a value badge","marker.value_badge_source":"Value","marker.value_badge_source.help":"Choose a specific state, supported attribute, or derived value of this device.","marker.value_badge_source.help.aria":"Help: value badge source","marker.value_badge_position":"Position","marker.value_badge_position.help":"The chosen side stays fixed and does not flip automatically at a plan edge.","marker.value_badge_position.help.aria":"Help: value badge position","marker.value_badge_right":"Right","marker.value_badge_bottom":"Below","marker.value_badge_left":"Left","marker.value_badge_top":"Above","marker.value_badge_empty":"This device has no available values","marker.value_badge_static":"A static icon does not show live values. The setting is preserved.","marker.value_badge_missing":"Source unavailable","marker.value_badge_missing_hint":"The saved source is currently unavailable. Keep it, disable the badge, or choose another value.","marker.value_badge_duplicate":"The same value is already shown inside the icon.","marker.value_badge_state":"State · {name}","marker.value_badge_marker_state":"Light-source state · {name}","marker.value_badge_lqi":"Average Zigbee signal quality","marker.value_badge_attr_current_temperature":"Current temperature · {name}","marker.value_badge_attr_temperature":"Target temperature · {name}","marker.value_badge_attr_current_humidity":"Current humidity · {name}","marker.value_badge_attr_humidity":"Humidity · {name}","marker.value_badge_attr_current_position":"Position · {name}","marker.value_badge_attr_percentage":"Speed · {name}","marker.value_badge_attr_brightness":"Brightness · {name}","marker.value_badge_attr_volume_level":"Volume · {name}","marker.value_badge_attr_battery_level":"Battery · {name}","marker.value_badge_attr_fan_speed":"Fan speed · {name}","marker.value_source":"Value source","marker.value_source.help":"Choose the value that replaces the icon. The tap action does not change.","marker.value_source.help.aria":"Help: value face source","marker.value_source_auto":"Automatic (as before)","marker.value_source_missing_hint":"The saved source is currently unavailable. The face shows — until it recovers or you choose another value.","marker.light_role_label":"Is this device a light source?","marker.light_role.help":"“Auto” uses the bound device's resolved role, “Always” forces its own source and “Never” excludes it; linked lights above remain independent.","marker.light_role.help.aria":"Help: whether this device is a light source","marker.light_role_auto_yes":"Auto (light source)","marker.light_role_auto_no":"Auto (not a light source)","marker.light_role_always":"Always a light source","marker.light_role_never":"Never a light source","marker.light_entity_label":"Leading light entity","marker.light_entity.help":"For a composite device, choose the entity whose state, colour and brightness represent this plan source. The automatic fallback remains compatible with older plans.","marker.light_entity.help.aria":"Help: leading light entity","marker.light_entity_auto":"Automatic ({entity})","marker.light_entity_none":"no controllable entity","marker.light_entity_missing":"The saved entity {entity} is unavailable. House Plan temporarily uses {fallback}; the saved choice will be restored if it returns.","marker.toggle_entity_label":"Entity to toggle","marker.toggle_entity.help":"For a composite device, choose the exact own light or switch operated by a tap. Automatic keeps the previous target rules and is independent from the leading light entity.","marker.toggle_entity.help.aria":"Help: entity to toggle","marker.toggle_entity_auto":"Automatic ({entity})","marker.toggle_entity_none":"no own controllable entity","marker.toggle_entity_missing":"The saved entity {entity} is no longer among this marker’s selectable channels. House Plan temporarily uses {fallback}; the saved choice will be restored if it returns.","marker.glow_color_label":"Glow colour and brightness","marker.glow_mode.help":"Use live source values, override only its colour, or fix both colour and brightness. The minimum is 1%; to disable the source, choose “Never”.","marker.glow_mode.help.aria":"Help: glow colour and brightness","marker.glow_mode_auto":"From source","marker.glow_mode_color":"Set colour","marker.glow_mode_fixed":"Set colour and brightness","marker.glow_color":"Glow colour","marker.glow_brightness":"Brightness","marker.glow_disabled_never":"Glow settings are unavailable because this marker is explicitly not a light source.","marker.glow_disabled_auto":"Auto mode found no spatial light source for this marker.","marker.glow_disabled_no_entity":"No active controllable Home Assistant entity is available for this spatial source.","marker.glow_passive_hint":"This source has no own Home Assistant data. Set its colour and brightness manually; its radius remains available.","marker.control_broken":"Saved source is missing or no longer marked as a light","marker.control_missing_label":"Missing plan light","marker.control_passive":"passive source","toast.marker_control_cycle":"This link would create a circular chain of light controls.","toast.marker_binding_required":"Choose a Home Assistant device before linking another light source.","confirm.unlock_title":"Unlock?","confirm.unlock_body":"House Plan will send an unlock command to this lock.","toast.files_migrate_failed":"Attachments could not be moved to the new binding, links keep pointing at the old files: {err}","space.pick_saved":"Already uploaded","space.pick_saved_hint":"Plans stored on the server, including ones you detached earlier","space.no_saved":"No plans stored on the server yet.","space.loading":"Loading…","space.used_by":"in use: {list}","space.in_use":"A space still uses this plan — detach it first","btn.use":"Use","confirm.delete_plan_title":"Delete plan file?","confirm.delete_plan_body":"The file will be deleted from the server. This action cannot be undone.","toast.plans_list_failed":"Could not list the stored plans: {err}","toast.plan_delete_failed":"Could not delete the plan: {err}","marker.hide":"Hide","marker.hide_tip":'The device will disappear from the plan after saving but will still count toward the room signal. Restore it through the "Devices" catalog in the device editor.',"marker.show":"Show","marker.show_tip":"The device will appear on the plan again after saving.","marker.hidden_ghost":"Device hidden by the user","marker.ha_disabled_device":"The device is disabled in Home Assistant and hidden from the plan.","marker.ha_disabled_entity":"The entity is disabled in Home Assistant and hidden from the plan.","marker.ha_disabled_all_entities":"The device has no active Home Assistant entities, so it is hidden from the plan.","marker.ha_registry_limited":"The full Home Assistant registry is unavailable to this user. The unverified object cannot be shown or used for now.","marker.delete_tip":"Completely delete the device from the plan and every aggregate. You can add it again later.","tap.run":"Run automation/script/scene","tap.none":"Do nothing","marker.run_target_label":"What to run","marker.run_search_ph":"Search: automation, script or scene…","marker.run_target_gone":"Target {id} not found — pick again","marker.tap_confirm":"Ask for confirmation","marker.tap_confirm_tip":"Show a confirmation dialog before acting — a guard against accidental taps.","marker.toggle_hint_single":"Target: {name} ({id}).","marker.virtual_light_target":"Virtual light: {name}.","marker.virtual_light_current":"Manual state: {state} → {effect}.","marker.virtual_light_state_on":"on","marker.virtual_light_state_off":"off","marker.toggle_hint_group":"Will toggle {count} source(s): {names}.","marker.toggle_hint_current":"Now: {state} → {effect}.","marker.toggle_hint_group_current":"Currently on: {on} of {count} → {effect}.","marker.toggle_hint_skipped":"Will be skipped ({count}): {targets}.","marker.toggle_effect_turn_on":"will turn on","marker.toggle_effect_turn_off":"will turn off","marker.toggle_effect_open":"will open","marker.toggle_effect_close":"will close","marker.toggle_effect_stop":"will stop","marker.toggle_effect_toggle":"state will toggle","marker.toggle_skip_missing":"not found","marker.toggle_skip_ha_disabled":"disabled in HA","marker.toggle_skip_unavailable":"unavailable","marker.toggle_skip_unsupported":"toggle is unsupported","marker.toggle_skip_secure":"blocked for security","marker.toggle_none_no_binding":"This device has no binding, so there is no state to toggle. Tapping will do nothing.","marker.toggle_none_no_actionable_entity":"This device has no state that can be toggled. Tapping will do nothing.","marker.toggle_none_configured_targets_missing":"The configured targets are unavailable. The device's own entity will not be substituted for them.","marker.toggle_none_ha_disabled":"The target is disabled in Home Assistant and cannot be used on the plan.","marker.toggle_none_unavailable":"The target is currently unavailable. Tapping will do nothing.","marker.toggle_none_unsupported":"Home Assistant exposes no safe toggle operation for this entity. Tapping will do nothing.","marker.toggle_none_secure":"Toggling locks, alarms and secure gates from the plan is blocked for security.","run.automation":"automation","run.script":"script","run.scene":"scene","confirm.tap_run":'Run "{name}"?',"confirm.tap_toggle":'Toggle "{name}"?',"confirm.current_state":"Current state: {state}","confirm.expected_state":"After switching: {state}","confirm.group_current":"on {on} of {total}","confirm.group_all_on":"all are on","confirm.group_all_off":"all are off","confirm.unavailable_targets":"Unavailable: {count}","confirm.expected_by_ha":"Home Assistant will determine the state","confirm.state_on":"On","confirm.state_off":"Off","confirm.state_open":"Open","confirm.state_closed":"Closed","confirm.state_opening":"Opening","confirm.state_closing":"Closing","confirm.state_stopped":"Stopped","confirm.state_unknown":"Unknown","toast.run_started":"Started: {name}","toast.run_target_missing":"Run target not found — check the device settings","toast.run_target_required":"Pick an automation, script or scene","toast.tap_target_changed":"The action target changed. Try again.","toast.virtual_light_toggle_failed":"Could not toggle the virtual light: {err}","toast.value_badge_source_required":"Choose a value for the badge","btn.run":"Run","vac.section":"Robot vacuum: live position","vac.autocal":"Set up automatically","vac.live":"Live position on the plan","vac.trail":"Show the robot's path","vac.autocal_no_rooms":"The integration reports no room list — open “Fit manually”","vac.route_warn_unmapped":"The robot is cleaning a map that is not assigned to any floor","vac.route_warn_needs_calibration":"The map is assigned to a floor but not calibrated","vac.route_warn_ambiguous":"Two maps are indistinguishable — no floor was chosen","vac.route_warn_missing_space":"The space of this map was deleted","vac.autocal_no_match":"Room names did not match (need ≥3 in common) — open “Fit manually”","vac.autocal_done":"Done: bound via {rooms} rooms. Start a cleanup and check","vac.cal_need_pos":"The robot is not reporting coordinates — start a cleanup and pause it","vac.cal_done":"Calibration saved. Start a cleanup and check","vac.cal_cancelled":"Calibration cancelled","vac.fit":"Fit manually","vac.fit_hint":"Drag the robot map into place, stretch by the corners","vac.fit_rotate":"Rotate 90°","vac.fit_mirror":"Mirror","vac.trail_never":"Never","vac.trail_cleaning":"While cleaning","vac.trail_always":"Always","gs.bg_group":"Stage background","gs.bg_color":"Background around the plan","gs.bg_default":"Theme default","gs.bg_theme":"theme default","gs.bg_mode":"Plan background","gs.bg_mode.help":"“Follows the Sun” uses sun.sun, falling back to the browser's local clock; Static always shows the selected colour.","gs.bg_mode.help.aria":"Help: general plan background","gs.bg_static":"Static color","gs.bg_daynight":"Follows the Sun","gs.sun_group":"Sun","gs.sun_missing":"The sun.sun entity was not found — the background follows your local clock; window rays are unavailable.","gs.north":"North on the plan","gs.north.help":"The angle is measured clockwise from the plan's upward vertical; north is required for window rays, not for the “Follows the Sun” background.","gs.north.help.aria":"Help: general north direction","gs.north_ph":"not set","gs.north_clear":"Clear","gs.north_letter":"N","gs.sun_rays":"Sunlight through windows","gs.sun_ray_origin":"Sun rays","gs.sun_ray_origin.inner":"From the inner window corners","gs.sun_ray_origin.outer":"From the outer window corners","gs.about_version":"Houseplan Card v{v}","gs.about_github":"GitHub · docs & issues","gs.about_telegram":"Telegram chat","support.title":"Help & feedback","space.bg_color":"Background around the plan","space.bg_inherit":"Inherit general","space.bg_inherited":"inherits general settings","space.bg_mode":"Plan background","space.bg_mode.help":"Inherit the general background or override this space with a static colour or “Follows the Sun”.","space.bg_mode.help.aria":"Help: space background","space.north":"North on the plan (override)","space.north.help":"Overrides general north for this space; the angle is measured clockwise from the plan's upward vertical and is used by window rays.","space.north.help.aria":"Help: north for this space","space.north_inherited":"inherited: {v}","space.sun_rays":"Sunlight through windows","space.sun_inherit":"Inherit general","space.sun_on":"On","space.sun_off":"Off","canvas.far_objects":"{n} object(s) far from the plan","canvas.show_far":"Show","canvas.home_tip":"The plan is over there — click to fit it","gs.grid_group":"Plan maintenance","gs.grid_hint":"Updates data models, aligns plan elements to the grid and merges redundant wall fragments. An exact report is shown before anything is stored.","gs.align_all":"Optimize plans","gs.align_title":"Optimize plans","gs.align_none":"All plans already use the current optimized data model.","gs.optimize_no_automatic_changes":"There are no automatic changes to apply. Review the items below.","gs.align_count":"{n} of {total} elements will move, by at most {cm} cm.","gs.align_where":"The largest shift is in “{s}”.","gs.align_turned":"Openings whose angle is corrected: {n}.","gs.align_preflight_failed":"Could not safely verify the geometry of the following spaces: {spaces}{more}.","gs.align_preflight_hint":"Plans were not changed. Copy the diagnostics with the button below and attach them to the bug report together with a space export.","gs.preflight_reason_prepare-exception":"Could not prepare the space geometry (exception while building the model)","gs.preflight_reason_wall-null":"The wall body did not build (the union came back empty)","gs.preflight_reason_wall-degraded-extra":"The wall body degraded with extra geometry","gs.preflight_reason_wall-failed-core":"The wall body core failed to assemble","gs.preflight_reason_wall-exception":"Wall construction threw an exception","gs.preflight_reason_floor-null":"The floor outline did not build","gs.preflight_reason_floor-exception":"Floor construction threw an exception","gs.preflight_copy":"Copy diagnostics","gs.preflight_copied":"Diagnostics copied","gs.preflight_update_hint":"The card and integration versions differ — update House Plan and retry.","gs.align_preflight_space":"Space {n}","gs.align_preflight_more":", and {n} more","gs.optimize_changes":"Model migrations: {m}; spaces updated: {c}; noisy coordinate values removed: {p}; merged real-wall fragments: {w}; merged zero-thickness wall fragments: {s}; independent walls: {i}.","gs.zero_walls_migrated":"Virtual wall spans converted: {n}.","gs.wall_segments_migrated":"Wall segments stabilised: {n}.","gs.room_drafts_migrated":"Unfinished contours converted to ordinary walls: {drafts}; wall segments: {segments}.","gs.optimize_lattice_summary":"Noisy coordinate values canonicalized: {n}; maximum movement: {cm} cm.","gs.optimize_lattice_space":"{space}: coordinate values canonicalized: {n}; off-grid values left unchanged: {far}.","gs.optimize_coincident_partitions":"Hidden independent wall sections absorbed into room walls: {n}.","gs.optimize_openings_rehosted":"Openings reattached to room walls: {n}.","gs.optimize_walls_straightened":"Walls straightened: {n}; maximum movement: {cm} cm.","gs.optimize_walls_straightened_where":"Largest wall correction: {s}.","gs.optimize_walls_straighten_skipped":"Near-axis walls left unchanged because they could not be repaired safely: {n}.","gs.optimize_glow_migration":"Legacy Glow: {spaces} spaces → no data fill + independent Glow; {rooms} rooms → inherited data fill + independent Glow.","gs.optimize_references":"References repaired: spaces — {spaces}; rooms — {rooms}; positions — {positions}; devices detached from missing spaces — {detached}.","gs.optimize_reference_more":", and {n} more","gs.optimize_orphans_removed":"Forgotten records removed: {total} — room labels: {rooms}; devices: {devices}; group markers: {groups}. They belonged to spaces deleted earlier.","gs.optimize_live_positions":"Old positions in deleted spaces belong to existing objects: {n}{names}. They will be kept.","gs.optimize_live_positions_remove":"Old positions in deleted spaces belong to existing objects: {n}{names}. They are selected for removal.","gs.optimize_live_names":": {names}{more}","gs.optimize_live_remove":"Remove old positions","gs.optimize_live_keep":"Keep old positions","gs.optimize_live_selected":"Old positions will be removed after Optimize is applied.","gs.optimize_unverified":"Could not safely verify positions: {n}. They were left unchanged.","gs.optimize_registry_limited":"Full administrator access to the Home Assistant registries is required for a safe check.","gs.optimize_vacuum_warning":"Vacuum room mappings that still need review: {n}.","gs.optimize_details":"Details","gs.optimize_details_more":"And {n} more records.","gs.optimize_detail_removed":"will be removed","gs.optimize_detail_live":"will be kept","gs.optimize_detail_unverified":"not verified","gs.optimize_detail_room_label":"room label","gs.optimize_detail_device":"device","gs.optimize_detail_group":"group marker","gs.optimize_detail_unknown":"unknown owner","gs.optimize_detail_item":"{status}: {kind} {id}; old space {space}","gs.align_warn":"Elements deliberately placed between grid nodes will move. One undo is available after the operation, only until the next plan edit.","gs.align_run":"Optimize","gs.align_done":"Plans optimized: {n} elements moved, {m} records maintained, {r} references repaired","gs.optimize_undo":"Undo last optimization","gs.optimize_undone":"The last optimization was undone","decor.furniture":"Furniture","decor.image":"Image","decor.image_title":"Custom images","decor.image_upload":"Upload image","decor.image_replace":"Replace image","decor.image_uploading":"Uploading…","decor.image_asset":"Image file","decor.image_pick_hint":"Upload an image or choose one already used in House Plan.","decor.image_place_hint":"Click on the plan to place the image.","decor.image_none":"No uploaded images yet.","decor.image_unavailable":"Image unavailable","decor.image_used":"Used in {n} objects","decor.image_upload_failed":"Could not upload the image: {err}","decor.image_error_capacity":"The custom image storage limit has been reached.","decor.image_in_use":"Remove every placed copy before deleting this image.","decor.image_delete_title":"Delete image file?","decor.image_delete_message":"Delete “{name}” from House Plan? This cannot be undone.","furn.title":"Furniture library","furn.symbol":"Symbol","furn.group_furniture":"Furniture","furn.group_appliance":"Appliances","furn.group_sanitary":"Plumbing","furn.group_other":"Other","furn.width":"Width","furn.depth":"Depth","furn.back_to_categories":"All categories","furn.pick_hint":"Choose a category, then a symbol.","furn.place_hint":"Click on the plan — the piece lands against the nearest wall. Shift places it free.","furn.cat_air_conditioner":"Air conditioners","furn.cat_armchair":"Armchairs","furn.cat_bathtub":"Bathtubs","furn.cat_bed":"Beds","furn.cat_bidet":"Bidets","furn.cat_boiler":"Water heaters","furn.cat_chair":"Chairs","furn.cat_coffee_table":"Coffee tables","furn.cat_cooktop":"Cooktops","furn.cat_dining_table":"Dining tables","furn.cat_dishwasher":"Dishwashers","furn.cat_dryer":"Dryers","furn.cat_fireplace":"Fireplaces","furn.cat_fridge":"Refrigerators","furn.cat_kitchen_cabinet":"Kitchen cabinets","furn.cat_kitchen_sink":"Kitchen sinks","furn.cat_nightstand":"Cabinets","furn.cat_plant":"Plants","furn.cat_rug":"Rugs","furn.cat_shelving":"Shelving","furn.cat_shower":"Showers","furn.cat_sink":"Sinks","furn.cat_sofa":"Sofas","furn.cat_stairs":"Stairs","furn.cat_toilet":"Toilets","furn.cat_tv":"Televisions","furn.cat_wardrobe":"Wardrobes","furn.cat_washer":"Washing machines","furn.cat_work_table":"Desks","furn.sym_sofa":"Two-seat sofa","furn.sym_sofa_three_seat":"Three-seat sofa","furn.sym_sofa_corner_right":"Right sectional sofa","furn.sym_armchair":"Soft armchair","furn.sym_armchair_office":"Office chair","furn.sym_coffee_table":"Rectangular coffee table","furn.sym_coffee_table_round":"Round coffee table","furn.sym_coffee_table_oval":"Oval coffee table","furn.sym_coffee_table_rounded":"Rounded coffee table","furn.sym_table_dining":"Rectangular dining table","furn.sym_table_round":"Round table","furn.sym_table_dining_oval":"Oval dining table","furn.sym_table_dining_rounded":"Rounded dining table","furn.sym_chair":"Chair","furn.sym_chair_bar":"Bar stool","furn.sym_desk":"Rectangular desk","furn.sym_desk_corner":"Corner desk","furn.sym_bed_double":"Double bed","furn.sym_bed_single":"Single bed","furn.sym_nightstand":"Bedside table","furn.sym_cabinet_tv":"TV cabinet","furn.sym_cabinet_shoe":"Shoe cabinet","furn.sym_cabinet_sink":"Sink cabinet","furn.sym_wardrobe":"Wardrobe","furn.sym_bookshelf":"Bookcase","furn.sym_wall_unit":"Wall unit","furn.sym_kitchen_floor":"Kitchen floor module","furn.sym_kitchen_floor_corner":"Kitchen floor corner module","furn.sym_kitchen_wall":"Kitchen wall module","furn.sym_kitchen_wall_corner":"Kitchen wall corner module","furn.sym_shelf_floor":"Floor shelving unit","furn.sym_shelf_wall":"Wall shelf","furn.sym_fridge":"Fridge","furn.sym_stove":"Four-burner cooktop","furn.sym_cooktop_two":"Two-burner cooktop","furn.sym_dishwasher":"Dishwasher","furn.sym_washer":"Washing machine","furn.sym_dryer":"Tumble dryer","furn.sym_tv":"TV on stand","furn.sym_tv_wall":"Wall-mounted TV","furn.sym_ac":"Air conditioner","furn.sym_water_heater":"Water heater","furn.sym_toilet":"Floor-standing toilet","furn.sym_toilet_built_in":"Built-in toilet","furn.sym_bathtub":"Rectangular bathtub","furn.sym_bathtub_corner":"Corner bathtub","furn.sym_shower":"Shower","furn.sym_sink":"Washbasin","furn.sym_kitchen_sink":"Single kitchen sink","furn.sym_kitchen_sink_double":"Double kitchen sink","furn.sym_bidet":"Floor-standing bidet","furn.sym_bidet_built_in":"Built-in bidet","furn.sym_stairs":"Stairs","furn.sym_fireplace":"Fireplace","furn.sym_plant":"Plant","furn.sym_rug":"Rug","common.yes":"Yes","common.no":"No","vac.diag_source":"Source","vac.diag_platform":"Integration","vac.diag_status":"Status","vac.diag_position":"Position","vac.diag_rooms":"Rooms","vac.diag_rooms_value":"{total} · {matched} names match · {readiness}","vac.autocal_ready":"auto-calibration available","vac.autocal_not_ready":"need 3 matching names","vac.diag_path":"Integration path","vac.diag_map":"Map ID","vac.source_none":"not selected","vac.source_status_ok":"Ready","vac.source_status_missing":"Missing","vac.source_status_disabled":"Disabled in Home Assistant","vac.source_status_unavailable":"Unavailable","vac.source_status_unverified":"Cannot verify with current permissions","vac.source_status_unsupported":"No position data","vac.source_status_none":"No source","vac.source_banner_missing":"The saved source no longer exists. It was not replaced automatically; choose another source or restore it in Home Assistant.","vac.source_banner_disabled":"The saved source is disabled in Home Assistant. Enable it there or choose another source.","vac.source_banner_unverified":"Current Home Assistant permissions cannot verify this saved source. It remains pinned and will not be replaced automatically.","vac.choose_source":"Choose source","vac.source_auto":"Automatic","vac.source_auto_hint":"Use a compatible entity from this device","vac.all_cameras":"All cameras","vac.all_cameras_warn":"A camera may not provide robot data. Choose one only if it is your vacuum map.","vac.all_cameras_empty":"No other camera entities found.","vac.platform_unknown":"unknown integration","vac.cap_position":"position","vac.cap_rooms_short":"rooms","vac.cap_path":"path","vac.cap_map":"map ID","vac.cap_none":"no robot data detected","vac.xcme_hint":"Enable these Xiaomi Cloud Map Extractor attributes:","vac.documentation":"Documentation","vac.residual_title":"Check automatic calibration","vac.residual_message":"The matched rooms disagree by up to {error}. Apply this approximate calibration, refine it manually, or cancel without changing the saved setup.","vac.apply_proposal":"Apply","gs.backup_group":"Backup and transfer","gs.backup_hint":"Download a portable JSON backup or preview and import a backup made by House Plan.","backup.export_open":"Export","backup.import_open":"Import","backup.export_title":"Export House Plan","backup.import_title":"Import House Plan","backup.export_hint":"Choose whether the backup should contain the whole House Plan configuration or only the current space.","backup.full":"Full backup","backup.current_space":"Current space","backup.current_space_title":"Current space: {title}","backup.no_current_space":"No current space","backup.plan_only":"Plan only","backup.plan_only_hint":"Keep rooms, walls, openings, decor and room-label positions without devices or Home Assistant bindings.","backup.plan_only_preview":"This file contains the plan only","backup.privacy_warning":"The archive keeps names, Home Assistant identifiers and exact coordinates. Internal plans and attachments are referenced, not embedded; runtime states and vacuum trails are not included.","backup.download":"Download JSON","backup.export_done":"Backup downloaded","backup.reading":"Checking the backup…","backup.revalidated":"The plan changed after this preview. The summary was refreshed; review it and confirm again.","backup.error.support_invalid_message":"Check the support message and try again.","backup.error.support_package_too_large":"The anonymized support package exceeds the 8 MiB limit.","backup.error.support_preview_expired":"The support attachment preview expired or is no longer available.","backup.error.support_rate_limited":"Too many support reports or previews were requested. Try again later.","backup.error.support_rejected":"The report did not pass support service validation.","backup.error.support_unavailable":"The private support service is temporarily unavailable.","backup.error.unauthorized":"You do not have permission to export or import this plan.","backup.error.not_ready":"House Plan is not ready yet. Try again in a moment.","backup.error.too_large":"The backup exceeds the 8 MiB limit.","backup.error.invalid_json":"The selected file is not valid JSON.","backup.error.invalid_format":"The selected file is not a House Plan backup.","backup.error.invalid_image":"The image is damaged or does not match its format.","backup.error.unsupported_export_version":"This backup format is not supported by the installed version.","backup.error.unsupported_image":"Use a supported PNG, JPEG, WebP or SVG image.","backup.error.future_model":"The backup was created by a newer House Plan data model.","backup.error.invalid_config":"The backup contains an invalid House Plan configuration.","backup.error.wall_model_migration_blocked":"The backup wall model could not be upgraded safely. Optimize the source plan first, then export it again.","backup.error.invalid_layout":"The backup contains invalid object positions.","backup.error.invalid_content":"The backup contains invalid or inconsistent content references.","backup.error.space_not_found":"The selected space no longer exists.","backup.error.capacity_exceeded":"Adding this backup would exceed the plan limits.","backup.error.preview_expired":"The preview expired. Select the backup file again.","backup.error.preview_owner_mismatch":"This preview belongs to another Home Assistant user.","backup.error.conflict":"The plan changed after the preview. Review the refreshed summary.","backup.error.content_confirmation_required":"Confirm that unavailable local content may be detached.","backup.error.commit_failed":"The backup could not be applied safely. The previous plan was restored or is pending recovery.","backup.error.missing_plan":"A referenced plan file disappeared after the preview. Review the backup again.","backup.error.missing_content":"A referenced local attachment disappeared after the preview. Review the backup again.","backup.error.marker_control_missing":"A linked plan light is missing from the backup.","backup.error.marker_control_not_light":"A linked plan target is no longer marked as a light source.","backup.error.marker_control_self":"A light source cannot control itself.","backup.error.marker_control_cycle":"The backup contains a circular chain of light controls.","backup.error.duplicate_marker_control":"The backup contains a duplicate plan-light link.","backup.error.no_backup":"There is no import or optimization snapshot to restore.","backup.error.in_use":"The item is still in use","backup.error.invalid_data":"The request carries invalid data","backup.error.invalid_light_entity":"The leading light must be a light.* or switch.* entity","backup.error.invalid_marker_control":"Invalid marker control reference","backup.error.invalid_name":"The name is invalid","backup.error.invalid_partition_opening_host":"The opening must keep its partition host","backup.error.invalid_partition_opening_jamb_margin":"The opening leaves no physical jamb at the wall end","backup.error.invalid_passage_fields":"An open passage cannot carry door-only settings","backup.error.invalid_space_id":"Unknown space","backup.error.invalid_toggle_entity":"The toggle entity must be light.* or switch.*","backup.error.invalid_value_badge":"Invalid value badge settings","backup.error.invalid_value_badge_attribute":"Invalid value badge attribute","backup.error.invalid_value_badge_position":"Invalid value badge position","backup.error.invalid_value_badge_source":"Invalid value badge source","backup.error.invalid_vacuum_map_route":"Check how the robot's maps are assigned to spaces.","backup.error.invalid_value_source":"Invalid value source","backup.error.invalid_value_source_attribute":"Invalid value source attribute","backup.error.io_error":"A file operation failed on the server","backup.error.not_toggleable":"This device cannot be toggled","backup.error.nothing_to_repair":"Nothing to repair","backup.error.space_in_use":"The space is still referenced","backup.error.value_badge_source_required":"The value badge needs a source","backup.error.wall_model_client_outdated":"The plan was updated elsewhere — reload the page","backup.same_source":"Created on this Home Assistant instance","backup.foreign_source":"Created on another Home Assistant instance","backup.created":"Created: {value}","backup.versions":"Card {card}; integration {integration}; data model {model}","backup.count_spaces":"Spaces: {n}","backup.count_rooms":"Rooms: {n}","backup.count_walls":"Walls: {n}","backup.count_openings":"Openings: {n}","backup.count_decor":"Decor objects: {n}","backup.count_markers":"Devices: {n}","backup.count_layout":"Positions: {n}","backup.bindings":"Bindings — devices: {device}, entities: {entity}, virtual: {virtual}; positions without a space: {legacy}","backup.binding_status":"Target status — active: {active}, disabled: {disabled}, missing: {missing}","backup.missing_areas":"Areas missing on the target: {areas}","backup.dropped_marker_links":"Plan-light links outside this transferred space were omitted: {n}.","backup.room_drafts_migrated":"Legacy unfinished contours converted to ordinary walls: {drafts}; wall segments: {segments}.","backup.repaired_target_refs":"Existing references restored by this space import: {n}.","backup.preserved_unresolved_refs":"References that could not be restored unambiguously were preserved: {n}.","backup.preserved_unresolved_hint":"No data was guessed or deleted. After the import, run Optimize plans to inspect the remaining references.","backup.import_details":"Import reference details","backup.import_detail.incoming_remapped":"References updated inside the imported copy: {n}","backup.import_detail.target_repaired":"Existing references restored: {n}","backup.import_detail.preserved_unresolved":"Unresolved references preserved: {n}","backup.import_detail.collisions":"Destination conflicts preserved safely: {n}","backup.import_detail.dropped_links":"Incoming links omitted by transfer rules: {n}","backup.import_detail.bounded_lineages":"Overly nested identifiers left bounded: {n}","backup.replace_warning":"This replaces the current configuration and layout. Uploaded files are never deleted. One undo remains available until the next plan edit.","backup.foreign_bookkeeping":"Instance-specific known/new-device bookkeeping will not be imported.","backup.final_name":"New space name","backup.target_settings":"The target instance's global settings remain unchanged.","backup.duplicates":"Bindings already present: {n}","backup.skip":"Skip duplicate devices","backup.virtual_copy":"Add safe static virtual copies","backup.content":"Referenced content","backup.decor_images_summary":"Custom images: {objects} objects, {assets} files; missing files: {missing}.","backup.content_available":"available locally","backup.content_external":"external link","backup.content_detach_required":"will be detached","backup.confirm_detach":"I understand that unavailable internal plans and attachments will be detached from the imported configuration.","backup.confirm_missing_images":"I understand that missing custom images will remain as repair placeholders and other unavailable local files will be detached.","backup.replace":"Replace","backup.add":"Add space","backup.space_done":"Space imported: {rooms} rooms, {markers} devices, {refs} existing references restored","backup.full_done":"Backup restored: {spaces} spaces, {rooms} rooms, {markers} devices","backup.undo_import":"Undo last full import","backup.import_undone":"Full import undone","backdrop.large_title":"Large image","backdrop.large_body":"This image is {w}×{h} ({fileMb} MB file) and needs about {decodedMb} MB of memory to display. On tablets this can crash the page.","backdrop.unknown_body":"The image dimensions could not be read — the file may be damaged. Continuing may crash the page on tablets.","backdrop.reduced_dimensions":"Reduced copy: {w}×{h} px.","backdrop.use_downscaled":"Upload a reduced copy","backdrop.reducing":"Reducing…","backdrop.keep_original":"Keep the original","backdrop.too_large_title":"Image is too large","backdrop.too_large_body":"This image exceeds what browsers can display ({w}×{h}, limit {limit} px per side). Please reduce it in a desktop editor and upload again.","backdrop.downscale_failed":"Could not create the reduced copy. The original plan was not changed."};const up=new WeakSet,pp=new WeakSet;function _p(e,t,i){const n=i?t.state(i):"ready";return i&&"pending"===n?(pp.has(e)||(e.inert=!0,e.setAttribute("aria-busy","true"),pp.add(e)),t.ensure(i).then(()=>{e.isConnected&&e.requestUpdate()}),up.has(e)?"warm":"cold"):(pp.delete(e)&&(e.inert=!1,e.removeAttribute("aria-busy")),i&&(e.setAttribute("lang","fallback"===n?"en":i),up.add(e)),"ready")}function mp(){return j``}const gp=[{code:"en",nativeLabel:"English",dictionary:dp},{code:"ru",nativeLabel:"Русский",dictionary:{"editor.context_actions":"Действия: {object}","editor.tool_options":"Параметры инструмента: {tool}","editor.palette":"Палитра: {tool}","editor.open_group":"Группа инструментов: {group}","editor.group_active":"{group} — активно: {item}","editor.disabled_action":"{action} недоступно: {reason}","editor.loading":"Загружаем редактор…","editor.loading_aria":"Редактор плана загружается","editor.load_failed":"Не удалось загрузить редактор.","editor.refresh_advice":"Обновите страницу и повторите попытку.","editor.retry_advice":"Проверьте сеть и нажмите ещё раз.","version_mismatch.title":"Версии House Plan не совпадают","version_mismatch.body":"Если Home Assistant ещё перезапускается, дождитесь завершения, затем перезагрузите эту страницу.","version_mismatch.frontend":"Карточка","version_mismatch.backend":"Интеграция","version_mismatch.reload":"Перезагрузить страницу","color_picker.title":"Выбор цвета","color_picker.hue":"Оттенок","color_picker.saturation":"Насыщенность","color_picker.value":"Яркость","color_picker.hex":"Цвет HEX","color_picker.invalid_hex":"Введите цвет HEX из 3 или 6 цифр","color_picker.confirm":"ОК","btn.properties":"Свойства","btn.keep_as_walls":"Оставить стенами","btn.delete_room_keep_walls":"Удалить комнату, оставить стены","btn.delete_room_with_walls":"Удалить комнату и стены","title.markup_select":"Выбор и редактирование стен и колонн","title.markup_column":"Колонна: кликните точку сетки для квадратной колонны","markup.partition":"Перегородка","markup.column":"Колонна","markup.hint_column":"кликните точку сетки, чтобы поставить квадратную колонну","history.wall_segment":"Добавление отрезка стены","history.column_add":"Добавление колонны","history.physical_edit":"Изменение физического объекта","history.physical_delete":"Удаление физического объекта","history.physical_move":"Перемещение физического объекта","history.wall_face_batch":"Создание комнат из стен","toast.column_duplicate":"Колонна с тем же центром и внешним размером уже существует","physical.partition_properties":"Свойства перегородки","physical.column_properties":"Свойства колонны","physical.shape":"Форма","physical.square":"Квадрат","physical.circle":"Круг","physical.diameter":"Диаметр","physical.side":"Сторона","physical.rotation":"Угол поворота","physical.length":"Длина","physical.allowed_range":"Допустимо: {min}–{max} {unit}","physical.column_size_title":"Внешняя сторона квадратной колонны, создаваемой кликом (1–150 см).","card.title":"План дома","count.devices":"{n} устр.","empty.no_spaces":"Пространств пока нет.","nav.spaces":"Пространства House Plan","empty.add_first":"Добавьте первое пространство и загрузите план этажа.","empty.read_only":"Пространства не настроены. Попросите администратора добавить первое.","empty.install":"Установите интеграцию House Plan и добавьте запись в «Устройства и службы».","btn.add_space":"Добавить пространство","btn.cancel":"Отмена","btn.save":"Сохранить","btn.close":"Закрыть","btn.delete":"Удалить","btn.copy":"Копировать","btn.edit":"Редактировать","btn.open_in_ha":"Открыть в HA","btn.reset":"Сброс","btn.attach":"Прикрепить…","btn.upload":"Загрузить…","btn.replace":"Заменить…","title.zoom_in":"Приблизить","title.zoom_out":"Отдалить","title.zoom_fit":"Вписать всё","title.configure_space":"Настроить пространство","title.add_space":"Добавить пространство","title.markup_add":"Стены: рисуйте непрерывную цепочку; каждый принятый отрезок сохраняется отдельно. Shift фиксирует 45°","title.markup_merge":"Объединить: клик по одной комнате, затем по соседней с общей стеной","title.markup_split":"Разделить комнату: клик по комнате, затем две точки на её стенах","title.markup_delroom":"Удалить комнату: кликните внутри комнаты и подтвердите удаление","title.need_plan":"Загрузите подложку (план этажа)","markup.add":"Стены","markup.merge":"Объединить","markup.split":"Разделить","markup.resize":"Размер","title.markup_resize":"Изменение размера комнат: тяните доступную ручку горизонтальной или вертикальной стены","markup.hint_resize":"тяните доступную ручку стены · стена упирается в первую небезопасную позицию · Esc — отмена · Ctrl+Z — отмена шага","resize.disabled.diagonal":"Стена расположена под углом: Resize поддерживает только горизонтальные и вертикальные стены","resize.disabled.side-angle":"Примыкающая стена расположена под углом: для Resize обе примыкающие стены должны образовывать прямой угол","resize.disabled.duplicate-physical-wall":"Стену перекрывает отдельная перегородка или колонна; удалите или переместите её перед изменением размера","resize.disabled.partial-shared":"Соседняя комната использует только часть этой стены, поэтому её нельзя безопасно двигать как одну общую стену","resize.disabled.unequal-shared":"У соседней комнаты другие конечные точки или длина стены, поэтому стены нельзя безопасно двигать вместе","resize.disabled.multiple-rooms":"Перемещение затронуло бы больше двух комнат","resize.disabled.thickness-conflict":"Толщину стены нельзя безопасно сохранить","resize.disabled.opening-conflict":"Проём на этой стене нельзя безопасно переместить","resize.disabled.invalid-geometry":"Эту стену нельзя переместить без изменения структуры плана","resize.limit_stopped":"Стена остановлена: дальше нарушается ограничение стыков","resize.commit_failed":"Изменение размера отменено: итоговый план не прошёл проверку геометрии","resize.preview_failed":"Стена остановлена в последней безопасной позиции: геометрию плана нельзя сохранить без потерь","markup.opening":"Проём","markup.delete_room":"Удалить комнату","history.undo":"Отменить","history.redo":"Повторить","history.undo_named":"Отменить: {name} (Ctrl+Z)","history.redo_named":"Повторить: {name} (Ctrl+Shift+Z / Ctrl+Y)","history.undo_empty":"Нет операций для отмены","history.redo_empty":"Нет операций для повтора","history.undone":"Отменено: {name}","history.redone":"Повторено: {name}","history.add_room":"Создание комнаты","history.split_room":"Разделение комнаты","history.merge_rooms":"Объединение комнат","history.resize_room":"Изменение размера комнаты","history.wall_thickness":"Изменение толщины стены","history.add_opening":"Добавление дверного или оконного проёма","history.edit_opening":"Изменение проёма","history.move_opening":"Перемещение проёма","history.delete_opening":"Удаление проёма","history.delete_room_keep_walls":"Удаление комнаты с сохранением стен","history.delete_room_with_walls":"Удаление комнаты и её стен","history.decor_add":"Добавление объекта декора","history.decor_edit":"Изменение объекта декора","history.decor_move":"Перемещение объекта декора","history.decor_transform":"Трансформация объекта декора","history.decor_delete":"Удаление объекта декора","history.backdrop_transform":"Трансформация подложки плана","history.device_move":"Перемещение: {name}","history.device_stale":"История позиций больше неприменима и была очищена","opening.new":"Новый проём","opening.edit":"Проём","opening.door":"Дверь","opening.window":"Окно","opening.gate":"Ворота","opening.passage":"Открытый проём","opening.passage_binding_warning":"При сохранении датчик открытия и замок будут удалены.","opening.invalid_passage_fields":"У открытого проёма на плане «{room}» есть недопустимые параметры: {fields}.","opening.type_label":"Тип","opening.length_label":"Длина, см","opening.contact_label":"Датчик открытия","opening.lock_label":"Замок","opening.none":"— нет —","opening.search_ph":"Поиск: имя или entity_id…","opening.invert":"Инвертировать открыто/закрыто","opening.flip_h":"Петли с другой стороны","opening.flip_v":"Открывается в другую сторону","opening.open":"Открыто","opening.closed":"Закрыто","opening.locked":"Заперто","opening.unlocked":"Не заперто","opening.state_unknown":"недоступно","opening.no_entities":"Датчики не привязаны — статичный символ на плане.","toast.opening_no_wall":"Кликните рядом со стеной комнаты или независимой стеной","opening.host_partition":"Независимая стена","opening.partition_orphan":"Независимая стена этого проёма больше не существует","opening.partition_jamb_margin":"Оставьте от края проёма до торца стены минимум {distance}","opening.rebind_partition":"Привязать к другой независимой стене","confirm.delete_partition_openings_title":"Удалить стену и проёмы?","confirm.delete_partition_openings_body":"В стене есть проёмы: {count}. Они будут удалены вместе со стеной.","confirm.delete_partition_openings_item":"• {type}, {length}","markup.hint_points":"точек: {n} · Shift — шаг 45° · Esc — завершить цепочку · Ctrl+Z — убрать точку · при замыкании будет предложена комната","markup.hint_start":"кликните точку сетки, чтобы начать цепочку стен","tip.lqi":"средний сигнал zigbee:","tip.area":"площадь: {value}","info.device_header":"Устройство на плане","info.model":"Модель","info.state":"Состояние","info.link":"Ссылка","info.manuals":"Инструкции","info.none":"Нет дополнительной информации","marker.new_device":"Новое устройство","marker.name_label":"Имя (отображается на плане)","marker.name_ph":"Название","marker.binding_label":"Привязка к устройству HA","marker.binding_disabled":"деактивировано в Home Assistant","marker.virtual_option":"Виртуальное устройство (без привязки)","marker.search_ph":"Поиск устройства / группы…","marker.nothing_found":"ничего не найдено","marker.room_label":"Комната","marker.room_override":" (переопределить размещение)","marker.room_choose":"— выберите комнату —","marker.room_auto":"— по зоне устройства (авто) —","marker.icon_label":"Иконка","marker.icon_ph":"mdi:… (пусто = авто)","marker.display_label":"Отображение","display.badge":"Значок + состояние","display.icon_ripple":"Значок + состояние и активность","display.static_icon":"Всегда статичный значок","display.value_static_icon":"Значение + статичный значок","marker.display_hint_badge":"Значок и динамическая подложка показывают состояние устройства без обычной пульсации активности. Красная тревога сохраняется.","marker.display_hint_icon_ripple":"Значок, динамическая подложка и пульсация: короткая — для событий, постоянная — для работы, движения или присутствия. Красная тревога имеет отдельный приоритет.","marker.display_hint_value":"Значок заменяется выбранным или автоматически найденным значением Home Assistant; подложка продолжает показывать состояние. Красная тревога сохраняется.","marker.display_hint_static_icon":"Подложка в цветах темы и значок всегда остаются одинаковыми. Состояния, активность, недоступность и тревоги не меняют отображение.","marker.display_hint_value_static_icon":"Маркер показывает выбранное значение, а подложка остаётся в цветах темы. Состояния, активность, недоступность и тревоги не меняют цвет маркера.","marker.static_alarm_warning":"Это устройство может сообщать о тревогах. Статичный режим скрывает визуальную тревогу маркера.","marker.preview.title":"Предпросмотр отображения","marker.preview.actual":"Сейчас","marker.preview.example":"Пример","marker.preview.integration":"Интеграция","marker.preview.source":"Источник отображения","marker.preview.current_state":"Текущее состояние","marker.preview.result":"На плане","marker.preview.details":"Подробнее об источниках","marker.preview.select_source":"Выберите устройство или сущность Home Assistant, чтобы увидеть фактическое отображение.","marker.preview.unknown_provider":"Интеграция неизвестна","marker.preview.virtual_provider":"House Plan · виртуальное устройство","marker.preview.no_source":"Нет активного источника","marker.preview.no_state":"Нет текущего состояния","marker.preview.mixed_states":"Несколько разных состояний","marker.preview.multiple_sources":"Источников: {n}","marker.preview.more_sources":"ещё {n}","marker.preview.scaled":"Предпросмотр уменьшен до {n}%, чтобы поместиться. Сохранённый размер не изменится.","marker.preview.demo_short":"Показать краткую активность","marker.preview.demo_continuous":"Показать постоянную активность","marker.preview.stop_continuous":"Остановить постоянную активность","marker.preview.demo_short_notice":"Пример краткой активности; фактическое состояние устройства не меняется.","marker.preview.demo_continuous_notice":"Пример постоянной активности; фактическое состояние устройства не меняется.","marker.preview.demo_already_visible":"Текущее состояние уже показывает реальную активность или тревогу.","marker.preview.reduced_motion":"В системе включено уменьшение движения, поэтому обычная активность показана точкой.","marker.preview.reason.neutral":"Нейтральная тёмная подложка","marker.preview.reason.working":"Жёлтая подложка: устройство сейчас работает","marker.preview.reason.working_activity":"Жёлтая подложка и эффект активности: устройство сейчас работает","marker.preview.reason.open":"Оранжевая подложка: физически открыто или разблокировано","marker.preview.reason.cover_icon_state":"Нейтральная подложка; состояние и значок определяет сущность шторы или заслонки","marker.preview.reason.presence":"Эффект активности, пока обнаружено присутствие","marker.preview.reason.event":"Короткий эффект активности после события","marker.preview.reason.transition":"Эффект активности во время движения или смены состояния","marker.preview.reason.media_neutral":"Медиаустройство остаётся на нейтральной тёмной подложке, пока доступно","marker.preview.reason.unavailable":"Приглушённая нейтральная подложка: отключено или недоступно","marker.preview.reason.alarm":"Красная тревожная подложка; тревога отображается всегда","marker.preview.reason.live_states_disabled":"Оформление по живым состояниям отключено в настройках карточки","marker.preview.reason.value_no_state":"Нет подходящего значения состояния — вместо него показан значок","marker.preview.reason.value_ambiguous_sources":"Подходит несколько источников значения — вместо него показан значок","marker.preview.reason.value_non_scalar":"Источник вернул не простое значение — вместо него показан значок","marker.preview.reason.value_virtual":"У виртуального устройства нет значения HA — вместо него показан значок","marker.preview.reason.vacuum_live_plan_only":"Живая позиция и след пылесоса доступны только на полном плане","marker.preview.reason.hidden_design_preview":"Устройство скрыто на плане, но его оформление видно в предпросмотре","marker.preview.reason.composite_power_source":"Состояние берётся из сущности питания устройства; вспомогательные переключатели не учитываются","marker.preview.reason.activity_display_disabled":"Выбранный режим отображения не показывает обычные эффекты активности","marker.preview.reason.ha_disabled":"Привязка отключена в Home Assistant, поэтому устройство будет скрыто на плане","marker.preview.reason.orphaned":"Сохранённая привязка Home Assistant больше не найдена","marker.preview.reason.static_icon":"Статичный режим: состояние устройства не меняет значок","marker.preview.reason.value_static_icon":"Статичный режим со значением: состояние устройства не меняет цвет маркера","marker.activity_color":"Цвет пульсации активности","marker.ripple_size":"Размер пульсации активности","marker.activity_alarm_note":"Цвет и размер относятся только к обычной активности и не влияют на красную тревогу.","marker.pulse_a11y_alarm":"Тревога","marker.pulse_a11y_event":"Недавнее событие","marker.pulse_a11y_presence":"Обнаружено присутствие","marker.pulse_a11y_transition":"Изменение состояния","marker.pulse_a11y_running":"Работает","marker.state_a11y_neutral":"Обычное состояние","marker.state_a11y_working":"Работает","marker.state_a11y_open":"Открыто","marker.state_a11y_locked":"Заблокировано","marker.state_a11y_unlocked":"Разблокировано","marker.state_a11y_alarm":"Тревога","marker.state_a11y_unavailable":"Недоступно","marker.lqi_a11y_low":"LQI {value}, слабый сигнал","marker.lqi_a11y_mid":"LQI {value}, средний сигнал","marker.lqi_a11y_high":"LQI {value}, сильный сигнал","marker.size_label":"Размер / поворот значка","marker.angle_label":"Поворот","marker.model_label":"Модель","marker.model_ph":"напр. Aqara T&H","marker.link_label":"Ссылка","marker.desc_label":"Описание","marker.desc_ph":"Заметки, характеристики…","marker.manuals_label":"Инструкции (PDF и т.п.)","marker.sub_device":"устройство","marker.sub_z2m_group":" · Z2M-группа","marker.sub_group":"группа","marker.sub_helper":"хелпер","space.new":"Новое пространство","space.copy_title":"Копирование пространства","space.copy_name":"Название нового пространства","space.copy_fallback":"Пространство","space.copy_create":"Создать копию","space.copy_optimize_title":"Оптимизировать перед копированием?","space.copy_optimize_body":"Перед созданием «{name}» House Plan должен оптимизировать весь план, включая другие пространства. Продолжить?","space.copy_optimize_confirm":"Оптимизировать и скопировать","space.copy_error_changed":"План изменился, пока было открыто подтверждение. Проверьте его и повторите попытку.","space.copy_error_source_missing":"Исходного пространства больше нет. Снова откройте его настройки и повторите попытку.","space.copy_error_source_invalid":"House Plan не смог проверить все стены этого пространства. Исправьте исходное пространство и повторите попытку.","space.copy_error_spaces_limit":"В House Plan уже создано максимальное число пространств.","space.copy_error_partitions_limit":"В этом пространстве слишком много стен для копирования.","space.copy_error_openings_limit":"В этом пространстве слишком много проёмов для копирования.","space.copy_error_decor_limit":"В этом пространстве слишком много элементов подложки для копирования.","space.copy_error_columns_limit":"В этом пространстве слишком много колонн для копирования.","space.copy_error_opening_host":"Один из проёмов больше не привязан к стене. Исправьте или удалите его перед копированием.","space.copy_error_geometry":"Копия создаст небезопасную геометрию стен. Исправьте исходное пространство и повторите попытку.","space.copy_error_optimize_geometry":"Копирование остановлено: оптимизация всего плана небезопасна для одного из пространств.","space.header":"Пространство","space.title_label":"Название","space.title_ph":"Например: Гараж","space.plan_label":"Подложка (план)","space.no_plan":"нет подложки","space.plan_alt":"план","room.new":"Новая комната","room.name_label":"Отображаемое имя","room.name_ph":"Например: Терраса","room.area_label":"Зона Home Assistant (свободные)","room.no_area_option":"— без зоны —","room.default_name":"Комната","device.unnamed":"без имени","device.light_group":"группа света","device.fallback":"устройство","device.virtual":"виртуальное устройство","confirm.delete_room_title":"Удалить комнату «{name}»?","confirm.delete_room_body":"Выберите, нужно ли оставить физические стены, принадлежащие только этой комнате. Общие с другой комнатой стены сохраняются всегда.","confirm.remove_marker_title":"Удалить устройство с плана?","confirm.remove_marker_body":"Устройство исчезнет полностью и перестанет участвовать в данных плана. Позже его можно будет добавить заново.","confirm.erase_decor":"Стереть объект «{kind}»? Действие можно отменить из истории редактора.","confirm.delete_space_title":"Удалить пространство?","confirm.delete_space_body":"Пространство, все его комнаты и вся разметка плана будут удалены.","confirm.delete_space_vac_routes":"Также будет снято сопоставление карт роботов: {count}.","space.delete_blocked":"Это пространство всё ещё используется устройствами: {n}. Сначала перенесите их в другое пространство или удалите.","toast.pos_save_failed":"Не удалось сохранить позицию: {err}","toast.no_entity":"У устройства нет подходящей сущности","toast.ha_disabled_action":"Деактивированный объект Home Assistant нельзя использовать на плане.","toast.ha_disabled_show_device":"Деактивированное в Home Assistant устройство нельзя показать на плане. Сначала активируйте его в Home Assistant.","toast.ha_disabled_show_entity":"Деактивированную в Home Assistant сущность нельзя показать на плане. Сначала активируйте её в Home Assistant.","toast.ha_disabled_add":"Деактивированный объект Home Assistant нельзя добавить на план. Сначала активируйте его в Home Assistant.","toast.ha_binding_unverified":"Статус объекта не удалось подтвердить по реестру Home Assistant. Отображение и действия временно недоступны.","toast.markup_needs_server":"Разметка доступна после переноса конфига на сервер","toast.space_order_changed":"Порядок изменён. Если где-то этаж карточки задан номером, проверьте такие панели.","toast.conflict":"Конфиг изменён в другом окне — данные обновлены, повторите последнее действие","toast.cfg_save_failed":"Не удалось сохранить конфиг: {err}","toast.room_overlap":"Контур накладывается на комнату «{name}» — комнаты не должны накладываться","toast.contour_cannot_close":"Контур нельзя замкнуть: он вырожден или пересекает сам себя","toast.merge_not_adjacent":"Объединять можно только комнаты с общей стеной","toast.rooms_merged":"Комнаты объединены в «{name}»","toast.split_pick_wall":"Начните разрез на стене комнаты","toast.split_bad_cut":"Разрез — от стены до стены внутри комнаты, без пересечения стен и самого себя","merge.header":"Объединение комнат","merge.hint":"У объединённой комнаты одно имя и одна зона. Вторая зона освобождается — её устройства уйдут с плана, пока их не заберёт другая комната.","merge.keep":"Оставить","merge.no_area":"без зоны","toast.room_saved":"Комната сохранена ({n}). Устройств добавлено: {added}. Обведите следующую или выйдите из разметки.","toast.room_saved_no_area":"Комната сохранена ({n}, без зоны). Обведите следующую или выйдите из разметки.","toast.marker_needs_server":"Редактирование устройств доступно после переноса конфига на сервер","toast.virtual_name_required":"Укажите имя виртуального устройства","toast.marker_saved":"Устройство сохранено","toast.marker_removed":"Устройство удалено с плана","toast.integration_missing":"Интеграция House Plan не установлена — управление недоступно","toast.plan_formats":"Поддерживаются SVG, PNG, JPG, WebP","toast.plan_required":"Загрузите подложку — план этажа обязателен","toast.space_added_onboard":"Пространство добавлено. Обведите комнаты: кликайте по точкам сетки и замкните контур.","toast.space_added":"Пространство добавлено","toast.space_copied":"Пространство «{name}» создано","toast.space_saved":"Пространство сохранено","toast.space_deleted":"Пространство удалено","toast.delete_failed":"Ошибка удаления: {err}","toast.error":"Ошибка: {err}","toast.toggle_target_unavailable":"Цель «{name}» недоступна — действие не выполнено","toast.toggle_targets_unavailable":"Цели недоступны: {names}. Действие не выполнено","toast.file_failed":"Файл «{name}» не загружен: {err}","toast.files_attached":"Прикреплено файлов: {n}","err.unknown":"неизвестная ошибка","err.code":"код {code}","err.too_large":"файл больше {mb} МБ","err.bad_ext":"недопустимый тип (нужен PDF/изображение)","err.unauthorized":"нужны права администратора","editor.title":"Заголовок","editor.default_floor":"Стартовое пространство","editor.default_floor_missing":"Стартовое пространство «{id}» больше не существует. Выберите другое.","editor.floor":"Закреплённое пространство","editor.floor_none":"— не закреплять —","editor.floor_index":"YAML-индекс {index} (сохранён)","fixed_floor.loading":"Загружаем закреплённое пространство…","fixed_floor.invalid_title":"Закреплённое пространство недоступно","fixed_floor.invalid_body":"Проверьте floor в конфигурации карточки. Настроенное значение: {value}","editor.icon_size":"Размер иконок, % ширины плана","editor.show_temperature":"Показывать температуру","editor.live_states":"Живые состояния (вкл/выкл, открыто…)","editor.light_pools":"Световые пулы и тени от стен","editor.show_signal":"Показывать сигнал zigbee (LQI)","editor.language":"Язык интерфейса","editor.lang_auto":"Авто (профиль HA)","title.icon_rules":"Правила иконок: какая MDI-иконка достаётся устройству по имени","rules.title":"Правила иконок","rules.hint":"Правила проверяются сверху вниз по строке «имя устройства + модель» (regex без учёта регистра); срабатывает первое совпадение. Если ничего не подошло — решает device class сущности, затем — иконка-заглушка.","rules.pattern_ph":"regex, напр. розетк|plug","rules.icon_ph":"mdi:power-socket-de","rules.add":"Добавить правило","rules.reset":"Сбросить к умолчаниям","rules.test_ph":"Проверьте имя устройства…","rules.invalid":"некорректный regex","rules.saved":"Правила иконок сохранены","btn.up":"Вверх","btn.down":"Вниз","tap.info":"Карточка устройства","tap.more_info":"Диалог HA (more-info)","tap.toggle":"Переключить состояние","marker.tap_label":"Действие по нажатию для этого устройства","tap.toggle_note":"Под селектором показано, какое состояние изменится. Защищённые устройства не переключаются с плана.","import.title":"Создать пространства из этажей HA","import.hint":"Home Assistant уже знает эти этажи. Отметьте, какие превратить в пространства плана — далее для каждого попросим картинку плана. Комнаты затем обводятся вручную по плану.","import.start":"Создать: {n}","import.manual":"Начать с нуля","import.progress":"Этаж {i} из {n}","import.done":"Пространства созданы. Обведите комнаты: кликайте по точкам сетки и замкните контур.","btn.skip":"Пропустить","space.scale_label":"Масштаб (размер клетки сетки)","space.cell_cm.help":"Связывает сетку с реальными размерами: от значения зависят длины и площади, толщина стен, размеры проёмов и радиус свечения. Изменение после разметки меняет расчётные размеры всего пространства, но не двигает его точки на плане.","space.cell_cm.help.aria":"Подсказка: масштаб пространства","space.scale_unit":"см на клетку","space.scale_unit_imperial":"дюйм на клетку","space.display_section":"Отображение","space.show_borders":"Всегда отображать границы комнат","space.zero_wall_style":"Стены нулевой толщины","space.zero_wall_style.help":"Пунктирные стены нулевой толщины пропускают Glow и солнечные лучи, сплошные блокируют их как барьер нулевой площади. Выбор меняет все такие стены пространства, даже когда их линии скрыты в просмотре.","space.zero_wall_style.help.aria":"Подсказка: вид стен нулевой толщины","space.zero_wall_dashed":"Пунктирные","space.zero_wall_solid":"Сплошные","space.show_names":"Отображать названия комнат (перетаскиваются)","space.room_color":"Цвет границ и названий","space.opacity":"Прозрачность","space.fill_label":"Заливка комнат","space.fill_mode.help":"«Свой цвет» задаёт оформление, а «Свет», «Температура» и «LQI» используют текущие данные Home Assistant; Glow включается отдельно.","space.fill_mode.help.aria":"Подсказка: режим заливки комнат","fill.none":"Нет","fill.lqi":"По силе зигби-сигнала","fill.light":"По освещению","fill.custom":"Свой цвет","space.custom_fill":"Цвет заливки","space.source_file":"У меня есть картинка плана","space.source_draw":"Нет подложки — нарисую комнаты вручную","fill.temp":"По температуре","tip.temp_avg":"средняя температура:","tip.hum_avg":"средняя влажность:","space_card.button":"Перейти к пространству","space_card.not_found":"Пространство «{id}» не найдено","space_card.loading":"Загрузка…","continuity.restore_plan":"Восстанавливаем план…","continuity.restore_connection":"Восстанавливаем подключение к устройствам…","continuity.retry":"Повторить","editor.space":"Пространство","editor.framing":"Кадрирование","editor.fit_content":"Всё видимое содержимое","editor.fit_house":"Плотно по геометрии дома","editor.show_button":"Показывать кнопку","editor.button_label":"Текст кнопки","editor.button_target":"Путь дашборда (куда вести)","marker.sub_entity":"сущность","title.general_settings":"Общие настройки","title.export_pdf":"Сохранить в PDF","pdf.title":"Сохранение в PDF","pdf.dimensions":"Отображать размеры и площади","pdf.decor":"Отображать мебель и другой декор","pdf.room_names":"Отображать названия комнат","pdf.backdrop":"Отображать подложку","pdf.save":"Сохранить","pdf.saving":"Формируем…","pdf.failed":"Не удалось создать PDF.","pdf.too_large":"Размер изображений превышает лимит PDF 25 МБ.","pdf.asset_failed":"Не удалось загрузить подложку или изображение декора.","pdf.scale":"Масштаб 1:{n}","pdf.north":"Север","gs.title":"Общие настройки","gs.light_group":"Заливка: освещение","gs.light_on":"Свет включён","gs.light_off":"Весь свет выключен","gs.temp_group":"Заливка: температура","gs.temp_cold":"Холодно","gs.temp_ok":"Комфорт","gs.temp_hot":"Жарко","gs.lqi_group":"Заливка: зигби-сигнал","gs.lqi_low":"Слабый сигнал","gs.lqi_high":"Сильный сигнал","gs.reset":"Сбросить к умолчаниям","gs.saved":"Общие настройки сохранены","gs.radar_show_live":"Показывать текущее присутствие на плане","gs.radar_show_live_hint":"Скрывает или показывает все живые цели радаров. Это не запускает и не останавливает запись наблюдений.","radar.title":"Присутствие на плане","radar.help":"Свяжите маркер с точными сущностями радара Home Assistant, укажите положение датчика и профиль координат. Живые позиции обрезаются по выбранной комнате.","radar.help.aria":"Подсказка: настройки радара присутствия","radar.enabled":"Использовать этот радар присутствия","radar.show_live":"Показывать живые цели","radar.configure":"Настроить радар","radar.configure_on_plan":"Настроить на плане","radar.change_installation":"Сменить установку","radar.no_contour":"У комнаты нет контура. Точки радара не будут обрезаться по комнате.","radar.discard_setup_title":"Отменить настройку радара?","radar.discard_setup":"Несохранённая настройка радара будет потеряна.","radar.step_place_mount":"Укажите физическое положение датчика","radar.step_place_heading":"Укажите точку прямо перед датчиком","radar.step_reference":"Укажите контрольное положение {n}, затем начните измерение","radar.step_check_reference":"Укажите независимое проверочное положение","radar.start_measure":"Начать измерение","radar.countdown":"Встаньте в отмеченное место через {seconds} с","radar.capturing":"Стойте неподвижно и в одиночестве…","radar.fit_ready":"Калибровка готова","radar.check_third":"Проверить в другом положении","radar.check_complete":"Независимая проверка завершена","radar.error_distance":"Расхождение положения: {distance}","radar.ambiguous_target":"Обнаружено несколько целей. Повторите измерение в одиночестве.","radar.insufficient_samples":"Недостаточно актуальных координат. Повторите или настройте вручную.","radar.bad_references":"Выберите разнесённые положения в разных направлениях от датчика.","radar.ambiguous_sources":"Измерения допускают два одинаково вероятных направления. Выберите точки, по которым можно различить левую и правую стороны.","radar.bad_fit":"Измерения не совпадают. Проверьте единицы, положение датчика и контрольные точки.","radar.desktop_hint":"Для точной настройки используйте компьютер. Редактирование на тач-устройствах поддерживается по остаточному принципу.","radar.detected":"House Plan распознал признаки радара у этого устройства. Перед сохранением проверьте точные источники.","radar.detected_ld2450":"House Plan нашёл набор координат ESPHome LD2450. Перед сохранением проверьте точные источники X/Y.","radar.additional_actions":"Дополнительные действия","radar.declare":"Это радар присутствия","radar.profile":"Профиль данных","radar.profile_esphome_ld2450_v1":"ESPHome LD2450 (цели X/Y)","radar.profile_cartesian_v1":"Декартовы цели (X/Y)","radar.profile_polar_v1":"Полярная цель (дальность/угол)","radar.profile_range_v1":"Только дальность","radar.profile_zones_v1":"Состояния зон","radar.profile_presence_v1":"Только присутствие","radar.room":"Комната радара","radar.room_choose":"Выберите комнату","radar.target":"Цель {n}","radar.axis_x":"Сущность координаты X","radar.axis_y":"Сущность координаты Y","radar.add_target":"Добавить слот цели","radar.range_channel":"Канал дальности {n}","radar.add_range":"Добавить канал дальности","radar.presence_gate":"Сущность присутствия для слота","radar.swap_axes":"Поменять оси X и Y местами","radar.axis_x_sign":"Направление X","radar.axis_y_sign":"Направление Y","radar.distance_source":"Сущность дальности","radar.angle_source":"Сущность угла","radar.angle_unit":"Единица угла","radar.degrees":"Градусы","radar.radians":"Радианы","radar.angle_zero":"Направление нулевого угла","radar.angle_forward":"Вперёд","radar.angle_right":"Вправо","radar.angle_clockwise":"Угол растёт по часовой стрелке","radar.zone_source":"Сущность зоны","radar.occupancy_source":"Сущность присутствия","radar.count_source":"Сущность количества целей","radar.availability_source":"Сущность доступности","radar.source_choose":"Выберите сущность","radar.source_optional":"Необязательно","radar.source_missing":"сейчас недоступна","radar.saved_unsupported":"Сохранённая настройка радара не поддерживается или неполна. Она неактивна; удалите её либо обновите House Plan перед повторной настройкой.","radar.occupancy":"Присутствие (вкл/выкл)","radar.count":"Количество","radar.mount":"Положение и направление","radar.mount_hint":"Это физическое положение датчика. Перемещение его декоративного маркера не меняет установку.","radar.heading":"Направление, °","radar.range_cm":"Дальность, см","radar.fov_deg":"Угол обзора, °","radar.unit":"Единица источника","radar.mirror":"Отразить ось влево/вправо","radar.remove":"Удалить настройки радара","radar.invalid":"Перед сохранением заполните комнату, источники и положение радара.","radar.check_sources":"Проверить живые данные","radar.checking":"Проверяем…","radar.health":"Состояние подключения","radar.live_summary":"Текущих целей: {targets}; дуг дальности: {ranges}","radar.health_ok":"Актуальные данные получены","radar.health_off":"Цели не обнаружены","radar.health_stale":"Часть координат устарела","radar.health_partial":"Часть источников актуальна, часть устарела","radar.health_restricted":"Нет доступа к одному или нескольким источникам","radar.health_incomplete":"Текущий отчёт радара неполон","radar.health_position_unavailable":"Есть присутствие, но актуальное положение недоступно","radar.health_unavailable":"Данные датчика недоступны","radar.health_needs_setup":"Требуется настроить установку","radar.health_inconsistent":"Источники передают противоречивые данные","radar.health_unknown":"Текущее состояние неизвестно","radar.health_disabled":"Радар отключён","radar.error_invalid_radar":"Проверьте настройки радара.","radar.error_invalid_selection":"Выберите существующую комнату и допустимые источники.","radar.error_source_restricted":"Нет доступа ко всем выбранным источникам.","radar.error_rate_limited":"Слишком много запросов. Повторите чуть позже.","radar.error_not_ready":"Обработка данных радара ещё не готова.","radar.error_conflict":"План изменился. Откройте настройку радара заново и повторите попытку.","radar.error_source_unavailable":"Один или несколько выбранных источников радара недоступны.","radar.error_unsupported_capability":"Установленная интеграция не поддерживает эту возможность радара.","radar.report_age":"{seconds} с назад","space.show_lqi":"Показывать зигби-сигнал (LQI) у устройств","space.hide_decor":"Скрыть декоративный слой","space.hide_decor_tip":"Линии, фигуры, надписи и мебель остаются на месте — их видно в редакторе подложки, но не на плане.","space.hide_openings":"Скрыть проёмы","space.hide_openings_tip":"Двери, окна и ворота не рисуются, но продолжают работать: свет проходит, солнце светит в окна, датчики открытия срабатывают. В редакторе плана проёмы видно всегда.","gs.light_none":"Нет источников света","mode.plan":"Редактор плана","mode.devices":"Редактор устройств","display.value":"Значение + состояние","marker.subarea":"без зоны, вручную","device.new":"Новое устройство — откройте его редактор, чтобы снять отметку","opening.unlock_action":"Открыть замок","opening.lock_action":"Закрыть замок","opening.lock_pending":"Выполняется…","title.close_editor":"Закрыть редактор (вернуться к просмотру)","title.add_device":"Добавить устройство на план","devbar.add":"Добавить","devbar.rules":"Правила иконок","device_inbox.button":"Устройства","device_inbox.title":"Устройства на плане","device_inbox.search":"Поиск по устройствам, сущностям и интеграциям…","device_inbox.add_virtual":"Добавить виртуальное устройство","device_inbox.tab_on_plan":"На плане","device_inbox.tab_available":"Доступны","device_inbox.tab_hidden":"Скрытые","device_inbox.tab_readd":"Доступны снова","device_inbox.only_new":"Только новые","device_inbox.show_entities":"Показывать сущности","device_inbox.show_hidden":"Показывать скрытые на плане","device_inbox.show_hidden.help":"Временно показывает на плане скрытые и деактивированные маркеры служебными призраками только в редакторе устройств. Сохранённая видимость устройств не меняется.","device_inbox.show_hidden.help.aria":"Подсказка: показывать скрытые устройства на плане","device_inbox.new":"Новое","device_inbox.find":"Найти на плане","device_inbox.edit":"Настроить","device_inbox.hide":"Скрыть","device_inbox.show":"Показать","device_inbox.add":"Добавить","device_inbox.readd":"Добавить заново","device_inbox.hide_available":"Скрыть из списка","device_inbox.show_more":"Показать ещё","device_inbox.more_actions":"Другие действия","device_inbox.find_hidden_hint":"Сначала включите «Показывать скрытые на плане»","device_inbox.show_disabled":"Перед показом активируйте эту привязку в Home Assistant","device_inbox.empty_on_plan":"На плане пока нет подходящих устройств.","device_inbox.empty_available":"Нет доступных устройств для добавления.","device_inbox.empty_hidden":"Скрытых устройств нет.","device_inbox.empty_readd":"Нет удалённых устройств, доступных для повторного добавления.","device_inbox.reason_visible_auto":"Найдено автоматически","device_inbox.reason_visible_explicit":"Добавлено явно","device_inbox.reason_manual_hidden":"Скрыто пользователем","device_inbox.reason_automatic_hidden":"Скрыто автоматически","device_inbox.reason_service_entry":"Служебная запись реестра","device_inbox.reason_excluded_integration":"Исключена интеграция «{integration}»","device_inbox.reason_excluded_domain":"Непространственный тип сущности","device_inbox.reason_grouped_light":"Представлено группой света комнаты","device_inbox.reason_represented_by_parent":"Представлено родительским устройством","device_inbox.reason_removed":"Ранее удалено с плана","device_inbox.reason_available":"Можно добавить на план","device_inbox.reason_no_bound_room":"Зона HA не связана с комнатой плана","device_inbox.status_ha_disabled":"Отключено в Home Assistant","device_inbox.status_orphaned":"Привязка больше не найдена в Home Assistant","device_inbox.status_unverified":"Реестр Home Assistant временно недоступен","device_inbox.saved":"Список устройств обновлён","device_inbox.filters_excluded":"Исключённые интеграции","device_inbox.filters_group_lights":"Объединять светильники комнаты в один маркер","device_inbox.filters_preview_appear":"появится: {count}","device_inbox.filters_preview_hide":"скроется: {count}","device_inbox.filters_preview_lights":"затронет светильников: {count}","device_inbox.filters_reset":"Вернуть рекомендуемые","device_inbox.filters_save":"Сохранить фильтры","device_inbox.filters_search_ph":"Добавить интеграцию…","device_inbox.filters_title":"Фильтры обнаружения","space.roomcard_section":"В карточке комнаты:","space.label_temp":"Температура","space.label_hum":"Влажность","space.label_lqi":"Средний Zigbee-сигнал","space.label_light":"Свет вкл/выкл","roomcard.light_on":"Вкл","roomcard.light_off":"Выкл","roomcard.light_partial":"{on} из {total}","toast.split_pick_inside":"Промежуточные точки разреза — внутри комнаты","mode.decor":"Редактор подложки","decor.select":"Выбрать","decor.line":"Линия","decor.rect":"Прямоугольник","decor.ellipse":"Овал","decor.text":"Надпись","decor.erase":"Стереть","decor.erase_confirm_title":"Стереть объект?","decor.color":"Цвет","decor.width":"Толщина линии","decor.line_style":"Стиль линии","decor.line_style_solid":"Сплошная","decor.line_style_dashed":"Пунктирная","decor.fill":"Заливка","decor.fill_color":"Цвет заливки","decor.length":"Длина","decor.size":"Размер","decor.flip_h":"Отзеркалить по горизонтали","decor.flip_v":"Отзеркалить по вертикали","decor.angle":"Угол поворота, °","decor.text_size":"Размер текста","decor.backdrop_properties":"Свойства картинки-подложки","decor.text_title":"Надпись","decor.object_title":"Редактирование: {kind}","decor.text_label":"Текст","decor.live_group":"Вставить переменную HA","decor.live_entity":"Сущность","decor.live_entity_ph":"выберите сущность","decor.live_attr":"Значение","decor.live_attr_ph":"выберите состояние или атрибут","decor.live_state":"Состояние","decor.backdrop":"Картинка-подложка","decor.backdrop_hint":"Тяните картинку — перемещение; угол — размер; верхнюю ручку — поворот. Shift меняет пропорции или снимает шаг угла.","decor.backdrop_reset":"Вернуть картинку","decor.backdrop_reset_done":"Картинка вернулась на своё место и в свой размер","marker.icon_auto":"Авто: {icon} (по правилам иконок; выберите свою, чтобы заменить)","marker.icon_pin_auto":"Закрепить","mode.plan_tip":"Редактор плана — геометрия дома: рисование и объединение/разделение комнат, привязка к зонам HA, двери, окна и ворота, карточки комнат, масштаб","mode.devices_tip":"Редактор устройств — всё про значки: перетаскивание, клик — настройка привязки/иконки/отображения, виртуальные устройства, правила иконок","mode.decor_tip":"Редактор подложки — чисто визуальный декор под планом: линии, прямоугольники, овалы и надписи, не реагирующие на клики","space.glow_enabled":"Свечение источников света","gs.glow_group":"Свечение источников света","gs.glow_base":"Темнота дома","gs.glow_light":"Цвет света по умолчанию / интенсивность","gs.wall_group":"Стены","gs.wall_fill":"Цвет заливки стен","gs.glow_radius":"Радиус свечения","gs.glow_radius.help":"Задаёт общий радиус светового пятна в метрах или футах; персональный радиус устройства заменяет это значение.","gs.glow_radius.help.aria":"Подсказка: общий радиус свечения","gs.unit_m":"м","gs.unit_ft":"фут","marker.controls_label":"Управляет другими источниками света","marker.controls.help":"При действии «Переключить состояние» перечисленные источники переключаются вместе с этим маркером. Их световые пятна остаются у собственных маркеров, а эта связь сама по себе не делает управляющий маркер источником света.","marker.controls.help.aria":"Подсказка: управление другими источниками света","marker.controls_filter":"Поиск ламп и выключателей…","info.controls":"Управляет","marker.glow_radius_label":"Радиус свечения","marker.glow_radius.help":"Задаёт радиус свечения в метрах или футах; пустое значение использует радиус из общих настроек.","marker.glow_radius.help.aria":"Подсказка: радиус свечения","markup.wallthick":"Толщина","markup.select":"Выбрать","title.markup_wallthick":"Толщина — клик по стене задаёт толщину от 0 до 100 см.","markup.hint_wallthick":"клик по стене · Esc закрывает без применения","wallthick.field":"Толщина","wallthick.unit_cm":"см","wallthick.unit_in":"дюйм","wallthick.apply_room":"Применить ко всем стенам комнаты","markup.draw_wall_title":"Толщина каждого нового сегмента стены (0–100 см). Общие стены сохраняют существующее значение.","room.queue_progress":"Комната {current} из {total}","toast.wall_rooms_saved":"Создано комнат: {n}","toast.wall_chain_saved":"Цепочка стен сохранена","toast.wallthick_pick":"Кликните по стене","toast.wallthick_set":"Толщина стены задана","toast.wallthick_cleared":"Толщина стены убрана","toast.physical_range":"Введите значение от {min} до {max} {unit}","toast.zero_wall_opening_conflict":"Сначала удалите проём на этом участке стены.","toast.zero_wall_ambiguous":"Не удалось однозначно выбрать участок стены. Уточните геометрию узла.","toast.zero_wall_migration_blocked":"Пространство не преобразовано: {reason}. Данные не изменены.","toast.physical_angle":"Введите угол поворота от 0° до 90°, не включая 90°","toast.physical_limit":"В пространстве достигнут лимит объектов этого типа","toast.geometry_unsafe":"Изменение отменено: геометрию стен нельзя безопасно построить.","junction.limit_angle":"Слишком острый угол между стенами: {actual}°, минимум {limit}°.","junction.limit_valence":"Слишком много стен в одном узле: {actual}, максимум {limit}.","junction.limit_length":"Слишком короткий участок стены: {actual} см, минимум {limit} см.","junction.limit_distance":"Стены и узлы слишком близко: {actual} см, минимум {limit} см.","junction.limit_clearance":"Внутри комнаты не остаётся места: {actual} см², минимум {limit} см².","junction.limit_check_failed":"Проверку стыков выполнить не удалось — изменение не сохранено","toast.wall_model_migration_blocked":"Не удалось обновить модель стен: {reason}. План не изменён. Запустите «Оптимизировать планы»; если ошибка повторится, исправьте конфликтующую геометрию стен.","toast.wall_model_client_outdated":"Обновите карточку и перезагрузите страницу перед редактированием плана.","wall_model.reason.invalid-room":"некорректный контур комнаты","wall_model.reason.zero-length":"отрезок стены нулевой длины","wall_model.reason.third-owner":"стена принадлежит более чем двум комнатам","wall_model.reason.duplicate-id":"конфликт идентификаторов стен","wall_model.reason.thickness-conflict":"конфликт значений толщины стены","wall_model.reason.opening-host":"проём нельзя однозначно привязать к стене","toast.delete_room_pick":"Кликните внутри комнаты, которую нужно удалить","toast.plan_snap_ambiguous":"Увеличьте масштаб, чтобы выбрать узел стены","toast.wall_repair_ambiguous":"У контура несколько возможных соединений. Увеличьте масштаб и соедините стены явно.","toast.wall_repair_too_large":"Разрыв больше 2 см. Соедините стены перед созданием комнаты.","toast.wall_repair_changed":"Геометрия стен изменилась. Попробуйте создать комнату ещё раз.","toast.opening_on_zero_wall":"Проёмы на стене нулевой толщины запрещены","marker.from_ha_option":"Выбрать из списка HA","marker.show_entities":"Показывать сущности","marker.show_entities_tip":"Добавляет в список не только устройства, но и все их сущности","marker.pick_ph":"Выберите устройство…","room.open_area":"Открыть зону в HA","room.fit_action":"Вписать комнату {name}","view.volumetric":"Объёмный вид","view.flat":"Плоский вид","kiosk.title":"Размеры на этом экране","kiosk.hint":"Хранится только на этом устройстве — у каждого настенного планшета или ТВ свои удобные размеры.","kiosk.icon_scale":"Размер значков устройств","kiosk.font_scale":"Размер текста карточек комнат","editor.kiosk":"Режим настенного устройства (киоск)","editor.cycle":"Автосмена пространств каждые N секунд (киоск, 0 = выкл)","room.settings_title":"Настройки комнаты","room.settings_section":"Настройки комнаты (переопределяют пространство)","room.fill_label":"Заливка в ЭТОЙ комнате","fill.inherit":"Как у пространства","room.custom_fill_space":"Цвет пространства","room.custom_fill_own":"Цвет комнаты","room.temp_range_label":"Диапазон комфорта","room.temp_range_min":"Нижняя граница комфортной температуры","room.temp_range_max":"Верхняя граница комфортной температуры","room.temp_range_reset":"Как у пространства","room.temp_range.help":"Диапазон применяется только к этой комнате. Пустое поле наследует соответствующую границу пространства; если границы поменялись местами, House Plan использует меньшую как нижнюю, а большую как верхнюю.","room.temp_range.help.aria":"О диапазоне комфорта комнаты","room.temp_src_label":"Источник температуры","room.hum_src_label":"Источник влажности","room.src_average":"Средняя по датчикам комнаты (по умолчанию)","room.src_pick":"Конкретное устройство или сущность HA","room.src_ph":"Выберите источник…","toast.room_updated":"Комната обновлена","space.card_font":"Размер шрифта карточек комнат (всё пространство)","room.sizes_section":"Размеры шрифтов","room.name_scale":"Размер названия","room.label_scale":"Размер подписей","preview.room_name":"Гостиная","toast.cfg_reload_failed":"Не удалось перечитать план с сервера: {err}","toast.locale_load_failed":"Не удалось загрузить языковой пакет. До перезагрузки страницы используется английский.","toast.furniture_art_load_failed":"Не удалось загрузить изображения мебели. Обновите страницу, чтобы их показать.","room.settings_short":"Настройки комнаты","room.unnamed":"Комната без имени","marker.use_climate_temp":"Учитывать температуру устройства в комнате","marker.use_climate_temp_tip":"Добавляет current_temperature кондиционера или термостата в среднюю температуру комнаты. Внешний бейдж со значением настраивается отдельно ниже.","marker.value_badge_title":"Бейдж со значением","marker.value_badge.help":"Показывает одно выбранное значение рядом со значком. Не влияет на комнатные показатели, свет, Glow и действие по нажатию.","marker.value_badge.help.aria":"Подсказка: бейдж со значением устройства","marker.value_badge_enabled":"Отображать бейдж со значением","marker.value_badge_source":"Значение","marker.value_badge_source.help":"Выберите конкретное состояние, поддерживаемый атрибут или производное значение этого устройства.","marker.value_badge_source.help.aria":"Подсказка: источник значения бейджа","marker.value_badge_position":"Расположение","marker.value_badge_position.help":"Выбранная сторона сохраняется постоянно и не переворачивается автоматически у края плана.","marker.value_badge_position.help.aria":"Подсказка: расположение бейджа","marker.value_badge_right":"Справа","marker.value_badge_bottom":"Снизу","marker.value_badge_left":"Слева","marker.value_badge_top":"Сверху","marker.value_badge_empty":"У этого устройства нет доступных значений","marker.value_badge_static":"Статичный значок не показывает живые значения. Настройка сохранится.","marker.value_badge_missing":"Источник недоступен","marker.value_badge_missing_hint":"Сохранённый источник сейчас недоступен. Можно сохранить его, отключить бейдж или выбрать другой.","marker.value_badge_duplicate":"То же значение уже показано внутри значка.","marker.value_badge_state":"Состояние · {name}","marker.value_badge_marker_state":"Состояние источника света · {name}","marker.value_badge_lqi":"Качество Zigbee-сигнала (среднее)","marker.value_badge_attr_current_temperature":"Текущая температура · {name}","marker.value_badge_attr_temperature":"Целевая температура · {name}","marker.value_badge_attr_current_humidity":"Текущая влажность · {name}","marker.value_badge_attr_humidity":"Влажность · {name}","marker.value_badge_attr_current_position":"Положение · {name}","marker.value_badge_attr_percentage":"Скорость · {name}","marker.value_badge_attr_brightness":"Яркость · {name}","marker.value_badge_attr_volume_level":"Громкость · {name}","marker.value_badge_attr_battery_level":"Заряд батареи · {name}","marker.value_badge_attr_fan_speed":"Скорость вентилятора · {name}","marker.value_source":"Источник значения","marker.value_source.help":"Выберите, что заменит значок. Действие по нажатию не изменится.","marker.value_source.help.aria":"Подсказка: источник значения внутри значка","marker.value_source_auto":"Автоматически (как раньше)","marker.value_source_missing_hint":"Сохранённый источник сейчас недоступен. До его восстановления или выбора другого значения внутри будет показано —.","marker.light_role_label":"Является источником света","marker.light_role.help":"«Авто» использует фактическую роль привязанного устройства, «Всегда» принудительно создаёт собственный источник, а «Никогда» исключает его; связанные лампы выше остаются независимыми.","marker.light_role.help.aria":"Подсказка: является ли устройство источником света","marker.light_role_auto_yes":"Автоматически (источник света)","marker.light_role_auto_no":"Автоматически (не источник света)","marker.light_role_always":"Всегда источник света","marker.light_role_never":"Никогда не источник света","marker.light_entity_label":"Ведущая сущность света","marker.light_entity.help":"Для составного устройства выберите сущность, состояние, цвет и яркость которой представляют этот источник на плане. Автоматический вариант сохраняет совместимость со старыми планами.","marker.light_entity.help.aria":"Подсказка: ведущая сущность света","marker.light_entity_auto":"Автоматически ({entity})","marker.light_entity_none":"нет управляемой сущности","marker.light_entity_missing":"Сохранённая сущность {entity} недоступна. Временно используется {fallback}; выбор восстановится, если сущность вернётся.","marker.toggle_entity_label":"Переключаемая сущность","marker.toggle_entity.help":"Для составного устройства выберите собственную лампу или переключатель, которой управляет нажатие. Автоматический вариант сохраняет прежние правила цели и не зависит от ведущей сущности света.","marker.toggle_entity.help.aria":"Подсказка: переключаемая сущность","marker.toggle_entity_auto":"Автоматически ({entity})","marker.toggle_entity_none":"нет собственной управляемой сущности","marker.toggle_entity_missing":"Сохранённой сущности {entity} больше нет среди выбираемых каналов этого маркера. Временно используется {fallback}; выбор восстановится, если сущность вернётся.","marker.glow_color_label":"Цвет и яркость свечения","marker.glow_mode.help":"Используйте данные источника, задайте только цвет или зафиксируйте цвет и яркость. Минимум — 1%; чтобы отключить источник, выберите «Никогда».","marker.glow_mode.help.aria":"Подсказка: цвет и яркость свечения","marker.glow_mode_auto":"Из источника","marker.glow_mode_color":"Задать цвет","marker.glow_mode_fixed":"Задать цвет и яркость","marker.glow_color":"Цвет свечения","marker.glow_brightness":"Яркость","marker.glow_disabled_never":"Настройки свечения недоступны: маркер явно исключён из источников света.","marker.glow_disabled_auto":"В автоматическом режиме у этого маркера не найден пространственный источник света.","marker.glow_disabled_no_entity":"Для пространственного источника нет активной управляемой сущности Home Assistant.","marker.glow_passive_hint":"У источника нет собственных данных Home Assistant. Задайте цвет и яркость вручную; радиус остаётся доступным.","marker.control_broken":"Сохранённый источник отсутствует или больше не отмечен как источник света","marker.control_missing_label":"Отсутствующий источник на плане","marker.control_passive":"пассивный источник","toast.marker_control_cycle":"Такая связь создаст циклическую цепочку управления светом.","toast.marker_binding_required":"Сначала выберите устройство Home Assistant, затем добавьте управляемый источник света.","confirm.unlock_title":"Открыть замок?","confirm.unlock_body":"House Plan отправит этому замку команду открытия.","toast.files_migrate_failed":"Не удалось перенести вложения к новой привязке, ссылки остались на старые файлы: {err}","space.pick_saved":"Уже загруженные","space.pick_saved_hint":"Планы, сохранённые на сервере, включая отцеплённые ранее","space.no_saved":"На сервере пока нет сохранённых планов.","space.loading":"Загрузка…","space.used_by":"используется: {list}","space.in_use":"План используется пространством — сначала отцепите его","btn.use":"Выбрать","confirm.delete_plan_title":"Удалить файл плана?","confirm.delete_plan_body":"Файл будет удалён с сервера. Это действие нельзя отменить.","toast.plans_list_failed":"Не удалось получить список планов: {err}","toast.plan_delete_failed":"Не удалось удалить план: {err}","marker.hide":"Скрыть","marker.hide_tip":"Устройство исчезнет с плана после сохранения, но продолжит участвовать в расчёте сигнала комнаты. Вернуть его можно через каталог «Устройства» в редакторе устройств.","marker.show":"Показать","marker.show_tip":"Устройство снова появится на плане после сохранения.","marker.hidden_ghost":"Устройство скрыто пользователем","marker.ha_disabled_device":"Устройство деактивировано в Home Assistant и скрыто с плана.","marker.ha_disabled_entity":"Сущность деактивирована в Home Assistant и скрыта с плана.","marker.ha_disabled_all_entities":"У устройства нет активных сущностей Home Assistant, поэтому оно скрыто с плана.","marker.ha_registry_limited":"Полный реестр Home Assistant недоступен этому пользователю. Неподтверждённый объект временно нельзя показывать или использовать.","marker.delete_tip":"Полностью удалить устройство с плана и из всех расчётов. Позже его можно добавить заново.","tap.run":"Запустить автоматизацию/скрипт/сцену","tap.none":"Ничего не делать","marker.run_target_label":"Что запускать","marker.run_search_ph":"Поиск: автоматизация, скрипт или сцена…","marker.run_target_gone":"Цель {id} не найдена — выберите заново","marker.tap_confirm":"Спрашивать подтверждение","marker.tap_confirm_tip":"Перед выполнением показать диалог подтверждения — защита от случайных нажатий.","marker.toggle_hint_single":"Цель: {name} ({id}).","marker.virtual_light_target":"Виртуальный свет: {name}.","marker.virtual_light_current":"Ручное состояние: {state} → {effect}.","marker.virtual_light_state_on":"включён","marker.virtual_light_state_off":"выключен","marker.toggle_hint_group":"Переключатся источники ({count}): {names}.","marker.toggle_hint_current":"Сейчас: {state} → {effect}.","marker.toggle_hint_group_current":"Сейчас включено {on} из {count} → {effect}.","marker.toggle_hint_skipped":"Не будут затронуты ({count}): {targets}.","marker.toggle_effect_turn_on":"включится","marker.toggle_effect_turn_off":"выключится","marker.toggle_effect_open":"откроется","marker.toggle_effect_close":"закроется","marker.toggle_effect_stop":"остановится","marker.toggle_effect_toggle":"состояние переключится","marker.toggle_skip_missing":"не найдено","marker.toggle_skip_ha_disabled":"деактивировано в HA","marker.toggle_skip_unavailable":"недоступно","marker.toggle_skip_unsupported":"переключение не поддерживается","marker.toggle_skip_secure":"заблокировано из соображений безопасности","marker.toggle_none_no_binding":"У устройства нет привязки, состояние переключать нечем. По нажатию ничего не произойдёт.","marker.toggle_none_no_actionable_entity":"У устройства нет состояния, которое можно переключить. По нажатию ничего не произойдёт.","marker.toggle_none_configured_targets_missing":"Настроенные цели сейчас недоступны. Собственная сущность устройства не будет подставлена вместо них.","marker.toggle_none_ha_disabled":"Цель деактивирована в Home Assistant и не может использоваться на плане.","marker.toggle_none_unavailable":"Цель сейчас недоступна. По нажатию ничего не произойдёт.","marker.toggle_none_unsupported":"Для этой сущности Home Assistant не предоставляет безопасного переключения. По нажатию ничего не произойдёт.","marker.toggle_none_secure":"Переключение замков, сигнализации и защитных ворот с плана заблокировано из соображений безопасности.","run.automation":"автоматизация","run.script":"скрипт","run.scene":"сцена","confirm.tap_run":"Запустить «{name}»?","confirm.tap_toggle":"Переключить «{name}»?","confirm.current_state":"Текущее состояние: {state}","confirm.expected_state":"После переключения: {state}","confirm.group_current":"включено {on} из {total}","confirm.group_all_on":"все включены","confirm.group_all_off":"все выключены","confirm.unavailable_targets":"Недоступно: {count}","confirm.expected_by_ha":"Состояние определит Home Assistant","confirm.state_on":"Включено","confirm.state_off":"Выключено","confirm.state_open":"Открыто","confirm.state_closed":"Закрыто","confirm.state_opening":"Открывается","confirm.state_closing":"Закрывается","confirm.state_stopped":"Остановлено","confirm.state_unknown":"Неизвестно","toast.run_started":"Запущено: {name}","toast.run_target_missing":"Цель запуска не найдена — проверьте настройки устройства","toast.run_target_required":"Выберите автоматизацию, скрипт или сцену","toast.tap_target_changed":"Цель действия изменилась. Повторите попытку.","toast.virtual_light_toggle_failed":"Не удалось переключить виртуальный свет: {err}","toast.value_badge_source_required":"Выберите значение для бейджа","btn.run":"Выполнить","vac.section":"Робот-пылесос: живая позиция","vac.autocal":"Настроить автоматически","vac.live":"Живая позиция на плане","vac.trail":"Показывать путь робота","vac.autocal_no_rooms":"Интеграция не отдаёт список комнат — откройте «Подогнать вручную»","vac.route_warn_unmapped":"Робот убирает на карте, которая не сопоставлена ни одному этажу","vac.route_warn_needs_calibration":"Карта сопоставлена этажу, но не откалибрована","vac.route_warn_ambiguous":"Две карты неразличимы — этаж не выбран","vac.route_warn_missing_space":"Пространство этой карты удалено","vac.autocal_no_match":"Не совпали имена комнат (нужно ≥3 общих) — откройте «Подогнать вручную»","vac.autocal_done":"Готово: привязка по {rooms} комнатам. Запустите уборку и проверьте","vac.cal_need_pos":"Робот сейчас не отдаёт координаты — запустите уборку и поставьте на паузу","vac.cal_done":"Калибровка сохранена. Запустите уборку и проверьте","vac.cal_cancelled":"Калибровка отменена","vac.fit":"Подогнать вручную","vac.fit_hint":"Перетащите карту робота на место, растяните за уголки","vac.fit_rotate":"Повернуть 90°","vac.fit_mirror":"Отразить","vac.trail_never":"Не показывать никогда","vac.trail_cleaning":"Во время уборки","vac.trail_always":"Показывать всегда","gs.bg_group":"Фон сцены","gs.bg_color":"Цвет фона вокруг плана","gs.bg_default":"Как в теме","gs.bg_theme":"по умолчанию — из темы","gs.bg_mode":"Фон плана","gs.bg_mode.help":"«Следует за Солнцем» использует sun.sun, а при недоступности — локальные часы браузера; статичный режим всегда показывает выбранный цвет.","gs.bg_mode.help.aria":"Подсказка: общий фон плана","gs.bg_static":"Статичный цвет","gs.bg_daynight":"Следует за Солнцем","gs.sun_group":"Солнце","gs.sun_missing":"Сущность sun.sun не найдена — фон следует локальным часам, а оконные лучи недоступны.","gs.north":"Север на плане","gs.north.help":"Угол отсчитывается по часовой стрелке от верхней вертикали плана; север нужен для оконных лучей, а не для фона «Следует за Солнцем».","gs.north.help.aria":"Подсказка: общее направление севера","gs.north_ph":"не задан","gs.north_clear":"Сбросить","gs.north_letter":"С","gs.sun_rays":"Солнце в окнах","gs.sun_ray_origin":"Лучи солнца","gs.sun_ray_origin.inner":"От внутренних углов окон","gs.sun_ray_origin.outer":"От внешних углов окон","gs.about_version":"Houseplan Card v{v}","gs.about_github":"GitHub · документация и issues","gs.about_telegram":"Чат в Telegram","support.title":"Помощь и обратная связь","space.bg_color":"Цвет фона вокруг плана","space.bg_inherit":"Наследовать общий","space.bg_inherited":"наследуется из общих настроек","space.bg_mode":"Фон плана","space.bg_mode.help":"Выберите наследование общего фона либо переопределите это пространство статичным цветом или режимом «Следует за Солнцем».","space.bg_mode.help.aria":"Подсказка: фон пространства","space.north":"Север на плане (переопределение)","space.north.help":"Переопределяет общий север для этого пространства; угол отсчитывается по часовой стрелке от верхней вертикали плана и используется оконными лучами.","space.north.help.aria":"Подсказка: север для пространства","space.north_inherited":"наследуется: {v}","space.sun_rays":"Солнце в окнах","space.sun_inherit":"Наследовать общий","space.sun_on":"Вкл","space.sun_off":"Выкл","canvas.far_objects":"Объектов далеко от плана: {n}","canvas.show_far":"Показать","canvas.home_tip":"План там — нажмите, чтобы вписать","gs.grid_group":"Обслуживание планов","gs.grid_hint":"Обновляет модели данных, выравнивает элементы по сетке и объединяет лишние фрагменты стен. Перед записью будет показан точный отчёт.","gs.align_all":"Оптимизировать планы","gs.align_title":"Оптимизировать планы","gs.align_none":"Все планы уже используют актуальную и оптимальную модель данных.","gs.optimize_no_automatic_changes":"Автоматических изменений нет. Проверьте пункты ниже.","gs.align_count":"Сдвинется элементов: {n} из {total}, максимум на {cm} см.","gs.align_where":"Наибольший сдвиг — в пространстве «{s}».","gs.align_turned":"Проёмов с исправлением угла: {n}.","gs.align_preflight_failed":"Не удалось безопасно проверить геометрию следующих пространств: {spaces}{more}.","gs.align_preflight_hint":"Планы не изменены. Скопируйте диагностику кнопкой ниже и приложите её к отчёту об ошибке вместе с экспортом пространства.","gs.preflight_reason_prepare-exception":"Не удалось подготовить геометрию пространства (исключение при сборке модели)","gs.preflight_reason_wall-null":"Тело стен не построилось (объединение вернуло пустоту)","gs.preflight_reason_wall-degraded-extra":"Тело стен деградировало с лишней геометрией","gs.preflight_reason_wall-failed-core":"Ядро тела стен не собралось","gs.preflight_reason_wall-exception":"Построение стен упало с исключением","gs.preflight_reason_floor-null":"Контур пола не построился","gs.preflight_reason_floor-exception":"Построение пола упало с исключением","gs.preflight_copy":"Скопировать диагностику","gs.preflight_copied":"Диагностика скопирована","gs.preflight_update_hint":"Версии карточки и интеграции различаются — обновите House Plan и повторите.","gs.align_preflight_space":"Пространство {n}","gs.align_preflight_more":" и ещё {n}","gs.optimize_changes":"Миграций модели: {m}; обновлено пространств: {c}; устранён шум координат: {p}; объединено отрезков реальных стен: {w}; объединено отрезков стен нулевой толщины: {s}; независимых: {i}.","gs.zero_walls_migrated":"Преобразовано виртуальных участков: {n}.","gs.wall_segments_migrated":"Стабилизировано сегментов стен: {n}.","gs.room_drafts_migrated":"Незавершённые контуры преобразованы в обычные стены: {drafts}; отрезков: {segments}.","gs.optimize_lattice_summary":"Канонизировано шумовых значений координат: {n}; максимальный сдвиг: {cm} см.","gs.optimize_lattice_space":"{space}: канонизировано значений координат: {n}; оставлено значений вне сетки: {far}.","gs.optimize_coincident_partitions":"Скрытые участки независимых стен поглощены стенами комнат: {n}.","gs.optimize_openings_rehosted":"Проёмы перепривязаны к стенам комнат: {n}.","gs.optimize_walls_straightened":"Выпрямлено стен: {n}; максимальное перемещение: {cm} см.","gs.optimize_walls_straightened_where":"Максимальная правка стены: {s}.","gs.optimize_walls_straighten_skipped":"Оставлено почти осевых стен, которые нельзя безопасно выпрямить: {n}.","gs.optimize_glow_migration":"Старый Glow: пространств — {spaces} → без заливки данных + независимый Glow; комнат — {rooms} → наследуемая заливка + независимый Glow.","gs.optimize_references":"Исправлено ссылок: пространства — {spaces}; комнаты — {rooms}; позиции — {positions}; устройств отвязано от отсутствующих пространств — {detached}.","gs.optimize_reference_more":", и ещё {n}","gs.optimize_orphans_removed":"Убрано забытых записей: {total} — подписи комнат: {rooms}; устройства: {devices}; групповые метки: {groups}. Все они принадлежали пространствам, удалённым ранее.","gs.optimize_live_positions":"Старые позиции в удалённых пространствах принадлежат существующим объектам: {n}{names}. Они будут сохранены.","gs.optimize_live_positions_remove":"Старые позиции в удалённых пространствах принадлежат существующим объектам: {n}{names}. Они выбраны для удаления.","gs.optimize_live_names":": {names}{more}","gs.optimize_live_remove":"Убрать старые позиции","gs.optimize_live_keep":"Сохранить старые позиции","gs.optimize_live_selected":"Старые позиции будут убраны после применения оптимизации.","gs.optimize_unverified":"Не удалось безопасно проверить позиций: {n}. Они оставлены без изменений.","gs.optimize_registry_limited":"Для безопасной проверки нужен полный доступ администратора к реестрам Home Assistant.","gs.optimize_vacuum_warning":"Сопоставления комнат пылесоса требуют проверки: {n}.","gs.optimize_details":"Подробности","gs.optimize_details_more":"И ещё записей: {n}.","gs.optimize_detail_removed":"будет удалено","gs.optimize_detail_live":"будет сохранено","gs.optimize_detail_unverified":"не проверено","gs.optimize_detail_room_label":"подпись комнаты","gs.optimize_detail_device":"устройство","gs.optimize_detail_group":"групповая метка","gs.optimize_detail_unknown":"неизвестный владелец","gs.optimize_detail_item":"{status}: {kind} {id}; прежнее пространство {space}","gs.align_warn":"Элементы, намеренно поставленные между узлами, будут сдвинуты. После операции доступна одна отмена — только до следующего изменения плана.","gs.align_run":"Оптимизировать","gs.align_done":"Планы оптимизированы: сдвинуто элементов — {n}, обслужено записей — {m}, исправлено ссылок — {r}","gs.optimize_undo":"Отменить последнюю оптимизацию","gs.optimize_undone":"Последняя оптимизация отменена","decor.furniture":"Мебель","decor.image":"Изображение","decor.image_title":"Свои изображения","decor.image_upload":"Загрузить изображение","decor.image_replace":"Заменить изображение","decor.image_uploading":"Загрузка…","decor.image_asset":"Файл изображения","decor.image_pick_hint":"Загрузите изображение или выберите уже используемое в House Plan.","decor.image_place_hint":"Кликните по плану, чтобы разместить изображение.","decor.image_none":"Загруженных изображений пока нет.","decor.image_unavailable":"Изображение недоступно","decor.image_used":"Используется в объектах: {n}","decor.image_upload_failed":"Не удалось загрузить изображение: {err}","decor.image_error_capacity":"Хранилище пользовательских изображений заполнено.","decor.image_in_use":"Перед удалением файла удалите все размещённые копии.","decor.image_delete_title":"Удалить файл изображения?","decor.image_delete_message":"Удалить «{name}» из House Plan? Это действие нельзя отменить.","furn.title":"Библиотека мебели","furn.symbol":"Символ","furn.group_furniture":"Мебель","furn.group_appliance":"Техника","furn.group_sanitary":"Сантехника","furn.group_other":"Прочее","furn.width":"Ширина","furn.depth":"Глубина","furn.back_to_categories":"Все категории","furn.pick_hint":"Выберите категорию, затем символ.","furn.place_hint":"Кликните по плану — предмет встанет к ближайшей стене. Shift — свободно.","furn.cat_air_conditioner":"Кондиционеры","furn.cat_armchair":"Кресла","furn.cat_bathtub":"Ванны","furn.cat_bed":"Кровати","furn.cat_bidet":"Биде","furn.cat_boiler":"Бойлеры","furn.cat_chair":"Стулья","furn.cat_coffee_table":"Журнальные столы","furn.cat_cooktop":"Варочные панели","furn.cat_dining_table":"Обеденные столы","furn.cat_dishwasher":"Посудомоечные машины","furn.cat_dryer":"Сушильные машины","furn.cat_fireplace":"Камины","furn.cat_fridge":"Холодильники","furn.cat_kitchen_cabinet":"Кухонные шкафы","furn.cat_kitchen_sink":"Кухонные мойки","furn.cat_nightstand":"Тумбы","furn.cat_plant":"Растения","furn.cat_rug":"Ковры","furn.cat_shelving":"Стеллажи","furn.cat_shower":"Душевые","furn.cat_sink":"Раковины","furn.cat_sofa":"Диваны","furn.cat_stairs":"Лестницы","furn.cat_toilet":"Унитазы","furn.cat_tv":"Телевизоры","furn.cat_wardrobe":"Шкафы","furn.cat_washer":"Стиральные машины","furn.cat_work_table":"Рабочие столы","furn.sym_sofa":"Диван двухместный","furn.sym_sofa_three_seat":"Диван трёхместный","furn.sym_sofa_corner_right":"Угловой диван, правый","furn.sym_armchair":"Кресло мягкое","furn.sym_armchair_office":"Кресло офисное","furn.sym_coffee_table":"Журнальный стол, прямоугольный","furn.sym_coffee_table_round":"Журнальный стол, круглый","furn.sym_coffee_table_oval":"Журнальный стол, овальный","furn.sym_coffee_table_rounded":"Журнальный стол, скруглённый","furn.sym_table_dining":"Обеденный стол, прямоугольный","furn.sym_table_round":"Круглый стол","furn.sym_table_dining_oval":"Обеденный стол, овальный","furn.sym_table_dining_rounded":"Обеденный стол, скруглённый","furn.sym_chair":"Стул","furn.sym_chair_bar":"Барный стул","furn.sym_desk":"Рабочий стол, прямоугольный","furn.sym_desk_corner":"Рабочий стол, угловой","furn.sym_bed_double":"Двуспальная кровать","furn.sym_bed_single":"Односпальная кровать","furn.sym_nightstand":"Тумба прикроватная","furn.sym_cabinet_tv":"Тумба под телевизор","furn.sym_cabinet_shoe":"Тумба для обуви","furn.sym_cabinet_sink":"Тумба под раковину","furn.sym_wardrobe":"Шкаф гардеробный","furn.sym_bookshelf":"Шкаф книжный","furn.sym_wall_unit":"Шкаф-стенка","furn.sym_kitchen_floor":"Кухонный напольный модуль","furn.sym_kitchen_floor_corner":"Кухонный напольный угловой модуль","furn.sym_kitchen_wall":"Кухонный навесной модуль","furn.sym_kitchen_wall_corner":"Кухонный навесной угловой модуль","furn.sym_shelf_floor":"Стеллаж напольный","furn.sym_shelf_wall":"Полка настенная","furn.sym_fridge":"Холодильник","furn.sym_stove":"Варочная панель, 4 конфорки","furn.sym_cooktop_two":"Варочная панель, 2 конфорки","furn.sym_dishwasher":"Посудомоечная машина","furn.sym_washer":"Стиральная машина","furn.sym_dryer":"Сушильная машина","furn.sym_tv":"Телевизор на подставке","furn.sym_tv_wall":"Телевизор на кронштейне","furn.sym_ac":"Кондиционер","furn.sym_water_heater":"Бойлер","furn.sym_toilet":"Унитаз напольный","furn.sym_toilet_built_in":"Унитаз встроенный","furn.sym_bathtub":"Ванна прямоугольная","furn.sym_bathtub_corner":"Ванна угловая","furn.sym_shower":"Душ","furn.sym_sink":"Раковина","furn.sym_kitchen_sink":"Кухонная мойка одинарная","furn.sym_kitchen_sink_double":"Кухонная мойка двойная","furn.sym_bidet":"Биде напольное","furn.sym_bidet_built_in":"Биде встроенное","furn.sym_stairs":"Лестница","furn.sym_fireplace":"Камин","furn.sym_plant":"Растение","furn.sym_rug":"Ковёр","common.yes":"Да","common.no":"Нет","vac.diag_source":"Источник","vac.diag_platform":"Интеграция","vac.diag_status":"Статус","vac.diag_position":"Позиция","vac.diag_rooms":"Комнаты","vac.diag_rooms_value":"{total} · совпало имён: {matched} · {readiness}","vac.autocal_ready":"автокалибровка доступна","vac.autocal_not_ready":"нужно 3 совпавших имени","vac.diag_path":"Путь интеграции","vac.diag_map":"ID карты","vac.source_none":"не выбран","vac.source_status_ok":"Готов","vac.source_status_missing":"Не найден","vac.source_status_disabled":"Деактивирован в Home Assistant","vac.source_status_unavailable":"Недоступен","vac.source_status_unverified":"Нельзя проверить с текущими правами","vac.source_status_unsupported":"Нет данных позиции","vac.source_status_none":"Нет источника","vac.source_banner_missing":"Сохранённый источник больше не существует. Он не заменён автоматически: выберите другой или восстановите его в Home Assistant.","vac.source_banner_disabled":"Сохранённый источник деактивирован в Home Assistant. Активируйте его там или выберите другой.","vac.source_banner_unverified":"Текущих прав Home Assistant недостаточно для проверки источника. Привязка сохранена и не будет заменена автоматически.","vac.choose_source":"Выбрать источник","vac.source_auto":"Автоматически","vac.source_auto_hint":"Использовать совместимую сущность этого устройства","vac.all_cameras":"Все камеры","vac.all_cameras_warn":"Камера может не отдавать данные робота. Выбирайте её только если это карта вашего пылесоса.","vac.all_cameras_empty":"Других сущностей камеры не найдено.","vac.platform_unknown":"интеграция неизвестна","vac.cap_position":"позиция","vac.cap_rooms_short":"комнаты","vac.cap_path":"путь","vac.cap_map":"ID карты","vac.cap_none":"данные робота не обнаружены","vac.xcme_hint":"Включите атрибуты Xiaomi Cloud Map Extractor:","vac.documentation":"Документация","vac.residual_title":"Проверьте автокалибровку","vac.residual_message":"Совпавшие комнаты расходятся максимум на {error}. Примените приблизительную калибровку, подгоните её вручную либо отмените без изменения сохранённых настроек.","vac.apply_proposal":"Применить","gs.backup_group":"Резервная копия и перенос","gs.backup_hint":"Скачайте переносимую JSON-копию или проверьте и импортируйте копию, созданную House Plan.","backup.export_open":"Экспорт","backup.import_open":"Импорт","backup.export_title":"Экспорт House Plan","backup.import_title":"Импорт House Plan","backup.export_hint":"Выберите, должна ли копия содержать всю конфигурацию House Plan или только текущее пространство.","backup.full":"Полная копия","backup.current_space":"Текущее пространство","backup.current_space_title":"Текущее пространство: {title}","backup.no_current_space":"Нет текущего пространства","backup.plan_only":"Только планировка","backup.plan_only_hint":"Сохранить комнаты, стены, проёмы, декор и позиции подписей комнат без устройств и привязок Home Assistant.","backup.plan_only_preview":"Файл содержит только планировку","backup.privacy_warning":"Архив сохраняет названия, идентификаторы Home Assistant и точные координаты. Внутренние планы и вложения указываются ссылками, но не вкладываются; текущие состояния и маршруты пылесосов не включаются.","backup.download":"Скачать JSON","backup.export_done":"Резервная копия скачана","backup.reading":"Проверяем резервную копию…","backup.revalidated":"После предпросмотра план изменился. Сводка обновлена — проверьте её и подтвердите ещё раз.","backup.error.support_invalid_message":"Проверьте сообщение для поддержки и повторите попытку.","backup.error.support_package_too_large":"Обезличенный пакет для поддержки превышает лимит 8 МиБ.","backup.error.support_preview_expired":"Предпросмотр вложения для поддержки истёк или больше недоступен.","backup.error.support_rate_limited":"Запрошено слишком много репортов или предпросмотров. Повторите позже.","backup.error.support_rejected":"Репорт не прошёл проверку службы поддержки.","backup.error.support_unavailable":"Закрытая служба поддержки временно недоступна.","backup.error.unauthorized":"У вас нет прав на экспорт или импорт этого плана.","backup.error.not_ready":"House Plan ещё не готов. Повторите попытку через несколько секунд.","backup.error.too_large":"Размер резервной копии превышает 8 МиБ.","backup.error.invalid_json":"Выбранный файл не является корректным JSON.","backup.error.invalid_format":"Выбранный файл не является резервной копией House Plan.","backup.error.invalid_image":"Изображение повреждено или не соответствует своему формату.","backup.error.unsupported_export_version":"Эта версия формата резервной копии не поддерживается установленной версией.","backup.error.unsupported_image":"Используйте поддерживаемое изображение PNG, JPEG, WebP или SVG.","backup.error.future_model":"Резервная копия создана в более новой версии модели данных House Plan.","backup.error.invalid_config":"Резервная копия содержит некорректную конфигурацию House Plan.","backup.error.wall_model_migration_blocked":"Не удалось безопасно обновить модель стен из резервной копии. Сначала оптимизируйте исходный план и повторите экспорт.","backup.error.invalid_layout":"Резервная копия содержит некорректные позиции объектов.","backup.error.invalid_content":"Резервная копия содержит некорректные или несогласованные ссылки на файлы.","backup.error.space_not_found":"Выбранное пространство больше не существует.","backup.error.capacity_exceeded":"Добавление этой копии превысит ограничения размера плана.","backup.error.preview_expired":"Время предпросмотра истекло. Выберите файл резервной копии заново.","backup.error.preview_owner_mismatch":"Этот предпросмотр принадлежит другому пользователю Home Assistant.","backup.error.conflict":"После предпросмотра план изменился. Проверьте обновлённую сводку.","backup.error.content_confirmation_required":"Подтвердите отсоединение недоступных локальных файлов.","backup.error.commit_failed":"Не удалось безопасно применить копию. Предыдущий план восстановлен или ожидает восстановления.","backup.error.missing_plan":"После предпросмотра исчез связанный файл плана. Проверьте копию ещё раз.","backup.error.missing_content":"После предпросмотра исчез связанный локальный файл. Проверьте копию ещё раз.","backup.error.marker_control_missing":"В резервной копии отсутствует связанный источник света на плане.","backup.error.marker_control_not_light":"Связанная цель больше не отмечена как источник света.","backup.error.marker_control_self":"Источник света не может управлять самим собой.","backup.error.marker_control_cycle":"Резервная копия содержит циклическую цепочку управления светом.","backup.error.duplicate_marker_control":"Резервная копия содержит повторяющуюся связь с источником света.","backup.error.no_backup":"Нет снимка импорта или оптимизации, который можно восстановить.","backup.error.in_use":"Элемент ещё используется","backup.error.invalid_data":"Запрос содержит некорректные данные","backup.error.invalid_light_entity":"Ведущий свет должен быть сущностью light.* или switch.*","backup.error.invalid_marker_control":"Некорректная ссылка управления маркером","backup.error.invalid_name":"Некорректное имя","backup.error.invalid_partition_opening_host":"Проём должен сохранить свою перегородку-носитель","backup.error.invalid_partition_opening_jamb_margin":"Проём не оставляет физического простенка у края стены","backup.error.invalid_passage_fields":"Открытый проход не может нести настройки двери","backup.error.invalid_space_id":"Неизвестное пространство","backup.error.invalid_toggle_entity":"Сущность переключения должна быть light.* или switch.*","backup.error.invalid_value_badge":"Некорректные настройки бейджа значения","backup.error.invalid_value_badge_attribute":"Некорректный атрибут бейджа значения","backup.error.invalid_value_badge_position":"Некорректная позиция бейджа значения","backup.error.invalid_value_badge_source":"Некорректный источник бейджа значения","backup.error.invalid_vacuum_map_route":"Проверьте сопоставление карт робота пространствам.","backup.error.invalid_value_source":"Некорректный источник значения","backup.error.invalid_value_source_attribute":"Некорректный атрибут источника значения","backup.error.io_error":"Файловая операция на сервере не удалась","backup.error.not_toggleable":"Это устройство нельзя переключить","backup.error.nothing_to_repair":"Нечего чинить","backup.error.space_in_use":"На пространство ещё есть ссылки","backup.error.value_badge_source_required":"Бейджу значения нужен источник","backup.error.wall_model_client_outdated":"План обновлён в другом месте — перезагрузите страницу","backup.same_source":"Создано на этом экземпляре Home Assistant","backup.foreign_source":"Создано на другом экземпляре Home Assistant","backup.created":"Создано: {value}","backup.versions":"Карточка {card}; интеграция {integration}; модель данных {model}","backup.count_spaces":"Пространств: {n}","backup.count_rooms":"Комнат: {n}","backup.count_walls":"Стен: {n}","backup.count_openings":"Проёмов: {n}","backup.count_decor":"Объектов декора: {n}","backup.count_markers":"Устройств: {n}","backup.count_layout":"Позиций: {n}","backup.bindings":"Привязки — устройства: {device}, сущности: {entity}, виртуальные: {virtual}; позиций без пространства: {legacy}","backup.binding_status":"Статус на целевом экземпляре — активных: {active}, деактивированных: {disabled}, отсутствующих: {missing}","backup.missing_areas":"На целевом экземпляре отсутствуют зоны: {areas}","backup.dropped_marker_links":"Связи с источниками света вне переносимого пространства пропущены: {n}.","backup.room_drafts_migrated":"Старые незавершённые контуры преобразованы в обычные стены: {drafts}; отрезков: {segments}.","backup.repaired_target_refs":"Существующих ссылок восстановлено этим импортом: {n}.","backup.preserved_unresolved_refs":"Неоднозначные ссылки сохранены без изменений: {n}.","backup.preserved_unresolved_hint":"House Plan ничего не угадывал и не удалял. После импорта запустите «Оптимизировать планы», чтобы проверить оставшиеся ссылки.","backup.import_details":"Подробности восстановления ссылок","backup.import_detail.incoming_remapped":"Ссылок обновлено внутри импортируемой копии: {n}","backup.import_detail.target_repaired":"Существующих ссылок восстановлено: {n}","backup.import_detail.preserved_unresolved":"Неразрешимых ссылок сохранено: {n}","backup.import_detail.collisions":"Конфликтов назначения безопасно сохранено: {n}","backup.import_detail.dropped_links":"Входящих связей пропущено по правилам переноса: {n}","backup.import_detail.bounded_lineages":"Чрезмерно вложенных идентификаторов ограничено: {n}","backup.replace_warning":"Текущая конфигурация и расположение будут заменены. Загруженные файлы не удаляются. Одну отмену можно выполнить до следующего изменения плана.","backup.foreign_bookkeeping":"Служебные списки известных и новых устройств другого экземпляра импортированы не будут.","backup.final_name":"Название нового пространства","backup.target_settings":"Глобальные настройки целевого экземпляра не изменятся.","backup.duplicates":"Уже существующих привязок: {n}","backup.skip":"Пропустить повторяющиеся устройства","backup.virtual_copy":"Добавить безопасные статичные виртуальные копии","backup.content":"Связанное содержимое","backup.decor_images_summary":"Свои изображения: объектов — {objects}, файлов — {assets}; отсутствует файлов — {missing}.","backup.content_available":"доступно локально","backup.content_external":"внешняя ссылка","backup.content_detach_required":"будет отвязано","backup.confirm_detach":"Я понимаю, что недоступные внутренние планы и вложения будут отвязаны от импортируемой конфигурации.","backup.confirm_missing_images":"Я понимаю, что отсутствующие свои изображения останутся восстанавливаемыми заглушками, а остальные недоступные локальные файлы будут отвязаны.","backup.replace":"Заменить","backup.add":"Добавить пространство","backup.space_done":"Пространство импортировано: комнат — {rooms}, устройств — {markers}, существующих ссылок восстановлено — {refs}","backup.full_done":"Копия восстановлена: пространств — {spaces}, комнат — {rooms}, устройств — {markers}","backup.undo_import":"Отменить последний полный импорт","backup.import_undone":"Полный импорт отменён","backdrop.large_title":"Большое изображение","backdrop.large_body":"Изображение {w}×{h} ({fileMb} МБ), для показа потребуется около {decodedMb} МБ памяти. На планшетах это может привести к падению страницы.","backdrop.unknown_body":"Не удалось прочитать размеры изображения — файл может быть повреждён. Продолжение может привести к падению страницы на планшете.","backdrop.reduced_dimensions":"Уменьшенная копия: {w}×{h} px.","backdrop.use_downscaled":"Загрузить уменьшенную копию","backdrop.reducing":"Уменьшаем…","backdrop.keep_original":"Оставить оригинал","backdrop.too_large_title":"Изображение слишком большое","backdrop.too_large_body":"Изображение превышает возможности браузера ({w}×{h}, предел {limit} px по стороне). Уменьшите его в редакторе на компьютере и загрузите снова.","backdrop.downscale_failed":"Не удалось создать уменьшенную копию. Текущий план не изменён."}},{code:"de",nativeLabel:"Deutsch",loadDictionary:async function(e){const t=0===e?await import("./de-JnsB57l8.js"):await import(new URL("./de-JnsB57l8.js?retry",import.meta.url).href);return{dictionary:t.dictionary,fingerprint:t.fingerprint}}},{code:"fr",nativeLabel:"Français",loadDictionary:async function(e){const t=0===e?await import("./fr-BAV7hmLH.js"):await import(new URL("./fr-BAV7hmLH.js?retry",import.meta.url).href);return{dictionary:t.dictionary,fingerprint:t.fingerprint}}}],fp=dp,vp=new Set;const yp=new class{constructor(e,t,i=console.warn,n){this.entries=e,this.expectedFingerprint=t,this.warn=i,this.loadFailed=n,this.dictionaries=new Map,this.pending=new Map,this.failed=new Set;for(const t of e)t.dictionary&&this.dictionaries.set(t.code,t.dictionary)}state(e){return this.dictionaries.has(e)?"ready":this.failed.has(e)?"fallback":"pending"}dictionary(e){return this.dictionaries.get(e)}ensure(e){if("pending"!==this.state(e))return Promise.resolve();const t=this.pending.get(e);if(t)return t;const i=this.entries.find(t=>t.code===e),n=this.load(i).finally(()=>this.pending.delete(e));return this.pending.set(e,n),n}async load(e){if(!e?.loadDictionary)return void(e&&this.failed.add(e.code));let t;for(const i of[0,1])try{const t=await e.loadDictionary(i);if(t.fingerprint!==this.expectedFingerprint)throw new Error(`locale fingerprint mismatch for ${e.code}`);return this.dictionaries.set(e.code,t.dictionary),void this.failed.delete(e.code)}catch(e){t=e}this.failed.add(e.code),this.warn(`[houseplan] unable to load ${e.code} locale; using English`,t),this.loadFailed?.(e.code)}}(gp,"34d1dbfc181acaf58842dfced0e6aa3a899aef6b8d1eeba53732ef729a63137e",console.warn,function(e){for(const t of vp)t(e)});function bp(e){const t=xp(e)?.code??"en";return yp.dictionary(t)??fp}function wp(e){return"string"==typeof e?e.trim().replaceAll("_","-").toLowerCase():""}const kp=new Map(gp.map(e=>[wp(e.code),e]));function xp(e){return kp.get(wp(e))}function Sp(e,t){const i=[{value:"",label:e},...gp.map(({code:e,nativeLabel:t})=>({value:e,label:t}))],n="string"==typeof t?t:"";return n&&!i.some(e=>e.value===n)&&i.push({value:n,label:xp(n)?.nativeLabel??n}),i}function $p(e,t){return function(e,t,i,n){const r=new Map(i.map(e=>[wp(e),e])),o=r.get(wp(e));if(o)return o;const s=wp(t),a=r.get(s);return a||(r.get(s.split("-")[0]||"")??n)}(t,e?.locale?.language||e?.language,gp.map(({code:e})=>e),"en")}function Mp(e,t,i){return on(bp(e)[t]??fp[t]??t,i)}function Rp(e,t){const i=bp(e)[t]??fp[t];return"string"==typeof i&&i.trim().length>0}function Cp(e,t,i,n){return{ox:0,oy:0}}function Tp(e,t){const i=(e.angle+90)*Math.PI/180,n=Wa(16,t),r=e.gateFace?-n*e.gateFace.side:n*(e.flipV?-1:1);return[[e.x+Math.cos(i)*r,e.y+Math.sin(i)*r],r<0]}function Dp(e){const t=e.length/2,i=e.face.cm>0?e.face.cm/e.cellCm*e.gridPitch/2:Wa(4,e.cellCm),n="gate"===e.type?Math.sin(10*Math.PI/180)*t:0;return{half:t,jambHalf:i,gateDepth:n,outlineHalf:Math.max(Wa(16,e.cellCm),i+Wa(8,e.cellCm),n+Wa(8,e.cellCm)),hitHalf:Math.max(Wa(20,e.cellCm),i+Wa(10,e.cellCm),n+Wa(12,e.cellCm))}}function Ap(e,t,i){e.minX=Math.min(e.minX,t),e.minY=Math.min(e.minY,i),e.maxX=Math.max(e.maxX,t),e.maxY=Math.max(e.maxY,i)}function Pp(e,t,i,n,r,o,s,a){const l=Math.min(s,a)*Math.PI/180,c=Math.max(s,a)*Math.PI/180,h=(e,t)=>{const i=Math.atan2(t,e),n=[l,c];for(let e=-3;e<=3;e++){const t=e*Math.PI-i,r=Math.PI/2+e*Math.PI-i;t>l&&tl&&r0&&[e.length,e.angle,t[0],t[1]].every(Number.isFinite)))return null;const{half:i,jambHalf:n}=Dp(e),r=ja(e.cellCm),o=1.75*r,s=1.25*r,a=.75*r,l={minX:-i-s,minY:-n-s,maxX:i+s,maxY:n+s},c={minX:1/0,minY:1/0,maxX:-1/0,maxY:-1/0};if("window"===e.type)Pp(c,-i,0,i,-o,o,-90,0),Pp(c,i,-i,0,-o,o,0,90),Ap(c,-i-a,-i-a),Ap(c,i+a,a);else if("gate"===e.type){const t=10*e.face.side;Pp(c,-i,0,i,-o,o,0,t),Pp(c,i,-i,0,-o,o,-t,0)}else Pp(c,-i,0,e.length,-o,o,-90,0),Ap(c,-i-a,-e.length-a),Ap(c,i+a,a);const[h,d]=Fp(e),u={...l};Ap(u,c.minX+h,c.minY+d),Ap(u,c.maxX+h,c.maxY+d);const p=e.flipH?-1:1,_="gate"===e.type?1:e.flipV?-1:1,m=e.angle*Math.PI/180,g=Math.cos(m),f=Math.sin(m),v={minX:1/0,minY:1/0,maxX:-1/0,maxY:-1/0};for(const e of[u.minX,u.maxX])for(const i of[u.minY,u.maxY]){const n=e*p,r=i*_;Ap(v,t[0]+n*g-r*f,t[1]+n*f+r*g)}return v}function Ip(e){if("passage"===e.type)return W``;const t=Math.max(0,Math.min(1,e.amount)),{half:i,jambHalf:n}=Dp(e),r=ja(e.cellCm),o=1.75*r,s=e.flipH?-1:1,a=e.flipV?-1:1,l="gate"===e.type?1:a,[c,h]=Fp(e);let d;if("window"===e.type){const o=Math.PI/2*i,s=e.face.cm>0?W``)}`}const Cr={color:"#607d8b",opacity:1,widthCm:3.6,fill:!1,fillColor:"#607d8b",fillOpacity:.25},Tr=(e,t=1)=>{const i=Number(e);return Number.isFinite(i)?Math.min(1,Math.max(0,i)):t},Dr=e=>{let t=Number(e);return Number.isFinite(t)?(t=(t%360+360)%360,t>180?t-360:t):0};function Ar(e,t,i){return Dr(t)?[e.x,e.y]:i([e.x,e.y])}function Pr(e,t,i,n){const r=Math.abs(i[0]-t[0]),o=Math.abs(i[1]-t[1]);return"line"===e?Math.hypot(r,o)>=n:r>=n&&o>=n}const Fr=(e,t,i)=>{const n=Number(e),r=Number.isFinite(t)&&t>0?t:5;return Number.isFinite(n)&&n>0?n/r*i:0},zr=(e,t,i)=>{const n=Number(e),r=Number.isFinite(t)&&t>0?t:5;return Number.isFinite(n)&&i>0?n/i*r:0},Ir=(e,t,i,n=Cr.widthCm)=>{const r=Number(e?.width_cm);if(Number.isFinite(r)&&r>0)return r;const o=Number(e?.width);return Number.isFinite(o)&&o>0?zr(o,t,i):n};function Or(e){const t=Cr;return e.color===t.color&&e.opacity===t.opacity&&e.widthCm===t.widthCm&&e.fill===t.fill&&e.fillColor===t.fillColor&&e.fillOpacity===t.fillOpacity?null:{color:e.color,opacity:Tr(e.opacity),width_cm:Math.max(.1,Math.min(100,Number(e.widthCm)||.1)),fill:!!e.fill,fill_color:e.fillColor,fill_opacity:Tr(e.fillOpacity,.25)}}function Er(e,t){return{color:e.color,opacity:Tr(e.opacity),width_cm:Math.max(.1,Math.min(100,Number(e.widthCm)||.1)),...t?{fill:e.fill,fill_color:e.fillColor,fill_opacity:Tr(e.fillOpacity,.25)}:{}}}function Nr(e){const t=e.x+e.w/2,i=e.y+e.h/2,n=Dr(e.angle)*Math.PI/180,r=Math.cos(n),o=Math.sin(n),s=(e,n)=>{const s=e-t,a=n-i;return[t+s*r-a*o,i+s*o+a*r]};return[s(e.x,e.y),s(e.x+e.w,e.y),s(e.x+e.w,e.y+e.h),s(e.x,e.y+e.h)]}function Hr(e){const t=Nr(e),i=(e,t)=>[(e[0]+t[0])/2,(e[1]+t[1])/2],n=[(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]),n],segments:t.map((e,i)=>({a:e,b:t[(i+1)%4]}))}}function Lr(e,t,i,n,r,o,s,a){const l=Dr(e.angle)*Math.PI/180,c=Math.cos(l),h=Math.sin(l),d=-Math.sin(l),u=Math.cos(l),p=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=p+m*c+g*d,v=_+m*h+g*u,y=n-f,b=r-v;let w=(y*c+b*h)*(t>0?1:-1),k=(y*d+b*u)*(i>0?1:-1),x=null;if(o){const t=w/Math.max(e.w,a),i=k/Math.max(e.h,a);x=Math.max(a/Math.max(e.w,a),a/Math.max(e.h,a),t,i),w=e.w*x,k=e.h*x}if(s>0)if(o){const t=Math.max(1,Math.round(e.w/s)),i=Math.max(1,Math.round(e.h/s));if(Math.abs(e.w-t*s)<1e-6&&Math.abs(e.h-i*s)<1e-6){const n=(e,t)=>{let i=Math.abs(e),n=Math.abs(t);for(;n;)[i,n]=[n,i%n];return Math.max(1,i)},r=1/n(t,i),o=Math.max(a/e.w,a/e.h),s=Math.max(o,Math.round((x??1)/r)*r);w=e.w*s,k=e.h*s}else{e.w>=e.h?(w=Math.round(w/s)*s,k=w*(e.h/Math.max(e.w,a))):(k=Math.round(k/s)*s,w=k*(e.w/Math.max(e.h,a)))}}else w=Math.round(w/s)*s,k=Math.round(k/s)*s;w=Math.max(a,w),k=Math.max(a,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)*u-k/2,w:w,h:k,angle:Dr(e.angle)||void 0}}const Br=(e,t,i)=>{const n=i[0]-t[0],r=i[1]-t[1],o=n*n+r*r;if(o<1e-12)return[...t];const s=Math.max(0,Math.min(1,((e[0]-t[0])*n+(e[1]-t[1])*r)/o));return[t[0]+n*s,t[1]+r*s]};function qr(e,t,i,n){const r=n(e);let o=null;for(const r of t.points){const t=n(r),s=Math.hypot(t[0]-e[0],t[1]-e[1]);s<=i&&(!o||se.points),segments:e.flatMap(e=>e.segments)}}const Wr=Math.tan(.25*Math.PI/180);function Ur(e,t){const i=Math.abs(Number(t[0])-Number(e[0])),n=Math.abs(Number(t[1])-Number(e[1]));if(!([i,n].every(Number.isFinite)&&i>0&&n>0))return null;const r=i>=n?"horizontal":"vertical",o=Math.max(i,n),s=Math.min(i,n);return s/o>Wr?null:{axis:r,major:o,minor:s,angleDegrees:180*Math.atan2(s,o)/Math.PI}}function Gr(e,t){const i=Ur(e,t);return i?"horizontal"===i.axis?[Number(t[0]),Number(e[1])]:[Number(e[0]),Number(t[1])]:[Number(t[0]),Number(t[1])]}const Vr=e=>`${e[0]},${e[1]}`,Kr=(e,t)=>e[0]===t[0]&&e[1]===t[1],Yr=(e,t)=>{const i=Vr(e),n=Vr(t);return i{let t=0;for(let i=0;i{if(e.length<3)return!1;for(let t=0;t1e-12},Jr=(e,t)=>Kr(e,t.from)?[...t.to]:[...e],Qr=(e,t)=>e.map(e=>Array.isArray(e?.poly)?{...e,poly:e.poly.map(e=>Jr(e,t))}:e),eo=(e,t,i)=>{const n=e.flatMap((e,t)=>ni(e)?.some(e=>Kr(e,i.from))?[t]:[]);if(!n.length)return!1;for(const i of n){const n=ni(e[i]),r=ni(t[i]);if(!n||!r)continue;if(!Zr(r))return!1;const o=Math.sign(Xr(n)),s=Math.sign(Xr(r));if(o&&s&&o!==s)return!1}const r=new Set;for(const e of n){const i=ni(t[e]);if(i)for(let n=0;n{let i=0;for(const n of e){const e=ni(n);if(e)for(let n=0;n{const{a:i,b:n,axis:r}=e,o="horizontal"===r?{from:n,to:[n[0],i[1]]}:{from:n,to:[i[0],n[1]]},s="horizontal"===r?{from:i,to:[i[0],n[1]]}:{from:i,to:[n[0],i[1]]};return[{move:o,preservedDegree:to(t,i)},{move:s,preservedDegree:to(t,n)}].sort((e,t)=>t.preservedDegree-e.preservedDegree||Vr(e.move.to).localeCompare(Vr(t.move.to))||Vr(e.move.from).localeCompare(Vr(t.move.from))).map(e=>e.move)};function no(e){const t=JSON.parse(JSON.stringify(e||{}));let i=Array.isArray(t.rooms)?t.rooms:[];const n=new Map;for(const e of i){const t=ni(e);if(t)for(let e=0;ee.key.localeCompare(t.key))){let t=null;for(const n of io(e,i)){const e=a.get(Vr(n.from));if(e&&e!==Vr(n.to))continue;const r=Qr(i,n);if(eo(i,r,n)){t=n,i=r;break}}t?(a.set(Vr(t.from),Vr(t.to)),r++,s=Math.max(s,Math.hypot(t.to[0]-t.from[0],t.to[1]-t.from[1]))):o++}t.rooms=i;for(const e of t.partitions||[]){if(!Array.isArray(e?.a)||!Array.isArray(e?.b))continue;const i=Ur(e.a,e.b);if(!i)continue;const n={key:String(e.id||Yr(e.a,e.b)),a:[...e.a],b:[...e.b],axis:i.axis};let a=null;for(const i of io(n,[{poly:[e.a,e.b]}])){const n=Jr(e.a,i),r=Jr(e.b,i),o=Math.hypot(r[0]-n[0],r[1]-n[1]);if(!(o>0))continue;const s=(t.openings||[]).filter(t=>"partition"===t?.host?.kind&&t.host.id===e.id).every(e=>{const t=Number(e.host.t),i=Number(e.length);return Number.isFinite(t)&&t>=0&&t<=1&&Number.isFinite(i)&&i>0&&t*o-i/2>=-1e-12&&t*o+i/2<=o+1e-12});if(s){a=i,e.a=n,e.b=r;break}}a?(r++,s=Math.max(s,Math.hypot(a.to[0]-a.from[0],a.to[1]-a.from[1]))):o++}return{space:t,report:{wallsStraightened:r,wallsStraightenSkipped:o,maxStraightenShift:s},changed:r>0}}const ro=["rect","ellipse","furniture","image"],oo=10**9,so=240,ao=1e-4;function lo(e){if(Array.isArray(e))return e.map(e=>lo(e));if(null!==e&&"object"==typeof e){const t={};for(const[i,n]of Object.entries(e))t[i]=lo(n);return t}return e}function co(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)*oo+.5)/oo);return 0===t?0:t}function ho(e){if("number"!=typeof e||!Number.isFinite(e))return e;const t=e*so,i=Math.round(t);if(Math.abs(t-i)null!==po(e)):[]}function mo(e){return"string"==typeof e&&ro.includes(e)}function go(e,t){for(const i of t)Object.prototype.hasOwnProperty.call(e,i)&&(e[i]=co(e[i]))}function fo(e,t){for(const i of t)Object.prototype.hasOwnProperty.call(e,i)&&(e[i]=ho(e[i]))}function vo(e){if(Array.isArray(e))for(let t=0;t{for(const r of n){const n=t[r];"number"==typeof n&&Number.isFinite(n)&&i(n,e)}},n=t=>{if(Array.isArray(t))for(let n=0;n{if(Array.isArray(e))for(const t of e)n(t)};for(const i of _o(e.rooms))t(i,["x","y","w","h"]),r(i.poly);for(const t of _o(e.walls))n(t.a),n(t.b);for(const t of _o(e.wall_segments))n(t.a),n(t.b);for(const i of _o(e.openings))t(i,["x","y"]);for(const i of _o(e.decor))"line"===i.kind?t(i,["x1","y1","x2","y2"]):mo(i.kind)?t(i,["x","y","w","h"]):"text"===i.kind&&t(i,["x","y"]);for(const t of _o(e.room_drafts))r(t.points);for(const t of _o(e.partitions))n(t.a),n(t.b);for(const t of _o(e.wall_columns))n(t.center);for(const t of _o(e.open_spans))n(t.a),n(t.b)}const r=po(t);if(!r)return;const o=new Map;if(n)for(const e of _o(n.spaces))null!=e.id&&o.set(String(e.id),e);for(const e of Object.values(r)){const t=po(e);if(!t)continue;const n=null!=t.s&&o.get(String(t.s))||null;for(const e of["x","y"]){const r=t[e];"number"==typeof r&&Number.isFinite(r)&&i(r,n)}}}function wo(e){const t=Number(e?.cell_cm);return t>0?t:5}function ko(e,t={}){const i={canonicalized:0,far:0,maxShift:0,maxShiftCm:0,spaces:[],bySpace:new Map},n=_o(po(e)?.spaces);let r=5;for(const e of n)r=Math.max(r,wo(e));bo(e,t,(e,t)=>{const n=e*so,o=Math.abs(n-Math.round(n)),s=ho(e),a=o>0&&o=ao))return;const l=a&&"number"==typeof s?Math.abs(s-e):0;if(a?i.canonicalized++:i.far++,i.maxShift=Math.max(i.maxShift,l),i.maxShiftCm=Math.max(i.maxShiftCm,l*so*(t?wo(t):r)),!t?.id||!a)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*so*wo(t))}),i.bySpace.size&&bo(e,t,(e,t)=>{if(!t?.id)return;const n=i.bySpace.get(String(t.id));if(!n)return;const r=e*so;Math.abs(r-Math.round(r))>=ao&&n.far++}),i.spaces=[...i.bySpace.values()];const{bySpace:o,...s}=i;return s}function xo(e){return function(e){const t=e,i=po(t);i&&fo(i,["x","y"]);return t}(lo(e))}function So(e){const t=e,i=po(t);if(!i)return t;for(const e of Object.values(i)){const t=po(e);t&&fo(t,["x","y"])}return t}function $o(e){return Mo(lo(e))}function Mo(e){const t=e,i=po(t);if(!i)return t;for(const e of _o(i.spaces)){go(e,["plan_x","plan_y","plan_scale","plan_scale_x","plan_scale_y","plan_angle"]);for(const t of _o(e.rooms))fo(t,["x","y","w","h"]),yo(t.poly);for(const t of _o(e.walls))vo(t.a),vo(t.b);for(const t of _o(e.wall_segments))vo(t.a),vo(t.b);for(const t of _o(e.openings)){fo(t,["x","y"]),go(t,["angle","length"]);const e=po(t.host);e&&go(e,["t"])}for(const t of _o(e.decor))"line"===t.kind?fo(t,["x1","y1","x2","y2"]):mo(t.kind)?(fo(t,["x","y","w","h"]),go(t,["angle"])):"text"===t.kind&&(fo(t,["x","y"]),go(t,["scale","angle"]));for(const t of _o(e.room_drafts))yo(t.points);for(const t of _o(e.partitions))vo(t.a),vo(t.b);for(const t of _o(e.wall_columns))vo(t.center),"square"===t.shape&&go(t,["angle"]);for(const t of _o(e.open_spans))vo(t.a),vo(t.b)}for(const e of _o(i.markers))go(e,["angle"]);return t}const Ro=15,Co=8;function To(e,t,i,n,r){const o=i[0]-e[0],s=i[1]-e[1],a=Math.hypot(o,s);if(!(a>0)||a<=r+1e-9)return null;const l=o/a,c=s/a,h=t=>{const n=(t[0]-e[0])*l+(t[1]-e[1])*c,o=(r-n)/(a-n);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),u=h(n);return d&&u?[[e[0],e[1]],t,d,u,n]:null}const Do=Math.sin(.25*Math.PI/180);function Ao(e,t){return Number.isFinite(e)&&e>0&&Number.isFinite(t)&&t>0&&e*t<3}function Po(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 Fo(e,t){return Number.isFinite(e)&&e>0&&Number.isFinite(t)&&t>0&&e*t<2}function zo(e){return Number.isFinite(e)?Math.max(1,Math.min(100,e)):1}function Io(e,t){return!Number.isFinite(e)||e<0?"":String(t?Math.round(e/2.54*100)/100:Math.round(100*e)/100)}function Oo(e,t,i){if(!Number.isFinite(e)||e<=0)return 0;const n=Number(t)>0?Number(t):5;return zo(e)/n*i}function Eo(e,t){return t>0&&Number.isFinite(e)?Math.round(e/t)*t:e}function No(e){return Math.max(1e-6*Math.abs(e),1e-9)}function Ho(e,t){if(!(t>0&&Number.isFinite(e)))return e;const i=Eo(e,t);return Math.abs(i-e)<=No(t)?i:e}function Lo(e,t){let i=t[0]-e[0],n=t[1]-e[1];const r=Math.hypot(i,n);return r<1e-12?[1,0]:(i/=r,n/=r,(i<-1e-12||Math.abs(i)<=1e-12&&n<0)&&(i=-i,n=-n),[i,n])}function Bo(e,t,i){const n=[Ho(e[0],i),Ho(e[1],i)],r=[Ho(t[0],i),Ho(t[1],i)],o=Eo((n[0]+r[0])/2,i),s=Eo((n[1]+r[1])/2,i),[a,l]=Lo(n,r);let c=Math.atan2(l,a);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)},${s.toFixed(d)}@${h.toFixed(4)}`}function qo(e,t,i,n){return 1===n?Bo(e,t,i):Bo([e[0]/n,e[1]/n],[t[0]/n,t[1]/n],i)}function jo(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 n=t>0?t:1;return[[i[0]*n,i[1]*n],[i[2]*n,i[3]*n]]}function Wo(e,t,i,n,r){const o=r>0?r:1;return{key:qo(e,t,n,o),cm:zo(i),a:[e[0]/o,e[1]/o],b:[t[0]/o,t[1]/o]}}function Uo(e,t){const i=t>0?t:1,n=[];for(const t of e){const e=t.key.lastIndexOf("@");if(e<0)continue;const[r,o]=t.key.slice(0,e).split(",").map(Number),s=Number(t.key.slice(e+1));[r,o,s].every(Number.isFinite)&&n.push({w:t,x:r*i,y:o*i,ang:s})}return n}function Go(e,t){const[i,n]=Lo(e,t);let r=Math.atan2(n,i);return r<0&&(r+=Math.PI),r}function Vo(e,t){let i=Math.abs(e-t);return i>Math.PI/2&&(i=Math.PI-i),i<.02}function Ko(e,t,i,n,r=1){if(!e?.length)return null;const o=qo(t,i,n,r),s=e.find(e=>e.key===o);if(s)return s;const a=r>0?r:1,l=No(n)*a,c=(e,t)=>Math.abs(e[0]-t[0])<=l&&Math.abs(e[1]-t[1])<=l;for(const n of e){const e=jo(n,a);if(e&&(c(e[0],t)&&c(e[1],i)||c(e[0],i)&&c(e[1],t)))return n}const h=(t[0]+i[0])/2,d=(t[1]+i[1])/2,u=Go(t,i),p=Math.max(.5*n,1e-9)*a;for(const t of Uo(e,a))if(Vo(t.ang,u)&&Math.hypot(t.x-h,t.y-d)<=p)return t.w;return null}function Yo(e,t,i,n,r=1){const o=Ko(e,t,i,n,r);if(o&&o.cm>0)return zo(o.cm);const s=function(e,t,i,n,r){if(!e?.length)return null;const o=r>0?r:1,s=Math.hypot(i[0]-t[0],i[1]-t[1]);if(s<1e-12)return null;const a=Go(t,i),l=Math.max(.5*n,1e-9)*o;let c=null;for(const n of e){if(!(n.cm>0))continue;const e=jo(n,o);if(!e)continue;const r=Math.hypot(e[1][0]-e[0][0],e[1][1]-e[0][1]);if(r<1e-12||!Vo(Go(e[0],e[1]),a))continue;if(Ns(t[0],t[1],e[0][0],e[0][1],e[1][0],e[1][1])>l||Ns(i[0],i[1],e[0][0],e[0][1],e[1][0],e[1][1])>l)continue;if(r+l(o.has(e.key)||(e=>{const t=jo(e,n);if(!t)return!1;const[i,o]=t,a=o[0]-i[0],c=o[1]-i[1],h=Math.hypot(a,c);if(h<=l)return!1;if(!s.some(e=>{const t=[e[0],e[1]],n=[e[2],e[3]];return Vo(Go(i,o),Go(t,n))&&Ns(i[0],i[1],t[0],t[1],n[0],n[1])<=l&&Ns(o[0],o[1],t[0],t[1],n[0],n[1])<=l}))return!1;const d=(r||[]).some(e=>{const t=[e[0],e[1]],n=[e[2],e[3]];if(!Vo(Go(i,o),Go(t,n)))return!1;const r=e=>Math.abs((e[0]-i[0])*c-(e[1]-i[1])*a)/h;if(r(t)>l||r(n)>l)return!1;const s=h*h,d=((t[0]-i[0])*a+(t[1]-i[1])*c)/s,u=((n[0]-i[0])*a+(n[1]-i[1])*c)/s;return Math.min(1,Math.max(d,u))-Math.max(0,Math.min(d,u))>l/h});return!d})(e))&&e.cm>=1&&e.cm<=100)}function Zo(e,t,i,n=8){const[r,o]=Lo(e,t);let s=Math.atan2(o,r);s<0&&(s+=Math.PI);let a=i*Math.PI/180%Math.PI;a<0&&(a+=Math.PI);let l=Math.abs(s-a);return l>Math.PI/2&&(l=Math.PI-l),l<=n*Math.PI/180}function Jo(e,t,i,n,r=1,o="affine",s){if(!e?.length)return[];if(t.length!==i.length)return"fixed-topology"===o&&s?.(),e.slice();const a=r>0?r:1,l=Math.max(.5*n,1e-9)*a,c=Math.max(n*a*1e-6,1e-9),h=[],d=new Map,u=new Map,p=(e,t,i)=>{const n=e.get(t)||new Set;n.add(i),e.set(t,n)};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],n=t.na[1]-t.oa[1],r=t.nb[0]-t.ob[0],o=t.nb[1]-t.ob[1];return Math.hypot(i-r,n-o)<=c?[e[0]+i,e[1]+n]: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,n]=Lo(e,t);return(t[0]-e[0])*i+(t[1]-e[1])*n>=0?[[...e],[...t]]:[[...t],[...e]]},v=[],y=[],b=(e,t,i)=>{if(Math.hypot(t[0]-e[0],t[1]-e[1])<=c)return;const[r,o]=f(e,t),s=zo(i);if(y.some(e=>e.entry.cm===s&&m(e.span[0],r)&&m(e.span[1],o)))return;const l=Wo(r,o,s,n,a);v.push(l),y.push({entry:l,span:[r,o]})};for(const t of e){const e=jo(t,a);if(e){const[i,n]=f(e[0],e[1]),r=n[0]-i[0],s=n[1]-i[1],a=r*r+s*s,d=Math.sqrt(a);if(d<=c){v.push({...t,cm:zo(t.cm)});continue}const u=[];for(const e of h){if(!Vo(Go(i,n),Go(e.oa,e.ob)))continue;const t=e=>Math.abs((e[0]-i[0])*s-(e[1]-i[1])*r)/d;if(t(e.oa)>l||t(e.ob)>l)continue;const o=((e.oa[0]-i[0])*r+(e.oa[1]-i[1])*s)/a,h=((e.ob[0]-i[0])*r+(e.ob[1]-i[1])*s)/a,p=Math.max(0,Math.min(o,h)),_=Math.min(1,Math.max(o,h));(_-p)*d>c&&u.push({lo:p,hi:_,move:e})}if(!u.length){"fixed-topology"===o?v.push({...t}):b(i,n,t.cm);continue}const p=[0,1,...u.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),y=[];for(let e=0;e+1a>=e.lo-1e-12&&a<=e.hi+1e-12);if(!l.length){y.push([o,s]);continue}const h=[g(o,l[0].move),g(s,l[0].move)],f=l.slice(1).some(e=>{const t=g(o,e.move),i=g(s,e.move);return!m(h[0],t)||!m(h[1],i)});y.push(f?[o,s]:h)}const w=(e,t)=>{const i=e[1][0]-e[0][0],n=e[1][1]-e[0][1],r=t[1][0]-t[0][0],o=t[1][1]-t[0][1],s=Math.hypot(i,n);return!(s<=c||i*r+n*o<=0)&&Math.abs(i*o-n*r)/s<=c},k=[];for(const e of y){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,n]=k[0];if(m(i,e[0])&&m(n,e[1])||m(i,e[1])&&m(n,e[0])){v.push({...t});continue}}for(const[e,i]of k)b(e,i,t.cm);continue}if("fixed-topology"===o){const e=u.get(t.key);if(1===e?.size){const i=[...e][0];v.push(i===t.key?{...t}:{...t,key:i});continue}const i=[Uo([t],a)[0]];1!==a&&i.push(Uo([t],1)[0]);const n=i.filter(Boolean).some(e=>h.some(t=>{if(!Vo(e.ang,Go(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&&Ns(e.x,e.y,t.oa[0],t.oa[1],t.ob[0],t.ob[1])<=l}));((e?.size||0)>1||n)&&s?.(),v.push({...t});continue}let i="";const r=d.get(t.key);if(1===r?.size&&(i=[...r][0]),!i){const e=Uo([t],a)[0];if(e){const t=new Set;for(const i of h){if(!Vo(e.ang,Go(i.oa,i.ob)))continue;const r=((e.x-i.oa[0])*i.dx+(e.y-i.oa[1])*i.dy)/i.len2;if(r<-1e-6||r>1.000001)continue;if(Ns(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),[s,c]=Lo(i.na,i.nb),h=Math.max(n*a,1e-6);t.add(qo([o[0]-s*h,o[1]-c*h],[o[0]+s*h,o[1]+c*h],n,a))}1===t.size&&(i=[...t][0])}}v.push({...t,key:i||t.key,cm:zo(t.cm)})}return v}function Qo(e,t,i,n,r=1,o="affine"){return Jo(e,t,i,n,r,o)}function es(e,t,i,n,r=1,o="fixed-topology"){let s=!1;const a=Jo(e,t,i,n,r,o,()=>{s=!0});return{walls:s?(e||[]).map(e=>({...e})):a,rejected:s}}function ts(e,t,i,n=1,r=[]){const o=n>0?n:1,s=Math.abs(i),a=Math.max(s*o*ao,1e-9),l=(r||[]).flatMap(e=>{const t=jo(e,o);return t?t.map(e=>[...e]):[]}),c=e=>e.every((e,t)=>(e=>{if(!(s>0))return!0;const t=e/o/s;return Math.abs(t-Math.round(t))Math.abs(e-i[t])<=a)),h=[],d=e=>JSON.stringify([e.key,e.cm,e.a,e.b]);for(const i of e||[]){const e=jo(i,o);if(!e)continue;const[n,r]=e;if(![n[0],n[1],r[0],r[1]].every(Number.isFinite)||!c(n)||!c(r)){h.push(d(i));continue}const s=r[0]-n[0],l=r[1]-n[1],u=Math.hypot(s,l);if(u<=a){h.push(d(i));continue}const p=s/u,_=l/u,m=[];for(const e of t){const[t,i]=e;if(![t?.[0],t?.[1],i?.[0],i?.[1]].every(Number.isFinite))continue;const r=e=>Math.abs((e[0]-n[0])*_-(e[1]-n[1])*p);if(r(t)>a||r(i)>a)continue;const o=(t[0]-n[0])*p+(t[1]-n[1])*_,s=(i[0]-n[0])*p+(i[1]-n[1])*_,l=Math.max(0,Math.min(o,s)),c=Math.min(u,Math.max(o,s));c-l>a&&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+a)break;if(g=Math.max(g,t),g>=u-a)break}ge.key!==s);return null==n||n<1?a:[...a,Wo(t,i,n,r,o)]}function ns(e,t,i,n,r,o=[],s=1){let a=e?e.slice():[];for(const e of function(e,t,i,n,r=1,o=[]){const s=Ss(e,t,i,n,r,o);if(!s)return[];const a=[];for(let e=0;e0||(c=is(c,t,i,n,r,s)))}return c}function os(e){const{a:t,b:i,halfDepth:n}=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 r=i[0]-t[0],o=i[1]-t[1],s=Math.hypot(r,o);if(!(s>1e-9&&n>0&&Number.isFinite(n)))return null;const a=-o/s*n,l=r/s*n;return[[t[0]+a,t[1]+l],[i[0]+a,i[1]+l],[i[0]-a,i[1]-l],[t[0]-a,t[1]-l]]}function ss(e,t,i){return Math.hypot(e[0]-t[0],e[1]-t[1])<=i}function as(e,t,i){const n=t.b[0]-t.a[0],r=t.b[1]-t.a[1],o=n*n+r*r;if(!(o>i*i))return!1;const s=((e[0]-t.a[0])*n+(e[1]-t.a[1])*r)/o;if(!(s>0&&s<1))return!1;const a=[t.a[0]+n*s,t.a[1]+r*s];return Math.hypot(e[0]-a[0],e[1]-a[1])<=i}function ls(e,t,i,n){const r=Math.hypot(t,i);if(!(r>1e-9&&n>0))return;const o=[t/r,i/r],s=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);s?s.halfDepth=Math.max(s.halfDepth,n):e.push({u:o,halfDepth:n})}function cs(e,t){try{const i=Gt(Bs(e),Bs(t));let n=null,r=0;for(const e of i||[]){const t=e?.[0]||[],i=Math.abs(ms(t));t.length>=4&&i>r&&(r=i,n=t.slice(0,-1).map(e=>[e[0],e[1]]))}return n}catch{return null}}function hs(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 n=Math.max(Number.isFinite(t)?t:0,1e-9),r=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 r)o.some(t=>ss(t,e,n))||o.push(e);const s=[];for(const e of o){const t=[];let r=!1;for(const{segment:o,index:s}of i){const i=Math.hypot(o.b[0]-o.a[0],o.b[1]-o.a[1]);ss(e,o.a,n)?t.push({u:[(o.b[0]-o.a[0])/i,(o.b[1]-o.a[1])/i],halfDepth:o.halfDepth,length:i,index:s}):ss(e,o.b,n)?t.push({u:[(o.a[0]-o.b[0])/i,(o.a[1]-o.b[1])/i],halfDepth:o.halfDepth,length:i,index:s}):as(e,o,n)&&(r=!0)}if(r||2!==t.length)continue;const[o,a]=t,l=o.u[0]*a.u[1]-o.u[1]*a.u[0];if(Math.abs(l)<1e-9)continue;const c=l<0?1:-1,h=[-o.u[1],o.u[0]],d=[-a.u[1],a.u[0]],u=[e[0]+h[0]*o.halfDepth*c,e[1]+h[1]*o.halfDepth*c],p=[e[0]-d[0]*a.halfDepth*c,e[1]-d[1]*a.halfDepth*c];if(!vs(u,o.u,p,a.u))continue;const _=[[o,a,p,[d[0]*-c,d[1]*-c]],[a,o,u,[h[0]*c,h[1]*c]]];for(const[t,,i,r]of _){const o=Math.min(2*t.halfDepth,t.length),a=[-t.u[1]*t.halfDepth,t.u[0]*t.halfDepth],l=[[e[0]+a[0],e[1]+a[1]],[e[0]+t.u[0]*o+a[0],e[1]+t.u[1]*o+a[1]],[e[0]+t.u[0]*o-a[0],e[1]+t.u[1]*o-a[1]],[e[0]-a[0],e[1]-a[1]]],c=e=>(e[0]-i[0])*r[0]+(e[1]-i[1])*r[1],h=[];for(let e=0;e=-1e-12&&h.push(t),n>1e-12&&r<-1e-12||n<-1e-12&&r>1e-12){const e=n/(n-r);h.push([t[0]+(i[0]-t[0])*e,t[1]+(i[1]-t[1])*e])}}h.length>=3&&Math.abs(ms(h))>n*n&&s.push({segmentIndex:t.index,wedge:h})}}return s}function ds(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 n=Math.max(Number.isFinite(t)?t:0,1e-9),r=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 r)o.some(t=>ss(t,e,n))||o.push(e);const s=[],a=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=Ts(a,n);for(const e of Ds(l).fans)s.push(e);const c=e=>!!As(l,e);for(const e of o){if(c(e))continue;const t=[];for(const r of i)ss(e,r.a,n)?ls(t,r.b[0]-r.a[0],r.b[1]-r.a[1],r.halfDepth):ss(e,r.b,n)?ls(t,r.a[0]-r.b[0],r.a[1]-r.b[1],r.halfDepth):as(e,r,n)&&(ls(t,r.a[0]-e[0],r.a[1]-e[1],r.halfDepth),ls(t,r.b[0]-e[0],r.b[1]-e[1],r.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;in*n&&s.push(m)}}}return s}function us(e,t,i,n){if(!(t>0)||!e||e.length<2)return"";if(i&&e.length>=3){let i=e;const r=e[e.length-1];if(e.length>=4&&Math.hypot(e[0][0]-r[0],e[0][1]-r[1])<1e-9&&(i=e.slice(0,-1)),i.length>=3){const e=i.map((e,i)=>n?.[i]||t),r=aa(i,e),o=ws(i,e);if(r&&o)return`${ks(r)} ${ks(xs(o))}`}}const r=[];for(let i=0;i=1e-9&&a>0&&r.push({a:o,b:s,halfDepth:a})}const o=r.map(os);for(const{segmentIndex:e,wedge:t}of hs(r)){const i=o[e];if(!i)continue;const n=cs(i,t);n&&(o[e]=n)}const s=[...o.filter(e=>!!e),...ds(r)],a=function(e){let t=null;try{for(const i of e){if(i.length<3)continue;const e=Bs(i);t=t?Wt(t,e):[e]}return t}catch{return null}}(s);return a?Qs(a):s.map(e=>ks(e)).join(" ")}function ps(e,t,i,n,r=1){if(!i.length)return!1;const o=_s(n,r),s=(e[0]+t[0])/2,a=(e[1]+t[1])/2,[l,c]=Lo(e,t);for(const e of i){const[t,i]=Lo([e[0],e[1]],[e[2],e[3]]);if(!(Math.abs(l*i-c*t)>.05)&&Ns(s,a,e[0],e[1],e[2],e[3])<=o)return!0}return!1}function _s(e,t){return Math.max(e*(t>0?t:1)*.04,1e-9)}function ms(e){let t=0;for(let i=0;ie[1]!=l>e[1]&&e[0]<(a-o)*(e[1]-s)/(l-s+0)+o&&(i=!i)}return i}([c[0]+.001*a,c[1]+.001*l],e)||(a=-a,l=-l),[a,l]}function fs(e,t){const i=e[0]*t[1]-e[1]*t[0],n=e[0]*t[0]+e[1]*t[1];return Math.abs(i)<1e-9&&n>0}function vs(e,t,i,n){const r=t[0]*n[1]-t[1]*n[0];if(Math.abs(r)<1e-12)return null;const o=[i[0]-e[0],i[1]-e[1]],s=(o[0]*n[1]-o[1]*n[0])/r;return[e[0]+s*t[0],e[1]+s*t[1]]}function ys(e,t,i){const n=e?.length||0;if(n<3||!Array.isArray(i)||i.length!==n)return 0;const r=(Math.trunc(t)%n+n)%n,o=e[r],s=e[(r+1)%n],a=s[0]-o[0],l=s[1]-o[1],c=Math.hypot(a,l);if(!(c>0))return 0;const h=Math.max(0,Number(i[r])||0);if(!(h>0))return c;const d=[a/c,l/c],u=gs(e,r),p=[o[0]+u[0]*h,o[1]+u[1]*h],_=t=>{const r=Math.max(0,Number(i[t])||0);if(!(r>0))return null;const s=e[t],a=e[(t+1)%n],l=a[0]-s[0],c=a[1]-s[1],h=Math.hypot(l,c);if(!(h>0))return null;const u=gs(e,t),_=vs(p,d,[s[0]+u[0]*r,s[1]+u[1]*r],[l/h,c/h]);return _?(_[0]-o[0])*d[0]+(_[1]-o[1])*d[1]:null},m=_((r-1+n)%n)??0,g=(_((r+1)%n)??c)-m;return g>0?g:0}function bs(e,t,i,n,r,o,s,a=1){const l=(e||[]).find(e=>e?.id===t),c=ni(l);if(!c||c.length<3)return null;const h=Fs(e,t,i,n,r,o,s,a);if(!h)return c.map(()=>0);const d=4*_s(r,a);return c.map((e,t)=>{const i=c[(t+1)%c.length],n=[(e[0]+i[0])/2,(e[1]+i[1])/2];for(let e=0;e!(e>0)))return e.map(e=>[e[0],e[1]]);const r=[];for(let o=0;o0||u>0)){r.push([e[o][0],e[o][1]]);continue}if(d>0!=u>0){const t=e[o],i=d>0?[t[0]+p*d,t[1]+_*d]:[t[0],t[1]],n=u>0?[t[0]+m*u,t[1]+g*u]:[t[0],t[1]];r.push(i),Math.hypot(n[0]-i[0],n[1]-i[1])>1e-9&&r.push(n);continue}if(fs(w,k)){const t=e[o],i=[t[0]+p*d,t[1]+_*d],n=[t[0]+m*u,t[1]+g*u];r.push(i),Math.hypot(n[0]-i[0],n[1]-i[1])>1e-9&&r.push(n);continue}const $=vs(x,w,S,k),M=Math.max(d,u,1e-9),R=As(i,e[o])?.limit??4*M;if($){const i=Math.hypot($[0]-e[o][0],$[1]-e[o][1]);if(Number.isFinite(i)&&i<=R){r.push($);continue}if(ta(e,t,o)){r.push($);continue}}d>0&&r.push([e[o][0]+p*d,e[o][1]+_*d]),u>0&&r.push([e[o][0]+m*u,e[o][1]+g*u]),d>0||u>0||r.push([e[o][0],e[o][1]])}return r.length>=3?r:null}function ks(e,t=!0){if(!e.length)return"";let i=`M ${e[0][0]} ${e[0][1]}`;for(let t=1;te?.id===t),a=ni(s);if(!a||a.length<3)return null;const l=_s(n,r),c=[];for(const i of e||[]){if(!i||i.id===t)continue;const e=ni(i);if(e)for(const t of Fn(a,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=jo(e,r);t&&c.push(t[0],t[1])}const h=[],d=[];for(let e=0;el)continue;const s=((e[0]-t[0])*(i[0]-t[0])+(e[1]-t[1])*(i[1]-t[1]))/(n*n);s<=r||s>=1-r||(o.some(e=>Math.abs(e-s)*n<=2*l)||o.push(s))}o.sort((e,t)=>e-t);for(const n of o)h.push([t[0]+(i[0]-t[0])*n,t[1]+(i[1]-t[1])*n]),d.push(e)}return{poly:h,parent:d,orig:a}}function $s(e,t,i,n){const r=t.poly.length,o=new Array(r).fill(0);if(!e?.length)return o;const s=new Set,a=[];for(let l=0;l0?(o[l]=zo(c.cm),s.add(c.key)):a.push(l)}if(!a.length)return o;const l=n>0?n:1,c=Math.max(.5*i,1e-9)*l,h=Uo(e,l).filter(e=>e.w.cm>0);for(let e=a.length-1;e>=0;e--){const i=a[e],n=t.poly[i],s=t.poly[(i+1)%r],d=Go(n,s);let u=null;for(const e of h){const t=jo(e.w,l);if(!t||!Vo(Go(t[0],t[1]),d))continue;if(Ns(n[0],n[1],t[0][0],t[0][1],t[1][0],t[1][1])>c||Ns(s[0],s[1],t[0][0],t[0][1],t[1][0],t[1][1])>c)continue;const i=Math.hypot(s[0]-n[0],s[1]-n[1]),r=Math.hypot(t[1][0]-t[0][0],t[1][1]-t[0][1]),o=Math.max(0,r-i);(!u||oc||Ns(r[0],r[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(Ns(e.x,e.y,n[0],n[1],r[0],r[1])>c)continue;o=Math.hypot(e.x-d,e.y-u)}(!p||i&&!p.exact||i===p.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])>n).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),s=new Map;for(const e of o){const t=s.get(e.key);t?e.half>t.half&&s.set(e.key,{...t,half:e.half}):s.set(e.key,e)}const a=[...s.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 a){const[t,i]=Ms(e.point,n),r=Rs(t,i),o=l.get(r)||[];o.push(e),l.set(r,o)}const c=[],h=new Map;for(const e of a){const t=Cs(h,e.point,n).filter(t=>Math.hypot(t.point[0]-e.point[0],t.point[1]-e.point[1])<=n).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,r]=Ms(i.point,n),o=Rs(t,r),s=h.get(o)||[];s.push(i),h.set(o,s)}const r=e.other[0]-e.point[0],o=e.other[1]-e.point[1],s=Math.hypot(r,o);if(!(s>n))continue;const a=[r/s,o/s];let l=Math.atan2(a[1],a[0]);l<0&&(l+=2*Math.PI),i.rays.push({u:a,halfDepth:e.halfDepth,length:s,angle:l})}const d=[],u=e=>{const t=1e-9*Math.max(1,r),i=e.filter(e=>Number.isFinite(e.halfDepth)&&e.halfDepth>0&&Number.isFinite(e.length)&&e.length>n);return i.filter((e,n)=>!i.some((i,r)=>r!==n&&i.halfDepth>=e.halfDepth-t&&i.length>=e.length-t&&(i.halfDepth>e.halfDepth+t||i.length>e.length+t||re.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 r=i.map(t=>{const i=u(t.supports),r=new Set,o=[];for(const s of i){const i=[e.point[0]+t.u[0]*s.length,e.point[1]+t.u[1]*s.length];for(const t of Cs(l,i,n)){if("shared"!==t.kind||Math.hypot(t.point[0]-i[0],t.point[1]-i[1])>n)continue;const s=t.other[0]-t.point[0],a=t.other[1]-t.point[1],l=Math.hypot(s,a);if(!(l>n))continue;const c=s/l,h=a/l;if(Math.hypot(t.other[0]-e.point[0],t.other[1]-e.point[1])<=n)continue;const d=`${t.key}|${t.point[0]}|${t.point[1]}|${t.other[0]}|${t.other[1]}|${t.halfDepth}`;r.has(d)||(r.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>n);if(r.length<3)continue;const o=Math.max(...r.map(e=>e.halfDepth));o>0&&Number.isFinite(o)&&d.push({point:[...e.point],rays:r,halfDepth:o,limit:1.25*o})}d.sort((e,t)=>e.point[0]-t.point[0]||e.point[1]-t.point[1]);const p=new Map;for(const e of d){const[t,i]=Ms(e.point,n),r=Rs(t,i),o=p.get(r)||[];o.push(e),p.set(r,o)}return{epsilon:n,coordinateScale:r,nodes:d,index:p}}function Ds(e){const t={fans:[],supports:[]};if(!e?.nodes?.length)return t;const i=Math.max(e.epsilon,1e-9)**2;for(const n of e.nodes){const e=n.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 r=n.point;for(const i of e)for(const e of i.supports){if(!(e.halfDepth>0&&e.length>0))continue;const n=-i.u[1]*e.halfDepth,o=i.u[0]*e.halfDepth,s=[r[0]+i.u[0]*e.length,r[1]+i.u[1]*e.length];t.supports.push([[r[0]+n,r[1]+o],[s[0]+n,s[1]+o],[s[0]-n,s[1]-o],[r[0]-n,r[1]-o]])}for(let n=0;n{const e=s.angle-o.angle;return e>0?e:e+2*Math.PI})();if(a<1e-9)continue;const l=a>Math.PI+1e-9,c=4*Math.max(o.halfDepth,s.halfDepth),h=[r[0]-o.u[1]*o.halfDepth,r[1]+o.u[0]*o.halfDepth],d=[r[0]+s.u[1]*s.halfDepth,r[1]-s.u[0]*s.halfDepth],u=o.u[0]*s.u[1]-o.u[1]*s.u[0],p=e=>{let t=Math.atan2(e[1]-r[1],e[0]-r[0])-o.angle;for(;t<0;)t+=2*Math.PI;return t<=a+1e-9};let _=null;if(Math.abs(u)>1e-9){const e=((d[0]-h[0])*s.u[1]-(d[1]-h[1])*s.u[0])/u,t=((d[0]-h[0])*o.u[1]-(d[1]-h[1])*o.u[0])/u,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<=s.thickLength)&&Math.hypot(i[0]-r[0],i[1]-r[1])<=c&&p(i)&&(_=i)}const m=e=>{Math.abs(ms(e))>i&&t.fans.push(e)};if(_){const e=1.5*Math.max(o.halfDepth,s.halfDepth);m(To([r[0],r[1]],h,_,d,e)??[[r[0],r[1]],h,_,d]);continue}if(l){m([[r[0],r[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,s.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]+s.u[0]*g(s.halfDepth,s.thickLength),d[1]+s.u[1]*g(s.halfDepth,s.thickLength)];m([[r[0],r[1]],h,f,v,d])}}return t}function As(e,t){return!e||!Array.isArray(t)||t.length<2||!t.slice(0,2).every(Number.isFinite)?null:Cs(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 Ps(e,t,i,n,r,o,s){return Ts(zs(e,t,i,n,r,o,s),4*_s(n,s),s)}function Fs(e,t,i,n,r,o,s,a=1){const l=Ss(e,t,n,r,a,i);if(!l)return null;const c=function(e,t,i){const n=(e||[]).find(e=>e?.id===t),r=ni(n);if(!r)return[];const o=[];for(const n of e||[]){if(!n||n.id===t)continue;const e=ni(n);if(e)for(const t of Fn(r,e,i))o.push(t)}return o}(e,t,_s(r,a)),h=function(e,t,i,n,r){const o=_s(n,r),s=[];for(let a=0;aNs(h,d,e[0],e[1],e[2],e[3])<=o);s.push(u?"shared":"outer")}return s}(l.poly,c,n,r,a),d=$s(i,l,r,a),u=d.map((e,t)=>h[t]&&e>0?Oo(e,o,s)/2:0);return{...l,kinds:h,cms:d,offsets:u}}function zs(e,t,i,n,r,o,s=1){const a=[];for(const l of e||[]){if(!l?.id)continue;const c=Fs(e,l.id,t,i,n,r,o,s);if(c)for(let e=0;e0&&(a=is(a,e.a,e.b,e.cm,n,s));return a}function Os(e,t,i,n,r,o,s=1){if(!t?.length)return[];const a=zs(e,t,i,n,r,o,s),l=new Map;for(const e of a){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 a)!e.open&&e.cm>0&&!d.has(e.key)&&(d.add(e.key),h.push({...e,ownerSignature:c(e.key)}));const u=[];for(const a of e||[]){if(!a?.id)continue;const l=Fs(e,a.id,t,i,n,r,o,s);if(l)for(let e=0;e0)||null===l.kinds[i]){e++;continue}const o=c(qo(l.poly[i],l.poly[(i+1)%l.poly.length],n,s));let a=e;for(;a+10&&u.push({a:[d[0],d[1]],b:[p[0],p[1]],key:qo(d,p,n,s),cm:r,len:_,ownerSignature:o}),e=a+1}}}u.sort((e,t)=>t.len-e.len||e.key.localeCompare(t.key));const p=[],_=new Set,m=new Set,g=4*_s(n,s);for(const e of u){const t=h.filter(t=>!m.has(t.key)&&t.cm===e.cm&&t.ownerSignature===e.ownerSignature&&Vo(Go(t.a,t.b),Go(e.a,e.b))&&Ns(t.a[0],t.a[1],e.a[0],e.a[1],e.b[0],e.b[1])<=g&&Ns(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),p.push(Wo(e.a,e.b,e.cm,n,s)))}}for(const e of h)m.has(e.key)||_.has(e.key)||(_.add(e.key),p.push(Wo(e.a,e.b,e.cm,n,s)));return p}function Es(e,t,i,n,r,o,s,a=1){const l=_s(r,a),c=(n[0]+n[2])/2,h=(n[1]+n[3])/2,d=Go([n[0],n[1]],[n[2],n[3]]);let u=null;for(const n of zs(e,t,i,r,o,s,a)){if(!Vo(Go(n.a,n.b),d))continue;const e=Ns(c,h,n.a[0],n.a[1],n.b[0],n.b[1]);e>4*l||(!u||e[e[0],e[1]]),o=Math.abs(ms(r));r.length>=3&&o>i&&(t=r,i=o)}return t}function Ls(e,t,i,n,r,o,s,a=1,l,c){const h=(e||[]).find(e=>e?.id===t),d=ni(h);if(!d||d.length<3)return null;if(!i?.length)return d.map(e=>[e[0],e[1]]);const u=Fs(e,t,i,n,r,o,s,a);if(!u||!u.offsets.some(e=>e>0))return d.map(e=>[e[0],e[1]]);const p=c||Ps(e,i,n,r,o,s,a),_=ws(u.poly,u.offsets,p);if(!_)return d.map(e=>[e[0],e[1]]);if(!p.nodes.length)return _;const m=void 0===l?ia(e,i,n,[],r,o,s,a):null,g=l??("ok"===m?.status||"degraded-extra"===m?.status?m.roomGeom:void 0);if(g)try{const e=Hs(Gt(Bs(u.poly),g));if(e)return e}catch{}return function(e,t){try{return Hs(Ut(Bs(e),Bs(t)))}catch{return null}}(_,u.poly)||d.map(e=>[e[0],e[1]])}function Bs(e){const t=e.map(e=>[e[0],e[1]]);return t.push([e[0][0],e[0][1]]),[t]}function qs(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(Ci(e[0]))>1e-9)}function js(e,t,i,n){const r=n?new Set(n):null;let o=null;for(let n=0;nt.epsilon))continue;const l=Ks([[e.point[0]+a[0]*n.halfDepth,e.point[1]+a[1]*n.halfDepth],[e.point[0]+s.u[0]*r+a[0]*n.halfDepth,e.point[1]+s.u[1]*r+a[1]*n.halfDepth],[e.point[0]+s.u[0]*r-a[0]*n.halfDepth,e.point[1]+s.u[1]*r-a[1]*n.halfDepth],[e.point[0]-a[0]*n.halfDepth,e.point[1]-a[1]*n.halfDepth]],t.coordinateScale);if(!l)continue;const c=Bs(l);o=o?Wt(o,c):c}}return o}function Ws(e,t,i){let n=null;for(const r of e.rays)for(const e of r.continuations){const r=[-e.u[1],e.u[0]],o=[e.start[0]+e.u[0]*e.length,e.start[1]+e.u[1]*e.length],s=Ks([[e.start[0]+r[0]*e.halfDepth,e.start[1]+r[1]*e.halfDepth],[o[0]+r[0]*e.halfDepth,o[1]+r[1]*e.halfDepth],[o[0]-r[0]*e.halfDepth,o[1]-r[1]*e.halfDepth],[e.start[0]-r[0]*e.halfDepth,e.start[1]-r[1]*e.halfDepth]],t.coordinateScale);if(!s)continue;const a=Ut(Bs(s),i);Array.isArray(a)&&0!==a.length&&(n=n?Wt(n,a):a)}return n}function Us(e,t,i=2*(4*e.halfDepth+2*t.epsilon)){const n=function(e,t=Do){const i=new Set,n=Number.isFinite(t)&&t>=0?t:Do;for(let t=0;te-t)}(e);return n.length?js(e,t,i,n):null}function Gs(e,t,i,n,r){const o=function(e){let t=null;for(const i of e){const e=Bs(i);try{t=t?Wt(t,e):e}catch{}}return t}(function(e,t,i=!1){if(!e)return[];const n=[];for(const r of e.nodes)for(let o=0;o1e-9)||h>=Math.PI-1e-9)continue;const d=[-s.u[1],s.u[0]],u=[-a.u[1],a.u[0]],p=[r.point[0]+d[0]*s.halfDepth,r.point[1]+d[1]*s.halfDepth],_=[r.point[0]-u[0]*a.halfDepth,r.point[1]-u[1]*a.halfDepth],m=vs(p,s.u,_,a.u);if(!m)continue;const g=Math.hypot(m[0]-r.point[0],m[1]-r.point[1]);if(!Number.isFinite(g)||g<=r.limit)continue;const f=t?Math.sqrt(Math.max(0,r.limit*r.limit-s.halfDepth*s.halfDepth)):0,v=t?Math.sqrt(Math.max(0,r.limit*r.limit-a.halfDepth*a.halfDepth)):0,y=Ks([[p[0]+s.u[0]*f,p[1]+s.u[1]*f],[_[0]+a.u[0]*v,_[1]+a.u[1]*v],m],e.coordinateScale);if(y&&n.push(y),i){const t=m[0]-r.point[0],i=m[1]-r.point[1],o=Math.hypot(t,i),s=g-r.limit;if(o>e.epsilon&&s>e.epsilon){const a=Math.min(Math.max(8*e.epsilon,.05*r.halfDepth),.25*s),l=t/o,c=i/o,h=-c,d=l,u=Ks([[m[0]-l*a+h*a,m[1]-c*a+d*a],[m[0]-l*a-h*a,m[1]-c*a-d*a],[m[0]+l*a,m[1]+c*a]],e.coordinateScale);u&&n.push(u)}}}return n}({...t,nodes:[e]},i,n));return o&&r?Gt(o,r):o}function Vs(e,t,i,n){if(!e||!t.nodes.length)return e;let r=null;try{r=function(e){let t=null;for(const i of e.nodes){const n=Us(i,e);n&&(t=t?Wt(t,n):n)}return t}(t)}catch{return e}let o=e;for(const e of t.nodes){const s=4*e.halfDepth+2*t.epsilon,a=2*s,l=[[e.point[0]-s,e.point[1]-s],[e.point[0]+s,e.point[1]-s],[e.point[0]+s,e.point[1]+s],[e.point[0]-s,e.point[1]+s]];try{let s=o;const c=Gs(e,t,!1,!0,r);c&&(s=Gt(s,c));let h=js(e,t,a);const d=Gs(e,t,!0,!0,r);d&&(h=Gt(h,d)),r&&(h=Wt(h,r));const u=.02*Math.min(...e.rays.map(e=>e.halfDepth));if(h=Wt(h,Bs([[e.point[0]-u,e.point[1]-u],[e.point[0]+u,e.point[1]-u],[e.point[0]+u,e.point[1]+u],[e.point[0]-u,e.point[1]+u]])),!h)continue;let p=Ut(h,Bs(l));n?p=Ut(p,n):i&&(p=Ut(p,i));const _=Bs(l),m=Gt(s,_),g=i?Gt(Ut(s,_),i):null,f=Ws(e,t,_);o=Wt(m,...g?[g]:[],...f?[f]:[],p)}catch{}}if(r)try{let e=r;n?e=Ut(e,n):i&&(e=Ut(e,i)),o=Wt(o,e)}catch{}return o}function Ks(e,t=1){if(!Array.isArray(e)||e.length<3)return null;const i=Number.isFinite(t)&&t>0?t:1,n=1e-12*Math.max(1,i),r=[];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/n)*n,s=Math.round(i/n)*n;if(!Number.isFinite(o)||!Number.isFinite(s))return null;r.push([Object.is(o,-0)?0:o,Object.is(s,-0)?0:s])}return Math.abs(ms(r))>n*n?r:null}function Ys(e,t,i,n){if(Ns(e[0],e[1],t[0],t[1],i[0],i[1])>n)return!1;const r=i[0]-t[0],o=i[1]-t[1],s=(e[0]-t[0])*r+(e[1]-t[1])*o,a=r*r+o*o,l=n*Math.sqrt(a);return s>=-l&&s<=a+l}function Xs(e,t,i){const n=[],r=[];for(let o=0;oi*i))continue;const d=i/Math.sqrt(h),u=[0,1];for(const e of t)for(const t of[e.a,e.b]){if(!Ys(t,s,a,i))continue;const e=((t[0]-s[0])*l+(t[1]-s[1])*c)/h;e>d&&e<1-d&&u.push(e)}u.sort((e,t)=>e-t);const p=u.filter((e,t)=>0===t||Math.abs(e-u[t-1])>d);for(let e=0;e=3&&r.length===n.length?{poly:n,offsets:r}:null}function Zs(e,t,i,n,r,o,s,a){const l=(e||[]).map(ni).filter(e=>!!e&&e.length>=3);if(!l.length)return null;let c=Wt(Bs(l[0]));for(let e=1;e"outer"===e.kind&&e.half>0),u=4*_s(n,s),p=a||Ts(h,u,s);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=Xs(e,d,u);if(!t||!t.offsets.some(e=>e>0))continue;const i=aa(t.poly,t.offsets,p),n=ws(t.poly,t.offsets,p);if(!i||!n)continue;const r=Gt(Bs(i),Bs(n));_=_?Wt(_,r):r}return{centre:c,shell:_||[]}}function Js(e,t,i,n,r,o,s=1){try{const a=Zs(e,t,i,n,r,o,s,Ps(e,t,i,n,r,o,s));if(!a)return[];return a.shell?.length?Wt(a.centre,a.shell):a.centre}catch{return null}}function Qs(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?" ":"")+ks(i.map(e=>[e[0],e[1]])))}return t}const ea=15;function ta(e,t,i){const n=e?.length||0;if(n<3||t?.length!==n)return!1;const r=e[(i-1+n)%n],o=e[i],s=e[(i+1)%n],a=[r[0]-o[0],r[1]-o[1]],l=[s[0]-o[0],s[1]-o[1]],c=Math.hypot(a[0],a[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,(a[0]*l[0]+a[1]*l[1])/(c*h))),u=Math.acos(d);if(!(u>1e-9))return!1;if(u>=ea*Math.PI/180)return!1;const p=Math.max(0,t[(i-1+n)%n]),_=Math.max(0,t[i]);if(!(p>0||_>0))return!1;const m=Math.sin(u);if(!(m>1e-12))return!1;const g=(_+p*d)/m,f=(p+_*d)/m;return Number.isFinite(g)&&Number.isFinite(f)&&g>0&&f>0&&ge>0))continue;for(const e of l.offsets)e>0&&(u=Math.max(u,2*e));const c=aa(l.poly,l.offsets,d),p=ws(l.poly,l.offsets,d);c&&h.push({outset:c,inset:p})}for(const e of l){const t=e.map(e=>e[0]),i=e.map(e=>e[1]);if(t.length){const n=Math.min(Math.max(...t)-Math.min(...t),Math.max(...i)-Math.min(...i)),r=Math.min(...e.map((t,i)=>{const n=e[(i+1)%e.length];return Math.hypot(n[0]-t[0],n[1]-t[1])}));u=Math.max(u,e.length>16?n:r)}}const p=function(e,t,i,n,r,o,s,a){if(!t?.length||!i?.length)return[];const l=4*_s(n,s),c=new Map;for(const a of zs(e,t,i,n,r,o,s))!a.open&&a.half>0&&!c.has(a.key)&&c.set(a.key,a);const h=[...c.values()];if(h.length<2)return[];const d=a||Ts(h,l),u=[];for(const e of i)for(const t of[[e[0],e[1]],[e[2],e[3]]])u.some(e=>Math.hypot(e[0]-t[0],e[1]-t[1])<=l)||u.push(t);const p=[],_=(e,t)=>{let i=0,n=0;if(Math.hypot(e.a[0]-t[0],e.a[1]-t[1])<=l)i=e.b[0]-e.a[0],n=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],n=e.a[1]-e.b[1]}const r=Math.hypot(i,n);return r>l?[i/r,n/r]:null};for(const e of u){const t=h.map(t=>({iv:t,u:_(t,e)})).filter(e=>!!e.u);for(let i=0;i0?[e.slice(),u,m,_]:[e.slice(),_,m,u];else{if(!f)continue;{const t=[-r.u[1],r.u[0]],i=[-o.u[1],o.u[0]],n=s<0?1:-1,a=[e[0]+t[0]*r.iv.half*n,e[1]+t[1]*r.iv.half*n],l=[e[0]-i[0]*o.iv.half*n,e[1]-i[1]*o.iv.half*n];y=s>0?[e.slice(),a,l]:[e.slice(),l,a]}}Math.abs(ms(y))>l*l&&p.push(y)}}return p}(e,t,i,r,o,s,a,d),_=n.length?la(e,t,i,r,o,s,a):null;let m="exterior";try{const v=Zs(e,t,i,r,o,s,a,d);m="paper";const y=v?v.shell?.length?Wt(v.centre,v.shell):v.centre:[],b=e=>{const t=Bs(e.outset);if(!e.inset)return t;const i=Bs(e.inset);return Gt(t,i)};m="room-rings";let w=null;for(const e of h)try{const t=b(e);w=w?Wt(w,t):t}catch{}if(m="edge-bodies",v)for(const n of oa(e,t,i,r,o,s,a))try{const e=Ut(Bs(n.quad),v.centre);w=w?Wt(w,e):e}catch{}m="junctions",w=function(e,t,i=1,n=Wt){let r=e;for(const e of t||[]){const t=Ks(e,i);if(t)try{const e=Bs(t);r=r?n(r,e):e}catch{}}return r}(w,p,a),m="facade-clip",w&&v&&(w=Ut(w,v.centre)),m="exterior-shell";const k=[];let x=0;if(v?.shell?.length)if(w)try{const e=Wt(w,v.shell);if(!qs(e))throw new Error("invalid shell union");w=e}catch{if(!qs(w)||!qs(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=Vs(w,{...d,nodes:t},v?.centre,y)}}if(m="junction-corners",d.nodes.length){const n=Ds(d),l=function(e,t,i,n,r,o,s,a){try{const l=Zs(e,t,i,n,r,o,s,{epsilon:a.epsilon,coordinateScale:a.coordinateScale,nodes:[],index:new Map});return l?l.shell?.length?Wt(l.centre,l.shell):l.centre:null}catch{return null}}(e,t,i,r,o,s,a,d);for(const e of n.fans)try{let t=[Bs(e)];if(l&&(t=Ut(t,l)),!t?.length)continue;w=w?Wt(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(ms(t||[]))<=f?null:[t,...i.filter(e=>Math.abs(ms(e||[]))>f)]}).filter(e=>!!e):g}const S=w||[],$=[...qs(S)?[{id:"room-primary",geom:S}]:[],...k.map((e,t)=>({id:`room-isolated-${t}`,geom:e.geom}))];m="openings";for(const e of n){if(!(e.length>0))continue;const t=da(_,e,!0);if(!t.negative&&!t.positive)continue;const i=e.angle*Math.PI/180,n=Math.cos(i),o=Math.sin(i),s=-o,l=n,c=e.length/2,h=1.25*Math.max(u,r*a),d=[[e.x-n*c-s*h,e.y-o*c-l*h],[e.x+n*c-s*h,e.y+o*c-l*h],[e.x+n*c+s*h,e.y+o*c+l*h],[e.x-n*c+s*h,e.y-o*c+l*h]];w&&(w=Gt(w,Bs(d)));for(const e of k)e.geom=Gt(e.geom,Bs(d))}m="extras";const M=[];let R=0;const C=c.mergeExtra||((e,t)=>e?Wt(e,t):t);for(let e=0;ee.length>=2&&Number.isFinite(e[0])&&Number.isFinite(e[1]))||Math.abs(Ci(t))<=1e-9){R++;continue}const i=[Bs(t)];try{const t=C(w,i,e);if(!qs(t))throw new Error("invalid extra union");w=t}catch{R++,qs(i)&&M.push({id:`extra-${e}`,geom:i})}}M.push(...k),M.sort((e,t)=>Qs(e.geom).localeCompare(Qs(t.geom)));const T=w||[];return{status:R||x?"degraded-extra":"ok",geom:T,components:[...qs(T)?[{id:"primary",geom:T}]:[],...M.map((e,t)=>({...e,id:`isolated-${t}`}))],roomGeom:S,roomComponents:$,paperGeom:y,depthUnits:u,openingPadUnits:1.25*Math.max(u,r*a),openingIndex:_,multiWallNodes:d,degradedExtraCount:R+x}}catch{return c.onCoreFailure?.(m),{status:"failed-core",geom:[],components:[],roomGeom:[],paperGeom:[],roomComponents:[],depthUnits:u,openingIndex:null,multiWallNodes:d,degradedExtraCount:0}}var g,f}function na(e,t,i,n=[],r,o,s,a=1,l=[],c={}){if(!t?.length&&!l.length)return null;return ra(ia(e,t,i,n,r,o,s,a,l,c))}function ra(e){if("failed-core"===e.status||"not-applicable"===e.status)return null;const t=e.components.map(e=>({id:e.id,d:Qs(e.geom),fillRule:"evenodd"})).filter(e=>!!e.d),i=t[0]?.d||"",n=Qs(e.paperGeom);if(t.length){const r={status:e.status,d:i,paths:t,components:e.components,roomGeom:e.roomGeom,multiWallNodes:e.multiWallNodes,paperD:n,depthUnits:e.depthUnits,fillRule:"evenodd"};return Object.defineProperties(r,{roomComponents:{value:e.roomComponents||[],enumerable:!1},openingIndex:{value:e.openingIndex,enumerable:!1},openingPadUnits:{value:e.openingPadUnits,enumerable:!1}}),r}return null}function oa(e,t,i,n,r,o,s=1){if(!t?.length)return[];const a=new Set,l=[];for(const c of e||[]){if(!c?.id)continue;const h=Fs(e,c.id,t,i,n,r,o,s);if(!h)continue;const d=h.poly;for(let e=0;e0))continue;const p=qo(t,i,n,s);if(a.has(p))continue;a.add(p);const _=Oo(u,r,o),[m,g]=gs(d,e),f=-m,v=-g,y=_/2,b=[[t[0]+f*y,t[1]+v*y],[i[0]+f*y,i[1]+v*y],[i[0]+m*y,i[1]+g*y],[t[0]+m*y,t[1]+g*y]];l.push({key:p,kind:c,cm:u,quad:b,a:[t[0],t[1]],b:[i[0],i[1]],depthUnits:_})}}return l}function sa(e,t=[]){let i=ks(e.quad);const[n,r]=Lo(e.a,e.b),o=n,s=r,a=-s,l=o;for(const n of t){if(!Zo(e.a,e.b,n.angle))continue;if(Ns(n.x,n.y,e.a[0],e.a[1],e.b[0],e.b[1])>Math.max(.55*e.depthUnits,.001))continue;const t=n.length/2,r=e.depthUnits,c=n.x,h=n.y;i+=` ${ks(xs([[c-o*t-a*r,h-s*t-l*r],[c+o*t-a*r,h+s*t-l*r],[c+o*t+a*r,h+s*t+l*r],[c-o*t+a*r,h-s*t+l*r]]))}`}return i}function aa(e,t,i){const n=e?.length||0;if(n<3||t.length!==n)return null;if(t.every(e=>!(e>0)))return e.map(e=>[e[0],e[1]]);xs(e),t.slice().reverse();const r=[];for(let o=0;o0||l>0)){r.push([e[o][0],e[o][1]]);continue}if(a>0!=l>0){const t=e[o],i=a>0?[t[0]-c*a,t[1]-h*a]:[t[0],t[1]],n=l>0?[t[0]-d*l,t[1]-u*l]:[t[0],t[1]];r.push(i),Math.hypot(n[0]-i[0],n[1]-i[1])>1e-9&&r.push(n);continue}if(fs(w,k)){const t=e[o],i=[t[0]-c*a,t[1]-h*a],n=[t[0]-d*l,t[1]-u*l];r.push(i),Math.hypot(n[0]-i[0],n[1]-i[1])>1e-9&&r.push(n);continue}const $=vs(x,w,S,k),M=Math.max(a,l,1e-9),R=As(i,e[o])?.limit??4*M;if($){const i=Math.hypot($[0]-e[o][0],$[1]-e[o][1]);if(Number.isFinite(i)&&i<=R){r.push($);continue}if(ta(e,t,o)){r.push([e[o][0],e[o][1]]);continue}}a>0&&r.push([e[o][0]-c*a,e[o][1]-h*a]),l>0&&r.push([e[o][0]-d*l,e[o][1]-u*l])}return r.length>=3?r:null}function la(e,t,i,n,r,o,s=1){const a=[];for(const l of e||[]){if(!l?.id)continue;const c=Fs(e,l.id,t,i,n,r,o,s);if(!c)continue;const h=Math.abs(Ci(c.poly));for(let e=0;e[Math.max(t,e.x0),Math.min(i,e.x1)]).filter(e=>e[1]-e[0]>n).sort((e,t)=>e[0]-t[0]||e[1]-t[1]);if(!r.length)return{coverage:0,full:!1};let o=r[0][0],s=r[0][1],a=0,l=o<=t+n;for(let e=1;e=i-n,{coverage:a,full:l}}function ha(e,t){return Number(t.full)-Number(e.full)||e.faceDistance-t.faceDistance||e.area-t.area||e.roomId.localeCompare(t.roomId)}function da(e,t,i=!1){const n=Number(t?.x),r=Number(t?.y),o=Number(t?.angle),s=Number(t?.length);if(!([n,r,o,s].every(Number.isFinite)&&s>0))return{negative:null,positive:null};const a=o*Math.PI/180,l=Math.cos(a),c=Math.sin(a),h=-c,d=l,u=s/2,p=Math.max(1e-9,e.adjacencyEps),_=new Map;let m=0;for(const t of e.edges){if(i&&!(t.half>0))continue;if(!Zo(t.a,t.b,o))continue;const[e,s]=Lo(t.a,t.b);if(Math.abs((n-t.a[0])*s-(r-t.a[1])*e)>p)continue;const a=(t.a[0]-n)*l+(t.a[1]-r)*c,g=(t.b[0]-n)*l+(t.b[1]-r)*c,f=Math.max(-u,Math.min(a,g)),v=Math.min(u,Math.max(a,g));if(v-f<=p)continue;const y=t.inward[0]*h+t.inward[1]*d>=0?1:-1,b=((t.a[0]+t.b[0])/2-n)*h+((t.a[1]+t.b[1])/2-r)*d,w=Math.abs(b+y*t.half),k=`${y}|${t.roomId}`,x={x0:f,x1:v,half:t.half,cm:t.cm,key:t.key,axis:[e,s]},S=_.get(k);S?(S.pieces.push(x),S.faceDistance=Math.min(S.faceDistance,w)):_.set(k,{roomId:t.roomId,side:y,order:m++,pieces:[x],faceDistance:w,area:t.area,coverage:0,full:!1})}for(const e of _.values()){const t=ca(e.pieces,-u,u,p);e.coverage=t.coverage,e.full=t.full}const g=e=>{const t=[..._.values()].filter(t=>t.side===e&&t.coverage>p);return t.sort(ha),t[0]||null};return{negative:g(-1),positive:g(1)}}function ua(e,t,i,n,r,o,s=1,a=[]){return pa(la(e,i,a,n,r,o,s),t)}function pa(e,t){const i=da(e,t),n=[i.negative,i.positive].filter(e=>!!e);if(!n.length)return{ox:0,oy:0,cm:0,side:-1};const r=i.negative&&i.positive?-1:n[0].side,o=t.flip_v?-r:r,s=(-1===o?i.negative:i.positive)||n[0],a=[...s.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(!(a.half>0&&a.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*a.half,oy:h*o*a.half,cm:a.cm,side:o}}function _a(e,t){const i=1e-9,n=t.filter(e=>Number.isFinite(e.x0)&&Number.isFinite(e.x1)&&Number.isFinite(e.half)&&e.x1>e.x0&&e.half>0);if(!n.length)return"";const r=n.flatMap(e=>[e.x0,e.x1]).sort((e,t)=>e-t),o=[];for(const e of r){const t=o[o.length-1];(void 0===t||e>t+i)&&o.push(e)}const s=[];for(let e=0;e+1t+i))continue;const a=(t+r)/2,l=n.reduce((e,t)=>a>=t.x0-i&&a<=t.x1+i?Math.max(e,t.half):e,0);if(!(l>0))continue;const c=s[s.length-1];c&&t<=c.x1+i&&Math.abs(l-c.half)<=i?c.x1=r:s.push({x0:t,x1:r,half:l})}const a=[];for(const e of s){const t=a[a.length-1],n=t?.[t.length-1];n&&e.x0<=n.x1+i?(e.x0=n.x1,t.push(e)):a.push([e])}return a.map(t=>{const i=t[0],n=t[t.length-1],r=Math.min(.25*Math.min(...t.map(e=>e.half)),.75),o=-e*r,s=[];if(1===e){s.push(`M ${i.x0} ${o} L ${n.x1} ${o}`);for(let e=t.length-1;e>=0;e--){const i=t[e];s.push(`L ${i.x1} ${i.half} L ${i.x0} ${i.half}`)}}else{s.push(`M ${n.x1} ${o} L ${i.x0} ${o}`);for(const e of t)s.push(`L ${e.x0} ${-e.half} L ${e.x1} ${-e.half}`)}return s.push("Z"),s.join(" ")}).join(" ")}function ma(e,t,i,n){if(!n)return i;const r=e.angle*Math.PI/180,o=Math.cos(r),s=Math.sin(r),a=[],l=1e-9;for(const r of i){const[i,c]=r.axis,h=o*i+s*c;if(Math.abs(h)<=l)continue;const d=e.x*i+e.y*c,u=d+h*r.x0,p=d+h*r.x1,_=Math.min(u,p),m=Math.max(u,p),g=`${r.key}|${t}`,f=n.get(g)||[];let v=[[_,m]];for(const[e,t]of f){const i=[];for(const[n,r]of v)t<=n+l||e>=r-l?i.push([n,r]):(e>n+l&&i.push([n,Math.min(r,e)]),te[0]-t[0]||e[1]-t[1]),b=[];for(const e of y){const t=b[b.length-1];t&&e[0]<=t[1]+l?t[1]=Math.max(t[1],e[1]):b.push([e[0],e[1]])}n.set(g,b)}return a}function ga(e,t){const i=new Map;return t.map(t=>function(e,t,i){const n=da(e,t,!0),r=n.negative,o=n.positive;if(!r&&!o)return null;let s;if(r&&o)s=[{candidate:r,side:-1},{candidate:o,side:1}];else{const e=r||o;s=[{candidate:e,side:-1},{candidate:e,side:1}]}const a=s.map(({candidate:e,side:n})=>({candidate:e,side:n,pieces:ma(t,n,e.pieces,i)})),l=a.map(({candidate:e,side:t,pieces:i})=>({side:t,roomId:e.roomId,d:_a(t,i)})),c=a.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 fa=150,va=1e-6;function ya(e){return Number.isFinite(e)?Math.max(1,Math.min(fa,e)):1}function ba(e){return((Number.isFinite(Number(e))?Number(e):0)%90+90)%90}const wa=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]},ka=(e,t)=>e[0]===t[0]&&e[1]===t[1];function xa(e,t=1e-6){const i=Number.isFinite(t)&&t>0?t:va,n=[];for(const t of e||[]){if(!Array.isArray(t)||t.length<2)return null;const e=Number(t[0]),r=Number(t[1]);if(!Number.isFinite(e)||!Number.isFinite(r))return null;const o=Math.round(e/i)*i,s=Math.round(r/i)*i;if(!Number.isFinite(o)||!Number.isFinite(s))return null;const a=[Object.is(o,-0)?0:o,Object.is(s,-0)?0:s];n.length&&ka(n[n.length-1],a)||n.push(a)}return n.length>1&&ka(n[0],n[n.length-1])&&n.pop(),n.length<3||new Set(n.map(e=>`${e[0]},${e[1]}`)).size<3?null:Ci(n)>i*i?n:null}function Sa(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 $a(e,t,i,n,r){return os({a:e,b:t,halfDepth:Oo(i,n,r)/2})}function Ma(e,t,i){const n=Number(t)>0?Number(t):5,r=ya(e.cm)/n*i,o=e.center[0],s=e.center[1];if("circle"===e.shape){const e=r/2;return Array.from({length:96},(t,i)=>{const n=i/96*Math.PI*2;return[o+Math.cos(n)*e,s+Math.sin(n)*e]})}const a=r/2,l=ba(e.angle)*Math.PI/180,c=Math.cos(l),h=Math.sin(l);return[[-a,-a],[a,-a],[a,a],[-a,a]].map(([e,t])=>[o+e*c-t*h,s+e*h+t*c])}function Ra(e,t){const i=Number.isFinite(t)?Math.max(0,Math.min(1,t)):0,n=(e.a[0]+e.b[0])/2,r=(e.a[1]+e.b[1])/2,o=(e.b[0]-e.a[0])*i/2,s=(e.b[1]-e.a[1])*i/2;return{...e,a:[n-o,r-s],b:[n+o,r+s]}}function Ca(e,t,i=1e-9){if(!t.length)return[e];let n=[wa(e)];try{for(const e of t){const t=e.b[0]-e.a[0],r=e.b[1]-e.a[1],o=Math.hypot(t,r);if(!(o>i))continue;const s=t/o,a=r/o,l=-a,c=s,h=1.25*Math.max(Number(e.depth)||0,4*i),d=Math.max(2*i,1e-9*o),u=[[e.a[0]-s*d-l*h,e.a[1]-a*d-c*h],[e.b[0]+s*d-l*h,e.b[1]+a*d-c*h],[e.b[0]+s*d+l*h,e.b[1]+a*d+c*h],[e.a[0]-s*d+l*h,e.a[1]-a*d+c*h]];n=Gt(n,wa(u))}return Na(n)}catch{return[e]}}function Ta(e,t){try{const i=Gt([[...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 n=null,r=0;for(const e of i||[]){const t=e?.[0]||[],i=Math.abs(Ci(t));t.length>=4&&i>r&&(r=i,n=t.slice(0,-1).map(e=>[e[0],e[1]]))}return n}catch{return null}}function Da(e,t,i,n=Math.max(2e-4*i,1e-9),r=[]){const o=[],s=new Map;for(const e of r){const t=s.get(e.hostId)||[];t.push(e),s.set(e.hostId,t)}const a=[],l=[],c=[];for(const n of e.partitions||[]){const e={a:n.a,b:n.b,halfDepth:Oo(n.cm,t,i)/2};if(!(e.halfDepth>0))continue;const r=os(e);r&&(o.push(e),a.push(r),c.push({id:n.id,body:r}))}const h=o;for(const{segmentIndex:e,wedge:t}of hs(h,n)){const i={list:a,at:e},n=Ta(i.list[i.at],t);n&&(i.list[i.at]=n,c[i.at].body=n)}for(const e of c)l.push(...Ca(e.body,s.get(e.id)||[],n));const d=(e.wall_columns||[]).map(e=>Ma(e,t,i)),u=ds(o,n).flatMap(e=>Ca(e,r,n));return{partitions:a,columns:d,patches:u,all:[...l,...u,...d]}}function Aa(e){try{const t=e.map(e=>xa(e)).filter(e=>!!e).map(e=>wa(e));return t.length?Wt(t[0],...t.slice(1)):null}catch{return null}}const Pa=e=>`M ${e.map(e=>`${e[0]} ${e[1]}`).join(" L ")} Z`;function Fa(e){const t=[];for(const i of e||[]){if(Oa([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(Pa(i.slice(0,-1)))}e.length&&t.push(e.join(" "))}return t}function za(e,t,i={}){const n=Aa(e.filter(e=>e.length>=3)),r=t.some(e=>!xa(e))?null:Aa(t);if(!n)return[];if(r)try{return Fa(Ut(n,r))}catch{}return function(e,t,i){let n=null;for(let r=0;r=4&&t.push(e.slice(0,-1).map(e=>[e[0],e[1]]));return t}function Na(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 Ha(e,t){let i=!1;for(let n=0,r=t.length-1;ne[1]!=l>e[1]&&e[0]<(a-o)*(e[1]-s)/(l-s||1e-12)+o&&(i=!i)}return i}function La(e,t){for(const i of t||[]){const t=i?.[0];if(!t?.length||!Ha(e,t))continue;let n=!1;for(let t=1;ti)return!1;if(Math.abs(ya(e.cm)-ya(t.cm))>1e-6)return!1;if(e.shape!==t.shape)return!0;if("circle"===e.shape||"circle"===t.shape)return!0;const n=Math.abs(ba(e.angle)-ba(t.angle));return Math.min(n,90-n)<=1e-6}const qa=2.54;function ja(e){const t="number"==typeof e?e:NaN;return!Number.isFinite(t)||t<=0||5===t?1:5/t}function Wa(e,t){return e*ja(t)}function Ua(e){return e?qa:1}function Ga(e,t){if(!t)return String(e);const i=e/qa;return String(Math.round(1e6*i)/1e6)}function Va(e,t){return t?e*qa:e}const Ka=1e3;function Ya(e,t){const i=Number(e),n=Number.isFinite(i)&&i>0?i:1,r=n>=1?t:t*n,o=n>=1?t/n:t;return{x:(t-r)/2,y:(t-o)/2,w:r,h:o}}const Xa=.01,Za=100;function Ja(e,t=1e3){const i=Ya(e?.plan_aspect,t),n=Number(e?.plan_scale),r=Number.isFinite(n)&&n>0?Math.min(Za,Math.max(Xa,n)):1,o=Number(e?.plan_scale_x),s=Number(e?.plan_scale_y),a=Number.isFinite(o)&&o>0?Math.min(Za,Math.max(Xa,o)):r,l=Number.isFinite(s)&&s>0?Math.min(Za,Math.max(Xa,s)):r,c=Number(e?.plan_x),h=Number(e?.plan_y),d=Dr(e?.plan_angle);return{x:i.x+(Number.isFinite(c)?cl(c):0)*t,y:i.y+(Number.isFinite(h)?cl(h):0)*t,w:i.w*a,h:i.h*l,...d?{angle:d}:{}}}function Qa(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 el(e){return e&&Array.isArray(e.spaces)?e.spaces.map(e=>{const t=Ka,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]*Ka,i[1]*t,i[2]*Ka,i[3]*t],bg:e.plan_url?{href:Hn(e.plan_url),...Ja(e,Ka)}:null,rooms:(e.rooms||[]).map(e=>{const i={...e,...Qa(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*Ka:void 0,y:null!=i.y?i.y*t:void 0,w:null!=i.w?i.w*Ka:void 0,h:null!=i.h?i.h*t:void 0,poly:i.poly?i.poly.map(e=>[e[0]*Ka,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])*Ka,Number(e.a?.[1])*t],b:[Number(e.b?.[0])*Ka,Number(e.b?.[1])*t],cm:Number(e.cm)})),partitions:(e.partitions||[]).map(e=>({id:e.id,a:[e.a[0]*Ka,e.a[1]*t],b:[e.b[0]*Ka,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]*Ka,e.center[1]*t],cm:Number(e.cm),..."circle"===e.shape?{}:{angle:ba(e.angle)}}))}}):[]}const tl=5e3,il=tl*Ka,nl=240,rl=Ka/nl,ol=1/nl;function sl(e){if(!Number.isFinite(e))return e;const t=Math.round(e*nl/Ka)*Ka/nl;return Math.abs(t-e)<=1e-9*rl?e:t}function al(e){return{x:sl(e.x),y:sl(e.y)}}function ll(e){return Number.isFinite(e)?Math.min(il,Math.max(-il,e)):0}function cl(e){return Number.isFinite(e)?Math.min(tl,Math.max(-tl,e)):0}const hl=1/3,dl=200;function ul(e){return"house"===e?"house":"content"}function pl(e){let t=1/0,i=1/0,n=-1/0,r=-1/0;for(const o of e){const e=Number(o[0]),s=Number(o[1]);Number.isFinite(e)&&Number.isFinite(s)&&(en&&(n=e),s>r&&(r=s))}return t>n?null:{minX:t,minY:i,maxX:n,maxY:r}}function _l(e){const t=[],i=e=>{if(Array.isArray(e))if(e.length>=2&&Number.isFinite(Number(e[0]))&&Number.isFinite(Number(e[1])))t.push([Number(e[0]),Number(e[1])]);else for(const t of e)i(t)};return i(e),pl(t)}function ml(e,t){const i=Number.isFinite(t)&&t>0?t:0;return{minX:e.minX-i,minY:e.minY-i,maxX:e.maxX+i,maxY:e.maxY+i}}function gl(e){return e.poly&&e.poly.length?pl(e.poly):null==e.x||null==e.y?null:pl([[e.x,e.y],[e.x+(e.w||0),e.y+(e.h||0)]])}function fl(e,t=1e3,i=1e3){const n=Number(e.x)*t,r=Number(e.y)*i,o=Number(e.w)*t,s=Number(e.h)*i;return![n,r,o,s].every(Number.isFinite)||o<=0||s<=0?null:pl(Nr({x:n,y:r,w:o,h:s,angle:Dr(e.angle)||void 0}))}function vl(e,t){const i=[];for(const t of e.rooms||[]){const e=gl(t);e&&i.push(e)}if(e.bg){const t=pl(Nr(e.bg));t&&i.push(t)}for(const e of t||[])if(Array.isArray(e)){const t=pl([e]);t&&i.push(t)}else i.push(e);return i}const yl=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},bl=e=>{let t=1/0,i=1/0,n=-1/0,r=-1/0;for(const o of e)o.minXn&&(n=o.maxX),o.maxY>r&&(r=o.maxY);return t>n||i>r?null:{x:t,y:i,w:n-t,h:r-i}};function wl(e,t){let{x:i,y:n,w:r,h:o}=e;r<30&&(i=i+r/2-100,r=dl),o<30&&(n=n+o/2-100,o=dl);const s="number"==typeof t?{top:t,right:t,bottom:t,left:t}:t,a=Math.max(r,o),l=a*s.top,c=a*s.right,h=a*s.bottom,d=a*s.left;return{x:i-d,y:n-l,w:r+d+c,h:o+l+h}}function kl(e,t={}){const i=t.pad??.05,n=t.k??10,r=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)<=il&&Math.abs(e.maxX)<=il&&Math.abs(e.minY)<=il&&Math.abs(e.maxY)<=il);if(!o.length)return{core:null,all:null,outliers:0};const s=bl(o);if(o.length<4){const e=wl(s,i);return{core:e,all:e,outliers:0}}const a=o.map(e=>(e.minX+e.maxX)/2),l=o.map(e=>(e.minY+e.maxY)/2),c=yl(a),h=yl(l),d=o.map((e,t)=>Math.max(Math.abs(a[t]-c),Math.abs(l[t]-h))),u=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),r),p=d.map(e=>e>n*u),_=p.filter(Boolean).length,m=_&&_<=o.length*hl?o.filter((e,t)=>!p[t]):o;return{core:wl(bl(m)||s,i),all:wl(s,i),outliers:m===o?0:_}}function xl(e){return kl(e,{pad:0}).all}function Sl(e,t,i=.05){const n=kl(vl(e,t),{pad:i});if(n.core)return n.core;const r=e.vb&&4===e.vb.length&&e.vb[2]>0&&e.vb[3]>0?e.vb:[0,0,Ka,Ka];return{x:r[0],y:r[1],w:r[2],h:r[3]}}function $l(e){const t=Sl(e);return{x:t.x+t.w/2,y:t.y+t.h/2}}function Ml(e){const t=[];for(const i of e.rooms||[]){const e=gl(i);e&&t.push(e)}const i=kl(t,{pad:0}).core,n=Ka*ja(e.cellCm??5);return i?Math.max(n,Math.min(il,Math.max(i.w,i.h))):n}function Rl(e,t,i,n=1){const r=Number(i),o=Number.isFinite(n)&&n>0?n:1;return!Number.isFinite(r)||r<=0?e*o:e*Ml(t)*o/r}const Cl=[1,2,5,10,20,50,100,200,500,1e3];function Tl(e,t,i=7){if(!(e>0&&t>0&&Number.isFinite(t)))return null;const n=Cl.find(n=>e*n*t>=i);if(void 0===n)return null;const r=Cl.find(e=>e>=5*n)??5*n;return{fine:n,coarse:r}}function Dl(e){if(e.poly&&e.poly.length){const t=e.poly.map(e=>e[0]),i=e.poly.map(e=>e[1]),n=Math.min(...t),r=Math.min(...i);return{x:n,y:r,w:Math.max(...t)-n,h:Math.max(...i)-r}}return{x:e.x??0,y:e.y??0,w:e.w??0,h:e.h??0}}function Al(e,t,i,n,r,o=new Set){const s=t[e.id];return!o.has(e.id)&&s&&s.s===e.space?{x:s.x*Ka,y:s.y*Ka}:n[e.id]?n[e.id]:al($l(r))}function Pl(e,t,i,n){const r=i["rl_"+(e.id||"")];if(r&&r.s===t)return{x:r.x*Ka,y:r.y*Ka};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 al({x:o[0],y:o[1]})}function Fl(e,t){for(const i of e?.spaces??[])for(const e of i?.decor??[])if("furniture"===e?.kind&&"string"==typeof e.symbol&&t(e.symbol))return!0;return!1}let zl=0;const Il=new Set;const Ol=new class{constructor(e){this.options=e,this._art=null,this._failed=!1,this._terminal=!1,this._inFlight=null,this._hosts=new Set,this._settled=[]}state(){return this._art?"ready":this._failed?"fallback":"pending"}get terminal(){return this._terminal}art(e,t){if(this._art)return this._art[e];t&&!this._failed&&this._hosts.add(t)}adopt(e,t){return!!this._art||(t!==this.options.expectedFingerprint?((this.options.warn??console.warn)("[houseplan] furniture artwork from another build ignored",{fingerprint:t}),!1):(this._install(e),!0))}ensure(){return"pending"!==this.state()?Promise.resolve():(this._inFlight||(this._inFlight=this._loadWithRetry().finally(()=>{this._inFlight=null})),this._inFlight)}onSettled(e){"pending"===this.state()?this._settled.push(e):Promise.resolve().then(e)}async _loadWithRetry(){let e=new Error("furniture artwork did not load");for(const t of[0,1])try{const i=await this.options.load(t);if(i.FURNITURE_ART_FINGERPRINT!==this.options.expectedFingerprint){this._terminal=!0,e=new Error(`furniture artwork fingerprint mismatch: expected ${this.options.expectedFingerprint}, got ${i.FURNITURE_ART_FINGERPRINT}`);break}if(this._art)return;return void this._install(i.GENERATED_FURNITURE_ART)}catch(t){e=t}this._art||(this._failed=!0,(this.options.warn??console.warn)("[houseplan] furniture artwork unavailable",e),this.options.loadFailed?.(this._terminal),this._flush())}_install(e){this._art=e,this._failed=!1,this._flush()}_flush(){const e=[...this._hosts];this._hosts.clear();for(const t of e)t.isConnected&&t.requestUpdate();const t=this._settled.splice(0);for(const e of t)e()}}({expectedFingerprint:"4da0d706a85c3f1c08ab6de960deb5feb08baaf9055265234e7bd1b554332653",load:async e=>0===e?await import("./furniture-plan-art.generated-CDfS5UbT.js"):await import((()=>{const e=new URL("./furniture-plan-art.generated-CDfS5UbT.js",import.meta.url);return e.searchParams.set("hp_retry","art-"+ ++zl),e.href})()),loadFailed:e=>{for(const t of Il)t(e)}}),El=["furniture","appliance","sanitary","other"],Nl=[{id:"sofa",group:"furniture",category:"sofa",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",category:"armchair",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",category:"coffee_table",w:110,h:60,g:[["r",0,0,1,1],["r",.08,.14,.84,.72]]},{id:"table_dining",group:"furniture",category:"dining_table",w:140,h:80,g:[["r",0,0,1,1],["r",.06,.11,.88,.78]]},{id:"table_round",group:"furniture",category:"dining_table",w:120,h:120,g:[["e",.5,.5,.5,.5],["e",.5,.5,.41,.41]]},{id:"chair",group:"furniture",category:"chair",w:45,h:45,g:[["r",0,0,1,.18],["r",.06,.18,.88,.8]]},{id:"desk",group:"furniture",category:"work_table",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",category:"bed",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",category:"bed",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",category:"nightstand",w:45,h:40,g:[["r",0,0,1,1],["r",.12,.14,.76,.33],["r",.12,.53,.76,.33]]},{id:"wardrobe",group:"furniture",category:"wardrobe",w:100,h:60,g:[["r",0,0,1,1],["l",0,.72,1,.72],["l",.5,.72,.5,1]]},{id:"bookshelf",group:"furniture",category:"wardrobe",w:80,h:30,g:[["r",0,0,1,1],["l",.34,0,.34,1],["l",.67,0,.67,1]]},{id:"fridge",group:"appliance",category:"fridge",w:60,h:65,g:[["r",0,0,1,1],["l",0,.36,1,.36],["l",.83,.44,.83,.64]]},{id:"stove",group:"appliance",category:"cooktop",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",category:"dishwasher",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",category:"washer",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",category:"dryer",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",category:"tv",w:120,h:30,g:[["r",0,0,1,.42],["l",.5,.42,.5,.72],["l",.3,.72,.7,.72]]},{id:"ac",group:"appliance",category:"air_conditioner",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",category:"boiler",w:45,h:45,g:[["e",.5,.5,.5,.5],["e",.5,.5,.31,.31]]},{id:"toilet",group:"sanitary",category:"toilet",w:40,h:70,g:[["r",.06,0,.88,.2],["e",.5,.58,.37,.35],["e",.5,.58,.22,.2]]},{id:"bathtub",group:"sanitary",category:"bathtub",w:170,h:75,g:[["r",0,0,1,1],["r",.05,.11,.77,.78],["e",.89,.5,.045,.1]]},{id:"shower",group:"sanitary",category:"shower",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",category:"sink",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",category:"kitchen_sink",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",category:"bidet",w:40,h:55,g:[["e",.5,.5,.44,.5],["e",.5,.5,.26,.3]]},{id:"stairs",group:"other",category:"stairs",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",category:"fireplace",w:120,h:40,g:[["r",0,0,1,1],["p",.22,1,.22,.42,.78,.42,.78,1]]},{id:"plant",group:"other",category:"plant",w:40,h:40,g:[["e",.5,.5,.22916667,.22916667],["l",.5,.27083333,.5,0],["l",.5,.72916667,.5,1],["l",.27083333,.5,0,.5],["l",.72916667,.5,1,.5],["l",.33333333,.33333333,.11458333,.11458333],["l",.66666667,.66666667,.88541667,.88541667],["l",.66666667,.33333333,.88541667,.11458333],["l",.33333333,.66666667,.11458333,.88541667]]},{id:"rug",group:"other",category:"rug",w:200,h:140,g:[["r",0,0,1,1],["r",.06,.09,.88,.82]]}],Hl=new Set(["fridge","dishwasher","washer","dryer","ac","water_heater","shower","sink","stairs","fireplace","plant","rug"]),Ll=[...[{id:"coffee_table",group:"furniture",category:"coffee_table",w:120,h:60},{id:"coffee_table_round",group:"furniture",category:"coffee_table",w:80,h:80},{id:"coffee_table_oval",group:"furniture",category:"coffee_table",w:120,h:60},{id:"coffee_table_rounded",group:"furniture",category:"coffee_table",w:120,h:60},{id:"table_dining",group:"furniture",category:"dining_table",w:160,h:90},{id:"table_round",group:"furniture",category:"dining_table",w:110,h:110},{id:"table_dining_oval",group:"furniture",category:"dining_table",w:180,h:100},{id:"table_dining_rounded",group:"furniture",category:"dining_table",w:160,h:90},{id:"desk",group:"furniture",category:"work_table",w:140,h:70},{id:"desk_corner",group:"furniture",category:"work_table",w:160,h:160},{id:"chair",group:"furniture",category:"chair",w:50,h:50},{id:"chair_bar",group:"furniture",category:"chair",w:45,h:48},{id:"armchair",group:"furniture",category:"armchair",w:90,h:90},{id:"armchair_office",group:"furniture",category:"armchair",w:65,h:65},{id:"sofa",group:"furniture",category:"sofa",w:180,h:90},{id:"sofa_three_seat",group:"furniture",category:"sofa",w:240,h:90},{id:"sofa_corner_right",group:"furniture",category:"sofa",w:260,h:170},{id:"bed_single",group:"furniture",category:"bed",w:90,h:200},{id:"bed_double",group:"furniture",category:"bed",w:160,h:200},{id:"nightstand",group:"furniture",category:"nightstand",w:50,h:40},{id:"cabinet_tv",group:"furniture",category:"nightstand",w:140,h:45},{id:"cabinet_shoe",group:"furniture",category:"nightstand",w:80,h:35},{id:"cabinet_sink",group:"furniture",category:"nightstand",w:80,h:50},{id:"bookshelf",group:"furniture",category:"wardrobe",w:100,h:35},{id:"wall_unit",group:"furniture",category:"wardrobe",w:240,h:45},{id:"wardrobe",group:"furniture",category:"wardrobe",w:180,h:60},{id:"kitchen_floor",group:"furniture",category:"kitchen_cabinet",w:60,h:60},{id:"kitchen_floor_corner",group:"furniture",category:"kitchen_cabinet",w:90,h:90},{id:"kitchen_wall",group:"furniture",category:"kitchen_cabinet",w:60,h:35},{id:"kitchen_wall_corner",group:"furniture",category:"kitchen_cabinet",w:60,h:60},{id:"shelf_floor",group:"furniture",category:"shelving",w:100,h:35},{id:"shelf_wall",group:"furniture",category:"shelving",w:100,h:25},{id:"cooktop_two",group:"appliance",category:"cooktop",w:30,h:50},{id:"stove",group:"appliance",category:"cooktop",w:60,h:60},{id:"tv",group:"appliance",category:"tv",w:120,h:28},{id:"tv_wall",group:"appliance",category:"tv",w:120,h:15},{id:"toilet",group:"sanitary",category:"toilet",w:40,h:70},{id:"toilet_built_in",group:"sanitary",category:"toilet",w:40,h:55},{id:"bathtub",group:"sanitary",category:"bathtub",w:170,h:75},{id:"bathtub_corner",group:"sanitary",category:"bathtub",w:140,h:140},{id:"bidet",group:"sanitary",category:"bidet",w:40,h:60},{id:"bidet_built_in",group:"sanitary",category:"bidet",w:40,h:50},{id:"kitchen_sink",group:"sanitary",category:"kitchen_sink",w:60,h:50},{id:"kitchen_sink_double",group:"sanitary",category:"kitchen_sink",w:90,h:50}].map(e=>({id:e.id,group:e.group,category:e.category,w:e.w,h:e.h,designer:!0})),...Nl.filter(e=>Hl.has(e.id))],Bl=new Map(Ll.map(e=>[e.id,e]));function ql(e){return e&&Bl.get(e)||null}function jl(e){return!0===Bl.get(e)?.designer}function Wl(e){return Ll.filter(t=>t.group===e)}function Ul(e){const t=ql(e);return t?{w:t.w,h:t.h}:{w:60,h:60}}function Gl(e,t,i=rl,n=1e3){const r=Number(t)>0?Number(t):5;return(Number(e)||0)/r*i/n}const Vl=5e-4,Kl=tl;function Yl(e){return Number.isFinite(e)?Math.max(Vl,Math.min(Kl,e)):Vl}function Xl(e){return Number.isFinite(e)?Math.max(1,Math.min(1e4,e)):1}const Zl=e=>{const t=Math.round(1e3*e)/1e3;return Object.is(t,-0)?"0":String(t)};function Jl(e,t){const i=ql(e);if(!i)return null;if(i.designer)return Ol.art(e,t)??null;const n=function(e,t,i){if(!e.g)return"";const n=e=>Zl(e*t),r=e=>Zl(e*i),o=[];for(const s of e.g)if("r"===s[0]){const[,e,t,i,a]=s;o.push(`M${n(e)} ${r(t)}H${n(e+i)}V${r(t+a)}H${n(e)}Z`)}else if("l"===s[0]){const[,e,t,i,a]=s;o.push(`M${n(e)} ${r(t)}L${n(i)} ${r(a)}`)}else if("e"===s[0]){const[,e,a,l,c]=s;o.push(`M${n(e-l)} ${r(a)}A${Zl(l*t)} ${Zl(c*i)} 0 0 1 ${n(e+l)} ${r(a)}A${Zl(l*t)} ${Zl(c*i)} 0 0 1 ${n(e-l)} ${r(a)}Z`)}else{const e=s.slice(1);if(e.length<4)continue;let t=`M${n(e[0])} ${r(e[1])}`;for(let i=2;i+10?n:Number.isFinite(r)&&r>0?r:1,s=Number(t),a=o*(Number.isFinite(s)&&s>0?s:1);return Number.isFinite(a)&&a>0?a:o}function ec(e,t,i,n,r){const o=e+i/2,s=t+n/2,a=(Number(r)||0)*Math.PI/180,l=Math.cos(a),c=Math.sin(a),h=(e,t)=>{const i=e-o,n=t-s;return[o+i*l-n*c,s+i*c+n*l]};return[h(e,t),h(e+i,t),h(e+i,t+n),h(e,t+n)]}function tc(e,t,i,n,r,o,s){const a=Number.isFinite(s)&&s>0?s:1e-6,l=(Number(e.angle)||0)*Math.PI/180,c=Math.cos(l),h=Math.sin(l),d=-Math.sin(l),u=Math.cos(l),p=e.x+e.w/2,_=e.y+e.h/2,m=t>0?-e.w/2:t<0?e.w/2:0,g=i>0?-e.h/2:i<0?e.h/2:0,f=p+m*c+g*d,v=_+m*h+g*u,y=n-f,b=r-v,w=t?(y*c+b*h)*(t>0?1:-1):e.w,k=i?(y*d+b*u)*(i>0?1:-1):e.h;let x=t?Math.abs(w):e.w,S=i?Math.abs(k):e.h;if(o&&t&&i){const t=x/Math.max(e.w,a),i=S/Math.max(e.h,a),n=Math.abs(t-1)>=Math.abs(i-1)?t:i,r=Math.max(a/e.w,a/e.h),o=Math.max(r,Number.isFinite(n)?n:r);x=e.w*o,S=e.h*o}x=Math.max(a,Number.isFinite(x)?x:a),S=Math.max(a,Number.isFinite(S)?S:a);const $=!!t&&w<0,M=!!i&&k<0,R=t?(t>0?1:-1)*($?-1:1):0,C=i?(i>0?1:-1)*(M?-1:1):0,T=f+R*(x/2)*c+C*(S/2)*d,D=v+R*(x/2)*h+C*(S/2)*u,A=!!e.flip_h!==$,P=!!e.flip_v!==M;return{x:T-x/2,y:D-S/2,w:x,h:S,...Number(e.angle)?{angle:Number(e.angle)}:{},...A?{flip_h:!0}:{},...P?{flip_v:!0}:{}}}function ic(e,t,i,n){let r=Number(e)+(Number(i)-Number(t));if([r,t,i].every(Number.isFinite)||(r=0),n){const e=r/45;r=45*(e<0?-Math.round(Math.abs(e)):Math.round(e))}return r=(r%360+360)%360,r>180?r-360:r}function nc(e,t,i,n,r){const o=e.x*t,s=e.y*i,a=e.w*t,l=e.h*i,c=o+a/2,h=s+l/2,d=o+(e.flip_h?a:0),u=s+(e.flip_v?l:0),p=(e.flip_h?-1:1)*a/n,_=(e.flip_v?-1:1)*l/r,m=Number(e.angle)||0;return(m?`rotate(${m} ${c} ${h}) `:"")+`translate(${d} ${u}) scale(${p} ${_})`}function rc(e,t,i,n=.1){if("string"==typeof e&&!e.trim())return null;const r=Number(e);if(!Number.isFinite(r)||0===r)return null;const o=r*(t?30.48:100),s=Math.abs(o);return si?null:o}function oc(e,t,i){const n=Math.abs(Number(e))/(i?30.48:100),r=Number(n.toFixed(6));return String(t?-r:r)}const sc=15e3,ac=2e3,lc=new WeakMap;function cc(e,t){let i=lc.get(e);if(!i){const t=new Set;i={hiddenAt:"hidden"===e.visibilityState?Date.now():0,token:0,subscribers:t,onVisibility:()=>{const t=lc.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 n=t.hiddenAt?Math.max(0,i-t.hiddenAt):0;t.hiddenAt=0,t.token++;const r={kind:"visible",token:t.token,at:i,hiddenFor:n,long:n>=sc};for(const e of[...t.subscribers])e(r)},onPageShow:t=>{const i=lc.get(e);if(!i)return;const n=Date.now();i.token++;const r={kind:"pageshow",token:i.token,at:n,hiddenFor:0,long:!!t.persisted,persisted:!!t.persisted};for(const e of[...i.subscribers])e(r)}},lc.set(e,i),e.addEventListener("visibilitychange",i.onVisibility),e.defaultView?.addEventListener("pageshow",i.onPageShow)}return i.subscribers.add(t),()=>{const i=lc.get(e);i&&(i.subscribers.delete(t),i.subscribers.size||(e.removeEventListener("visibilitychange",i.onVisibility),e.defaultView?.removeEventListener("pageshow",i.onPageShow),lc.delete(e)))}}const hc={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 dc{constructor(e,t=hc){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 n=(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 r=0;const o=new Promise(e=>{r=this.clock.setTimeout(()=>e({ready:!1,timedOut:!0}),ac)}),s=await Promise.race([n.then(e=>({ready:e,timedOut:!1})),o]);return i=!1,this.clock.clearTimeout(r),!this._disposed&&e===this._token&&(!(!s.ready&&!s.timedOut)&&(s.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 uc(e){let t=2166136261,i=2654435769;const n=new WeakSet,r=e=>{for(let n=0;n>>0)+(i>>>2)}},o=e=>{if(null===e)return void r("n");const t=typeof e;if("string"===t)return void r(`s${e.length}:${e}`);if("number"===t)return void r(`d${Number.isNaN(e)?"NaN":String(e)}`);if("boolean"===t)return void r(e?"t":"f");if("undefined"===t)return void r("u");if("object"!==t)return void r(`${t}:${String(e)}`);const i=e;if(n.has(i))r("[cycle]");else{if(n.add(i),Array.isArray(e)){r("[");for(const t of e)o(t);return r("]"),void n.delete(i)}r("{");for(const t of Object.keys(e).sort())r(t),o(e[t]);r("}"),n.delete(i)}};return o(e),`${(t>>>0).toString(16).padStart(8,"0")}${(i>>>0).toString(16).padStart(8,"0")}`}function pc(e){return uc(e)}const _c=new WeakMap;class mc{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=_c.get(e);return t||(t={signed:{},queued:new Set,inFlight:new Map,retry:new Map,listeners:new Set,settlers:new Set,references:new Map},_c.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=Hn(t);if(!i.startsWith("/api/houseplan/content/"))return i;const n=this.bind(e);this.referenced.add(i),n.references.set(this.referenceOwner,new Set(this.referenced));const r=n.signed[i],o=r?this.now()-r.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 n of function(e,t){const i=Math.max(1,Math.floor(t)),n=[];for(let t=0;t{const n=i.inFlight.get(e);return!(void 0!==n&&t-n<15e3)&&(i.inFlight.set(e,t),!0)});r.length&&e.callWS({type:"houseplan/content/sign",paths:r}).then(e=>{const t=this.now();let n=0,o=!1;for(const s of r){const r=e?.urls?.[s];if("string"==typeof r&&r){const e=i.signed[s];e?.loaded&&e.url!==r?(e.pending={url:r,at:t},this.preloadReplacement(i,s,r,t)):(i.signed[s]={url:r,at:t,loaded:e?.url===r&&!!e.loaded},o=!0),i.retry.delete(s),n++}else this.backOff(i,s)}if(n&&(this.trimShared(i),o))for(const e of[...i.listeners])e()}).catch(()=>{for(const e of r)this.backOff(i,e)}).finally(()=>{for(const e of r)i.inFlight.get(e)===t&&i.inFlight.delete(e);for(const e of[...i.settlers])e()})}}preloadReplacement(e,t,i,n){const r=()=>{const r=e.signed[t];if(r?.pending?.url===i){e.signed[t]={url:i,at:n,loaded:!0},e.retry.delete(t),this.trimShared(e);for(const t of[...e.listeners])t()}},o=()=>{const n=e.signed[t];n?.pending?.url===i&&(delete n.pending,this.backOff(e,t))};if("undefined"==typeof Image)return void r();const s=new Image;s.onload=()=>{("function"==typeof s.decode?s.decode():Promise.resolve()).then(r).catch(o)},s.onerror=o,s.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 n=i.url;return i.preload=new Promise(r=>{const o=new Image;let s=!1;const a=o=>{if(s)return;s=!0,clearTimeout(l);const a=e.signed[t];if(a===i&&delete a.preload,o&&a===i&&a.url===n){a.loaded=!0;for(const t of[...e.listeners])t();r(!0)}else o||a!==i||this.backOff(e,t),r(!1)};o.onload=()=>{("function"==typeof o.decode?o.decode():Promise.resolve()).then(()=>a(!0)).catch(()=>a(!1))},o.onerror=()=>a(!1);const l=setTimeout(()=>a(!1),ac);o.src=n}),i.preload}prepareImage(e,t){const i=Hn(t);if(!i.startsWith("/api/houseplan/content/"))return Promise.resolve(!0);const n=this.bind(e),r=()=>{const t=n.signed[i];if(t&&this.now()-t.atthis.now()&&!n.inFlight.has(i)&&!n.queued.has(i)?Promise.resolve(!1):null},o=r();return o?(s=o,new Promise(e=>{let t=!1;const i=i=>{t||(t=!0,clearTimeout(n),e(i))},n=setTimeout(()=>i(!1),ac);s.then(i).catch(()=>i(!1))})):new Promise(e=>{let t=!1,i=null;const o=i=>{t||(t=!0,clearTimeout(a),n.settlers.delete(s),e(i))},s=()=>{t||i||(i=r(),i&&i.then(o).catch(()=>o(!1)))},a=setTimeout(()=>o(!1),ac);n.settlers.add(s),s()});var s}backOff(e,t){const i=e.retry.get(t)?.delay||0,n=Math.min(6e4,i?2*i:2e3);e.retry.set(t,{notBefore:this.now()+n,delay:n})}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,n]of t)(n.pending||n.preload)&&i.add(e);t.sort((e,t)=>t[1].at-e[1].at);const n=t.filter(([e])=>i.has(e));for(const e of t){if(n.length>=512)break;i.has(e[0])||n.push(e)}e.signed=Object.fromEntries(n)}resign(e,t){const i=this.bind(e);this.referenced=new Set(t),i.references.set(this.referenceOwner,new Set(this.referenced));const n=this.now(),r=new Set;for(const e of i.references.values())for(const t of e)r.add(t);const o={};for(const[e,t]of Object.entries(i.signed))r.has(e)&&n-t.at!!o[e]&&!o[e].pending))}markLoaded(e,t,i){const n=Hn(t);if(!n.startsWith("/api/houseplan/content/"))return;const r=this.bind(e).signed[n];if(r&&(!i||r.url===i)&&!r.loaded){r.loaded=!0;for(const t of[...this.bind(e).listeners])t()}}isReady(e,t){const i=Hn(t);if(!i.startsWith("/api/houseplan/content/"))return!0;const n=this.bind(e).signed[i];return!!n&&this.now()-n.at=2&&(this._sequenceMultitouch=!0,this._postGestureClickBlocked=!0))}pointerTerminal(e,t){if("touch"!==t)return!1;const i=this._sequenceMultitouch;return this._activeTouchPointers.delete(e),0===this._activeTouchPointers.size&&(this._sequenceMultitouch=!1),i}reset(){this._activeTouchPointers.clear(),this._sequenceMultitouch=!1,this._postGestureClickBlocked=!1}}const fc=1e-7,vc=(e,t)=>{const i=e.x-t.x,n=e.y-t.y;return i*i+n*n};function yc(e){const t=Math.max(0,e.floorRadius);return{left:Math.min(e.painted.left,e.center.x-t),top:Math.min(e.painted.top,e.center.y-t),right:Math.max(e.painted.right,e.center.x+t),bottom:Math.max(e.painted.bottom,e.center.y+t)}}function bc(e,t){let i=null,n=Number.POSITIVE_INFINITY;for(const r of e){const e=vc(t,r.center);(efunction(e,t){const i=Math.max(0,t.right-t.left),n=Math.max(0,t.bottom-t.top);if(i<=0||n<=0)return!1;const r=Math.min(i,n)/2,o=Math.max(t.left+r,Math.min(t.right-r,e.x)),s=Math.max(t.top+r,Math.min(t.bottom-r,e.y));return vc(e,{x:o,y:s})<=r*r+fc}(t,e.painted));if(i.length)return bc(i,t);return bc(e.filter(e=>{const i=Math.max(0,e.floorRadius);return vc(t,e.center)<=i*i+fc}),t)}class kc{constructor(e,t=44){this.cellSize=t,this.buckets=new Map;const i=Number.isFinite(t)&&t>0?t:44;this.cellSize=i;for(const t of e){const e=yc(t),n=Math.floor(e.left/i),r=Math.floor(e.right/i),o=Math.floor(e.top/i),s=Math.floor(e.bottom/i);for(let e=n;e<=r;e++)for(let i=o;i<=s;i++){const n=`${e}:${i}`,r=this.buckets.get(n);r?r.push(t):this.buckets.set(n,[t])}}}resolve(e){const t=`${Math.floor(e.x/this.cellSize)}:${Math.floor(e.y/this.cellSize)}`;return wc(this.buckets.get(t)||[],e)}}class xc{constructor(){this.active=new Map,this.released=new Map}begin(e,t){this.released.delete(e),this.active.set(e,t)}owner(e){return this.active.get(e)||null}release(e){const t=this.active.get(e)||null;if(!t)return this.released.get(e)||null;for(this.active.delete(e),this.released.set(e,t);this.released.size>16;){const e=this.released.keys().next().value;if(void 0===e)break;this.released.delete(e)}return t}consumeClick(e){const t=this.released.get(e)||null;return this.released.delete(e),t}cancel(e){const t=this.active.get(e)||null;return this.active.delete(e),t}clear(){this.active.clear(),this.released.clear()}}class Sc{constructor(){this.index=null,this.pointers=new xc,this.hoverId=null,this.hoverElement=null}invalidate(){this.index=null}reset(e){this.invalidate(),this.pointers.clear(),this.hover(e,null)}clearPointers(){this.pointers.clear()}cancel(e){return this.pointers.cancel(e)}release(e){return this.pointers.release(e)}indexFor(e){if(this.index)return this.index;const t=[];for(const i of e.querySelectorAll('.devlayer > .dev[data-hp="device"][data-id]')){const e=i.querySelector(".device-shell-frame"),n=i.getBoundingClientRect(),r=e?.getBoundingClientRect();!i.dataset.id||!i.isConnected||!r||n.width<=0||n.height<=0||r.width<=0||r.height<=0||t.push({id:i.dataset.id,center:{x:n.left+n.width/2,y:n.top+n.height/2},painted:{left:r.left,top:r.top,right:r.right,bottom:r.bottom},floorRadius:Math.max(22,Math.min(r.width,r.height)/2)})}return this.index=new kc(t),this.index}at(e,t,i,n,r){const o=this.indexFor(e).resolve({x:n,y:r})?.id;return o&&t.find(e=>e.id===o&&e.space===i)||null}byId(e,t,i){return i&&e.find(e=>e.id===i&&e.space===t)||null}begin(e,t,i,n,r){const o=this.at(e,t,i,n.clientX,n.clientY)||r;return this.pointers.begin(n.pointerId,o.id),o}pointer(e,t,i,n,r){const o=n.pointerId;return(Number.isFinite(o)?this.byId(t,i,this.pointers.owner(o)):null)||this.at(e,t,i,n.clientX,n.clientY)||r}click(e,t,i,n,r){if(!(n instanceof PointerEvent))return r;const o=n,s=Number.isFinite(o.pointerId)?this.pointers.consumeClick(o.pointerId):null;return this.byId(t,i,s)||this.at(e,t,i,o.clientX,o.clientY)||r}hover(e,t){this.hoverId===t&&this.hoverElement?.isConnected||(this.hoverElement?.removeAttribute("data-hp-device-hover"),this.hoverId=t,this.hoverElement=t&&[...e.querySelectorAll('.devlayer > .dev[data-hp="device"][data-id]')].find(e=>e.dataset.id===t)||null,this.hoverElement?.setAttribute("data-hp-device-hover",""))}}function $c(e,t){if(t)return e.find(e=>e.id===t)}function Mc(e,t){return{id:e,title:t,plan_url:null,view_box:[0,0,1,1],rooms:[],wall_segments:[]}}function Rc(e="file"){const t="draw"===e;return{source:e,showBorders:t,showNames:t,displayTouched:!1}}function Cc(e,t){if(e.displayTouched)return{...e,source:t};const i="draw"===t;return{...e,source:t,showBorders:i,showNames:i}}function Tc(e,t,i){return{...e,[t]:i,displayTouched:!0}}function Dc(e){const t=String(e??"").trim().replace(",",".");if(!/^[+-]?(?:\d+(?:\.\d*)?|\.\d+)$/.test(t))return null;const i=Number(t);return Number.isFinite(i)?i:null}function Ac(e,t){const i=e=>{if(""===String(e??"").trim())return{valid:!0,value:null};const t=Dc(e);return{valid:null!==t,value:t}},n=i(e),r=i(t);return n.valid&&r.valid?null!==n.value&&null!==r.value&&n.value>r.value?{valid:!0,min:r.value,max:n.value}:{valid:!0,min:n.value,max:r.value}:{valid:!1,min:n.value,max:r.value}}function Pc(e,t,i,n,r,o){const s=Ac(n,r);return pn(e,t,o&&s.valid?{settings:{...i.settings||{},temp_min:s.min,temp_max:s.max}}:i)}function Fc(e){const t=e=>"number"==typeof e&&Number.isFinite(e)?String(e):"";return[t(e?.temp_min),t(e?.temp_max)]}function zc(e,t,i){const n=Ac(t,i);return!!n.valid&&(null===n.min?delete e.temp_min:e.temp_min=n.min,null===n.max?delete e.temp_max:e.temp_max=n.max,!0)}var Ic="M11,18H13V16H11V18M12,2A10,10 0 0,0 2,12A10,10 0 0,0 12,22A10,10 0 0,0 22,12A10,10 0 0,0 12,2M12,20C7.59,20 4,16.41 4,12C4,7.59 7.59,4 12,4C16.41,4 20,7.59 20,12C20,16.41 16.41,20 12,20M12,6A4,4 0 0,0 8,10H10A2,2 0 0,1 12,8A2,2 0 0,1 14,10C14,12 11,11.75 11,15H13C13,12.75 16,12.5 16,10A4,4 0 0,0 12,6Z";function Oc(e,t,i){return[e[0]*t+e[1]*i+e[2],e[3]*t+e[4]*i+e[5]]}function Ec(e,t){let i=0;for(const[n,r]of t){const t=Oc(e,n[0],n[1]);i=Math.max(i,Math.hypot(t[0]-r[0],t[1]-r[1]))}return i}const Nc=e=>{if(null==e||""===e)return null;const t=Number(e);return Number.isFinite(t)?t:null},Hc=e=>{const t=e,i=Nc(Array.isArray(t)?t[0]:t?.x),n=Nc(Array.isArray(t)?t[1]:t?.y);return null==i||null==n?null:[i,n]};function Lc(e){if(!Array.isArray(e))return null;const t=[];for(const i of e){const e=Hc(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,n=0,r=0;for(let e=0;ee+t[0],0)/t.length,t.reduce((e,t)=>e+t[1],0)/t.length]:[n/(3*i),r/(3*i)]}function Bc(e){if(!Array.isArray(e))return null;const t=[];for(const i of e){const e=Hc(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=Lc(t);if(!i)return null;const n=t.map(e=>e[0]),r=t.map(e=>e[1]);return{centroid:i,bbox:[Math.min(...n),Math.min(...r),Math.max(...n),Math.max(...r)]}}function qc(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(Hc).filter(e=>null!=e)).filter(e=>e.length>=2);i.length>64&&(i=i.slice(-64));const n=i.reduce((e,t)=>e+t.length,0);if(n<=4e3)return i.map(e=>e.slice());const r=4e3-2*i.length,o=i.map(e=>e.length-2),s=o.reduce((e,t)=>e+t,0),a=o.map(e=>r*e/s),l=a.map(Math.floor);let c=r-l.reduce((e,t)=>e+t,0);const h=a.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 n=0;ne.slice()),i=t[t.length-1];return i?(i.length>2?i.pop():t.pop(),t):[]}const Uc=e=>Number.isFinite(e[0])&&Number.isFinite(e[1]),Gc=(e,t)=>e[0]===t[0]&&e[1]===t[1];function Vc(e){if(!e)return null;const t=e.vacuum_position||e.robot_position||null,i=t&&null!=Nc(t.x)&&null!=Nc(t.y)?{x:Nc(t.x),y:Nc(t.y),a:Nc(t.a??t.angle??t.theta)}:null,n=qc(e.path?.path??e.path?.points??e.path),r=[],o=e.rooms,s=Array.isArray(o)?o.map((e,t)=>[String(e?.id??t),e]):o&&"object"==typeof o?Object.entries(o):[];for(const[e,t]of s){if(!t||"object"!=typeof t)continue;const i=String(t.name??t.label??"").trim(),n=[[Nc(t.cx),Nc(t.cy)],[Nc(t.center?.x),Nc(t.center?.y)],[Nc(t.x),Nc(t.y)]].find(([e,t])=>null!=e&&null!=t);let o=n?.[0]??null,s=n?.[1]??null;const a=Bc(t.outline),l=Nc(t.x0),c=Nc(t.y0),h=Nc(t.x1),d=Nc(t.y1),u=(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)||a?.bbox||null;if(null!=o&&null!=s||!a||([o,s]=a.centroid),null!=o&&null!=s||!u||(o=(u[0]+u[2])/2,s=(u[1]+u[3])/2),i&&null!=o&&null!=s){const t={id:e,name:i,cx:o,cy:s};u&&([t.x0,t.y0,t.x1,t.y1]=u),r.push(t)}}const a=function(e){return String(e.map_name??e.current_map??e.map_index??e.selected_map??"default")}(e);return i||r.length||n.length?{pos:i,path:n,rooms:r,mapId:a}:null}function Kc(e,t,i){return![e,t,i].every(Number.isFinite)||e<0||t<=0||i<=0?Number.POSITIVE_INFINITY:e/t*i}const Yc=40;function Xc(e,t,i){if(!e||!t)return null;const n=t.attributes||{},r=e.split(".")[0]||"",o=null!=i?.platform?String(i.platform):null,s=!!Hc(n.vacuum_position??n.robot_position),a=!(!n.rooms||"object"!=typeof n.rooms),l=qc(n.path?.path??n.path?.points??n.path).length>0,c=[n.map_name,n.current_map,n.map_index,n.selected_map].some(e=>null!=e),h="xiaomi_cloud_map_extractor"===o,d=a||l||c;let u=null;if(s?u="compatible":h?u="known_xcme_incomplete":d?u="partial":"camera"===r&&(u="camera"),!u)return null;const p=s?"camera"===r?300:200:h?100:d?50:0;return{entityId:e,name:String(n.friendly_name||e),platform:o,category:u,hasPosition:s,hasRooms:a,hasPath:l,hasMapId:c,score:p}}const Zc=e=>e.toLowerCase().replace(/[\s_\-.,]+/g,"");function Jc(e,t){const i=new Set(t.map(Zc).filter(Boolean)),n=new Set;for(const t of e){const e=Zc(t.name||"");e&&i.has(e)&&n.add(e)}return n.size}function Qc(e,t){const i=new Map(t.map(e=>[Zc(e.name),e])),n=[],r=[];for(const t of e){const e=i.get(Zc(t.name));e&&(n.push([[t.cx,t.cy],[e.cx,e.cy]]),r.push(t.name))}if(n.length<3)return null;const o=function(e){if(e.length<3)return null;let t=0,i=0,n=0,r=0,o=0,s=0,a=0,l=0,c=0,h=0,d=0,u=0;for(const[[p,_],[m,g]]of e){if(![p,_,m,g].every(Number.isFinite))return null;t+=p*p,i+=p*_,n+=p,r+=_*_,o+=_,s+=1,a+=p*m,l+=_*m,c+=m,h+=p*g,d+=_*g,u+=g}const p=[t,i,n,i,r,o,n,o,s],_=e=>{const[t,i,n,r,o,s,a,l,c]=p,h=t*(o*c-s*l)-i*(r*c-s*a)+n*(r*l-o*a);if(!Number.isFinite(h)||Math.abs(h)<1e-9)return null;const d=[(o*c-s*l)/h,(n*l-i*c)/h,(i*s-n*o)/h,(s*a-r*c)/h,(t*c-n*a)/h,(n*r-t*s)/h,(r*l-o*a)/h,(i*a-t*l)/h,(t*o-i*r)/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=_([a,l,c]),g=_([h,d,u]);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}(n);return o?{matrix:o,matched:r,residual:Ec(o,n)}:null}function eh(e,t,i){const n=e[e.length-1];if(n&&n[0]===t[0]&&n[1]===t[1])return e;if(e.push(t),e.length<=600)return e;let r=function(e,t){if(e.length<3)return e.slice();const i=new Uint8Array(e.length);i[0]=i[e.length-1]=1;const n=[[0,e.length-1]];for(;n.length;){const[r,o]=n.pop(),[s,a]=e[r],[l,c]=e[o],h=l-s,d=c-a,u=Math.hypot(h,d)||1e-9;let p=0,_=-1;for(let t=r+1;tp&&(p=i,_=t)}_>0&&p>t&&(i[_]=1,n.push([r,_],[_,o]))}const r=[];for(let t=0;t600&&(r=r.filter((e,t)=>t%2==0||t===r.length-1)),r}function th(e){return"cleaning"===e||"returning"===e||"on"===e}const ih={0:[1,0],90:[0,1],180:[-1,0],270:[0,-1]};function nh(e){const[t,i]=ih[e.rot]||[1,0],n=e.mir?-1:1;return[e.s*t*n,-e.s*i,e.ox,e.s*i*n,e.s*t,e.oy]}function rh(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,n=Math.sqrt(Math.abs(t));let r=180*Math.atan2(-e[1],e[4])/Math.PI;return r=(90*Math.round(r/90)%360+360)%360,{ox:e[2],oy:e[5],s:n,rot:r,mir:i}}function oh(e,t){const i=[],n=[];for(const t of e)null!=t.x0?(i.push(t.x0,t.x1),n.push(t.y0,t.y1)):(i.push(t.cx),n.push(t.cy));if(!i.length)return{ox:t[0]+t[2]/2,oy:t[1]+t[3]/2,s:t[2]/1e4,rot:0,mir:!0};const r=Math.min(...i),o=Math.max(...i),s=Math.min(...n),a=Math.max(...n),l=Math.max(o-r,a-s)||1,c={ox:0,oy:0,s:.6*Math.min(t[2],t[3])/l,rot:0,mir:!0},h=nh(c),[d,u]=Oc(h,(r+o)/2,(s+a)/2);return c.ox=t[0]+t[2]/2-d,c.oy=t[1]+t[3]/2-u,c}function sh(e,t,i,n){const[r,o]=Oc(nh(t),i,n),s=nh({...e,ox:0,oy:0}),[a,l]=Oc(s,i,n);return{...e,ox:r-a,oy:o-l}}function ah(e){const t=e?.trail_mode;return"never"===t||"cleaning"===t||"always"===t?t:!1===e?.trail?"never":"cleaning"}const lh=e=>"number"==typeof e&&Number.isFinite(e);function ch(e){return Array.isArray(e)&&6===e.length&&e.every(lh)?[e[0],e[1],e[2],e[3],e[4],e[5]]:null}function hh(e,t,i){return"legacy:"+e+" "+t+" "+i}function dh(e,t,i,n){const r=t?.map_routes;if(Array.isArray(r))return r.filter(e=>e&&"string"==typeof e.id&&e.id).map(e=>({id:e.id,source:String(e.source??""),map_id:String(e.map_id??""),space:String(e.space??""),calibration:ch(e.calibration)}));const o="string"==typeof t?.source&&t.source?t.source:n||"";if(!o)return[];const s=t?.calibration;if(!s||"object"!=typeof s)return[];const a=[];for(const t of Object.keys(s)){const n=ch(s[t]);n&&a.push({id:hh(e,o,t),source:o,map_id:t,space:i,calibration:n})}return a}const uh=(e,t)=>e instanceof Map?e.get(t):e?.[t];function ph(e){const t=[];let i=!1,n="",r="";for(const o of e.routes){const s=uh(e.observed,o.source);void 0!==s&&(i=!0,n||(n=o.source,r=s),s===o.map_id&&t.push(o))}if(t.length>1)return{kind:"ambiguous",routeIds:t.map(e=>e.id).sort()};if(1===t.length){const i=t[0];if(e.spaceIds&&!e.spaceIds.has(i.space))return{kind:"missing_space",route:i};const n=ch(i.calibration);return n?{kind:"ready",route:{...i,calibration:n}}:{kind:"needs_calibration",route:i}}if(i)return{kind:"unmapped",source:n,mapId:r};const o=e.observed instanceof Map?[...e.observed.entries()]:Object.entries(e.observed||{});if(o.length){const e=o.slice().sort((e,t)=>e[0].localeCompare(t[0]))[0];return{kind:"unmapped",source:e[0],mapId:e[1]}}return{kind:"none"}}function _h(e,t,i){const n=new Set;for(const t of e)t.source&&n.add(t.source);for(const e of t)e&&n.add(e);const r={};for(const e of[...n].sort()){const t=i(e);void 0!==t&&(r[e]=t)}return r}function mh(e,t,i){if(!e)return null;const n="string"==typeof e.route_id?e.route_id:"";if(n)return t.find(e=>e.id===n)||null;const r=function(e,t,i){if(!e||"string"!=typeof e.map_id)return{kind:"orphan_run"};const n=e.map_id,r="string"==typeof i?i:"";let o=t.filter(e=>e.map_id===n);return r&&(o=o.filter(e=>e.source===r)),1===o.length?{kind:"adopted",route:o[0]}:0===o.length?{kind:"orphan_run"}:{kind:"ambiguous_run",routeIds:o.map(e=>e.id).sort()}}(e,t,i);return"adopted"===r.kind?r.route:null}function gh(e){const t="ready"===e.resolution.kind?e.resolution.route:null,i=t&&t.space===e.renderSpace?ch(t.calibration):null,n=mh(e.serverCurrent,e.routes,e.rootSource),r=!!t&&!!n&&n.id===t.id,o=mh(e.serverPrevious,e.routes,e.rootSource);return{live:i,currentRunMatches:r,previous:!!o&&o.space===e.renderSpace&&(e.explicitRoutes||!!t&&o.id===t.id)?ch(o.calibration):null}}const fh={availability:"available",status:"alarm",activity:"none"},vh=new Set(["motion","vibration","sound"]),yh=new Set(["occupancy","presence"]),bh=new Set(["door","window","garage_door","opening"]),wh=new Set(["running","power"]),kh=new Set(["smoke","gas","carbon_monoxide","moisture","safety","tamper","problem"]);const xh=new Set(["running","working","washing","rinsing","spinning","drying","heating","cooling","cleaning","cooking","playing","recording","pumping","irrigating","humidifying","dehumidifying","fan","preheating","defrosting"]),Sh=new Set([...xh,"start","started","run","active","in_progress","wash","rinse","spin","dry"]),$h=new Set(["off","idle","paused","standby","docked","finished","complete","completed","stopped","ready","sleeping","stop","end","done","inactive"]),Mh=new Set(["heat","cool","heat_cool","auto","dry","fan_only"]),Rh=e=>""===e||"unknown"===e||"unavailable"===e||"__missing__"===e,Ch=e=>String(e??"").trim().toLowerCase(),Th=e=>Ch(e).replace(/[\s-]+/g,"_").replace(/_+/g,"_").replace(/^_|_$/g,""),Dh=new Map([["run_state",0],["job_state",0],["operation_state",0],["activity_state",0],["machine_state",1],["running_state",1],["status",2],["device_status",2],["machine_status",2]]),Ah=new Set(["wifi","connection","signal","battery"]);function Ph(e,t){const i=e?.entities?.[t]||{};if("config"===i.entity_category)return null;const n=String(t||"").split(".").slice(1).join("."),r=[i.translation_key,i.original_name,i.name],o=[...r,n];r.some(e=>Ch(e))||o.push(e?.states?.[t]?.attributes?.friendly_name);const s=o.map(Th).filter(Boolean);if(s.some(e=>e.split("_").some(e=>Ah.has(e))))return null;let a=null;for(const e of s)for(const[t,i]of Dh)(e===t||e.endsWith(`_${t}`))&&(a=null==a?i:Math.min(a,i));return a}const Fh=(e,t)=>null!=Ph(e,t);function zh(e,t){if(!t.startsWith("switch."))return!1;const i=e?.entities?.[t]||{},n=e?.states?.[t],r=t.slice(7).toLowerCase();if(/(?:^|_)(?:main_)?power$/.test(r))return!0;if([i.translation_key,i.original_name,i.name].map(Ch).some(e=>["power","main power","power switch","питание"].includes(e)))return!0;const o=Ch(n?.attributes?.friendly_name);return/(?:^|[\s._-])(?:main[\s._-]+)?power$/.test(o)||/(?:^|[\s._-])питание$/.test(o)}function Ih(e){for(const t of["hvac_action","action","current_operation","run_state","job_state","operation","activity"]){const i=Ch(e?.[t]);if(xh.has(i)||$h.has(i))return i}return""}function Oh(e,t){const i=e?.states?.[t],n=i?Ch(i.state):"__missing__",r=String(t||"").split(".")[0],o=Ch(i?.attributes?.device_class),s={eid:t,state:n,availability:Rh(n)?"unavailable":"available",status:"neutral",activity:"none",edge:"none"};if("unavailable"===s.availability)return s;if(function(e,t,i){return"alarm_control_panel"===e?"triggered"===i:"on"===i&&Yn(e,t)}(r,o,n))return{...s,status:"alarm"};if("binary_sensor"===r)return vh.has(o)?{...s,edge:"rising"}:yh.has(o)?{...s,activity:"on"===n?"presence":"none"}:bh.has(o)?{...s,status:"on"===n?"open":"neutral",edge:"rising"}:"moving"===o?{...s,activity:"on"===n?"transition":"none"}:wh.has(o)&&"on"===n?{...s,status:"working",activity:"running"}:s;if("cover"===r)return{...s,activity:"opening"===n||"closing"===n?"transition":"none",edge:"terminal_transition"};if("lock"===r)return{...s,status:"unlocked"===n||"open"===n?"open":"neutral",activity:"locking"===n||"unlocking"===n?"transition":"none",edge:"terminal_transition"};if("valve"===r)return{...s,status:["open","opening","closing"].includes(n)?"open":"neutral",activity:"opening"===n||"closing"===n?"transition":"none",edge:"terminal_transition"};if("climate"===r){const e=Ih(i.attributes),t=Array.isArray(i.attributes?.hvac_modes)?i.attributes.hvac_modes.map(Ch):[],r=!$h.has(n)&&(Mh.has(n)||xh.has(n)||t.includes(n));return(e?xh.has(e):r)?{...s,status:"working",activity:"running"}:s}if(["light","switch","fan","humidifier"].includes(r))return"on"===n?{...s,status:"working",activity:"running"}:s;if("media_player"===r)return"off"===n?{...s,availability:"unavailable"}:s;if("vacuum"===r)return"cleaning"===n?{...s,status:"working",activity:"running"}:"returning"===n?{...s,status:"working",activity:"transition"}:s;if("script"===r)return"on"===n?{...s,status:"working",activity:"running"}:s;if("automation"===r)return s;if("button"===r||"event"===r)return{...s,edge:"change"};const a=Ih(i.attributes);return xh.has(a)||xh.has(n)&&!$h.has(n)?{...s,status:"working",activity:"running"}:s}function Eh(e,t,i){const n=i.filter(t=>t.startsWith("switch.")&&!e?.entities?.[t]?.entity_category),r=t.find(t=>zh(e,t));if(!(n.length>1&&!!r))return t.map(t=>Oh(e,t));const o=t.find(t=>t!==r&&Fh(e,t)),s=Oh(e,r);return"unavailable"===s.availability||"off"===s.state?t.map(t=>({eid:t,state:e?.states?.[t]?Ch(e.states[t].state):"__missing__",availability:"unavailable",status:"neutral",activity:"none",edge:"none"})):t.map(t=>{if(t===o)return function(e,t){const i=e?.states?.[t],n=i?Ch(i.state):"__missing__",r={eid:t,state:n,availability:Rh(n)?"unavailable":"available",status:"neutral",activity:"none",edge:"none"};if("unavailable"===r.availability)return r;const o=Ih(i?.attributes);return xh.has(o)||Sh.has(n)&&!$h.has(n)?{...r,status:"working",activity:"running"}:r}(e,t);return{...t===r?s:Oh(e,t),status:"neutral",activity:"none",edge:"none"}})}function Nh(e){if(!e.length)return{availability:"available",status:"neutral",activity:"none"};const t=e.filter(e=>"available"===e.availability);if(!t.length)return{availability:"unavailable",status:"neutral",activity:"none"};if(t.some(e=>"alarm"===e.status))return fh;const i=t.some(e=>"working"===e.status)?"working":t.some(e=>"open"===e.status)?"open":"neutral",n=t.some(e=>"transition"===e.activity)?"transition":t.some(e=>"presence"===e.activity)?"presence":t.some(e=>"running"===e.activity)?"running":"none";return{availability:"available",status:i,activity:n}}function Hh(e,t){if(!(e=>!!e&&!Rh(e))(e)||"unavailable"===t.availability||e===t.state)return null;if("rising"===t.edge)return"off"===e&&"on"===t.state?"event":null;if("change"===t.edge)return"event";if("terminal_transition"===t.edge){const i=new Set([e,t.state]);if(i.has("closed")&&i.has("open")||i.has("locked")&&i.has("unlocked"))return"transition"}return null}const Lh=(e,t=0)=>{const i=Number(e);return Number.isInteger(i)&&i>=0?i:t},Bh=(e,t)=>{const i={rev:0,configRev:Lh(t),off:new Set};if(null==e)return{snapshot:i,valid:!1};const n=e.off;return!Number.isInteger(e.rev)||Number(e.rev)<0||!Number.isInteger(e.config_rev)||Number(e.config_rev)<0||!Array.isArray(n)||n.some(e=>"string"!=typeof e||!e)?{snapshot:i,valid:!1}:{snapshot:{rev:Number(e.rev),configRev:Number(e.config_rev),off:new Set(n)},valid:!0}};function qh(e,t=0){return Bh(e,t).snapshot}function jh(e,t,i,n){const r=Bh(t,i);return n&&r.valid&&r.snapshot.configRev===i?e.configRev===i&&r.snapshot.rev{try{const[i,n]=await Promise.all([e.callWS({type:"config/device_registry/list"}),e.callWS({type:"config/entity_registry/list"})]),r=ed(i,"id"),o=ed(n,"entity_id");if(!r||!o)throw new Error("invalid_registry_response");t.devices=r,t.entities=o,t.authoritative=!0,t.access="full",t.lastSuccess=Date.now(),t.error=void 0}catch(e){t.authoritative=!1,t.access="limited",t.error=function(e){if(e&&"object"==typeof e){const t=e;return String(t.message||t.code||t.error||"registry_unavailable")}return String(e||"registry_unavailable")}(e)}finally{t.revision++,t.loading=void 0,function(e){for(const t of[...e.listeners])try{t()}catch{}}(t)}})()),t.loading}function id(e,t){void 0===t.reloadTimer&&(t.reloadTimer=globalThis.setTimeout(()=>{t.reloadTimer=void 0,td(e,t)},80))}async function nd(e,t){if(t.subscribing||t.unsubDevice&&t.unsubEntity)return t.subscribing;const i=e?.connection?.subscribeEvents;return"function"==typeof i?(t.subscribing=(async()=>{try{t.unsubDevice||(t.unsubDevice=await i.call(e.connection,()=>id(e,t),"device_registry_updated")),t.unsubEntity||(t.unsubEntity=await i.call(e.connection,()=>id(e,t),"entity_registry_updated"))}catch{}finally{0===t.refs&&(t.unsubDevice?.(),t.unsubEntity?.(),t.unsubDevice=void 0,t.unsubEntity=void 0),t.subscribing=void 0}})(),t.subscribing):void 0}function rd(e,t){const i=Qh(e);if(!i)return()=>{};const n=0===i.refs;i.refs++,i.listeners.add(t),("pending"===i.access||n)&&td(e,i),nd(e,i);let r=!1;return()=>{r||(r=!0,i.listeners.delete(t),i.refs=Math.max(0,i.refs-1),i.refs>0||(i.unsubDevice?.(),i.unsubEntity?.(),i.unsubDevice=void 0,i.unsubEntity=void 0,void 0!==i.reloadTimer&&globalThis.clearTimeout(i.reloadTimer),i.reloadTimer=void 0))}}function od(e){const t=Qh(e);t&&(id(e,t),nd(e,t))}function sd(e){const t=Qh(e);if(!t)return{revision:0,authoritative:!1,access:"limited",devices:e?.devices||{},entities:e?.entities||{},lastSuccess:0,error:"registry_unavailable"};let i=e?.devices||{},n=e?.entities||{};if(t.authoritative){const r=t.liveDevices!==i||t.liveEntities!==n,o=void 0!==t.liveDevices||void 0!==t.liveEntities;if(r&&(t.liveDevices=i,t.liveEntities=n,t.projectedRevision=void 0,o&&id(e,t)),t.projectedRevision!==t.revision||!t.projectedDevices||!t.projectedEntities){const e={...t.devices},r={...t.entities};for(const[t,n]of Object.entries(i))Object.prototype.hasOwnProperty.call(e,t)||(e[t]=n);for(const[e,t]of Object.entries(n))Object.prototype.hasOwnProperty.call(r,e)||(r[e]=t);t.projectedDevices=e,t.projectedEntities=r,t.projectedRevision=t.revision}i=t.projectedDevices,n=t.projectedEntities}return{revision:t.revision,authoritative:t.authoritative,access:t.access,devices:i,entities:n,lastSuccess:t.lastSuccess,error:t.error}}function ad(e){if(!e||"object"!=typeof e&&"function"!=typeof e)return 0;let t=Yh.get(e);return t||(t=Xh++,Yh.set(e,t)),t}function ld(e,t=sd(e)){return[t.revision,t.access,ad(t.devices),ad(t.entities)].join(":")}function cd(e){return!!e&&null==e.disabled_by}function hd(e,t=sd(e)){const i={},n={},r={};for(const[e,n]of Object.entries(t.devices||{}))cd(n)&&(i[e]=n);for(const[e,i]of Object.entries(t.entities||{})){if(!cd(i))continue;const r=i.device_id?t.devices?.[i.device_id]:null;t.authoritative&&i.device_id&&!r||(r&&!cd(r)||(n[e]=i))}for(const[i,n]of Object.entries(e?.states||{})){const e=t.entities?.[i];if(e&&!cd(e))continue;const o=e?.device_id?t.devices?.[e.device_id]:null;t.authoritative&&e?.device_id&&!o||(o&&!cd(o)||(r[i]=n))}return{...e,devices:i,entities:n,states:r}}function dd(e,t=sd(e)){return{...e,devices:t.devices||{},entities:t.entities||{}}}function ud(e,t){const i=[];for(const[n,r]of Object.entries(e||{}))r?.device_id===t&&i.push(n);return i}function pd(){if(Jh)return Jh;if("undefined"==typeof localStorage)return{};try{const e=JSON.parse(localStorage.getItem(Zh)||"{}");if(!e||"object"!=typeof e||Array.isArray(e))return{};const t=Date.now(),i={};for(const[n,r]of Object.entries(e))!r||"active"!==r.kind&&"ha_disabled"!==r.kind||!Number.isFinite(r.ts)||t-r.ts>7776e6||(i[n]=r);return Jh=i,Jh}catch{return{}}}function _d(e,t,i=sd(e)){if(!t||"virtual"===t)return{kind:"active",enabledEntityIds:[],allEntityIds:[]};const n=t.indexOf(":");if(n<1)return{kind:"unverified",reason:"registry_unavailable",enabledEntityIds:[],allEntityIds:[]};const r=t.slice(0,n),o=t.slice(n+1);if("device"!==r&&"entity"!==r||!o)return{kind:"unverified",reason:"registry_unavailable",enabledEntityIds:[],allEntityIds:[]};const s=i.devices||{},a=i.entities||{};if(i.authoritative){if("device"===r){const e=s[o];if(!e)return{kind:"orphaned",reason:"device_missing",enabledEntityIds:[],allEntityIds:[]};const t=ud(a,o);if(!cd(e))return{kind:"ha_disabled",reason:"device",enabledEntityIds:[],allEntityIds:t};const i=t.filter(e=>cd(a[e]));return t.length&&!i.length?{kind:"ha_disabled",reason:"all_entities",enabledEntityIds:[],allEntityIds:t}:{kind:"active",enabledEntityIds:i,allEntityIds:t}}const t=a[o];return t&&!cd(t)?{kind:"ha_disabled",reason:"entity",enabledEntityIds:[],allEntityIds:[o]}:t?.device_id&&!s[t.device_id]?{kind:"orphaned",reason:"device_missing",enabledEntityIds:[],allEntityIds:[o]}:t?.device_id&&!cd(s[t.device_id])?{kind:"ha_disabled",reason:"device",enabledEntityIds:[],allEntityIds:[o]}:t||e?.states?.[o]?{kind:"active",enabledEntityIds:[o],allEntityIds:[o]}:{kind:"orphaned",reason:"entity_missing",enabledEntityIds:[],allEntityIds:[]}}const l=function(e){return pd()[e]||null}(t);if("device"===r){const t=s[o],i=ud(a,o);if(null!=t?.disabled_by)return{kind:"ha_disabled",reason:"device",enabledEntityIds:[],allEntityIds:i};const n=i.filter(e=>{const t=a[e];return null==t?.disabled_by&&(!t.device_id||null==s[t.device_id]?.disabled_by)});if(i.length&&!n.length&&i.every(e=>null!=a[e]?.disabled_by))return{kind:"ha_disabled",reason:"all_entities",enabledEntityIds:[],allEntityIds:i};if("ha_disabled"===l?.kind)return{kind:"ha_disabled",reason:l.reason||"device",enabledEntityIds:[],allEntityIds:i};if(t||n.some(t=>!!e?.states?.[t]))return{kind:"active",enabledEntityIds:n,allEntityIds:i}}else{const t=a[o];if(null!=t?.disabled_by)return{kind:"ha_disabled",reason:"entity",enabledEntityIds:[],allEntityIds:[o]};if(t?.device_id&&null!=s[t.device_id]?.disabled_by)return{kind:"ha_disabled",reason:"device",enabledEntityIds:[],allEntityIds:[o]};if("ha_disabled"===l?.kind)return{kind:"ha_disabled",reason:l.reason||"entity",enabledEntityIds:[],allEntityIds:[o]};if(t||e?.states?.[o])return{kind:"active",enabledEntityIds:[o],allEntityIds:[o]}}return{kind:"unverified",reason:"registry_unavailable",enabledEntityIds:[],allEntityIds:[]}}function md(e){const t=sd(e);return{access:t.access,authoritative:t.authoritative,revision:t.revision,lastSuccess:t.lastSuccess,error:t.error}}function gd(e){const t={};for(const[i,n]of Object.entries(e.entities)){if(!n?.device_id||!cd(n))continue;const r=e.devices?.[n.device_id];r&&!cd(r)||(t[n.device_id]=t[n.device_id]||[]).push(i)}return t}function fd(e,t){const i=new Map;for(const n of e){if(!0===n?.removed)continue;const e=n?.binding||"";if(!e.startsWith("entity:"))continue;const r=e.slice(7);if(!r)continue;const o=t?.entities?.[r]?.device_id;if(!o)continue;const s=i.get(o)||new Set;s.add(r),i.set(o,s)}return{byDevice:i}}function vd(e,t,i,n){const r=n.byDevice.get(t);return r?.size?{partial:!0,entityIds:i.filter(t=>!r.has(t)&&!e?.entities?.[t]?.hidden)}:{partial:!1,entityIds:[...i]}}function yd(e,t,i){if(t.identifiers?.[0]?.[0])return t.identifiers[0][0];for(const t of i){const i=e.entities[t]?.platform;if(i)return i}return""}function bd(e,t){if(/_device_temperature$/.test(t))return!1;if(e.entities?.[t]?.entity_category)return!1;const i=e.states[t];if(!i)return/_temperature$/.test(t);const n=i.attributes||{};return"temperature"===n.device_class||/°C|°F/.test(n.unit_of_measurement||"")||/_temperature$/.test(t)}const wd=["vacuum","lawn_mower","climate","media_player","light","cover","lock","valve","alarm_control_panel","water_heater","fan","humidifier","siren","camera","remote"],kd=e=>[...e.filter(e=>!e.reg?.hidden),...e.filter(e=>!!e.reg?.hidden)];function xd(e,t){const i=t.map(t=>({eid:t,reg:e?.entities?.[t]})).filter(e=>!!e.reg);if(!i.length)return[];const n=i.filter(e=>!e.reg.entity_category),r=n.length?n:i;for(const e of wd){const t=r.filter(t=>t.eid.startsWith(e+"."));if(t.length)return kd(t).map(e=>e.eid)}const o=r.filter(t=>function(e,t){if(!t.startsWith("binary_sensor."))return!1;const i=Ch(e?.states?.[t]?.attributes?.device_class||e?.entities?.[t]?.device_class||e?.entities?.[t]?.original_device_class);return vh.has(i)||yh.has(i)||bh.has(i)||wh.has(i)||"moving"===i||kh.has(i)}(e,t.eid));if(o.length)return kd(o).map(e=>e.eid);const s=r.filter(e=>e.eid.startsWith("switch."));if(s.length){const t=kd(s),n=t.find(t=>zh(e,t.eid));if(s.length>1&&n){const t=i.filter(t=>t.eid!==n.eid&&"config"!==t.reg?.entity_category&&null!=Ph(e,t.eid)),r=t.filter(e=>!e.reg?.entity_category),o=r.length?r:t;for(const t of[0,1,2]){const i=kd(o.filter(i=>Ph(e,i.eid)===t));if(i.length)return[i[0].eid,n.eid]}}return[(n||t[0]).eid]}const a=[];for(const e of je)a.push(...kd(r.filter(t=>t.eid.startsWith(e+"."))));return a.push(...kd(r.filter(e=>!je.includes(e.eid.split(".")[0])))),a.map(e=>e.eid)}function Sd(e,t,i){const n=t.map(t=>({eid:t,reg:e.entities[t],st:e.states[t]})).filter(e=>e.reg),r=[n.filter(e=>!e.reg.hidden&&!e.reg.entity_category),n.filter(e=>!e.reg.entity_category),n.filter(e=>!e.reg.hidden),n];if("mdi:thermometer"===i||"mdi:air-filter"===i)for(const t of r){const i=t.find(t=>bd(e,t.eid));if(i)return i.eid}const o=xd(e,t);return o.find(Pn)||o[0]}function $d(e,t,i=[]){return[...new Set(Md(e,t,i))].filter(e=>Pn(e))}function Md(e,t,i=[]){const n=e?.startsWith("entity:")?new Set([e.slice(7)]):new Set(i);return(t||[]).filter(e=>"string"==typeof e&&!n.has(e))}function Rd(e,t){if("string"==typeof t)return e.area===t;const i=e.marker?.room_id;return i?!!t.id&&i===t.id:!!t.area&&e.area===t.area}function Cd(e){const t=e.marker?.binding?.startsWith("entity:")?e.marker.binding.slice(7):null,i=e.entities.filter(Pn),n=e.primary&&Pn(e.primary)?e.primary:null;return[...new Set([t,n,...i].filter(e=>!!e&&Pn(e)))]}function Td(e){const t=Cd(e),i=e.marker?.light_entity;return i&&t.includes(i)?i:t[0]||null}function Dd(e,t){if(!1===t.marker?.is_light)return[];if(!0===t.marker?.is_light){return[{eid:Td(t),via:"forced"}]}const i=t.primary||xd(e,t.entities)[0];return i&&!i.startsWith("light.")?[]:t.entities.filter(t=>t.startsWith("light.")&&!!e.states?.[t]).map(e=>({eid:e,via:"light"}))}const Ad=new WeakMap,Pd=new WeakMap;function Fd(e){return e.map(e=>[e.id||"",!0===e.hidden?1:0,e.primary||"",[...e.entities].join(","),void 0===e.controls?"":[...e.controls].join(","),e.marker?.id||"",e.marker?.binding||"",e.marker?.is_light,e.marker?.tap_action||"",!0===e.marker?.removed?1:0,e.marker?.light_entity||"",null==e.marker?.controls?"":[...e.marker.controls].join(",")].join("")).join("")}function zd(e){const t=Fd(e),i=Ad.get(e);if(i?.fingerprint===t)return i;const n=e.filter(e=>!e.hidden),r=new Map,o=new Map;for(const t of e){o.set(t,Md(t.marker?.binding,t.marker?.controls??t.controls,t.entities));const e=t.hidden||!0!==t.marker?.is_light?null:t.marker?.id||t.id;e&&r.set(String(e),t)}const s=new Map;for(const t of e){const e=o.get(t)||[],i=new Set(void 0===t.controls?e.filter(Pn):t.controls.filter(Pn)),n=Td(t),a=i.size?[...i]:n?[n]:[];for(const i of e){if(!i.startsWith("marker:"))continue;const e=i.slice(7);if(!e||e===String(t.marker?.id||t.id||""))continue;if(!r.has(e))continue;const n=s.get(e)||{markerId:e,controllers:[],driverEids:[]};n.controllers.push({device:t,driverEids:[...a]}),n.driverEids=[...new Set([...n.driverEids,...a])],s.set(e,n)}}const a={fingerprint:t,visible:n,markerById:r,persistedByDevice:o,incomingByMarker:s};return Ad.set(e,a),a}function Id(e){return zd(e).incomingByMarker}function Od(e,t){const i=$d(t.marker?.binding,t.controls??t.marker?.controls,t.entities),n=Md(t.marker?.binding,t.marker?.controls??t.controls,t.entities);return(null!=t.marker?.is_light||!i.length&&!n.some(e=>e.startsWith("marker:")))&&Dd(e,t).length>0}function Ed(e,t){return Dd(e,t).some(e=>!!e.eid)}function Nd(e,t,i,n){const r="always"===e||"auto"===e&&t,o=r&&!i;return{sourceExists:r,fromSourceEnabled:r&&i,manualEnabled:r,radiusEnabled:r,passive:o,effectiveMode:o&&"auto"===n?"fixed":n}}function Hd(e,t){const i=$d(t.marker?.binding,t.controls??t.marker?.controls,t.entities).map(e=>({eid:e,via:"controls"})),n=Od(e,t)?Dd(e,t):[];for(const e of n)e.eid&&i.some(t=>t.eid===e.eid)||i.push(e);return i}function Ld(e,t,i,n){if(null!=i)return Ld(e,t,null,n).filter(e=>Rd(e.device,i));const r=Fd(t),o=function(e,t){const i=new Set;for(const e of t){for(const t of e.entities)i.add(t);for(const t of e.controls||e.marker?.controls||[])"string"!=typeof t||t.startsWith("marker:")||i.add(t)}return[...i].sort().map(t=>`${t}:${e?.states?.[t]?.state??""}`).join("|")}(e,t),s=Wh(n),a=Pd.get(t);if(a?.graphFingerprint===r&&a.stateFingerprint===o&&a.virtualLightFingerprint===s&&a.registry===e?.entities)return a.sources;const{visible:l,markerById:c,persistedByDevice:h,incomingByMarker:d}=zd(t),u=null==i?l:l.filter(e=>Rd(e,i)),p=new Map,_=new Map;for(const t of u){const i=Hd(e,t).filter(e=>"controls"!==e.via);for(const n of i){const i=!0===t.marker?.is_light?String(t.marker?.id||t.id||""):"",r=i?`marker:${i}`:`entity:${n.eid}`,o=n.eid?[n.eid]:[],s={key:r,eid:n.eid||"",stateEids:o,serviceEids:o,device:t,via:n.via,castsGlow:!0,passive:!n.eid,on:!n.eid||"on"===e.states?.[n.eid]?.state};p.set(t,[...p.get(t)||[],s]),n.eid&&_.set(n.eid,s)}}const m=new Map;for(const e of t){const t=h.get(e)||[],i=new Set(void 0===e.controls?t.filter(Pn):e.controls);m.set(e,i)}for(const t of p.values())for(const i of t){if(!i.passive)continue;const t=i.key.slice(7),r=d.get(t);i.on=!r||r.driverEids.some(t=>"on"===e.states?.[t]?.state),!r&&Uh(i.device.marker)&&(i.on=Gh(i.device.marker,n))}const g=new Map,f=e=>{const t=g.get(e.key);(!t||e.castsGlow&&!t.castsGlow)&&g.set(e.key,e)};for(const t of l){const n=h.get(t)||[],r=null==i||Rd(t,i);for(const i of n){if(i.startsWith("marker:")){const e=c.get(i.slice(7)),t=e?p.get(e):null;if(t)for(const e of t)f(e);continue}if(!Pn(i)||!m.get(t)?.has(i))continue;const n=_.get(i);n?f(n):r&&f({key:`entity:${i}`,eid:i,stateEids:[i],serviceEids:[i],device:t,via:"controls",castsGlow:!1,passive:!1,on:"on"===e.states?.[i]?.state})}for(const e of p.get(t)||[])f(e)}const v=[...g.values()];return Pd.set(t,{graphFingerprint:r,stateFingerprint:o,virtualLightFingerprint:s,registry:e?.entities,sources:v}),v}function Bd(e){const t=e.filter(e=>e.castsGlow);return t.find(e=>e.on)||t[0]||null}function qd(e){return e.length?e.some(e=>e.on)?"on":"off":"none"}function jd(e,t){const i=[];for(const n of t){const t=e.states[n];if(!t)continue;const r=(t.attributes?.unit_of_measurement||"").toLowerCase();if(/_(linkquality|lqi)$/.test(n)||"lqi"===r){const e=parseFloat(t.state);isNaN(e)||i.push(e);continue}const o=t.attributes?.linkquality??t.attributes?.lqi;if(null!=o){const e=parseFloat(o);isNaN(e)||i.push(e)}}return Ii(i)}function Wd(e,t){for(const i of t){if(!bd(e,i))continue;const t=e.states[i];if(!t)continue;const n=parseFloat(t.state);if(!isNaN(n))return Math.round(10*n)/10}return null}function Ud(e,t){for(const i of t){if(!i.startsWith("climate."))continue;const t=e.states[i];if(!t||"unavailable"===t.state||"unknown"===t.state)continue;const n=parseFloat(t.attributes?.current_temperature);if(Number.isFinite(n))return Math.round(10*n)/10}return null}function Gd(e,t){if(e.entities?.[t]?.entity_category)return!1;const i=e.states[t];if(!i)return/_humidity$/.test(t);const n=i.attributes||{};return"humidity"===n.device_class||"%"===n.unit_of_measurement&&/_humidity$/.test(t)||/_humidity$/.test(t)}function Vd(e,t){for(const i of t){if(!Gd(e,i))continue;const t=e.states[i];if(!t)continue;const n=parseFloat(t.state);if(!isNaN(n))return Math.round(n)}return null}function Kd(e,t){if(!t)return[];const i=[];for(const[t,n]of Object.entries(e.entities)){if(!t.startsWith("light.")||n.hidden||!cd(n))continue;let r=null;if("group"===n.platform)r=n.area_id||null;else{if(!n.device_id)continue;{const t=e.devices[n.device_id];if(!cd(t))continue;if("Group"!==t?.model)continue;r=t.area_id||n.area_id||null}}if(!r)continue;const o=e.states[t];i.push({eid:t,name:n.name||o?.attributes?.friendly_name||t,area:r})}return i}function Yd(e,t,i,n,r){const o=qe(t,i,r);if(o!==Be)return o;const s=[];for(const t of n){const i=e.states[t]?.attributes?.device_class;i&&s.push(i)}return function(e){for(const t of e){const e=Le[t];if(e)return e}return null}(s)??Be}function Xd(e,t){return e.map(e=>{if(!Array.isArray(e.controls))return e;const i=e.controls.filter(e=>!("string"==typeof e&&e.startsWith("marker:")&&t.has(e.slice(7))));return i.length===e.controls.length?e:{...e,controls:i.length?i:null}})}function Zd(e,t,i){if(!t||!i||t===i)return[...e];const n=`marker:${t}`,r=`marker:${i}`;return e.map(e=>{const t=Array.isArray(e.controls)?e.controls.map(e=>e===n?r:e):e.controls,i="derived_marker_state"===e.value_badge?.source?.kind&&e.value_badge.source.ref===n?{...e.value_badge,source:{...e.value_badge.source,ref:r}}:e.value_badge,o="derived_marker_state"===e.value_source?.kind&&e.value_source.ref===n?{...e.value_source,ref:r}:e.value_source;return t===e.controls&&i===e.value_badge&&o===e.value_source?e:{...e,controls:t,...void 0!==i?{value_badge:i}:{},...void 0!==o?{value_source:o}:{}}})}function Jd(e,t,i){if(!t||t===i)return!0;const n=new Map;for(const t of e)n.set(t.id,(t.controls||[]).filter(e=>"string"==typeof e&&e.startsWith("marker:")).map(e=>e.slice(7)));const r=new Set,o=[i];for(;o.length;){const e=o.pop();if(e===t)return!0;r.has(e)||(r.add(e),o.push(...n.get(e)||[]))}return!1}function Qd(e,t,i,n){const r=new Set([t]),o=e.filter(e=>{const o=e.id===t||!n&&e.binding===i;return o&&r.add(e.id),!o});return{markers:n?o:[...o,{id:t,binding:i,removed:!0,hidden:!0}],cleanupIds:r}}function eu(e){const t=new Set,i=new Set,n=new Set;for(const r of e||[]){const e=String(r.binding||"").indexOf(":");if(e<1)continue;const o=r.binding.slice(0,e),s=r.binding.slice(e+1);s&&(!0===r?.removed?"device"===o?t.add(s):"entity"===o&&i.add(s):"entity"===o&&n.add(s))}return{devices:t,entities:i,liveEntities:n}}function tu(e,t,i){if(i.liveEntities.has(t))return!1;if(i.entities.has(t))return!0;const n=e?.entities?.[t]?.device_id;return!!n&&i.devices.has(n)}function iu(e,t,i,n,r){const o=$d(t.binding,t.controls,e.entities).filter(e=>!tu(i,e,n)).filter(e=>"active"===_d(i,"entity:"+e,r).kind);e.marker=t,e.controls=o,e.userHidden=!0===t.hidden,e.hidden=e.userHidden||"ha_disabled"===e.bindingStatus?.kind,t.name&&(e.name=t.name),t.icon&&(e.icon=t.icon),null!=t.model&&(e.model=t.model),e.link=t.link??null,e.description=t.description??null,e.pdfs=t.pdfs||[],e.tapAction=t.tap_action??null}function nu(e){const t=e.hass,i=e.registry||sd(t),n=hd(t,i),r=dd(t,i),{areaToSpace:o,markers:s,settings:a,excluded:l,iconRules:c}=e,h=!1!==a.group_lights,d=eu(s),u=Kd(n,h).filter(e=>!tu(n,e.eid,d)),p=new Set(u.map(e=>e.area)),_=gd(n),m=fd(s,r),g=new Set(s.map(e=>e.binding)),f=[];for(const e of Object.values(n.devices)){const r=e.area_id;if(!r||!o[r])continue;if("service"===e.entry_type)continue;if(g.has("device:"+e.id))continue;if("active"!==_d(t,"device:"+e.id,i).kind)continue;const s=vd(n,e.id,_[e.id]||[],m);if(s.partial&&!s.entityIds.length)continue;const a=s.entityIds,d=yd(n,e,a);let u=l.has(d)||"Group"===e.model||/scene/i.test(e.model||"")||/bridge/i.test((e.model||"")+(e.name||""))||"myheat"===d&&!!e.via_device_id;if(!u&&h&&p.has(r)){const t=(e.name_by_user||e.name||"").trim();"mdi:lightbulb"===Yd(n,t,e.model,a,c)&&(u=!0)}u&&f.push("device:"+e.id)}return f}function ru(e,t,i,n){if("string"==typeof e.room_id&&e.room_id.length>0&&null===e.area)return{area:"",space:e.space||n};const r=e.area||t||"";return{area:r,space:r&&i[r]||e.space||n}}function ou(e){const t=e.hass,i=e.registry||sd(t),n=hd(t,i),r=dd(t,i),{areaToSpace:o,markers:s,settings:a,excluded:l,showAll:c,firstSpaceId:h,loc:d,iconRules:u}=e,p=!1!==a.group_lights,_=eu(s),m=Kd(n,p).filter(e=>!tu(n,e.eid,_)),g=new Set(m.map(e=>e.area)),f=gd(n),v=function(e){const t={};for(const[i,n]of Object.entries(e.entities||{}))n?.device_id&&(t[n.device_id]=t[n.device_id]||[]).push(i);return t}(r),y=fd(s,r),b=new Set;for(const e of s){const[t,i]=e.binding.split(":");"device"!==t&&"entity"!==t||!i||b.add(e.binding)}const w=(e,t)=>s.find(i=>i.binding===e+":"+t),k={},x=[];for(const e of Object.values(n.devices)){const r=e.area_id;if(!r||!o[r])continue;if("service"===e.entry_type)continue;if(b.has("device:"+e.id))continue;const s=_d(t,"device:"+e.id,i);if("active"!==s.kind)continue;const h=w("device",e.id);if(h&&h.hidden&&!a.filter_seeded)continue;const _=vd(n,e.id,f[e.id]||[],y);if(_.partial&&!_.entityIds.length)continue;const m=_.entityIds,v=_.partial?{kind:"active",enabledEntityIds:m,allEntityIds:m}:s,S=yd(n,e,m),$=!a.filter_seeded;if($&&!c){if(l.has(S))continue;if("Group"===e.model)continue;if(/scene/i.test(e.model||""))continue;if(/bridge/i.test((e.model||"")+(e.name||"")))continue;if("myheat"===S&&e.via_device_id)continue}const M=(e.name_by_user||e.name||d("device.unnamed")).trim(),R=M+"|"+r;let C=Yd(n,M,e.model,m,u);if(m.some(e=>e.startsWith("lock."))&&(C="mdi:lock"),$&&!c&&p&&"mdi:lightbulb"===C&&g.has(r))continue;k[R]=(k[R]||0)+1;const T=k[R]>1?M+" "+k[R]:M,D={id:e.id,name:T,model:e.model||"",area:r,space:o[r],icon:C,entities:m,allEntities:v.allEntityIds,bindingStatus:v,bindingKind:"device",bindingRef:e.id,pdfs:[]};D.primary=Sd(n,m,C),"mdi:thermometer"!==C&&"mdi:air-filter"!==C||(D.temp=Wd(n,m)),D.primary&&Gd(n,D.primary)&&(D.hum=Vd(n,m)),x.push(D)}for(const e of m)o[e.area]&&(b.has("entity:"+e.eid)||x.push({id:"lg_"+e.eid,name:e.name,model:d("device.light_group"),area:e.area,space:o[e.area],icon:"mdi:lightbulb-group",entities:[e.eid],allEntities:[e.eid],bindingStatus:{kind:"active",enabledEntityIds:[e.eid],allEntityIds:[e.eid]},primary:e.eid,bindingKind:"entity",bindingRef:e.eid,pdfs:[]}));for(const e of s){if(e.removed)continue;const[s,l]=e.binding.split(":"),c="device"===s||"entity"===s?_d(t,e.binding,i):null;if(!e.hidden||a.filter_seeded||"ha_disabled"===c?.kind)if("device"===s){const t=c;if("unverified"===t.kind)continue;const s=r.devices[l],{area:a,space:p}=ru(e,s?.area_id,o,h),m="active"===t.kind?t.enabledEntityIds:[];let g=s?Yd(n,s.name_by_user||s.name||"",s.model,m,u):"mdi:help-circle";m.some(e=>e.startsWith("lock."))&&(g="mdi:lock");const f={id:e.id,name:s?.name_by_user||s?.name||d("device.fallback"),model:s?.model||"",area:a,space:p,icon:g,entities:m,allEntities:t.allEntityIds.length?t.allEntityIds:s&&v[s.id]||[],bindingStatus:t,bindingKind:"device",bindingRef:l};f.primary=Sd(n,m,g),"mdi:thermometer"!==g&&"mdi:air-filter"!==g||(f.temp=Wd(n,m)),f.primary&&Gd(n,f.primary)&&(f.hum=Vd(n,m)),iu(f,e,r,_,i),x.push(f)}else if("entity"===s){if(tu(r,l,_))continue;const t=c;if("unverified"===t.kind)continue;const s=r.entities[l],a=s?.area_id||s?.device_id&&r.devices[s.device_id]?.area_id||"",{area:d,space:p}=ru(e,a,o,h),m=n.states[l],g=s?.name||m?.attributes?.friendly_name||l;let f=Yd(n,g,"",[l],u);l.startsWith("lock.")&&(f="mdi:lock");const v={id:e.id,name:g,model:"",area:d,space:p,icon:f,entities:"active"===t.kind?[l]:[],allEntities:[l],bindingStatus:t,primary:"active"===t.kind?l:void 0,bindingKind:"entity",bindingRef:l};"mdi:thermometer"!==f&&"mdi:air-filter"!==f||!v.entities.length||(v.temp=Wd(n,v.entities)),v.entities.length&&Gd(n,l)&&(v.hum=Vd(n,v.entities)),iu(v,e,r,_,i),x.push(v)}else{const t=e.area||"",n=e.space||t&&o[t]||h,s={id:e.id,name:e.name||d("device.virtual"),model:e.model||"",area:t,space:n,icon:e.icon||"mdi:map-marker",entities:[],allEntities:[],bindingStatus:{kind:"active",enabledEntityIds:[],allEntityIds:[]},bindingKind:"virtual",virtual:!0};iu(s,e,r,_,i),x.push(s)}}return x}function su(e){const{marker:t,siblingMarkers:i=[],...n}=e;return ou({...n,markers:[...i.filter(e=>e.id!==t.id),t]}).find(e=>e.id===t.id)||null}function au(e,t,i,n){if(!t)return null;if(function(e,t,i){if(!t)return!1;const n=t.indexOf(":");if(n<1)return!1;const r=t.slice(0,n),o=t.slice(n+1),s=eu(i);return"device"===r?s.devices.has(o):"entity"===r&&tu(e,o,s)}(e,t,n))return null;const r=t.indexOf(":");if(r<0)return null;const o=t.slice(0,r),s=t.slice(r+1);if(!s)return null;if("entity"===o){const t=parseFloat(e.states[s]?.state);return Number.isFinite(t)?"temp"===i?Math.round(10*t)/10:Math.round(t):null}if("device"===o){const t=Object.entries(e.entities).filter(([,e])=>e.device_id===s).map(([e])=>e);return"temp"===i?Wd(e,t):Vd(e,t)}return null}const lu=new RegExp(["water","voda","coolant","flow_?temp","return_?temp","target","setpoint","chip","cpu","processor","board","core_temp","device_temp","batter","akkum","freezer","fridge","oven","kettle","boiler"].join("|"),"i");function cu(e,t){return t.area?t.area:e&&t.id?`@room/${encodeURIComponent(e)}/${encodeURIComponent(t.id)}`:null}function hu(e){return null==e.area&&e.space&&e.room_id?cu(e.space,{id:e.room_id,area:null}):e.area||null}function du(e){const t=e?.exclude_integrations;return t?new Set(t):Ie}function uu(e,t,i,n=Ie){const r=new Map;if(!e?.entities)return r;const o=eu(i),s=new Set,a=new Map,l=new Map;for(const e of i||[]){if(e?.removed)continue;const t=(e.binding||"").indexOf(":");if(t<=0)continue;const i=e.binding.slice(0,t),n=e.binding.slice(t+1);if(!n)continue;!0===e.use_climate_temp&&s.add(n);const r=hu(e);r&&("entity"!==i||a.has(n)?"device"!==i||l.has(n)||l.set(n,r):a.set(n,r))}const c=new Map;for(const[t,i]of Object.entries(e.entities)){if(i.device_id&&o.devices.has(i.device_id)&&!o.liveEntities.has(t)||!i.device_id&&o.entities.has(t)&&!o.liveEntities.has(t))continue;const r=i.device_id?e.devices?.[i.device_id]:null;if(!cd(i)||r&&!cd(r))continue;const h=a.get(t)||(i.device_id?l.get(i.device_id):null)||i.area_id||r?.area_id||null;if(!h)continue;if(i.entity_category)continue;if(!(s.size>0&&t.startsWith("climate.")&&(s.has(t)||i.device_id&&s.has(i.device_id)))){if(n.has(i.platform))continue;if(lu.test(t))continue}let d=c.get(h);d||(d=new Map,c.set(h,d));const u=i.device_id||t;let p=d.get(u);if(!p){const n=e.states?.[t];p={name:(r?r.name_by_user||r.name:i.name||n?.attributes?.friendly_name||t)||t,model:r?.model,ents:[]},d.set(u,p)}p.ents.push(t)}for(const[i,n]of c){const o=[],a=[];for(const[i,r]of n){const n=Yd(e,r.name,r.model,r.ents,t),l="mdi:thermometer"===n||"mdi:air-filter"===n;if(l){const t=Wd(e,r.ents);null!=t&&o.push(t)}if(s.size>0&&(s.has(i)||r.ents.some(e=>s.has(e)))){const t=Ud(e,r.ents);null!=t&&o.push(t)}if(l||"mdi:water-percent"===n){const t=Vd(e,r.ents);null!=t&&a.push(t)}}(o.length||a.length)&&r.set(i,{temp:o.length?Math.round(o.reduce((e,t)=>e+t,0)/o.length*10)/10:null,hum:a.length?Math.round(a.reduce((e,t)=>e+t,0)/a.length):null})}return r}function pu(e,t,i){const n=[];for(const r of t){if(r.area!==i||r.virtual)continue;const t=jd(e,r.entities);null!=t&&n.push(t)}return Ii(n)}const _u={offStates:["off"],unknownUsesToggle:!0},mu={light:_u,switch:_u,fan:_u,humidifier:_u,input_boolean:_u,automation:_u,remote:_u,group:_u,climate:{..._u,featureMasks:{turn_on:256,turn_off:128,toggle:384}},media_player:{..._u,featureMasks:{turn_on:128,turn_off:256,toggle:384}},siren:{..._u,featureMasks:{turn_on:1,turn_off:2,toggle:3}},vacuum:{..._u,featureMasks:{turn_on:1,turn_off:2,toggle:3}},water_heater:{..._u,featureMasks:{turn_on:8,turn_off:8,toggle:8}},camera:{..._u,featureMasks:{turn_on:1,turn_off:1,toggle:1}}};function gu(e){return e.slice(0,e.indexOf("."))}function fu(e,t,i){if(!e?.services||"object"!=typeof e.services)return!1;const n=e.services?.[t];return!!n&&Object.prototype.hasOwnProperty.call(n,i)}function vu(e,t,i){return fu(e,t,i)?{domain:t,service:i}:fu(e,"homeassistant",i)?{domain:"homeassistant",service:i}:null}function yu(e,t){return e?.entities?.[t]||null}function bu(e,t,i){const n=e?.states?.[i],r=yu(t,i);return n?.attributes?.friendly_name||r?.name||r?.original_name||i}function wu(e,t){const i=yu(e,t);if(null!=i?.disabled_by)return!0;const n=i?.device_id?e?.devices?.[i.device_id]:null;return null!=n?.disabled_by}function ku(e,t){const i=e?.attributes?.supported_features;if(null==i||""===i)return!1;const n=Number(i);return Number.isFinite(n)&&(n&t)===t}function xu(e,t,i){const n=gu(i);if("lock"===n||"alarm_control_panel"===n)return!0;if("cover"!==n)return!1;const r=e?.states?.[i],o=yu(t,i),s=String(r?.attributes?.device_class||o?.device_class||o?.original_device_class||"");return Gi.has(s)}function Su(e,t,i,n,r){return{ref:i,entityId:n,name:n?bu(e,t,n):null,reason:r}}function $u(e,t,i,n,r,o=null){return{target:null,skipped:Su(e,t,i,n,r),semantics:o,nextEffect:null,command:null}}function Mu(e,t,i,n,r=i){const o=gu(i);if("cover"!==o&&"valve"!==o)return function(e,t,i,n,r=i){const o=gu(i),s=e?.states?.[i];if(wu(t,i))return $u(e,t,r,i,"ha-disabled","power");if(xu(e,t,i))return $u(e,t,r,i,"secure");if(!s)return $u(e,t,r,i,"missing","power");if("unavailable"===s.state)return $u(e,t,r,i,"unavailable","power");const a=mu[o];if(!a)return $u(e,t,r,i,"unsupported");let l,c;if("unknown"===s.state||""===s.state){if(!a.unknownUsesToggle)return $u(e,t,r,i,"unsupported","power");l="toggle",c="toggle"}else a.offStates.includes(String(s.state))?(l="turn-on",c="turn_on"):(l="turn-off",c="turn_off");const h=a.featureMasks?.[c];if(h&&!ku(s,h))return $u(e,t,r,i,"unsupported","power");const d=vu(e,o,c);return d?{target:{entityId:i,name:bu(e,t,i),state:String(s.state||""),via:n},skipped:null,semantics:"power",nextEffect:l,command:{...d,data:{entity_id:i}}}:$u(e,t,r,i,"unsupported","power")}(e,t,i,n,r);if(wu(t,i))return $u(e,t,r,i,"ha-disabled",o);if(xu(e,t,i))return $u(e,t,r,i,"secure",o);const s=e?.states?.[i];if(!s)return $u(e,t,r,i,"missing",o);if("unavailable"===s.state)return $u(e,t,r,i,"unavailable",o);const a=function(e,t,i){const n=String(i?.state||""),r="closed"===n?{service:`open_${t}`,effect:"open",feature:1}:"open"===n?{service:`close_${t}`,effect:"close",feature:2}:"opening"===n||"closing"===n?{service:`stop_${t}`,effect:"stop",feature:8}:null;return r&&ku(i,r.feature)&&fu(e,t,r.service)?r:ku(i,3)&&fu(e,t,"toggle")?{service:"toggle",effect:"toggle"}:null}(e,o,s);if(!a)return $u(e,t,r,i,"unsupported",o);return{target:{entityId:i,name:bu(e,t,i),state:String(s.state||""),via:n},skipped:null,semantics:o,nextEffect:a.effect,command:{domain:o,service:a.service,data:{entity_id:i}}}}function Ru(e){return"entity"===e.bindingKind?e.bindingRef&&Pn(e.bindingRef)?[e.bindingRef]:[]:"virtual"===e.bindingKind?[]:Cd(e)}function Cu(e){const t=e.marker?.toggle_entity;return t&&Ru(e).includes(t)?t:null}function Tu(e,t,i){const n=function(e,t){if("entity"===e.bindingKind&&e.bindingRef){const t=e.marker?.light_entity?Td(e):null;return[...new Set([t,e.bindingRef].filter(e=>!!e))]}const i=e.entities.length?e.entities:e.allEntities||[],n=e.marker?.light_entity||e.primary&&Pn(e.primary)?Td(e):null;return[...new Set([n,...xd(t,i)].filter(e=>!!e))]}(i,t);if(!n.length)return null;const r="entity"===i.bindingKind?"binding":"device-role";if("binding"===r)return Mu(e,t,n[0],r);let o=null,s=null;for(const i of n){const n=Mu(e,t,i,r);if(n.command)return n;const a=n.skipped?.reason;if("missing"===a||"unavailable"===a||"secure"===a)return n;"ha-disabled"!==a?o||=n:s||=n}return o||s}function Du(e){const t=e.skipped?.reason;return"missing"===t?"unavailable":t||"unsupported"}function Au(e,t){return{origin:e,kind:"none",semantics:null,targets:[],skippedTargets:[],noneReason:t,nextEffect:null,command:null}}function Pu(e,t){return"cover"===e||"toggle"===e?"toggle":"more-info"===e||"run"===e||"info"===e||"none"===e?e:(null==e||""===e)&&"light"===t?"toggle":"info"}function Fu(e,t){return{origin:e,kind:"single",semantics:t.semantics,targets:t.target?[t.target]:[],skippedTargets:t.skipped?[t.skipped]:[],noneReason:t.command?null:Du(t),nextEffect:t.nextEffect,command:t.command}}function zu(e,t,i,n=[]){const r=new Map,o=[],s=new Set,a=e=>{const t=`${e.ref}\n${e.entityId||""}\n${e.reason}`;s.has(t)||(s.add(t),o.push(e))};for(const e of n)a(e);for(const n of i){const i=Mu(e,t,n.entityId,n.via,n.ref);i.target?r.set(n.entityId,r.get(n.entityId)||i.target):i.skipped&&a(i.skipped)}const l=[...r.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=vu(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=>Su(e,t,i.entityId,i.entityId,"unsupported"))],noneReason:"unsupported",nextEffect:null,command:null}}function Iu(e){return String(e.marker?.id||e.id||"")}function Ou(e){const{hass:t,device:i}=e,n=e.registryHass||t,r=function(e){return"toggle"===e.tapAction?"explicit-toggle":"cover"===e.tapAction?"legacy-cover":!e.tapAction&&e.primary?.startsWith("light.")?"default-light":null}(i);if(!r)return null;const o=i.marker;if("explicit-toggle"===r&&Uh(o)){const t=String(o?.id||i.id||""),n=Id(e.devices).get(t);if(n)return function(e,t){const i=e.registryHass||e.hass;return zu(e.hass,i,t.driverEids.map(e=>({entityId:e,via:"control-marker-driver",ref:`marker:${t.markerId}`})))}(e,n);const s=Gh(o,e.virtualLights);return{origin:r,kind:"single",semantics:"power",targets:[{entityId:"",name:i.name,state:s?"on":"off",via:"virtual-light"}],skippedTargets:[],noneReason:null,nextEffect:s?"turn-off":"turn-on",command:null,operation:{kind:"virtual-light",markerId:o.id}}}if("explicit-toggle"===r){if(Md(i.marker?.binding,i.marker?.controls??i.controls,i.entities).length)return function(e,t=null){const{hass:i,device:n,devices:r}=e,o=e.registryHass||i,s=Md(n.marker?.binding,n.marker?.controls??n.controls,n.entities),a=e.lightSources||Ld(i,r,null,e.virtualLights),l=new Map;for(const e of a){if(!e.key.startsWith("marker:"))continue;const t=l.get(e.key)||[];t.push(e),l.set(e.key,t)}const c=Id(r),h=new Map;for(const e of r){const t=String(e.marker?.id||e.id||"");t&&h.set(t,e)}const d=[],u=[];t&&d.push({entityId:t,via:"entity"===n.bindingKind?"binding":"device-role",ref:t});for(const e of s){if(!e.startsWith("marker:")){Pn(e)?d.push({entityId:e,via:"control-entity",ref:e}):u.push(Su(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 n=t.bindingStatus.allEntityIds[0]||null;u.push({ref:e,entityId:n,name:t.name||(n?bu(i,o,n):null),reason:"ha-disabled"})}else u.push(Su(i,o,e,null,"missing"));continue}const r=[...new Set(t.flatMap(e=>e.serviceEids))];if(r.length){for(const t of r)d.push({entityId:t,via:"control-entity",ref:e});continue}const s=t.some(e=>e.passive),a=e.slice(7),p=Iu(n),_=c.get(a)?.controllers.find(e=>Iu(e.device)===p);if(s&&_?.driverEids.length)for(const t of _.driverEids)d.push({entityId:t,via:"control-marker-driver",ref:e});else u.push(Su(i,o,e,null,s?"missing":"unsupported"))}return zu(i,o,d,u)}(e,Cu(i))}if("legacy-cover"===r){const e=i.entities.find(e=>e.startsWith("cover."))||i.allEntities?.find(e=>e.startsWith("cover."));return e?Fu(r,Mu(t,n,e,"device-role")):Au(r,"no-actionable-entity")}const s=Cu(i),a=s?Mu(t,n,s,"entity"===i.bindingKind?"binding":"device-role"):Tu(t,n,i);return a?Fu(r,a):Au(r,i.virtual||"virtual"===i.bindingKind?"no-actionable-entity":"no-binding")}function Eu(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 Nu(e){return e?e.operation?e.operation:e.command?{kind:"ha-service",command:e.command}:null:null}const Hu=new Set(["missing","ha-disabled","unavailable"]);function Lu(e,t){const i=Nu(e),n=Nu(t);return!(!i||!n||i.kind!==n.kind)&&("virtual-light"===i.kind&&"virtual-light"===n.kind?i.markerId===n.markerId:"ha-service"===i.kind&&"ha-service"===n.kind&&function(e,t){const i=Eu(e),n=Eu(t);return i.length===n.length&&i.every((e,t)=>e===n[t])}(i.command,n.command))}function Bu(e,t){const i=e.targets[0]||e.skippedTargets[0],n=[];return"group"===e.kind?e.targets.length&&n.push(t.group(e.targets)):i&&n.push(t.single(i)),e.nextEffect&&e.targets.length&&n.push("group"===e.kind?t.groupCurrentNext(e.targets,e.nextEffect):t.currentNext(e.targets[0],e.nextEffect)),e.skippedTargets.length&&n.push(t.skipped(e.skippedTargets)),!e.command&&e.noneReason&&n.push(t.none(e.noneReason)),n}function qu(e,t){return e.catch(()=>{}).then(t)}const ju=e=>{const t=e?.config;return t&&Array.isArray(t.spaces)?t:null},Wu=(e,t)=>"number"==typeof e&&Number.isFinite(e)?e:t;class Uu{constructor(e){this.onBodyReplaced=e,this.config=null,this.configRev=0,this.configFingerprint="",this.layout={},this.layoutRev=0,this.layoutFingerprint=""}setConfig(e){const t=this.config;e!==t&&(this.config=e,this.onBodyReplaced?.("_serverCfg",t))}setLayout(e){const t=this.layout;e!==t&&(this.layout=e,this.onBodyReplaced?.("_layout",t))}currentConfigFingerprint(){return this.configFingerprint||uc(this.config)}currentLayoutFingerprint(){return this.layoutFingerprint||uc(this.layout)}adoptResponses(e,t,i,n){const r=ju(e),o=uc(r),s=o!==this.currentConfigFingerprint();s&&(i(),this.setConfig(r),this.configFingerprint=o),this.configRev=e?.rev??this.configRev;let a=!1;if(void 0!==t){const e=t?.layout??{},i=uc(e);a=i!==this.currentLayoutFingerprint(),a&&(n(),this.setLayout(e),this.layoutFingerprint=i),this.layoutRev=t?.rev??this.layoutRev}return{configChanged:s,layoutChanged:a}}adoptMergedLayout(e,t,i){const n=uc(e),r=n!==uc(this.layout);return r&&(i?.(),this.setLayout(e)),this.layoutFingerprint=n,this.layoutRev=t?.rev??this.layoutRev,r}stageConfigCandidate(e){const t=uc(e);t!==uc(this.config)&&this.setConfig(e),this.configFingerprint=t}acceptConfigWrite(e,t){this.configFingerprint=uc(e),this.configRev=Wu(t?.rev,this.configRev+1)}acceptPairWrite(e,t,i){this.setConfig(e),this.configFingerprint=uc(e),this.setLayout(t),this.layoutFingerprint=uc(t),this.configRev=Wu(i?.config_rev,this.configRev+1),this.layoutRev=Wu(i?.layout_rev,this.layoutRev+1)}noteLayoutRevision(e){"number"==typeof e&&e>this.layoutRev&&(this.layoutRev=e)}stageLocalConfig(e){this.setConfig(e)}stageLocalLayout(e){this.setLayout(e)}seedIdentity(e){Object.assign(this,e)}refreshConfigFingerprint(){this.configFingerprint=uc(this.config)}refreshLayoutFingerprint(){this.layoutFingerprint=uc(this.layout)}beginOptimistic(e,t){return function(e,t,i,n,r){return{previous:JSON.parse(JSON.stringify(e)),previousFingerprint:i,revision:n,attempted:t,attemptedFingerprint:r(t)}}(e,t,this.configFingerprint,this.configRev,uc)}rollbackOptimistic(e){const t=this.config;return!(!t||this.configRev!==e.revision||uc(t)!==e.attemptedFingerprint)&&(this.setConfig(e.previous),this.configFingerprint=e.previousFingerprint,!0)}restoreCached(e){const t=e?.config;return!(!t||!Array.isArray(t.spaces))&&(this.setConfig(t),this.configRev=e?.rev||0,this.configFingerprint=e?.config_fingerprint||uc(t),this.setLayout(e?.layout||{}),this.layoutRev=e?.layout_rev||0,this.layoutFingerprint=e?.layout_fingerprint||uc(this.layout),!0)}snapshot(e){return this.config?(this.refreshConfigFingerprint(),this.refreshLayoutFingerprint(),{config:this.config,rev:this.configRev,config_fingerprint:this.configFingerprint,layout:this.layout,layout_rev:this.layoutRev,layout_fingerprint:this.layoutFingerprint,virtual_lights:e}):null}}async function Gu(e,t){const i=t.isCurrent??(()=>!0);if(!i())return{status:"superseded"};const{cfgResp:n,layResp:r}=t,o=e._adoption,s=ju(n),a=null!=n&&uc(s)!==o.currentConfigFingerprint()||null!=r&&uc(r.layout??{})!==o.currentLayoutFingerprint();if(a){const t=await e._signer.prepareImage(e.hass,e._candidateBackdrop(s));if(!i())return{status:"superseded"};if(!t)return e._continuity.note("asset-failed"),e._scheduleLoadRetry(!0),{status:"asset-wait"}}if(!i())return{status:"superseded"};a&&e._continuity.hasCompleteFrame&&"steady"===e._continuity.state&&e._beginContinuityCandidate(t.reason,!0),t.beforeAdopt?.();const l=e._space;return function(e,t,i){const n=e._adoption,r=!!n.config,{configChanged:o,layoutChanged:s}=n.adoptResponses(t??{},i,()=>{e._geometryHistory.clear(),e._devicePositionHistory.clear(),e._cancelDeviceDrag(),e._pendingPhysicalWrites.clear(),e._clearRoomFocus(!0),e._cancelCameraTransition(!1),r&&e._clearGeometryGesture()},()=>{e._cancelCameraTransition(!1),e._devicePositionHistory.clear(),e._cancelDeviceDrag()});if(o&&e._seedDecorStyle(n.config),t&&("virtual_lights"in t||"config"in t)){const i=jh(e._virtualLights,t.virtual_lights,n.configRev,"virtual_lights"in t);Wh(i)!==Wh(e._virtualLights)&&(e._virtualLights=i,e._capturedSnapshotVirtual="")}e._canOptimizeUndo=!(!t?.can_optimize_undo&&!i?.can_optimize_undo),e._adoptConfigCapabilities(t),e._undoKind=t?.undo_kind||i?.undo_kind||null,"boolean"==typeof t?.can_write&&(e._serverCanWrite=t.can_write),o&&e._continuity.note("config-candidate",{configRev:n.configRev}),s&&e._continuity.note("layout-candidate",{layoutRev:n.layoutRev})}(e,n,r),"reload"===t.profile&&(e._syncDecorAssets(s).catch(()=>{}),e._adoptInitialSpace(e._model,!0),e._resumePendingNavMode(),e._cacheSnapshot()),t.afterAdopt?.(),{status:"adopted",spaceChanged:e._space!==l}}const Vu=(e,t)=>e.connection===t.connection&&e.userId===t.userId&&e.route===t.route,Ku=e=>"number"==typeof e&&Number.isFinite(e)?e:null;class Yu{constructor(){this.sequence=0,this.currentSequence=0,this.lifecycle=0,this.observedHighWater=null,this.context=null}observeContext(e){this.context?Vu(this.context,e)||(this.context={...e},this.invalidateLifecycle()):this.context={...e}}invalidateLifecycle(){this.lifecycle+=1,this.currentSequence=++this.sequence,this.observedHighWater=null}observeRevision(e,t,i){this.observeContext(i);const n=Ku(e);if(null===n)return null;const r=Ku(t)??Number.NEGATIVE_INFINITY;return n<=Math.max(r,this.observedHighWater??Number.NEGATIVE_INFINITY)?null:(this.observedHighWater=n,Object.freeze({sequence:this.currentSequence,lifecycle:this.lifecycle,context:{...i},observedRevision:n}))}isReservationCurrent(e,t,i){this.observeContext(t);const n=Ku(i)??Number.NEGATIVE_INFINITY;return e.sequence===this.currentSequence&&e.lifecycle===this.lifecycle&&Vu(e.context,t)&&e.observedRevision===this.observedHighWater&&e.observedRevision>n}begin(e){this.observeContext(e.context),e.force&&this.invalidateLifecycle();const t=++this.sequence;return this.currentSequence=t,Object.freeze({sequence:t,lifecycle:this.lifecycle,force:e.force,context:{...e.context},baselineRevision:e.baselineRevision,baselineFingerprint:e.baselineFingerprint})}isCurrent(e){this.observeContext(e.context);const t=e.claim;return e.connected&&(t.force||!e.writePending)&&t.sequence===this.currentSequence&&t.lifecycle===this.lifecycle&&Vu(t.context,e.context)&&t.baselineRevision===e.baselineRevision&&t.baselineFingerprint===e.baselineFingerprint}}const Xu=e=>{const t=e.hass,i=t?.user?.id;return{connection:t?.connection??null,userId:"string"==typeof i?i:null,route:location.pathname}};async function Zu(e,t=!1,i){let n=null;const r=e._configReloadAuthority;if(!t){if(void 0!==i&&(n=r.observeRevision(i,e._cfgRev,Xu(e)),!n))return;if(e._saveConfigDebounced.pending()&&e._saveConfigDebounced.flush(),e._cfgWriting)return clearTimeout(e._reloadRetry),void(e._reloadRetry=window.setTimeout(()=>{n&&!r.isReservationCurrent(n,Xu(e),e._cfgRev)||Zu(e,!1)},400))}const o=r.begin({force:t,context:Xu(e),baselineRevision:e._cfgRev,baselineFingerprint:e._adoption.currentConfigFingerprint()}),s=()=>((e,t)=>e._configReloadAuthority.isCurrent({claim:t,context:Xu(e),connected:e.isConnected,baselineRevision:e._cfgRev,baselineFingerprint:e._adoption.currentConfigFingerprint(),writePending:e._saveConfigDebounced.pending()||e._cfgWriting}))(e,o);let a=!1;try{const t=await e._getAuthoritativeConfig();if(!s())return;const i=await e._adoptAuthoritative({cfgResp:t,reason:"config-reload",profile:"reload",isCurrent:s,afterAdopt:()=>{e._regSignature="",e._maybeRebuildDevices()}});if("superseded"===i.status)return;if(a=!0,"adopted"!==i.status)return;i.spaceChanged&&e._restoreZoom(),e.requestUpdate()}catch(t){if(!s())return;a=!0,e._showToast(e._t("toast.cfg_reload_failed",{err:e._errText(t)}))}finally{(a||s())&&(e._continuityDataReady=!0,e.requestUpdate())}}const Ju=e=>!!e&&e.length>=2&&Number.isFinite(e[0])&&Number.isFinite(e[1]);function Qu(e,t=5,i=5){return Oo(e.cm,t,i)/2}function ep(e,t,i=1,n=5,r=5,o=0){const s=e.host;if(!s||"partition"!==s.kind||"string"!=typeof s.id||!s.id)return{resolved:null,reason:"invalid-host"};const a=t.find(e=>e.id===s.id);if(!a)return{resolved:null,reason:"missing-partition"};if(!Ju(a.a)||!Ju(a.b)||!Number.isFinite(s.t)||s.t<0||s.t>1)return{resolved:null,reason:"invalid-position"};const l=a.b[0]-a.a[0],c=a.b[1]-a.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 u=s.t*h;if(u-d/2h-o+1e-9)return{resolved:null,reason:"does-not-fit"};const p=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:s,partition:a,center:[a.a[0]+l*s.t,a.a[1]+c*s.t],angle:m,length:d,depth:Oo(a.cm,n,r),t:s.t,axis:{a:[a.a[0],a.a[1]],b:[a.b[0],a.b[1]],ux:p,uy:_,length:h}}}}function tp(e,t,i=1,n=5,r=5){return ep(e,t,i,n,r,0)}function ip(e,t,i=1,n=5,r=5){const o=e.host,s="partition"===o?.kind?t.find(e=>e.id===o.id):void 0;if(!s)return tp(e,t,i,n,r);const a=ep(e,t,i,n,r,Qu(s,n,r));return"does-not-fit"===a.reason?{resolved:null,reason:"does-not-fit-jamb"}:a}function np(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 rp(e){const{center:t,length:i,axis:n,host:r}=e,o=i/2;return{hostId:r.id,a:[t[0]-n.ux*o,t[1]-n.uy*o],b:[t[0]+n.ux*o,t[1]+n.uy*o],depth:e.depth}}function op(e,t=!1){const i=t?1:-1,n=e.depth/2;return{ox:-e.axis.uy*i*n,oy:e.axis.ux*i*n,cm:e.partition.cm,side:i}}function sp(e,t,i){return e.flatMap(e=>!Ju(e.a)||!Ju(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:Oo(e.cm,t,i)/2,partitionHost:{kind:"partition",id:e.id}}])}function ap(e,t,i){const{center:n,length:r,axis:o}=e,s=r/2,a=t.flatMap(e=>{if(!e.kind||e.open)return[];const t=e.b[0]-e.a[0],r=e.b[1]-e.a[1],a=Math.hypot(t,r);if(!(a>i))return[];const l=t/a,c=r/a;if(Math.abs(o.ux*c-o.uy*l)>1e-6)return[];if(Math.abs((n[0]-e.a[0])*c-(n[1]-e.a[1])*l)>i)return[];const h=e=>(e[0]-n[0])*o.ux+(e[1]-n[1])*o.uy,d=h(e.a),u=h(e.b),p=Math.max(-s,Math.min(d,u)),_=Math.min(s,Math.max(d,u));return _>=p-i?[[p,_]]:[]});if(!a.length)return!1;a.sort((e,t)=>e[0]-t[0]||e[1]-t[1]);let l=-s;for(const[e,t]of a){if(e>l+i)return!1;if(l=Math.max(l,t),l>=s-i)return!0}return!1}function lp(e,t,i=1e-9){const n=e.length/(2*e.axis.length),r=e.t-n,o=e.t+n;return t.some(t=>{if(t.host.id!==e.host.id||t.opening.id===e.opening.id)return!1;const n=t.length/(2*t.axis.length);return Math.max(r,t.t-n)ha-icon{align-self:start;color:var(--hp-accent);}.version-recovery-copy{min-width:0;display:flex;flex-direction:column;gap:var(--sp-2);font-size:var(--fs-m);line-height:1.35;}.version-recovery-copy>span{color:var(--hp-muted);}.version-recovery-versions{display:flex;flex-wrap:wrap;gap:var(--sp-2) var(--sp-5);}.version-recovery-versions span,.version-recovery-versions b{overflow-wrap:anywhere;}.version-recovery-reload{min-height:44px;white-space:normal;}@keyframes hp-version-recovery-in{from{opacity:0;}to{opacity:1;}}@keyframes hp-version-recovery-out{from{opacity:1;}to{opacity:0;}}@media (max-width:520px){.version-recovery-card{grid-template-columns:auto minmax(0,1fr);}.version-recovery-reload{grid-column:1 / -1;width:100%;}}@keyframes fixedfloor-spin{to{transform:rotate(360deg);}}.spacer{flex:1;}.bootveil{position:absolute;inset:0;z-index:40;display:flex;align-items:center;justify-content:center;background:var(--hp-bg,#16212e);opacity:1;transition:opacity 0.15s ease;pointer-events:none;}.bootveil.off{opacity:0;}.bootveil .boothouse{position:static;width:56px;height:56px;fill:var(--hp-accent);opacity:0.85;animation:hp-boot-pulse 1.3s ease-in-out infinite;}@keyframes hp-boot-pulse{0%,100%{opacity:0.3;transform:scale(0.94);}50%{opacity:0.9;transform:scale(1);}}@media (prefers-reduced-motion:reduce){.bootveil .boothouse{animation:none;opacity:0.7;}.version-recovery.phase-visible,.version-recovery.phase-leaving{animation:none;}}@keyframes hp-pulse-short{0%{transform:scale(1);opacity:0.55;}70%{opacity:0.22;}100%{transform:scale(var(--ripple-scale,1.5));opacity:0;}}@keyframes hp-pulse-short-b{0%{transform:scale(1);opacity:0.55;}70%{opacity:0.22;}100%{transform:scale(var(--ripple-scale,1.5));opacity:0;}}@keyframes hp-pulse-continuous{0%{transform:scale(1);opacity:0.55;}65%{opacity:0.18;}100%{transform:scale(var(--ripple-scale,1.5));opacity:0;}}@keyframes hp-pulse-alarm{0%{transform:scale(1);opacity:0.72;}100%{transform:scale(1.5);opacity:0;}}@keyframes hp-slide-left{0%{transform:translateX(4%);opacity:0.72;}100%{transform:translateX(0);opacity:1;}}@keyframes hp-slide-right{0%{transform:translateX(-4%);opacity:0.72;}100%{transform:translateX(0);opacity:1;}}@keyframes hp-sunfade-in{from{opacity:0;}to{opacity:1;}}@keyframes hp-sunfade-out{from{opacity:1;}to{opacity:0;}}.sr-only{position:absolute !important;width:1px !important;height:1px !important;padding:0 !important;margin:-1px !important;overflow:hidden !important;clip:rect(0,0,0,0) !important;white-space:nowrap !important;border:0 !important;}.toast{position:fixed;pointer-events:none;left:50%;bottom:22px;transform:translateX(-50%);background:var(--hp-bg);border:1px solid var(--hp-accent);color:var(--hp-txt);padding:var(--sp-4) var(--sp-6);border-radius:var(--rad-l);font-size:var(--fs-m);box-shadow:var(--shadow-2);z-index:120;max-width:90vw;}`,o`.fixedfloor-loading{animation:fixedfloor-spin 1.1s linear infinite;}.fixedfloor-error p{max-width:42rem;margin:0;overflow-wrap:anywhere;}@media (prefers-reduced-motion:reduce){.fixedfloor-loading{animation:none;}.radar-target{transition:none;}}.stage.noplan{background:#ffffff;}.stage.mode-plan,.stage.mode-devices,.stage.mode-decor{background:#ffffff;}.stage{position:relative;width:100%;container-type:inline-size;overflow:hidden;touch-action:none;background:var(--ha-card-background,var(--card-background-color,#111));}.zoomwrap{position:absolute;inset:0;z-index:1;}.stage.mode-transition,.stage.mode-transition .zoomwrap{transition:none !important;}.stage.mode-transition .hp-view-only-layer,.stage.mode-transition .hp-editor-only-layer{pointer-events:none;will-change:opacity;}.stage.mode-transition .hp-paper{fill:var(--hp-mode-paper) !important;}.hp-day-cycle-env{position:absolute;inset:0;z-index:0;overflow:hidden;pointer-events:none;isolation:isolate;}.hp-day-cycle-bg{position:absolute;inset:0;opacity:0;overflow:hidden;transition:opacity 1100ms cubic-bezier(.22,.61,.36,1);}.hp-day-cycle-bg.active{opacity:1;}.hp-day-cycle-sun{position:absolute;left:var(--hp-day-cycle-sun-x);top:var(--hp-day-cycle-sun-y);width:clamp(140px,25cqw,250px);height:clamp(140px,25cqw,250px);transform:translate(-50%,-50%);border-radius:50%;filter:blur(10px);opacity:var(--hp-day-cycle-sun-opacity);transition:left 1100ms cubic-bezier(.22,.61,.36,1),top 1100ms cubic-bezier(.22,.61,.36,1),opacity 1100ms cubic-bezier(.22,.61,.36,1);}.stage.mode-transition .hp-day-cycle-env{transition:none;}.stage.daycycle .hp-paperg,.stage.daycycle.hp-safe-daycycle-outline .hp-paper-outline-svg,.hp-static-stage.daycycle .hp-paper-outline-svg{filter:drop-shadow(0 0 1px var(--hp-day-cycle-outline-near)) drop-shadow(0 0 5px var(--hp-day-cycle-outline-mid)) drop-shadow(0 0 10px var(--hp-day-cycle-outline-far));will-change:filter;transition:filter 1100ms cubic-bezier(.22,.61,.36,1);}.stage.daycycle.hp-safe-daycycle-outline .hp-paperg{filter:none;will-change:auto;transition:none;}.hp-static-stage.daycycle .hp-paperg{filter:none;will-change:auto;transition:none;}.stage.daycycle.hp-safe-daycycle-outline .hp-paper-outline-svg{transition:none;}.stage.daycycle.hp-safe-daycycle-outline .plan-svg{will-change:transform;}@media (prefers-reduced-motion:reduce){.hp-day-cycle-bg,.hp-day-cycle-sun,.stage.daycycle .hp-paperg,.stage.daycycle.hp-safe-daycycle-outline .hp-paper-outline-svg,.hp-static-stage.daycycle .hp-paper-outline-svg{transition:none;}}.sunlayer{pointer-events:none;}.compass{width:120px;height:120px;flex:none;touch-action:none;cursor:grab;user-select:none;}.compass:active{cursor:grabbing;}.compass .cring{fill:rgba(255,255,255,0.04);stroke:var(--divider-color,#444);stroke-width:2;}.compass .ctick{stroke:var(--secondary-text-color,#9aa4ad);stroke-width:2;}.compass .ctick.minor{stroke-width:1;opacity:0.6;}.compass .cneedle line{stroke:var(--primary-color,#3ea6ff);stroke-width:2.5;stroke-linecap:round;}.compass .cneedle path{fill:var(--primary-color,#3ea6ff);}.compass .cneedle text{fill:var(--text-primary-color,#fff);font-size:11px;font-weight:700;}.compass .cdeg{fill:var(--secondary-text-color,#9aa4ad);font-size:13px;}.compass.unset .cneedle{opacity:0.35;}.stage.hpboot .zoomwrap,.stage.hpboot .zoombadge{visibility:hidden;}.stage.hpsettle{transition:height 0.25s ease;}@media (prefers-reduced-motion:reduce){.stage.hpsettle{transition:none;}}.zoomctl{display:inline-flex;gap:var(--sp-1);background:rgba(127,127,127,0.12);border-radius:var(--rad-m);padding:var(--sp-1);}.zoomctl .zb{border:none;padding:var(--sp-3) var(--sp-4);}.zoomctl .zb[disabled]{opacity:0.4;pointer-events:none;}.projection-toggle{min-width:44px;min-height:44px;justify-content:center;padding:var(--sp-3);}.header-action{min-width:44px;min-height:44px;justify-content:center;padding:var(--sp-3);}.homearrow{position:absolute;z-index:12;transform:translate(-50%,-50%);width:40px;height:40px;border-radius:50%;display:flex;align-items:center;justify-content:center;cursor:pointer;background:var(--card-background-color,var(--hp-bg));color:var(--hp-accent);border:1px solid var(--hp-accent);opacity:0.9;padding:0;}.homearrow ha-icon{--mdc-icon-size:22px;line-height:1;}.zoombadge{position:absolute;z-index:12;left:var(--sp-4);bottom:var(--sp-4);background:var(--card-background-color,var(--hp-bg));opacity:0.92;color:var(--hp-txt);border:1px solid var(--hp-accent);border-radius:var(--rad-m);padding:var(--sp-1) var(--sp-4);font-size:var(--fs-s);font-weight:600;pointer-events:none;}.zoomwrap>svg{position:absolute;inset:0;width:100%;height:100%;display:block;}.plan-svg{z-index:1;}.hp-paper-outline-svg{z-index:0;overflow:visible;pointer-events:none;visibility:hidden;}.stage.hp-safe-daycycle-outline .hp-paper-outline-svg{visibility:visible;}.hp-static-stage .hp-paper-outline-svg{visibility:visible;}.iso-underlay-svg{z-index:0;overflow:visible;}.iso-shadows-svg{z-index:3;overflow:visible;}.iso-walls-svg{z-index:4;overflow:visible;}.iso-overlays-svg{z-index:5;overflow:visible;}.iso-underlay-svg,.iso-shadows-svg,.iso-walls-svg,.iso-overlays-svg,.iso-underlay,.iso-shadows,.iso-walls,.iso-openings{pointer-events:none;}.iso-side-hi{stop-color:#b9bdbe;}.iso-side-lo{stop-color:#969c9f;}.iso-top-hi{stop-color:#fafaf7;}.iso-top-lo{stop-color:#e2e4e2;}.iso-wall-side{fill:url(#hp-iso-wall-side) #a8acae;stroke:#92989b;stroke-width:0.7;vector-effect:non-scaling-stroke;}.iso-wall-top{fill:url(#hp-iso-wall-top) #f3f3f1;stroke:#d7d9d8;stroke-width:0.8;vector-effect:non-scaling-stroke;}.iso-material-texture{fill:url(#hp-iso-wall-texture);stroke:none;opacity:0.12;pointer-events:none;}.iso-floor-texture{fill:url(#hp-iso-floor-texture);opacity:0.1;}.iso-texture-mark{fill:rgba(36,43,47,0.34);}.iso-texture-line{fill:none;stroke:rgba(36,43,47,0.24);stroke-width:0.55;}.iso-floor-side{fill:#858b8d;stroke:#71787b;stroke-width:0.7;vector-effect:non-scaling-stroke;}.iso-opening-panel{fill:#d7d9d7;fill-opacity:0.96;stroke:#7f878b;stroke-width:0.9;vector-effect:non-scaling-stroke;}.iso-opening-panel.iso-window{fill:#dfeff4;fill-opacity:0.72;stroke:#8aa7b1;}.iso-opening-panel.iso-material-reveal{fill:#c7cbca;stroke:#8b9294;}.iso-opening-panel.iso-material-matte-leaf{fill:#a6abad;stroke:none;}.iso-opening-panel.iso-opening-leaf-edge,.iso-opening-panel.iso-opening-leaf-top{fill:#8d9497;}.iso-opening-panel.iso-material-light-frame,.iso-opening-panel.iso-material-light-sill{fill:#fffef8;fill-opacity:0.94;stroke:#b3b5ae;}.iso-opening-panel.iso-material-light-window,.iso-opening-panel.iso-material-glass-side{fill:#c9e4f3;fill-opacity:0.88;stroke:#8fb4c7;}.iso-opening-panel.iso-material-glass-top{fill:#e3f2fa;fill-opacity:0.96;stroke:#9fc4d5;}.iso-ambient-shadow{fill:rgba(15,21,25,0.22);filter:url(#hp-iso-ambient-shadow);}.stage.theme-dark .iso-side-hi{stop-color:#4c555a;}.stage.theme-dark .iso-side-lo{stop-color:#343c40;}.stage.theme-dark .iso-top-hi{stop-color:#687176;}.stage.theme-dark .iso-top-lo{stop-color:#50585d;}.stage.theme-dark .iso-wall-side{stroke:#30373b;}.stage.theme-dark .iso-wall-top{stroke:#7b858a;}.stage.theme-dark .iso-floor-side{fill:#2d3438;stroke:#20272a;}.stage.theme-dark .iso-opening-panel{fill:#626b70;stroke:#899399;}.stage.theme-dark .iso-opening-panel.iso-window{fill:#75919b;stroke:#abc6ce;}.stage.theme-dark .iso-opening-panel.iso-material-reveal{fill:#454e52;stroke:#727d82;}.stage.theme-dark .iso-opening-panel.iso-material-matte-leaf{fill:#626a6e;stroke:none;}.stage.theme-dark .iso-opening-panel.iso-opening-leaf-edge,.stage.theme-dark .iso-opening-panel.iso-opening-leaf-top{fill:#4b5458;}.stage.theme-dark .iso-opening-panel.iso-material-light-frame,.stage.theme-dark .iso-opening-panel.iso-material-light-sill{fill:#e8e7df;stroke:#a9aca7;}.stage.theme-dark .iso-opening-panel.iso-material-light-window,.stage.theme-dark .iso-opening-panel.iso-material-glass-side{fill:#8fbfd5;stroke:#bad9e6;}.stage.theme-dark .iso-opening-panel.iso-material-glass-top{fill:#c9e6f2;stroke:#d9eef6;}.stage.theme-dark .iso-ambient-shadow{fill:rgba(0,0,0,0.34);}.stage.theme-dark .iso-texture-mark{fill:rgba(255,255,255,0.24);}.stage.theme-dark .iso-texture-line{stroke:rgba(255,255,255,0.18);}@media (prefers-color-scheme:dark){.stage:not(.theme-light) .iso-side-hi{stop-color:#4c555a;}.stage:not(.theme-light) .iso-side-lo{stop-color:#343c40;}.stage:not(.theme-light) .iso-top-hi{stop-color:#687176;}.stage:not(.theme-light) .iso-top-lo{stop-color:#50585d;}.stage:not(.theme-light) .iso-wall-side{stroke:#30373b;}.stage:not(.theme-light) .iso-wall-top{stroke:#7b858a;}.stage:not(.theme-light) .iso-floor-side{fill:#2d3438;stroke:#20272a;}.stage:not(.theme-light) .iso-opening-panel{fill:#626b70;stroke:#899399;}.stage:not(.theme-light) .iso-opening-panel.iso-window{fill:#75919b;stroke:#abc6ce;}.stage:not(.theme-light) .iso-opening-panel.iso-material-reveal{fill:#454e52;stroke:#727d82;}.stage:not(.theme-light) .iso-opening-panel.iso-material-matte-leaf{fill:#626a6e;stroke:none;}.stage:not(.theme-light) .iso-opening-panel.iso-opening-leaf-edge,.stage:not(.theme-light) .iso-opening-panel.iso-opening-leaf-top{fill:#4b5458;}.stage:not(.theme-light) .iso-opening-panel.iso-material-light-frame,.stage:not(.theme-light) .iso-opening-panel.iso-material-light-sill{fill:#e8e7df;stroke:#a9aca7;}.stage:not(.theme-light) .iso-opening-panel.iso-material-light-window,.stage:not(.theme-light) .iso-opening-panel.iso-material-glass-side{fill:#8fbfd5;stroke:#bad9e6;}.stage:not(.theme-light) .iso-opening-panel.iso-material-glass-top{fill:#c9e6f2;stroke:#d9eef6;}.stage:not(.theme-light) .iso-ambient-shadow{fill:rgba(0,0,0,0.34);}.stage:not(.theme-light) .iso-texture-mark{fill:rgba(255,255,255,0.24);}.stage:not(.theme-light) .iso-texture-line{stroke:rgba(255,255,255,0.18);}}@media (forced-colors:active){.iso-wall-side,.iso-wall-top,.iso-floor-side,.iso-opening-panel{fill:Canvas;stroke:CanvasText;forced-color-adjust:auto;}.iso-ambient-shadow,.iso-material-texture{display:none;}}@supports not (filter:blur(1px)){.iso-ambient-shadow,.iso-material-texture{display:none;}}.hp-paper{fill:var(--ha-card-background,var(--card-background-color,#111));stroke:none;}.stage.noplan .hp-paper,.stage.mode-plan .hp-paper,.stage.mode-devices .hp-paper,.stage.mode-decor .hp-paper{fill:#ffffff;}.room{transition:0.12s;cursor:default;stroke-linejoin:round;stroke-linecap:round;}.stage.mode-view .room{cursor:pointer;}.room.overlay{fill:transparent;stroke:transparent;stroke-width:calc(2px * var(--hp-cell-visual-scale,1));}:host([data-pointer-hover]) .stage.mode-view .room.overlay:not(.styled):hover{stroke:var(--hp-accent);stroke-opacity:1;}.room.yard{fill:rgba(75,140,90,0.14);stroke:#4b8c5a;stroke-width:calc(2px * var(--hp-cell-visual-scale,1));}:host([data-pointer-hover]) .stage.mode-view .room.yard:not(.styled):hover{stroke:var(--hp-accent);stroke-opacity:1;}.room.styled{stroke:var(--room-stroke,transparent);stroke-opacity:var(--room-stroke-op,0);stroke-width:calc(2.5px * var(--hp-cell-visual-scale,1));fill:var(--room-fill,transparent);fill-opacity:var(--room-fill-op,0);}.glow-base-layer,.glow-base-tunnels,.glow-pools-frame,.glow-pools,.glow-spot{pointer-events:none;}.glow-pools-frame,.glow-pools,.glow-spot{isolation:isolate;}.glow-pools.blend-screen .glow-spot{mix-blend-mode:screen;}.glow-spot{opacity:1;transition:opacity 500ms ease;}.glow-spot.is-entering,.glow-spot.is-leaving{opacity:0;}@media (prefers-reduced-motion:reduce){.glow-spot{transition:none;}}:host([data-pointer-hover]) .stage.mode-view .room.styled:hover{stroke:var(--hp-accent);stroke-opacity:1;}.op-leaf{transition:transform 0.6s ease;}.op-arc{stroke-width:calc(1.5px * var(--hp-cell-visual-scale,1));transition:stroke-dashoffset 0.6s ease;}.op-outline{fill:none;stroke:var(--hp-accent);stroke-width:calc(1.5px * var(--hp-cell-visual-scale,1));opacity:0;transition:opacity 0.15s;pointer-events:none;}:host([data-pointer-hover]) .stage.markup g.opening:hover .op-outline{opacity:0.9;}.op-hit{fill:transparent;pointer-events:none;cursor:default;}.stage.markup .op-hit{pointer-events:auto;cursor:grab;touch-action:none;}.stage.markup .op-hit:active{cursor:grabbing;}.stage.markup .opening.orphan{pointer-events:auto;cursor:pointer;color:var(--error-color,#db4437);}.stage.markup .opening.orphan circle{fill:var(--hp-bg);stroke:currentColor;stroke-width:calc(2px * var(--hp-cell-visual-scale,1));}.stage.markup .opening.orphan text{fill:currentColor;font-weight:800;font-size:calc(12px * var(--hp-cell-visual-scale,1));pointer-events:none;}.stage.markup.tool-resize .op-hit{pointer-events:none;cursor:default;}.stage.mode-view .oplock{pointer-events:auto;cursor:pointer;}.stage.projection-iso.mode-view .oplock::before{content:'';position:absolute;left:50%;top:50%;width:max(44px,100%);height:max(44px,100%);transform:translate(-50%,-50%);border-radius:50%;pointer-events:auto;}@media (prefers-reduced-motion:reduce){.op-leaf,.op-arc{transition:none;}}.roomlabel{pointer-events:none;position:absolute;transform:translate(-50%,-50%);font-size:calc(var(--rl-icon-size,var(--icon-size,2.5cqw)) * 0.5 * var(--rl-scale,1) * var(--rl-font,1) * var(--rl-space,1));font-weight:700;letter-spacing:0.04em;white-space:nowrap;cursor:grab;user-select:none;z-index:1;display:flex;flex-direction:column;align-items:center;gap:0.15em;text-align:center;}.rlname{display:inline-flex;align-items:center;gap:0.25em;font-size:calc(1em * var(--rl-name,1));}.zoomwrap.slide-left{animation:hp-slide-left 0.18s cubic-bezier(0.2,0.7,0.2,1);}.zoomwrap.slide-right{animation:hp-slide-right 0.18s cubic-bezier(0.2,0.7,0.2,1);}@media (prefers-reduced-motion:reduce){.zoomwrap.slide-left,.zoomwrap.slide-right{animation:none;}}.rlgearbtn{--gear-h:calc(var(--icon-size,2.5cqw) * 0.77);position:absolute;transform:translate(-50%,-50%);display:inline-flex;align-items:center;gap:0.35em;height:var(--gear-h);padding:0 calc(var(--gear-h) * 0.38);border:0;border-radius:999px;background:var(--hp-accent);color:var(--text-primary-color,#fff);font:inherit;font-size:calc(var(--gear-h) * 0.42);font-weight:600;line-height:1;white-space:nowrap;cursor:pointer;pointer-events:auto;opacity:0.92;box-shadow:var(--shadow-1);z-index:2;}.rlgearbtn{transition:opacity 0.15s,filter 0.15s;}:host([data-pointer-hover]) .rlgearbtn:hover{opacity:1;filter:brightness(1.18);}.rlgearbtn ha-icon{--mdc-icon-size:calc(var(--gear-h) * 0.55);display:inline-flex;}.rlgear{--mdc-icon-size:0.9em;display:inline-flex;margin-right:0.2em;opacity:0.6;cursor:pointer;pointer-events:auto;}:host([data-pointer-hover]) .rlgear:hover{opacity:1;}.rlgo{--mdc-icon-size:0.85em;display:inline-flex;opacity:0.55;}.stage.mode-view .rlgo{pointer-events:auto;cursor:pointer;}:host([data-pointer-hover]) .stage.mode-view .rlgo:hover{opacity:1;}.roomlabel .rlmetrics{position:absolute;top:calc(100% + 0.15em);left:50%;transform:translateX(-50%);white-space:nowrap;display:flex;align-items:center;gap:0.55em;font-size:calc(0.75em * var(--rl-meta,1));font-weight:600;letter-spacing:0.02em;opacity:0.9;}.roomlabel .rlm{display:inline-flex;align-items:center;gap:0.12em;}.roomlabel .rlm ha-icon{--mdc-icon-size:1.05em;display:inline-flex;}.roomlabel .rlm.lit{opacity:1;}.rlhandle{display:none;position:absolute;width:9px;height:9px;border-radius:2px;background:var(--hp-accent);border:1px solid var(--card-background-color,#fff);z-index:2;}.rlhandle.tl{left:-6px;top:-6px;cursor:nwse-resize;}.rlhandle.br{right:-6px;bottom:-6px;cursor:nwse-resize;}.rlhandle.tr{right:-6px;top:-6px;cursor:nesw-resize;}.rlhandle.bl{left:-6px;bottom:-6px;cursor:nesw-resize;}:host([data-pointer-hover]) .stage.markup .roomlabel:hover .rlhandle{display:block;}.stage.markup .roomlabel{pointer-events:auto;}.stage.mode-view .roomlabel{pointer-events:auto;cursor:pointer;border-radius:0.2em;}.stage.projection-iso.mode-view .roomlabel{box-sizing:border-box;min-width:44px;min-height:44px;justify-content:center;text-shadow:none;filter:none;-webkit-text-stroke:0 transparent;color:#303936 !important;}.stage.projection-iso.mode-view .dev,.stage.projection-iso.mode-view .oplock{z-index:2;}.stage.projection-iso.theme-dark.mode-view .roomlabel{color:#f2f0e8 !important;}@media (prefers-color-scheme:dark){.stage.projection-iso:not(.theme-light).mode-view .roomlabel{color:#f2f0e8 !important;}}.stage.mode-view .roomlabel:focus-visible{outline:2px solid var(--hp-accent);outline-offset:4px;}.roomlabel:active{cursor:grabbing;}.measurelayer{position:absolute;inset:0;pointer-events:none;}.alignline{stroke:var(--hp-accent);stroke-width:calc(1.2px * var(--hp-cell-visual-scale,1));stroke-dasharray:calc(4px * var(--hp-cell-visual-scale,1)) calc(4px * var(--hp-cell-visual-scale,1));pointer-events:none;opacity:0.9;}.aligndot{fill:var(--hp-accent);pointer-events:none;}.measurelabel.on45{color:#4bd28f;border-color:#4bd28f;}.measurelabel{position:absolute;transform:translate(12px,-150%);font-size:var(--fs-s);font-weight:600;padding:1px var(--sp-3);border-radius:var(--rad-s);background:rgba(0,0,0,0.72);color:#fff;white-space:nowrap;pointer-events:none;user-select:none;z-index:3;}.measurelabel.opdimension{transform:translate(calc(-50% + var(--op-label-shift-x,0px)),calc(-50% + var(--op-label-shift-y,-12px)));border:1px solid var(--hp-open,#ff9800);}.decorlayer .dshape{pointer-events:none;}.stage.mode-decor .decorlayer .dshape{pointer-events:visiblePainted;cursor:pointer;}.stage.mode-decor.dtool-select .decorlayer .dshape{cursor:move;}.stage.mode-decor.dtool-line .decorlayer .dshape,.stage.mode-decor.dtool-rect .decorlayer .dshape,.stage.mode-decor.dtool-ellipse .decorlayer .dshape,.stage.mode-decor.dtool-text .decorlayer .dshape,.stage.mode-decor.dtool-furniture .decorlayer .dshape,.stage.mode-decor.dtool-image .decorlayer .dshape,.stage.mode-decor.dtool-backdrop .decorlayer .dshape{pointer-events:none;}.stage.mode-decor.dtool-furniture,.stage.mode-decor.dtool-image{cursor:copy;}.stage.mode-decor.dtool-select .decorlayer .dimage,.stage.mode-decor.dtool-erase .decorlayer .dimage,.stage.mode-decor.dtool-select .decorlayer .dimage-missing,.stage.mode-decor.dtool-erase .decorlayer .dimage-missing{pointer-events:bounding-box;}.decorlayer .dimage-missing rect{fill:rgba(127,127,127,0.12);stroke:var(--hp-accent);stroke-dasharray:8 5;vector-effect:non-scaling-stroke;}.decorlayer .dimage-missing path{fill:none;stroke:var(--hp-accent);vector-effect:non-scaling-stroke;}.decorlayer .decor-image-placement-preview{opacity:0.65;}.stage.mode-decor.dtool-text .decorlayer .dshape.dtext,.stage.mode-decor.dtool-select .decorlayer .dshape.dtext,.stage.mode-decor.dtool-erase .decorlayer .dshape.dtext{pointer-events:visiblePainted;pointer-events:bounding-box;}.stage.mode-decor.dtool-text .decorlayer .dshape.dtext{cursor:text;}.decorlayer .derasehit{fill:none;stroke:transparent;stroke-width:16px;stroke-linecap:round;stroke-linejoin:round;vector-effect:non-scaling-stroke;pointer-events:none;}.stage.mode-decor.dtool-erase .decorlayer .derasehit{pointer-events:stroke;}.decorlayer .dselecthit{fill:none;stroke:transparent;stroke-width:16px;stroke-linecap:round;vector-effect:non-scaling-stroke;pointer-events:none;}.stage.mode-decor.dtool-select .decorlayer .dselecthit{pointer-events:stroke;cursor:move;}.stage.mode-decor .decorlayer .dshape.dfurniturehit{fill:none;stroke:transparent;pointer-events:none;}.stage.mode-decor.dtool-select .decorlayer .dshape.dfurniturehit{pointer-events:stroke;cursor:move;}.decorlayer .dsel{filter:drop-shadow(0 0 3px var(--hp-accent));}.decorlayer .ddraft{stroke-dasharray:calc(6px * var(--hp-cell-visual-scale,1)) calc(5px * var(--hp-cell-visual-scale,1));pointer-events:none;}.decorlayer .furniture-placement-preview{opacity:0.55;pointer-events:none;}.decorlayer text{font-weight:600;user-select:none;dominant-baseline:middle;text-anchor:middle;}.stage.mode-decor{outline:2px solid #26a69a;outline-offset:-2px;}.bdframe .bdbox{fill:none;stroke:var(--hp-accent);stroke-width:2;stroke-dasharray:10 7;vector-effect:non-scaling-stroke;pointer-events:none;opacity:0.9;}.bdframe .bdhandle{fill:transparent;stroke:none;pointer-events:all;touch-action:none;}.bdframe .bdknob{fill:var(--hp-accent);stroke:#fff;stroke-width:1;vector-effect:non-scaling-stroke;pointer-events:none;}:host([data-pointer-hover]) .bdframe .bdhandle:hover + .bdknob{fill:#fff;stroke:var(--hp-accent);}.bdframe .bd-nwse{cursor:nwse-resize;}.bdframe .bd-nesw{cursor:nesw-resize;}.stage.mode-decor.bdgrab{cursor:grab;}.stage.mode-decor.bdgrabbing,.stage.mode-decor.bdgrabbing .bdframe .bdhandle{cursor:grabbing;}.measurelabel.bdmeasure{transform:translate(-50%,-50%);border:1px solid var(--hp-accent);}.dtframe .dtbox{fill:none;stroke:var(--hp-accent);stroke-width:1.5;stroke-dasharray:7 5;vector-effect:non-scaling-stroke;pointer-events:none;opacity:0.85;}.dtframe .dtstem,.bdframe .dtstem{stroke:var(--hp-accent);stroke-width:1.5;vector-effect:non-scaling-stroke;pointer-events:none;opacity:0.85;}.dtframe .dthandle{fill:transparent;stroke:none;pointer-events:all;touch-action:none;}.dtframe .dtknob{fill:var(--hp-accent);stroke:#fff;stroke-width:1;vector-effect:non-scaling-stroke;pointer-events:none;}:host([data-pointer-hover]) .dtframe .dthandle:hover + .dtknob{fill:#fff;stroke:var(--hp-accent);}.dtframe .dt-nwse{cursor:nwse-resize;}.dtframe .dt-nesw{cursor:nesw-resize;}.dtframe .dtrot{cursor:grab;}.dtframe .dt-ew{cursor:ew-resize;}.dtframe .dt-ns{cursor:ns-resize;}.dtfurnitureframe .dtrot{cursor:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24'%3E%3Cpath d='M18.4 7.2A8 8 0 1 0 20 12' fill='none' stroke='%23000' stroke-width='2' stroke-linecap='round'/%3E%3Cpath d='m15.5 3.8 3.2 3.5-4.6.8' fill='none' stroke='%23000' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E") 12 12,grab;}.dtfurnitureframe .dtrot:active{cursor:grabbing;}.dtframe .dtendpoint{cursor:crosshair;}.bdframe .dtrot{cursor:grab;}.dtarea{resize:vertical;min-height:3.4em;font:inherit;line-height:1.35;}.stage.mode-decor.dtool-line,.stage.mode-decor.dtool-rect,.stage.mode-decor.dtool-ellipse,.stage.mode-decor.dtool-text{cursor:crosshair;}.stage.mode-decor.dtool-erase,.stage.mode-decor.dtool-erase .decorlayer .dshape{cursor:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24'%3E%3Cg transform='rotate(-45 12 12)'%3E%3Crect x='7' y='2' width='10' height='18' rx='2' fill='%23fff' stroke='%23111' stroke-width='1.5'/%3E%3Cpath d='M7 13h10v5a2 2 0 0 1-2 2H9a2 2 0 0 1-2-2z' fill='%23ff9f43' stroke='%23111' stroke-width='1.5'/%3E%3C/g%3E%3C/svg%3E") 5 22,pointer;}.stage.mode-decor .room{pointer-events:none;}.stage.mode-decor .devlayer,.stage.mode-decor .devlayer *,.stage.mode-decor .dev::before{pointer-events:none;}.stage .room,.stage .devlayer,.stage .opening,.stage .room-outline,.stage .wallbodies,.stage .opening-tunnels,.stage .glow-base-layer,.stage .glow-pools-frame,.stage .zero-walls{opacity:var(--hp-mode-architecture-opacity,1);}.opening-preview{opacity:0.5;pointer-events:none;}.opening-preview[data-kind="passage"]{opacity:1;}.passage-preview-cut{fill:var(--wall-fill,#ffffff);fill-opacity:0.35;stroke:none;pointer-events:none;}.passage-preview-boundary{stroke:var(--hp-open,#ff9800);stroke-width:calc(2.5px * var(--hp-cell-visual-scale,1));pointer-events:none;}.opening-preview .op-leaf,.opening-preview .op-arc{transition:none;}.opening-preview-dot{fill:var(--hp-open,#ff9800);pointer-events:none;}.opening-dimensions,.opening-dimension{pointer-events:none;}.opening-dimension-line,.opening-dimension-tick{fill:none;stroke:var(--hp-open,#ff9800);stroke-width:1.5;vector-effect:non-scaling-stroke;pointer-events:none;}.opening-dimension-tick{stroke-width:2;}.stage.edit .room{pointer-events:none;}.stage.markup{cursor:crosshair;}.stage.markup.tool-merge,.stage.markup.tool-split.pickstage,.stage.markup.tool-delroom{cursor:pointer;}.stage.markup.tool-wallthick{cursor:default;}.stage.markup.tool-wallthick.wallhot{cursor:pointer;}.wallbody-fill{fill:var(--wall-fill,#ffffff);fill-opacity:var(--wall-fill-op,1);fill-rule:evenodd;stroke:none;pointer-events:none;}.wallbody{fill:url(#hp-wall-hatch);fill-rule:evenodd;stroke:var(--room-stroke,var(--hp-muted));stroke-width:calc(0.6px * var(--hp-cell-visual-scale,1));pointer-events:none;}.wallbody.solid{fill:none;}.wallthick-hover{fill:var(--accent-color,#03a9f4);fill-opacity:0.38;stroke:var(--accent-color,#03a9f4);stroke-width:calc(2.5px * var(--hp-cell-visual-scale,1));stroke-linejoin:round;stroke-linecap:round;pointer-events:none;}.wallthick-hover.isopen{fill:var(--error-color,#f44336);stroke:var(--error-color,#f44336);}.zero-wall{stroke:var(--zero-wall-stroke,var(--hp-muted));stroke-width:calc(2.5px * var(--hp-cell-visual-scale,1));stroke-dasharray:calc(7px * var(--hp-cell-visual-scale,1)) calc(7px * var(--hp-cell-visual-scale,1));stroke-linecap:butt;pointer-events:none;opacity:0.9;}.zero-walls.solid .zero-wall{stroke-dasharray:none;}.room.noedge{stroke-opacity:0 !important;}.room-outline{fill:none;stroke-width:calc(2.5px * var(--hp-cell-visual-scale,1));stroke-linejoin:round;stroke-linecap:round;pointer-events:none;}.room-outline.outlined{stroke:rgba(62,166,255,0.55);stroke-opacity:1;}.room-hover-fill{fill:#000;fill-opacity:0.22;pointer-events:none;}.room-hover-halo{fill:none;stroke:var(--hp-accent);stroke-opacity:0.28;stroke-width:calc(8px * var(--hp-cell-visual-scale,1));stroke-linejoin:round;stroke-linecap:round;pointer-events:none;}.room-hover-outline{fill:none;stroke:var(--hp-accent);stroke-width:calc(3px * var(--hp-cell-visual-scale,1));stroke-linejoin:round;stroke-linecap:round;pointer-events:none;}.stage.markup .room{pointer-events:none;}.stage.markup .devlayer .dev{display:none;}.stage.mode-plan{outline:2px solid #ffc14d;outline-offset:-2px;}.stage.mode-devices{outline:2px solid var(--hp-accent);outline-offset:-2px;}.room.outlined{stroke:rgba(62,166,255,0.55);fill:rgba(62,166,255,0.06);}.room.picked{stroke:#ffc14d;stroke-width:calc(3px * var(--hp-cell-visual-scale,1));fill:rgba(255,193,77,0.25);}.griddot{fill:var(--hp-accent);opacity:0.35;stroke:rgba(0,0,0,0.35);stroke-width:0.4;}.griddot.major{opacity:0.5;stroke-width:0;}.seg{stroke:var(--hp-accent);stroke-width:calc(2.5px * var(--hp-cell-visual-scale,1));stroke-linecap:round;stroke-linejoin:round;}.pathline{stroke:#ffc14d;stroke-width:calc(3px * var(--hp-cell-visual-scale,1));fill:none;stroke-linecap:round;stroke-linejoin:round;}.preview{stroke:#ffc14d;stroke-width:calc(2px * var(--hp-cell-visual-scale,1));stroke-dasharray:calc(6px * var(--hp-cell-visual-scale,1)) calc(5px * var(--hp-cell-visual-scale,1));opacity:0.7;}.active-axis{stroke:#ffc14d;stroke-width:2;stroke-linecap:round;vector-effect:non-scaling-stroke;pointer-events:none;}.active-vertex{fill:#ffc14d;stroke:#171006;stroke-width:2;vector-effect:non-scaling-stroke;pointer-events:none;}.wall-repair-preview{stroke:#d93025;stroke-width:4;stroke-linecap:round;stroke-dasharray:5 4;vector-effect:non-scaling-stroke;pointer-events:none;}.drawwall-preview-fill{fill:var(--wall-fill,#ffffff);fill-opacity:calc(var(--wall-fill-op,1) * 0.55);fill-rule:evenodd;stroke:none;pointer-events:none;}.drawwall-preview{fill:url(#hp-wall-hatch);fill-opacity:0.55;fill-rule:evenodd;stroke:var(--accent-color,#03a9f4);stroke-width:calc(0.5px * var(--hp-cell-visual-scale,1));stroke-opacity:0.7;pointer-events:none;}.drawwall-zero-preview{fill:none;stroke:var(--accent-color,#03a9f4);stroke-width:calc(3px * var(--hp-cell-visual-scale,1));stroke-linecap:butt;stroke-linejoin:round;opacity:0.72;pointer-events:none;}.drawwall-zero-preview.dashed{stroke-dasharray:calc(7px * var(--hp-cell-visual-scale,1)) calc(7px * var(--hp-cell-visual-scale,1));}.vertex{fill:#ffc14d;stroke:#4a2800;stroke-width:calc(1px * var(--hp-cell-visual-scale,1));}.vertex.first{fill:#4bd28f;stroke:#04121f;}.plan-snap-overlay,.plan-snap-overlay *,.hidden-wall-diagnostic,.hidden-wall-diagnostic *{pointer-events:none;}.plan-snap-line,.hidden-wall-line{fill:none;stroke:color-mix(in srgb,var(--hp-accent) 82%,white 18%);stroke-width:1;stroke-linecap:round;opacity:0.92;}.plan-snap-node,.hidden-wall-node{fill:var(--ha-card-background,var(--card-background-color,#fff));stroke:color-mix(in srgb,var(--hp-accent) 88%,#07131c 12%);stroke-width:1;vector-effect:non-scaling-stroke;}.plan-snap-node.active{fill:#ffc14d;stroke:#171006;stroke-width:2;}.plan-snap-node.active.dynamic{fill:#4bd28f;stroke:#04121f;}.plan-snap-node.conflict{fill:#fff;stroke:#d93025;stroke-width:3;}@media (prefers-color-scheme:dark){.plan-snap-line{stroke:color-mix(in srgb,var(--hp-accent) 72%,white 28%);}.hidden-wall-line{stroke:color-mix(in srgb,var(--hp-accent) 72%,white 28%);}.plan-snap-node,.hidden-wall-node{fill:#17242c;stroke:#9bdcf5;}.plan-snap-node.active{fill:#ffc14d;stroke:#fff4d6;}.plan-snap-node.active.dynamic{fill:#4bd28f;stroke:#eafff4;}}@media (forced-colors:active){.plan-snap-line,.hidden-wall-line{stroke:CanvasText;opacity:1;forced-color-adjust:auto;}.plan-snap-node,.hidden-wall-node{fill:Canvas;stroke:CanvasText;forced-color-adjust:auto;}.plan-snap-node.active,.plan-snap-node.active.dynamic{fill:Highlight;stroke:HighlightText;forced-color-adjust:auto;}}.sunlayer{animation:hp-sunfade-in 2s linear both;}.sunlayer.out{animation:hp-sunfade-out 2s linear both;}@media (prefers-reduced-motion:reduce){.sunlayer,.sunlayer.out{animation:none;}.sunlayer.out{opacity:0;}}.devlayer{position:absolute;inset:0;pointer-events:none;z-index:6;}.radar-target{position:absolute;width:8px;height:8px;box-sizing:border-box;transform:translate(-50%,-50%);border-radius:50%;background:var(--success-color,#43a047);border:2px solid var(--primary-text-color,#1f1f1f);box-shadow:0 0 0 1px color-mix(in srgb,var(--card-background-color,#fff) 80%,transparent);pointer-events:none;z-index:0;}.radar-target.smooth{transition:left 200ms linear,top 200ms linear;}.radar-ranges{position:absolute;inset:0;width:100%;height:100%;overflow:visible;pointer-events:none;z-index:0;}.radar-ranges path,.radar-ranges polyline{fill:none;stroke:var(--success-color,#43a047);stroke-width:2px;stroke-dasharray:5 4;vector-effect:non-scaling-stroke;opacity:0.72;}.radar-ranges .radar-zone{fill:color-mix(in srgb,var(--success-color,#43a047) 8%,transparent);stroke:var(--success-color,#43a047);stroke-width:2px;vector-effect:non-scaling-stroke;opacity:0.8;}.stage.mode-devices .dev{cursor:grab;}.stage.mode-devices .dev:active{cursor:grabbing;}.physical-hit{fill:transparent;stroke:transparent;pointer-events:none;cursor:grab;}.stage.tool-select .physical-hit{pointer-events:all;}.physical-hit:active{cursor:grabbing;}line.physical-hit{cursor:pointer;}.physical-hit.selected{fill:rgba(255,193,77,0.24);stroke:transparent;}line.physical-hit.selected{stroke:transparent;}.physical-drag{fill:rgba(255,193,77,0.38);stroke:#ffc14d;stroke-width:2.5;vector-effect:non-scaling-stroke;pointer-events:none;}.physical-chrome{pointer-events:none;}.physical-chrome .frame,.physical-chrome .stem{fill:none;stroke:#ffc14d;stroke-width:2;vector-effect:non-scaling-stroke;}.physical-chrome .frame{fill:rgba(255,193,77,0.22);}.physical-chrome polyline.frame{fill:none;}.physical-chrome .move-dot{fill:#ffc14d;stroke:#24262d;stroke-width:1.5;vector-effect:non-scaling-stroke;}.physical-chrome .rotate-handle{fill:#24262d;stroke:#ffc14d;stroke-width:2.5;vector-effect:non-scaling-stroke;pointer-events:all;cursor:crosshair;}.drawwall.invalid input{border-color:var(--error-color,#db4437);}.drawwall .rangehint{margin-inline-start:4px;font-size:0.78em;opacity:0.72;}.drawwall.invalid .rangehint{color:var(--error-color,#db4437);opacity:1;}.stage.markup.tool-partition,.stage.markup.tool-column{cursor:crosshair;}.rszhandle{fill:transparent;stroke:none;pointer-events:all;cursor:grab;touch-action:none;}.rszhandle:active{cursor:grabbing;}.rszhandle.disabled,.rszhandle.disabled:active{cursor:not-allowed;}.rszicon{pointer-events:none;}.rszicon path{fill:none;stroke-linecap:round;stroke-linejoin:round;vector-effect:non-scaling-stroke;}.rszhalo{stroke:var(--hp-bg);stroke-width:6;}.rszink{stroke:var(--hp-accent);stroke-width:2;}:host([data-pointer-hover]) .rszhandle:hover + .rszicon .rszink{stroke-width:3;}.rszicon.disabled{opacity:0.38;}:host([data-pointer-hover]) .rszhandle.disabled:hover + .rszicon .rszink{stroke-width:2;}.rszmeasurelayer,.rszmeasurelayer *{pointer-events:none;}.rszmeasurehalo,.rszmeasureink,.rszleader{fill:none;stroke-linecap:round;vector-effect:non-scaling-stroke;}.rszmeasurehalo{stroke:var(--hp-bg);stroke-width:7px;opacity:0.9;}.rszmeasureink{stroke:var(--hp-accent);stroke-width:3px;}.rszleader{stroke:var(--hp-accent);stroke-width:2px;opacity:0.95;}.measurelabel.dmeasure{transform:translate(-50%,-160%);}.measurelabel.rszarea{transform:translate(calc(-50% + var(--rsz-label-x,0px)),calc(-50% + var(--rsz-label-y,0px)));background:rgba(0,0,0,0.6);border:1px solid var(--hp-accent);}.measurelabel.furnmeasure{transform:translate(-50%,-50%);border:1px solid var(--hp-accent);}.alignmsg{margin:0 0 8px;font-size:13px;line-height:1.45;}`,o`.dev ha-icon{position:relative;z-index:1;}.device-pulse{position:absolute;left:50%;top:50%;width:var(--dev-size);height:var(--dev-size);transform:translate(-50%,-50%);pointer-events:none;z-index:0;}.device-pulse i{position:absolute;inset:0;border-radius:50%;border:2px solid var(--ripple-color,var(--hp-accent));opacity:0;}.device-pulse.short i{animation:hp-pulse-short 1.1s cubic-bezier(.22,.61,.36,1) 1 forwards;}.device-pulse.short i:nth-child(2){animation-delay:1.1s;}.device-pulse.short i:nth-child(3){animation-delay:2.2s;}.device-pulse.short.gen2 i{animation-name:hp-pulse-short-b;}.device-pulse.continuous i:nth-child(n + 2),.device-pulse.alarm i:nth-child(n + 3){display:none;}.device-pulse.continuous i:first-child{animation:hp-pulse-continuous 3.6s cubic-bezier(.45,.05,.55,.95) infinite;}.device-pulse.alarm i{border-width:3px;border-color:#F0410C;animation:hp-pulse-alarm 2.4s cubic-bezier(.22,.61,.36,1) infinite;}.device-pulse.alarm i:nth-child(2){animation-delay:1.2s;}.activity-dot{position:absolute;right:8%;bottom:8%;width:18%;height:18%;min-width:4px;min-height:4px;border-radius:50%;background:var(--ripple-color,var(--hp-accent));border:1px solid color-mix(in srgb,var(--hp-bg) 82%,transparent);pointer-events:none;z-index:3;}.kioskdots{position:absolute;left:50%;bottom:var(--sp-5);transform:translateX(-50%);display:flex;gap:var(--sp-4);z-index:5;pointer-events:none;}.kdot{width:9px;height:9px;border-radius:50%;background:var(--hp-muted);opacity:0.55;}.kdot.on{background:var(--hp-accent);opacity:1;}.dev.valonly{width:var(--dev-size,var(--icon-size,2.5cqw));}.dev.valonly .device-core{width:max-content;min-width:var(--dev-size,var(--icon-size,2.5cqw));padding-inline:calc(var(--dev-size,var(--icon-size,2.5cqw)) * 0.16);border-radius:calc(var(--dev-size,var(--icon-size,2.5cqw)) / 2);}.dev .valtext{overflow:visible;font-size:calc(var(--dev-size,var(--icon-size,2.5cqw)) * var(--value-font-scale,.45));font-weight:600;white-space:nowrap;}@media (prefers-reduced-motion:reduce){.device-pulse{display:none;}}.dev .newdot{position:absolute;top:calc(var(--dev-size,var(--icon-size,2.5cqw)) * -0.12);right:calc(var(--dev-size,var(--icon-size,2.5cqw)) * -0.12);width:calc(var(--dev-size,var(--icon-size,2.5cqw)) * 0.34);height:calc(var(--dev-size,var(--icon-size,2.5cqw)) * 0.34);border-radius:50%;background:#f0301f;border:2px solid var(--card-background-color,var(--hp-bg));pointer-events:none;z-index:2;}.dev{position:absolute;--dev-size:calc(var(--device-base-size,2.25cqw) * var(--dev-scale,1));--device-shell-size:calc(var(--dev-size) * 1.26875);--device-shell-inset:calc(var(--dev-size) * 0.134375);--device-shell-stroke-ratio:0.01875;--device-shell-border-width:max(1px,calc(var(--dev-size) * var(--device-shell-stroke-ratio)));--device-core-bg:var(--card-background-color,#fff);--device-core-fg:var(--primary-text-color,#252525);--device-core-bg:light-dark(#fff,#252525);--device-core-fg:light-dark(#252525,#fff);--device-face-bg:var(--device-core-bg);--device-face-fg:var(--device-core-fg);--device-shell-base-stroke:light-dark(#BCBCBC,rgb(37 37 37 / 75%));--device-shell-stroke:var(--device-shell-base-stroke);--device-shell-shadow:0 calc(var(--dev-size) * .025) calc(var(--dev-size) * .05) rgb(37 40 45 / 12%),0 calc(var(--dev-size) * .1) calc(var(--dev-size) * .175) calc(var(--dev-size) * -.025) rgb(37 40 45 / 18%);--device-core-inset-shadow:0 0 0 0 transparent;--device-ring-color:transparent;--device-ring-width:0px;width:var(--dev-size);height:var(--dev-size);margin:calc(var(--dev-size) / -2) 0 0 calc(var(--dev-size) / -2);border:0;background:transparent;display:block;color:var(--device-core-fg);cursor:pointer;pointer-events:none;transition:opacity 0.2s;box-shadow:none;outline:none;z-index:auto;}.dev.theme-light{--device-core-bg:#fff;--device-core-fg:#000;--device-shell-base-stroke:#BCBCBC;--device-shell-stroke:var(--device-shell-base-stroke);--device-shell-shadow:0 calc(var(--dev-size) * .025) calc(var(--dev-size) * .05) rgb(37 40 45 / 12%),0 calc(var(--dev-size) * .1) calc(var(--dev-size) * .175) calc(var(--dev-size) * -.025) rgb(37 40 45 / 18%);--device-core-inset-shadow:0 0 0 0 transparent;}.dev.theme-dark{--device-core-bg:#252525;--device-core-fg:#fff;--device-shell-base-stroke:rgb(37 37 37 / 75%);--device-shell-stroke:var(--device-shell-base-stroke);--device-shell-shadow:0 calc(var(--dev-size) * .025) calc(var(--dev-size) * .0375) rgb(37 40 45 / 12%),0 calc(var(--dev-size) * .1) calc(var(--dev-size) * .175) calc(var(--dev-size) * -.025) rgb(37 40 45 / 18%);--device-core-inset-shadow:inset 0 calc(var(--dev-size) * 0.0125) calc(var(--dev-size) * 0.0125) rgb(255 255 255 / 70%);}.dev::before{content:'';position:absolute;left:50%;top:50%;width:max(44px,var(--device-shell-size));height:max(44px,var(--device-shell-size));transform:translate(-50%,-50%);border-radius:50%;pointer-events:auto;z-index:1;}.device-shell{position:absolute;box-sizing:border-box;display:flex;align-items:center;gap:calc(var(--dev-size) * 0.1);padding:0;min-width:var(--dev-size);min-height:var(--dev-size);border:0;background:transparent;box-shadow:none;transition:opacity .2s;pointer-events:none;z-index:2;}.device-shell-frame{position:absolute;z-index:0;box-sizing:border-box;inset:calc(var(--device-shell-inset) / -1);border:var(--device-shell-border-width) solid var(--device-shell-stroke);border-radius:9999px;background:transparent;box-shadow:var(--device-shell-shadow);transition:border-color .15s,opacity .2s;pointer-events:auto;backdrop-filter:none;}.device-shell:not(.with-values){left:0;top:0;}.device-shell:not(.with-values):not(.text-shell) .device-shell-frame{border-radius:50%;}.device-shell.with-values.pos-right{left:0;top:50%;transform:translateY(-50%);}.device-shell.with-values.pos-left{right:0;top:50%;transform:translateY(-50%);flex-direction:row-reverse;}.device-shell.with-values.pos-bottom{left:50%;top:0;transform:translateX(-50%);flex-direction:column;}.device-shell.with-values.pos-top{left:50%;bottom:0;transform:translateX(-50%);flex-direction:column-reverse;}.device-core{position:relative;z-index:1;box-sizing:border-box;flex:0 0 auto;width:var(--dev-size);height:var(--dev-size);display:flex;align-items:center;justify-content:center;border-radius:50%;background:var(--device-face-bg);color:var(--device-face-fg);box-shadow:var(--device-core-inset-shadow),0 0 0 var(--device-ring-width) var(--device-ring-color);line-height:0;transition:background .15s,color .15s,opacity .2s;pointer-events:none;}.device-sections{display:flex;flex-direction:column;align-items:stretch;justify-content:center;gap:calc(var(--dev-size) * .08);min-width:0;pointer-events:none;}.device-shell.pos-top .device-sections,.device-shell.pos-bottom .device-sections{flex-direction:row;}.dev ha-icon{--mdc-icon-size:calc(var(--dev-size,var(--device-base-size,2.25cqw)) * 0.55);display:flex;align-items:center;justify-content:center;line-height:0;}.dev.on{--device-face-bg:#F0A00C;--device-face-fg:light-dark(#fff,#252525);--device-shell-stroke:#F0A00C;}.dev.theme-light.on{--device-face-fg:#fff;}.dev.theme-dark.on{--device-face-fg:#252525;--device-shell-stroke-ratio:.0375;}.dev.open{--device-face-bg:var(--hp-open);--device-face-fg:light-dark(#fff,#252525);}.dev.theme-light.open{--device-face-fg:#fff;}.dev.theme-dark.open{--device-face-fg:#252525;}.dev.lock-locked{--device-face-bg:#66D17A;--device-face-fg:light-dark(#fff,#252525);--device-shell-stroke:#66D17A;}.dev.theme-light.lock-locked{--device-face-fg:#fff;}.dev.theme-dark.lock-locked{--device-face-fg:#252525;--device-shell-stroke-ratio:.025;}.dev.lock-unlocked{--device-face-bg:#F0410C;--device-face-fg:light-dark(#fff,#252525);--device-shell-stroke:#F0410C;}.dev.theme-light.lock-unlocked{--device-face-fg:#fff;}.dev.theme-dark.lock-unlocked{--device-face-fg:#252525;--device-shell-stroke-ratio:.025;}:host([data-pointer-hover]) .dev:not(.unavail)[data-hp-device-hover]{--device-face-bg:#0C82F0;--device-face-fg:light-dark(#fff,#252525);--device-shell-stroke:var(--device-shell-base-stroke);}:host([data-pointer-hover]) .dev.theme-light:not(.unavail)[data-hp-device-hover]{--device-face-fg:#fff;}:host([data-pointer-hover]) .dev.theme-dark:not(.unavail)[data-hp-device-hover]{--device-face-fg:#252525;}:host([data-pointer-hover]) .dev[data-hp-device-hover],.dev:focus-visible{z-index:5;}.dev[data-hp-zigbee-topology-endpoint]{z-index:8;}:host([data-pointer-hover]) .dev[data-hp-zigbee-topology-endpoint][data-hp-device-hover]{z-index:8;}.dev.unavail{opacity:0.35;--device-face-bg:#B5BAC1;--device-shell-stroke:var(--device-shell-base-stroke);}.dev.virtual .device-shell-frame{border-style:dashed;}.dev.ghost{opacity:0.6;color:var(--hp-accent);}.dev.ghost .device-shell-frame{border-style:dashed;border-color:var(--hp-accent);box-shadow:none;}.dev.ghost .device-core{background:rgba(62,166,255,0.22);background:color-mix(in srgb,var(--hp-accent) 30%,var(--card-background-color,#1c2530));color:var(--hp-accent);}.dev.ghost.ha-disabled{opacity:0.62;color:var(--secondary-text-color,#9aa0aa);}.dev.ghost.ha-disabled .device-shell-frame{border-color:var(--secondary-text-color,#9aa0aa);}.dev.ghost.ha-disabled .device-core{background:rgba(120,124,134,0.2);background:color-mix(in srgb,var(--secondary-text-color,#9aa0aa) 24%,var(--card-background-color,#1c2530));color:var(--secondary-text-color,#9aa0aa);}.dev .habadge{position:absolute;right:-18%;bottom:-18%;display:grid;place-items:center;width:46%;height:46%;min-width:12px;min-height:12px;border-radius:50%;background:var(--card-background-color,#242832);border:1px solid currentColor;}.dev .habadge ha-icon{width:72%;height:72%;}.dev.sel{--device-ring-color:#F0A00C;--device-ring-width:calc(var(--dev-size) * 0.0375);}.dev:focus-visible{--device-ring-color:#0C82F0;--device-ring-width:calc(var(--dev-size) * 0.0375);}.dev:not(.on):not(.open):not(.alarm):not(.lock-locked):not(.lock-unlocked):not(.unavail):focus-visible{--device-face-fg:#0C82F0;}.dev.alarm,:host([data-pointer-hover]) .dev.alarm[data-hp-device-hover],.dev.alarm:focus-visible{--device-face-bg:#F0410C;--device-face-fg:light-dark(#fff,#252525);--device-shell-stroke:#F0410C;}.dev.theme-light.alarm{--device-face-fg:#fff;}.dev.theme-dark.alarm{--device-face-fg:#252525;--device-shell-stroke-ratio:.025;}.dev .value-badge{position:relative;z-index:2;box-sizing:border-box;width:max-content;min-width:calc(var(--dev-size,var(--icon-size,2.5cqw)) * .7875);height:calc(var(--dev-size,var(--icon-size,2.5cqw)) * .7875);display:flex;align-items:center;justify-content:center;overflow:visible;background:var(--device-core-bg);border:0;border-radius:calc(var(--dev-size,var(--icon-size,2.5cqw)) * 0.39375);padding:0 calc(var(--dev-size,var(--icon-size,2.5cqw)) * 0.14);font-size:calc(var(--dev-size,var(--icon-size,2.5cqw)) * var(--value-font-scale,.45));font-weight:600;line-height:1;color:var(--device-core-fg);white-space:nowrap;pointer-events:none;}.dev .value-badge.unavailable,.dev .value-badge.missing{opacity:0.66;}.dev .lqi{position:absolute;top:calc(50% + var(--device-shell-size) / 2 + var(--dev-size) * .05);left:50%;transform:translateX(-50%);margin-top:calc(var(--dev-size,var(--icon-size,2.5cqw)) * 0.05);font-size:calc(var(--dev-size,var(--icon-size,2.5cqw)) * 0.38);font-weight:600;line-height:1;text-shadow:0 0 3px rgba(0,0,0,0.9),0 0 2px rgba(0,0,0,0.9);white-space:nowrap;pointer-events:none;}.dev .lqi.below-value-badge{margin-top:calc(var(--dev-size,var(--icon-size,2.5cqw)) * 0.8875);}.temprange{display:inline-flex;align-items:center;gap:var(--sp-3);margin-left:auto;color:var(--hp-muted);font-size:var(--fs-s);}.vacwarn{position:absolute;top:-12%;right:-12%;width:calc(var(--device-base-size,2.25cqw) * 0.42);height:calc(var(--device-base-size,2.25cqw) * 0.42);border-radius:50%;display:flex;align-items:center;justify-content:center;background:light-dark(#fff,#252525);border:1px solid #E5A100;color:#E5A100;z-index:7;pointer-events:none;}.vacwarn ha-icon{--mdc-icon-size:calc(var(--device-base-size,2.25cqw) * 0.32);color:inherit;}.vacpuck{position:absolute;--puck-size:calc(var(--device-base-size,2.25cqw) * 0.8);width:var(--puck-size);height:var(--puck-size);border-radius:50%;transform:translate(-50%,-50%);--vac-core-bg:light-dark(#fff,#252525);--vac-core-fg:light-dark(#252525,#fff);background:var(--vac-core-bg);border:1px solid #BCBCBC;box-shadow:0 1px 2px rgb(37 40 45 / 12%),0 4px 8px -1.07px rgb(37 40 45 / 18%);color:var(--vac-core-fg);display:flex;align-items:center;justify-content:center;cursor:pointer;z-index:6;transition:left 1.2s linear,top 1.2s linear;animation:vacpulse 2.2s ease-out infinite;}.vacpuck.theme-light{--vac-core-bg:#fff;--vac-core-fg:#252525;}.vacpuck.theme-dark{--vac-core-bg:#252525;--vac-core-fg:#fff;}.vacpuck.jump{transition:none;}.vacpuck.stale{opacity:0.45;animation:none;}.vacpuck ha-icon{--mdc-icon-size:calc(var(--puck-size) * 0.68);color:var(--vac-core-fg);display:flex;align-items:center;justify-content:center;line-height:0;width:var(--mdc-icon-size);height:var(--mdc-icon-size);}@keyframes vacpulse{0%{box-shadow:0 0 0 0 color-mix(in srgb,var(--hp-accent) 45%,transparent);}70%{box-shadow:0 0 0 12px transparent;}100%{box-shadow:0 0 0 0 transparent;}}@media (prefers-reduced-motion:reduce){.vacpuck{animation:none;}}.vactrail{position:absolute;inset:0;width:100%;height:100%;pointer-events:none;z-index:5;overflow:visible;}.vactrail polyline,.vactrail path{fill:none;stroke-linejoin:round;stroke-linecap:round;vector-effect:non-scaling-stroke;}.vactrail g.prev{opacity:0.4;}.vactrail .case{stroke:rgba(0,0,0,0.4);stroke-width:2.25;}.vactrail .core{stroke:rgba(255,255,255,0.82);stroke-width:0.9;}.devicepreview-empty{min-height:82px;margin:4px 0 14px;padding:var(--sp-4);display:flex;align-items:center;justify-content:center;gap:var(--sp-3);border:1px dashed var(--hp-line);border-radius:var(--rad-m);color:var(--hp-muted);text-align:center;}`,o`.hdr{position:sticky;top:var(--header-height,56px);z-index:20;background:var(--card-background-color,var(--hp-bg));border-radius:var(--ha-card-border-radius,12px) var(--ha-card-border-radius,12px) 0 0;}.tabs{display:flex;gap:var(--sp-2);background:rgba(127,127,127,0.12);padding:var(--sp-2);border-radius:var(--rad-l);flex-wrap:wrap;}.tab{border:0;background:transparent;color:var(--hp-muted);display:inline-flex;align-items:center;padding:var(--sp-3) var(--sp-5);border-radius:var(--rad-m);font-size:var(--fs-m);font-weight:600;cursor:pointer;transition:0.15s;font-family:inherit;}:host([data-pointer-hover]) .tab:hover{color:var(--hp-txt);}.tab.active{background:var(--hp-accent);color:var(--text-primary-color,#fff);}.farhint{position:absolute;left:50%;transform:translateX(-50%);bottom:var(--sp-4);z-index:12;display:flex;align-items:center;gap:var(--sp-2);max-width:calc(100% - var(--sp-8));background:var(--card-background-color,var(--hp-bg));opacity:0.94;color:var(--hp-txt);border:1px solid var(--divider-color,#33404d);border-radius:var(--rad-m);padding:var(--sp-1) var(--sp-3);font-size:var(--fs-s);}.farhint ha-icon{--mdc-icon-size:18px;color:var(--hp-warn,#e2a03f);flex:none;}.farhint span{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}.dropbtn{display:flex;align-items:center;gap:var(--sp-4);width:100%;text-align:left;border:1px solid var(--hp-muted);border-radius:var(--rad-m);background:transparent;color:var(--hp-txt);padding:var(--sp-4) 10px;cursor:pointer;font-family:inherit;font-size:var(--fs-m);margin-top:var(--sp-3);}.dropbtn .ref{color:var(--hp-muted);font-size:var(--fs-s);margin-left:auto;}.dropbtn ha-icon{--mdc-icon-size:18px;margin-left:var(--sp-2);}.dropbtn.open{border-color:var(--hp-accent);}.droppanel{border:1px solid var(--hp-accent);border-top:none;border-radius:0 0 var(--rad-m) var(--rad-m);padding:var(--sp-3);margin-top:-4px;}.hdr.kioskhide{display:none;}.decorbar .dcolor{width:30px;height:26px;padding:0;border:none;background:none;cursor:pointer;}.decorbar .dwidth{font-family:inherit;font-size:var(--fs-s);border-radius:var(--rad-s);background:var(--hp-bg2,transparent);color:var(--hp-txt);border:1px solid var(--hp-muted);padding:var(--sp-2) var(--sp-3);}.decorbar .bdhint{font-size:var(--fs-s);color:var(--hp-muted);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}.decorbar .dfill{display:inline-flex;align-items:center;gap:var(--sp-2);font-size:var(--fs-s);cursor:pointer;}.decorbar .dfill input[type="checkbox"]{width:16px;height:16px;flex:none;margin:0;padding:0;}.decorbar hp-color-opacity{flex:0 0 auto;}.modes{display:inline-flex;gap:var(--sp-1);background:rgba(127,127,127,0.12);border-radius:var(--rad-l);padding:var(--sp-2);}.modetab{display:inline-flex;align-items:center;gap:var(--sp-3);border:0;background:transparent;color:var(--hp-muted);padding:var(--sp-3) 10px;border-radius:var(--rad-m);font-size:var(--fs-m);font-weight:600;cursor:pointer;font-family:inherit;transition:background-color 0.14s ease,color 0.14s ease,transform 0.14s ease;}.modetab:active{transform:scale(0.97);}.modetab ha-icon{--mdc-icon-size:15px;}.tab[data-reorderable]{cursor:grab;}.tab.dragging{cursor:grabbing;opacity:0.55;}.tab.drop-before{box-shadow:inset 2px 0 0 0 var(--primary-color,#03a9f4);}.tab.drop-after{box-shadow:inset -2px 0 0 0 var(--primary-color,#03a9f4);}.modetab .closex{--mdc-icon-size:13px;box-sizing:border-box;display:inline-flex;align-items:center;justify-content:center;width:24px;height:24px;min-width:24px;min-height:24px;margin:-5.5px -5.5px -5.5px -3.5px;opacity:0.75;cursor:pointer;border-radius:var(--rad-s);}:host([data-pointer-hover]) .modetab .closex:hover{opacity:1;}.editbar .barclose{box-sizing:border-box;width:40px;height:40px;padding:0;margin:0;min-width:40px;min-height:40px;justify-content:center;gap:0;line-height:0;}.editbar .barclose ha-icon{flex:none;margin:0;}.modetab.active{background:var(--hp-accent);color:var(--text-primary-color,#fff);}@media (max-width:720px){.modetab .ml{display:none;}}.editbar{display:grid;grid-template-columns:minmax(0,1fr) auto;align-items:stretch;border-bottom:1px solid var(--hp-line);font-size:var(--fs-m);}.editbar-tools{display:flex;align-items:center;gap:10px;padding:var(--sp-4) var(--sp-5);flex-wrap:wrap;min-width:0;outline:none;}.editbar-end{display:flex;align-items:center;padding:var(--sp-4) var(--sp-5);border-inline-start:1px solid var(--hp-line);background:var(--card-background-color,var(--hp-bg));position:relative;z-index:2;}.tab .tabedit{--mdc-icon-size:13px;display:inline-flex;align-items:center;margin-left:var(--sp-3);opacity:0.4;}:host([data-pointer-hover]) .tab:hover .tabedit{opacity:0.9;}.tab.tabadd{padding:var(--sp-3) var(--sp-4);}.tab.tabadd ha-icon{--mdc-icon-size:15px;}.rhint{font-size:var(--fs-s);color:var(--hp-muted);margin-bottom:var(--sp-3);}.togglehint{overflow-wrap:anywhere;}.togglehint>div + div{margin-top:var(--sp-1);}.editorchrome{display:block;height:0;opacity:0;visibility:hidden;overflow:hidden;}.editorchrome:not(.open){pointer-events:none;}.editorchrome.open{height:auto;opacity:1;visibility:visible;overflow:visible;}.editorchrome.transitioning{overflow:hidden;will-change:height;pointer-events:none;}.editorchrome.transitioning .barclose{pointer-events:auto;}.editorchrome-inner{min-height:0;transform-origin:top center;}.editorchrome.transitioning .editorchrome-inner{will-change:opacity;}@media (prefers-reduced-motion:reduce){.modetab{transition:none;}}.editbar .warn{color:#ffc14d;}.editbar .sname{font-weight:600;}.editbar input{width:74px;background:transparent;border:1px solid var(--hp-line);color:var(--hp-txt);border-radius:var(--rad-s);padding:var(--sp-3) var(--sp-4);font-size:var(--fs-m);}.editbar label,.editbar .hint{color:var(--hp-muted);font-size:var(--fs-s);}.editbar .drawwall{display:inline-flex;align-items:center;gap:var(--sp-3);white-space:nowrap;}.editbar .wallsgroup{display:inline-flex;align-items:center;gap:10px;white-space:nowrap;}.editbar .drawwall input{width:4.2em;}.editbar .drawwall .opl{color:var(--hp-muted);font-size:var(--fs-s);}.menuwrap{position:fixed;inset:0;z-index:80;}.menu{position:fixed;background:var(--hp-bg);border:1px solid var(--hp-accent);border-radius:var(--rad-l);box-shadow:var(--shadow-2);min-width:210px;max-width:300px;overflow:hidden;transform:translate(0,8px);}.menu .hd{padding:var(--sp-4) var(--sp-5);font-weight:600;font-size:var(--fs-m);border-bottom:1px solid var(--hp-line);display:flex;align-items:center;gap:var(--sp-3);}.menu .hd ha-icon,.menu .it.all ha-icon{color:var(--hp-accent);--mdc-icon-size:16px;}.menu .it{padding:var(--sp-4) var(--sp-5);font-size:var(--fs-m);cursor:pointer;display:flex;align-items:center;gap:var(--sp-4);}.menu .it ha-icon{--mdc-icon-size:16px;color:var(--hp-muted);}:host([data-pointer-hover]) .menu .it:hover{background:rgba(127,127,127,0.15);}.menu .it.all{color:var(--hp-accent);font-weight:600;}.tip{position:fixed;pointer-events:none;background:var(--hp-bg);border:1px solid var(--hp-accent);color:var(--hp-txt);padding:var(--sp-3) 10px;border-radius:var(--rad-m);font-size:var(--fs-m);box-shadow:var(--shadow-2);z-index:60;max-width:260px;}.tip .m{color:var(--hp-muted);font-size:var(--fs-s);display:block;}`,o`.head{display:flex;align-items:center;gap:10px;padding:10px var(--sp-5);border-bottom:1px solid var(--hp-line);flex-wrap:wrap;}.title{font-size:var(--fs-l);font-weight:600;display:flex;align-items:center;gap:var(--sp-3);white-space:nowrap;}.title ha-icon{color:var(--hp-accent);--mdc-icon-size:18px;}@media (max-width:1100px){.head .count{display:none;}}@media (max-width:620px){.head{gap:var(--sp-3);padding:var(--sp-4) 10px;}.head .title{font-size:var(--fs-m);}}.count{font-size:var(--fs-s);color:var(--hp-muted);}.btn{display:inline-flex;align-items:center;gap:var(--sp-3);border:1px solid var(--hp-line);background:transparent;color:var(--hp-txt);padding:var(--sp-3) 10px;border-radius:var(--rad-m);cursor:pointer;transition:0.15s;font-family:inherit;font-size:var(--fs-m);}.btn ha-icon{--mdc-icon-size:17px;}:host([data-pointer-hover]) .btn:hover{border-color:var(--hp-accent);}.btn.on{background:var(--hp-accent);color:var(--text-primary-color,#fff);border-color:var(--hp-accent);}.btn.ghost{border:none;}.btn[disabled]{opacity:0.5;pointer-events:none;}.sunrow{display:flex;align-items:center;gap:var(--sp-5);margin:var(--sp-3) 0;}.suncol{flex:1;display:flex;flex-direction:column;gap:var(--sp-3);min-width:0;}.recoveryoverlay{position:absolute;inset:0;z-index:75;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:var(--sp-4);padding:var(--sp-6);box-sizing:border-box;background:linear-gradient(var(--ha-card-background,var(--card-background-color,#111)),var(--ha-card-background,var(--card-background-color,#111))),#111;color:var(--primary-text-color,#fff);text-align:center;pointer-events:auto;transition:opacity 0.15s ease;}.recoveryoverlay.phase-entering,.recoveryoverlay.phase-leaving{opacity:0;}.recoveryoverlay.phase-fading-in,.recoveryoverlay.phase-opaque{opacity:1;}.recoveryoverlay ha-icon{--mdc-icon-size:44px;color:var(--hp-accent);}.editorloading{position:absolute;z-index:74;left:50%;top:50%;display:flex;align-items:center;gap:var(--sp-3);padding:var(--sp-3) var(--sp-5);border:1px solid color-mix(in srgb,var(--hp-accent) 45%,transparent);border-radius:999px;background:color-mix(in srgb,var(--ha-card-background,var(--card-background-color,#111)) 92%,transparent);color:var(--primary-text-color);box-shadow:0 6px 22px rgb(0 0 0 / 18%);transform:translate(-50%,-50%);pointer-events:none;animation:editor-loading-in 0.15s ease both;}.editorloading ha-icon{--mdc-icon-size:22px;color:var(--hp-accent);animation:editor-loading-spin 0.9s linear infinite;}@keyframes editor-loading-in{from{opacity:0;transform:translate(-50%,calc(-50% + 4px));}to{opacity:1;transform:translate(-50%,-50%);}}@keyframes editor-loading-spin{to{transform:rotate(360deg);}}@media (prefers-reduced-motion:reduce){.recoveryoverlay,.editorloading,.editorloading ha-icon{transition:none;animation:none;}}.oplock{--oplock-size:calc(var(--icon-size,2.5cqw) * 0.62);--oplock-core-size:calc(var(--oplock-size) / 1.26875);--oplock-stroke-ratio:0.01875;--oplock-stroke-width:max(1px,calc(var(--oplock-core-size) * var(--oplock-stroke-ratio)));--oplock-core-bg:light-dark(#fff,#252525);--oplock-core-fg:light-dark(#252525,#fff);--oplock-shell-stroke:light-dark(#BCBCBC,rgb(37 37 37 / 75%));--oplock-shell-shadow:0 calc(var(--oplock-core-size) * .025) calc(var(--oplock-core-size) * .05) rgb(37 40 45 / 12%),0 calc(var(--oplock-core-size) * .1) calc(var(--oplock-core-size) * .175) calc(var(--oplock-core-size) * -.025) rgb(37 40 45 / 18%);--oplock-core-shadow:0 0 0 0 transparent;pointer-events:none;position:absolute;transform:translate(-50%,-50%);width:var(--oplock-size);height:var(--oplock-size);display:grid;place-items:center;border:0;background:transparent;z-index:1;}.oplock.theme-light{--oplock-core-bg:#fff;--oplock-core-fg:#252525;--oplock-shell-stroke:#BCBCBC;}.oplock.theme-dark{--oplock-core-bg:#252525;--oplock-core-fg:#fff;--oplock-shell-stroke:rgb(37 37 37 / 75%);--oplock-core-shadow:inset 0 calc(var(--oplock-core-size) * .0125) calc(var(--oplock-core-size) * .0125) rgb(255 255 255 / 70%);}.oplock-shell{box-sizing:border-box;width:100%;height:100%;border:var(--oplock-stroke-width) solid var(--oplock-shell-stroke);border-radius:50%;background:transparent;box-shadow:var(--oplock-shell-shadow);display:grid;place-items:center;pointer-events:none;backdrop-filter:none;}.oplock-core{width:var(--oplock-core-size);height:var(--oplock-core-size);border-radius:50%;background:var(--oplock-core-bg);color:var(--oplock-core-fg);box-shadow:var(--oplock-core-shadow);display:grid;place-items:center;pointer-events:none;}.oplock ha-icon{--mdc-icon-size:calc(var(--oplock-core-size) * 0.55);display:flex;line-height:0;}.oplock.locked{--oplock-core-bg:#66D17A;--oplock-core-fg:light-dark(#fff,#252525);--oplock-shell-stroke:#66D17A;}.oplock.theme-light.locked{--oplock-core-fg:#fff;}.oplock.theme-dark.locked{--oplock-core-fg:#252525;--oplock-stroke-ratio:.025;}.oplock.unlocked{--oplock-core-bg:#F0410C;--oplock-core-fg:light-dark(#fff,#252525);--oplock-shell-stroke:#F0410C;}.oplock.theme-light.unlocked{--oplock-core-fg:#fff;}.oplock.theme-dark.unlocked{--oplock-core-fg:#252525;--oplock-stroke-ratio:.025;}.oplock.unknown{--oplock-core-fg:var(--hp-muted);}.btn.lockact{width:100%;justify-content:center;display:flex;align-items:center;gap:var(--sp-3);margin-top:var(--sp-4);}.btn.lockact.warn{color:var(--error-color,#d33);border-color:var(--error-color,#d33);}.oprow{display:flex;align-items:center;gap:var(--sp-4);padding:var(--sp-3) 0;}.oprow b{margin-left:auto;}.oprow.ok b{color:#66d17a;}.oprow.warn b{color:var(--hp-open);}.bindharow{display:flex;align-items:center;gap:var(--sp-5);flex-wrap:wrap;}.bindharow .entcheck{opacity:0.9;}.ctrlchips{display:flex;flex-wrap:wrap;gap:var(--sp-3);margin:var(--sp-2) 0;}.ctrlchip{display:inline-flex;align-items:center;gap:var(--sp-2);background:var(--hp-accent);color:var(--text-primary-color,#fff);border-radius:var(--rad-l);padding:var(--sp-2) var(--sp-4);font-size:var(--fs-s);}.ctrlchip ha-icon{--mdc-icon-size:14px;cursor:pointer;}.ctrllist{display:flex;flex-direction:column;gap:var(--sp-1);margin-top:var(--sp-2);}.ctrlopt{display:flex;align-items:center;gap:var(--sp-4);text-align:left;border:0;background:transparent;color:var(--hp-txt);padding:var(--sp-3) var(--sp-4);border-radius:var(--rad-s);cursor:pointer;font-family:inherit;font-size:var(--fs-m);}:host([data-pointer-hover]) .ctrlopt:hover{background:var(--secondary-background-color,rgba(128,128,128,0.15));}.ctrlopt .sub{color:var(--hp-muted);font-size:var(--fs-s);margin-left:auto;}.ctrlopt ha-icon{--mdc-icon-size:16px;}.ctrlstates{display:flex;flex-direction:column;gap:var(--sp-2);}.ctrlstate{display:inline-flex;align-items:center;gap:var(--sp-3);color:var(--hp-muted);}.ctrlstate.on{color:var(--hp-txt);}.ctrlstate ha-icon{--mdc-icon-size:15px;}.cardpreview{display:flex;flex-direction:column;align-items:center;gap:var(--sp-2);margin:var(--sp-4) 0 var(--sp-1);padding:10px;border:1px dashed var(--hp-muted);border-radius:var(--rad-m);}.cardpreview .cpname{font-weight:700;letter-spacing:0.04em;}.cardpreview .cpmeta{display:inline-flex;align-items:center;gap:0.3em;font-weight:600;opacity:0.85;}.cardpreview .cpmeta ha-icon{--mdc-icon-size:1.05em;}.iconauto{display:flex;align-items:center;gap:var(--sp-3);font-size:var(--fs-s);margin:var(--sp-2) 0 0;}.iconauto ha-icon{--mdc-icon-size:18px;}.iconauto span{flex:1;}.iconauto .btn{min-height:32px;padding:0 var(--sp-3);}hp-dialog .dfill{display:inline-flex;align-items:center;gap:var(--sp-3);cursor:pointer;}.wallthick-dlg{position:absolute;z-index:40;min-width:200px;transform:translate(-50%,8px);padding:10px 12px;border-radius:10px;background:var(--card-background-color,#fff);box-shadow:0 8px 28px rgba(0,0,0,.22);display:flex;flex-direction:column;gap:8px;pointer-events:auto;}.wallthick-dlg .row{display:flex;align-items:center;gap:8px;}.wallthick-dlg input[type="number"]{width:5.5em;padding:4px 6px;border:1px solid var(--divider-color,#ccc);border-radius:6px;background:var(--input-fill,transparent);color:var(--primary-text-color);}.areasel,.namein{background:var(--hp-bg);border:1px solid var(--hp-line);color:var(--hp-txt);border-radius:var(--rad-s);padding:var(--sp-3) var(--sp-4);font-size:var(--fs-m);font-family:inherit;}.namein{width:130px;}.habindingbanner{display:flex;align-items:center;gap:var(--sp-3);padding:var(--sp-3) var(--sp-4);margin-bottom:var(--sp-4);border:1px solid var(--warning-color,#ff9800);border-radius:var(--rad-m);background:color-mix(in srgb,var(--warning-color,#ff9800) 12%,transparent);color:var(--primary-text-color,#f1f3f6);}.habindingbanner>span{flex:1;min-width:0;}.habindingbanner>ha-icon{color:var(--warning-color,#ff9800);flex:0 0 auto;}.habindingbanner.limited{border-color:var(--secondary-text-color,#9aa0aa);background:color-mix(in srgb,var(--secondary-text-color,#9aa0aa) 10%,transparent);}.habindingbanner.limited>ha-icon{color:var(--secondary-text-color,#9aa0aa);}.srcrow{display:flex;align-items:center;gap:var(--sp-4);font-size:var(--fs-m);cursor:pointer;padding:var(--sp-1) 0;}.dispsection{margin-top:var(--sp-5) !important;padding-top:var(--sp-4);border-top:1px solid var(--hp-line);font-weight:600;color:var(--hp-txt) !important;}.colorrow{display:flex;align-items:center;gap:var(--sp-4);}.roomtemprange{display:grid;gap:8px;min-width:0;}.roomtemprange-head{display:flex;flex-wrap:wrap;align-items:center;gap:6px;}.roomtemprange-fields{display:flex;flex-wrap:wrap;align-items:center;gap:8px;min-width:0;}.roomtemprange-fields input{flex:0 1 104px;min-width:72px;}.roomtemprange-fields input[aria-invalid='true']{border-color:var(--error-color,#db4437);}.gsrow>hp-color-opacity{min-width:min(100%,210px);justify-content:space-between;}.ripple-colorrow>hp-color-opacity{width:100%;justify-content:space-between;}.ripple-sizerow>.opl{min-width:0;}.colorrow input[type='range']{flex:1;}.colorrow .tempin{width:70px;flex:none;}hp-dialog .body .temprange .tempin{width:56px;flex:none;padding:var(--sp-2) var(--sp-3);}hp-dialog .body .colorrow .tempin{width:72px;flex:none;}.srcrow{flex-wrap:nowrap;}.srcrow ha-switch{flex:none;}.colorrow ha-slider{flex:1;min-width:0;}.srcrow>span:first-of-type{white-space:nowrap;}.colorrow .opl{color:var(--hp-muted);font-size:var(--fs-s);}.colorrow .opv{font-size:var(--fs-s);min-width:34px;text-align:right;}.markerlightgroup{min-width:0;margin:var(--sp-5) 0 0;padding:var(--sp-4);border:1px solid var(--hp-line);border-radius:var(--rad-m);}.markerlightgroup legend{display:flex;align-items:center;flex-wrap:wrap;gap:var(--sp-1);padding:0 var(--sp-2);color:var(--hp-txt);font-weight:600;}.markerlightgroup legend>span{min-width:0;overflow-wrap:anywhere;}.markerlightgroup[disabled]>:not(legend){opacity:.62;}.radargroup{display:grid;gap:var(--sp-2);}.radargroup>p{margin:0;}.radargroup>label:not(.srcrow){margin-top:var(--sp-2);}.radarcoordinates{align-items:flex-end;flex-wrap:wrap;}.radarcoordinates>label{display:grid;flex:1 1 92px;gap:var(--sp-1);min-width:0;margin:0;}hp-dialog .body .radarcoordinates .tempin{box-sizing:border-box;width:100%;}.radaradditional{margin-top:var(--sp-5);}.radaradditional summary{cursor:pointer;font-weight:600;}.radaradditional .btn{margin-top:var(--sp-3);}.radarinspection{display:grid;gap:6px;padding:10px 12px;border-radius:10px;background:color-mix(in srgb,var(--primary-color) 7%,transparent);}.radarinspection code{overflow-wrap:anywhere;font-size:12px;}.radarsetup{display:grid;gap:10px;margin-top:10px;padding:12px;border:1px solid var(--hp-accent);border-radius:var(--rad-m);background:color-mix(in srgb,var(--secondary-background-color) 88%,transparent);}.radarsetup-head{display:flex;align-items:center;gap:8px;}.radarsetup-head strong{flex:1;}.radarsetup>svg{width:min(100%,460px);aspect-ratio:1;justify-self:center;border-radius:var(--rad-m);background:var(--primary-background-color);touch-action:none;cursor:crosshair;}.radarsetup .room{fill:color-mix(in srgb,var(--hp-accent) 8%,transparent);stroke:var(--divider-color);stroke-width:3;vector-effect:non-scaling-stroke;}.radarsetup .heading{stroke:var(--hp-accent);stroke-width:4;vector-effect:non-scaling-stroke;}.radarsetup .trail{fill:none;stroke:var(--success-color,#43a047);stroke-width:3;stroke-linecap:round;stroke-linejoin:round;vector-effect:non-scaling-stroke;opacity:.55;}.radarsetup g circle{fill:var(--hp-bg);stroke:var(--hp-accent);stroke-width:3;vector-effect:non-scaling-stroke;}.radarsetup g.pending circle{stroke-dasharray:5 4;}.radarsetup g text{fill:var(--hp-txt);font-size:22px;font-weight:700;text-anchor:middle;dominant-baseline:middle;pointer-events:none;}.markerhelpfield{margin-top:var(--sp-4);}.markerhelplabel{display:flex;align-items:center;flex-wrap:wrap;gap:var(--sp-1);margin-bottom:var(--sp-1);}.markerhelplabel>label{min-width:0;overflow-wrap:anywhere;}.helpfieldlabel{display:flex;align-items:center;flex-wrap:wrap;gap:var(--sp-1);min-width:0;margin-top:var(--sp-3);color:var(--hp-muted);font-size:var(--fs-s);}.helpfieldlabel.compact{margin-top:0;}hp-dialog .body .helpfieldlabel>label{min-width:0;margin-top:0;overflow-wrap:anywhere;}.help-inline-label{display:inline-flex;align-items:center;flex-wrap:wrap;gap:var(--sp-1);}hp-dialog .body .help-inline-label>label{min-width:0;margin-top:0;overflow-wrap:anywhere;}.markerradios{display:grid;gap:var(--sp-1);min-width:0;}.markerlightgroup .srcrow>span:first-of-type{min-width:0;white-space:normal;overflow-wrap:anywhere;}.markerglowvalue{margin:var(--sp-3) 0;flex-wrap:wrap;}.markerglowvalue hp-color-opacity{flex:none;}.markerlightdisabled{display:flex;align-items:center;gap:var(--sp-2);margin-top:var(--sp-2) !important;}.markerlightdisabled ha-icon{--mdc-icon-size:18px;flex:none;}.markerbadgetechnical{min-width:0;margin:var(--sp-1) 0 var(--sp-2) !important;overflow-wrap:anywhere;}.markerbadgetechnical code{white-space:normal;}.planrow{display:flex;align-items:center;gap:10px;}.savedplans{display:flex;flex-direction:column;gap:var(--sp-3);max-height:240px;overflow:auto;margin:var(--sp-3) 0 var(--sp-1);padding:var(--sp-3);border:1px solid var(--hp-line);border-radius:var(--rad-m);background:var(--hp-bg2,rgba(255,255,255,0.03));flex:0 0 auto;min-height:2.6em;}.savedplan{display:flex;align-items:center;gap:10px;}.savedplan.cur{outline:1px solid var(--hp-accent);border-radius:var(--rad-s);}.savedplan img{width:56px;height:40px;object-fit:contain;border:1px solid var(--hp-line);border-radius:var(--rad-s);background:#fff;flex:none;}.savedmeta{display:flex;flex-direction:column;min-width:0;flex:1;}.savedmeta b{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}.savedmeta .muted{font-size:var(--fs-s);}.savedplan .btn.danger ha-icon{color:#f25a4a;}.savedplan .btn[disabled]{opacity:0.4;pointer-events:none;}.planprev{max-width:120px;max-height:70px;border:1px solid var(--hp-line);border-radius:var(--rad-s);background:#fff;}.planname{font-size:var(--fs-m);max-width:150px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}.planname.muted{color:var(--hp-muted);}.filebtn{cursor:pointer;}.fileupload{display:inline-flex;min-width:0;}.fileupload>input{display:none;}.btn.danger{border-color:#b3402a;color:#ff7a5c;}hp-dialog .row .spacer{flex:1;}hp-dialog .body{max-height:66vh;overflow-y:auto;}hp-confirm{display:contents;}hp-dialog .danger-confirm-body{display:flex;flex-direction:column;gap:var(--sp-4);}hp-dialog .danger-confirm-body p{margin:0;line-height:1.45;}hp-dialog .danger-confirm-object{overflow-wrap:anywhere;font-size:var(--fs-l);line-height:1.3;}.descin{width:100%;box-sizing:border-box;background:var(--hp-bg);border:1px solid var(--hp-line);color:var(--hp-txt);border-radius:var(--rad-s);padding:var(--sp-3) var(--sp-4);font-size:var(--fs-m);font-family:inherit;resize:vertical;min-height:92px;flex-shrink:0;line-height:1.35;}.bindsel{display:flex;flex-direction:column;gap:var(--sp-3);border:1px solid var(--hp-line);border-radius:var(--rad-m);padding:var(--sp-4);}.bindsel .opt{display:flex;align-items:center;gap:var(--sp-3);border:1px solid var(--hp-line);background:transparent;color:var(--hp-txt);border-radius:var(--rad-s);padding:var(--sp-3) var(--sp-4);cursor:pointer;font-size:var(--fs-m);font-family:inherit;}.bindsel .opt.on{background:var(--hp-accent);color:var(--text-primary-color,#fff);border-color:var(--hp-accent);}.curbind{display:flex;align-items:center;gap:var(--sp-3);font-size:var(--fs-m);color:var(--hp-txt);flex-wrap:wrap;}.curbind .ref{color:var(--hp-muted);font-size:var(--fs-s);}.vacbox .vacbtns{display:flex;gap:var(--sp-4);margin:var(--sp-3) 0;flex-wrap:wrap;}.vacdiag{display:grid;gap:4px;margin-bottom:var(--sp-3);}.vacdiag>div{display:flex;justify-content:space-between;gap:var(--sp-5);}.vacdiag>div>span{color:var(--secondary-text-color);}.vacdiag>div>b{text-align:right;overflow-wrap:anywhere;}.vacroute-missing-group{margin-top:var(--sp-4);padding-top:var(--sp-4);border-top:1px solid var(--hp-line);}.vacroute-group-title{margin:0 0 var(--sp-3);color:var(--secondary-text-color);font-size:var(--fs-m);font-weight:600;}.vacroute-missing-group .vacroute-list{margin-top:0;}.vacpicker{margin:var(--sp-3) 0;}.vacsource-warning{display:grid;gap:8px;}.vacsource-warning .btn{justify-self:start;}.vacpicker>summary{display:inline-flex;width:auto;list-style:none;cursor:pointer;}.vacpicker>summary::-webkit-details-marker{display:none;}.vacsource-list{display:grid;gap:6px;margin-top:8px;}.vacsource-list details{padding:6px 0 0;}.vacsource-list details>summary{cursor:pointer;font-weight:600;}.vacsource{display:flex;align-items:center;justify-content:space-between;gap:12px;width:100%;min-width:0;padding:9px 10px;border:1px solid var(--divider-color);border-radius:10px;color:var(--primary-text-color);background:var(--secondary-background-color);text-align:left;cursor:pointer;}.vacsource.on{border-color:var(--accent-color);box-shadow:inset 3px 0 var(--accent-color);}.vacsource>span:first-child{min-width:0;display:grid;gap:2px;}.vacsource small{color:var(--secondary-text-color);overflow-wrap:anywhere;}.vacsource-meta{color:var(--secondary-text-color);text-align:right;font-size:0.82em;}.vacxcme pre{margin:8px 0 0;white-space:pre-wrap;user-select:text;}.vacfit{position:absolute;inset:0;width:100%;height:100%;z-index:12;overflow:visible;touch-action:none;cursor:grab;pointer-events:auto;}.vacfit:active{cursor:grabbing;}.vacfit polygon{fill:color-mix(in srgb,var(--hp-accent) 16%,transparent);stroke:var(--hp-accent);stroke-width:2;vector-effect:non-scaling-stroke;stroke-dasharray:6 4;}.vacfit text{fill:var(--hp-accent);font-size:26px;text-anchor:middle;dominant-baseline:middle;pointer-events:none;user-select:none;}.furnpalette{display:flex;flex-direction:column;max-height:38vh;border-top:1px solid var(--hp-border,rgba(255,255,255,0.12));background:var(--card-background-color,var(--hp-bg));font-size:0.85em;}.furnhd{display:flex;align-items:center;gap:6px;padding:4px 8px;font-weight:600;opacity:0.9;}.furnhd .spacer{flex:1;}.furnbody{overflow:auto;padding:0 8px 6px;}.furngroup{margin:6px 0 3px;font-size:0.85em;text-transform:uppercase;letter-spacing:0.04em;opacity:0.6;}.furnrow{display:flex;flex-wrap:wrap;gap:4px;}.furnback{min-height:34px;gap:5px;margin:2px 0 4px;}.furnitem{display:flex;flex-direction:column;align-items:center;gap:2px;width:74px;padding:4px 2px;border:1px solid transparent;border-radius:8px;background:rgba(127,127,127,0.08);color:inherit;font:inherit;font-size:0.8em;line-height:1.15;text-align:center;cursor:pointer;}:host([data-pointer-hover]) .furnitem:hover{background:rgba(127,127,127,0.18);}.furnitem.on{border-color:var(--hp-accent);background:rgba(38,166,154,0.18);}.furnprev{width:40px;height:40px;color:var(--primary-text-color,currentColor);}.furncategory{width:92px;min-height:76px;}.furncatprev{width:48px;height:48px;}.furnvariants .furnitem{min-height:74px;}.furnsize{display:flex;align-items:center;flex-wrap:wrap;gap:6px;padding:6px 8px;border-top:1px solid var(--hp-border,rgba(255,255,255,0.12));}.furnsize label{display:flex;align-items:baseline;gap:3px;opacity:0.8;}.furnsize .furnunit{opacity:0.6;font-size:0.85em;}.furnsize input{width:5.5em;padding:3px 5px;}.furnhint{opacity:0.6;}.imageupload{display:inline-flex;gap:6px;margin:4px 0 8px;cursor:pointer;}.imageupload.disabled{opacity:0.55;pointer-events:none;}.imageupload input{display:none;}.imageassets{align-items:stretch;}.imageempty{padding:12px 6px;}.imageasset{position:relative;}.imageasset .furnitem{width:104px;min-height:92px;}.imageasset img{width:64px;height:54px;object-fit:contain;border-radius:4px;background:repeating-conic-gradient(#ddd 0 25%,#fff 0 50%) 50% / 12px 12px;}.imageasset .furnitem span{max-width:96px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}.imageasset .furnitem small{opacity:0.65;font-size:0.72em;}.imageassetdelete{position:absolute;top:0;right:0;min-width:30px;width:30px;min-height:30px;padding:3px;}.imagepropertypreview{display:flex;align-items:center;gap:10px;min-width:0;}.imagepropertypreview img{width:72px;height:54px;object-fit:contain;border-radius:4px;background:repeating-conic-gradient(#ddd 0 25%,#fff 0 50%) 50% / 12px 12px;}.imagepropertypreview span{overflow-wrap:anywhere;}.vacfitdot{fill:var(--hp-accent);pointer-events:none;}.vacfithandle{fill:transparent;stroke:none;cursor:nwse-resize;}.vacfitknob{fill:var(--hp-bg);stroke:var(--hp-accent);stroke-width:2;vector-effect:non-scaling-stroke;pointer-events:none;}.vaccalbar{position:fixed;left:50%;bottom:24px;transform:translateX(-50%);display:flex;gap:var(--sp-5);align-items:center;background:var(--hp-bg);color:var(--hp-txt);border:1px solid var(--hp-accent);border-radius:var(--rad-l);padding:10px var(--sp-5);z-index:60;box-shadow:var(--shadow-2);}.candlist{max-height:160px;overflow-y:auto;border-top:1px solid var(--hp-line);flex:0 0 auto;min-height:2.6em;}.cand{display:flex;justify-content:space-between;gap:var(--sp-4);padding:var(--sp-3) var(--sp-4);cursor:pointer;border-radius:var(--rad-s);font-size:var(--fs-m);}:host([data-pointer-hover]) .cand:hover{background:rgba(127,127,127,0.15);}.cand.sel{background:var(--hp-accent);color:var(--text-primary-color,#fff);}.cand .cs{color:var(--hp-muted);font-size:var(--fs-s);white-space:nowrap;}.opening-entity-candidate{width:100%;border:0;background:transparent;color:inherit;font:inherit;text-align:left;}.opening-entity-candidate.sel{background:var(--hp-accent);color:var(--text-primary-color,#fff);}.opening-entity-empty{cursor:default;}.cand.sel .cs{color:var(--text-primary-color,#fff);opacity:0.85;}.cand.muted{color:var(--hp-muted);cursor:default;}.pdfedit{display:flex;flex-wrap:wrap;gap:var(--sp-3);align-items:center;}.pdftag{display:inline-flex;align-items:center;gap:var(--sp-2);border:1px solid var(--hp-line);border-radius:var(--rad-s);padding:var(--sp-2) var(--sp-3);font-size:var(--fs-s);}.pdftag a{color:var(--hp-txt);text-decoration:none;max-width:150px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}.pdftag .x{--mdc-icon-size:15px;cursor:pointer;color:var(--hp-muted);}:host([data-pointer-hover]) .pdftag .x:hover{color:#ff7a5c;}.entlist{display:flex;flex-direction:column;gap:var(--sp-2);margin-bottom:10px;}.entrow{display:flex;align-items:center;gap:var(--sp-4);padding:var(--sp-3) var(--sp-4);border-radius:var(--rad-m);background:var(--secondary-background-color,rgba(128,128,128,0.12));}.entrow ha-icon{--mdc-icon-size:20px;color:var(--hp-muted);}.entrow.on ha-icon{color:var(--hp-accent);}.entrow .en{flex:1;font-size:var(--fs-m);}.entrow .ev{font-size:var(--fs-m);color:var(--hp-muted);}.entbtn{min-width:74px;min-height:32px;padding:var(--sp-2) var(--sp-5);border:1px solid var(--hp-muted);border-radius:999px;background:transparent;color:var(--hp-txt);font:inherit;font-size:var(--fs-m);cursor:pointer;}.entbtn.on{background:var(--hp-accent);border-color:var(--hp-accent);color:var(--text-primary-color,#fff);font-weight:600;}.inforow{display:flex;gap:10px;font-size:var(--fs-m);margin:var(--sp-2) 0;}.inforow .k{color:var(--hp-muted);min-width:84px;}.inforow a{color:var(--hp-accent);word-break:break-all;}.infodesc{font-size:var(--fs-m);white-space:pre-wrap;margin-top:var(--sp-3);}.infodesc.muted{color:var(--hp-muted);}.pdflist{display:flex;flex-direction:column;gap:var(--sp-2);}.pdf{display:inline-flex;align-items:center;gap:var(--sp-2);color:var(--hp-accent);text-decoration:none;}ha-icon-picker{display:block;}.floorrow{display:flex;align-items:center;gap:var(--sp-4);padding:var(--sp-3) var(--sp-2);font-size:var(--fs-m);cursor:pointer;}.floorrow .floorlvl{color:var(--hp-muted);font-size:var(--fs-s);border:1px solid var(--hp-line);border-radius:var(--rad-s);padding:0 var(--sp-3);}.rtest{display:flex;align-items:center;gap:var(--sp-4);margin-bottom:var(--sp-4);}.rtest .namein{flex:1;}.rtest ha-icon{color:var(--hp-accent);}.rtesticon{font-size:var(--fs-s);color:var(--hp-muted);}.rrow{display:flex;align-items:center;gap:var(--sp-3);margin:var(--sp-1) 0;}.rrow .rpat{flex:2;}.rrow .ricon{flex:1.4;}.rrow .rpat.bad{border-color:#ff7a5c;}.rrow .rprev{--mdc-icon-size:18px;color:var(--hp-txt);min-width:18px;}.rrow .ract{--mdc-icon-size:16px;color:var(--hp-muted);cursor:pointer;}:host([data-pointer-hover]) .rrow .ract:hover{color:var(--hp-txt);}:host([data-pointer-hover]) .rrow .ract.del:hover{color:#ff7a5c;}.gsrow .gsl{min-width:150px;font-size:var(--fs-m);color:var(--hp-muted);}.optimize-live{display:grid;justify-items:start;gap:var(--sp-2);margin-bottom:var(--sp-3);}.optimize-live .alignmsg,.optimize-live .rhint{margin-bottom:0;}.optimize-cleanup{min-height:44px;}.optimize-selected{color:var(--hp-txt);}.optimize-details{margin-top:var(--sp-3);color:var(--hp-muted);font-size:var(--fs-s);overflow-wrap:anywhere;}.optimize-details>summary{width:fit-content;color:var(--hp-txt);cursor:pointer;font-weight:600;}.optimize-details>summary:focus-visible{outline:2px solid var(--hp-accent);outline-offset:3px;border-radius:var(--rad-s);}.optimize-details ul{margin:var(--sp-3) 0;padding-inline-start:22px;}.optimize-details li + li{margin-top:var(--sp-1);}.btn.alignall{width:100%;justify-content:center;}.backupactions{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:var(--sp-3);}.backupactions .btn{justify-content:center;min-width:0;}.backupupload{display:inline-flex;min-width:0;}.backupupload>.btn{width:100%;justify-content:center;}.backupupload input{display:none;}.backupbody{min-width:0;}.backupplanonly{margin-inline-start:var(--sp-4) !important;align-items:flex-start !important;}.backupplanonly>span:first-of-type{display:grid;gap:2px;white-space:normal;}.backupplanonly small{color:var(--secondary-text-color);line-height:1.35;}.backupplanonlystatus{color:var(--hp-accent) !important;font-weight:700;}.backupfile,.backupsummary,.backupcontent{display:flex;flex-direction:column;min-width:0;gap:var(--sp-1);}.backupfile b,.backupcontent span{overflow-wrap:anywhere;}.backupfile span,.backupsummary span,.backupcontent span{color:var(--hp-muted);font-size:var(--fs-s);}.backupcounts{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:var(--sp-2) var(--sp-4);font-size:var(--fs-s);}.backupwarn,.backuperror{border-radius:var(--rad-s);padding:var(--sp-3);font-size:var(--fs-s);line-height:1.45;overflow-wrap:anywhere;}.backupwarn{background:color-mix(in srgb,var(--hp-accent) 12%,transparent);}.backuperror{background:rgba(179,64,42,.16);color:#ff7a5c;}.backupdetails{border:1px solid var(--hp-line);border-radius:var(--rad-s);padding:var(--sp-2) var(--sp-3);font-size:var(--fs-s);}.backupdetails summary{cursor:pointer;font-weight:700;}.backupdetails>div{display:grid;gap:var(--sp-1);padding-block-start:var(--sp-2);}.backupdetails code{overflow-wrap:anywhere;color:var(--hp-muted);}.backupchoices{display:flex;flex-direction:column;gap:var(--sp-2);border:1px solid var(--hp-line);border-radius:var(--rad-s);min-width:0;}.backupchoices label{margin:0 !important;display:flex;gap:var(--sp-2);}.backupconfirm{align-items:flex-start !important;}.backupconfirm>span:first-of-type{min-width:0;white-space:normal;overflow-wrap:anywhere;}@media (max-width:520px){.backupactions,.backupcounts{grid-template-columns:1fr;}}.aboutver{font-size:var(--fs-s);color:var(--hp-muted);margin:var(--sp-2) 0 var(--sp-3);}.aboutlink{display:flex;align-items:center;gap:var(--sp-3);width:fit-content;color:var(--hp-accent);text-decoration:none;font-size:var(--fs-m);padding:var(--sp-1) 0;}:host([data-pointer-hover]) .aboutlink:hover{text-decoration:underline;}.aboutlink ha-icon{--mdc-icon-size:18px;line-height:1;}hp-dialog .supportbody{min-width:0;overflow-x:hidden;gap:var(--sp-5);}.supportsection{display:grid;min-width:0;gap:var(--sp-2);}.supportsection + .supportsection{padding-top:var(--sp-4);border-top:1px solid var(--hp-line);}.supportsection h3{margin:0;color:var(--hp-txt);font-size:var(--fs-m);}.supportlinks,.supportactions{display:flex;align-items:center;flex-wrap:wrap;gap:var(--sp-2) var(--sp-4);min-width:0;}.supportform>label:not(.srcrow){margin-top:var(--sp-2);color:var(--hp-muted);font-size:var(--fs-s);}.supportmessage,.supportraw{width:100%;min-width:0;box-sizing:border-box;resize:vertical;border:1px solid var(--hp-line);border-radius:var(--rad-s);padding:var(--sp-3);color:var(--hp-txt);background:color-mix(in srgb,var(--card-background-color,var(--hp-bg)) 92%,var(--hp-txt));font:inherit;}.supportmessage{min-height:120px;background:var(--hp-bg);}.supportraw{min-height:220px;margin-top:var(--sp-2);resize:none;white-space:pre;overflow:auto;font-family:ui-monospace,SFMono-Regular,Consolas,monospace;font-size:12px;}.supportattach{min-width:0;align-items:flex-start;margin:var(--sp-2) 0 0 !important;}.supportattach>span:first-of-type{min-width:0;white-space:normal;overflow-wrap:anywhere;}.supportwarning,.supportstatus,.supportupdate{display:flex;align-items:flex-start;gap:var(--sp-2);min-width:0;margin:0;padding:var(--sp-3);border-radius:var(--rad-s);background:color-mix(in srgb,var(--hp-accent) 14%,transparent);overflow-wrap:anywhere;font-size:var(--fs-s);line-height:1.45;}.supportwarning ha-icon,.supportstatus ha-icon,.supportupdate ha-icon{flex:none;color:var(--hp-accent);--mdc-icon-size:20px;}.supportpreview,.supportmanual,.supporterror,.supportsuccess{display:grid;min-width:0;gap:var(--sp-2);padding:var(--sp-3);border:1px solid var(--hp-line);border-radius:var(--rad-s);}.supportsummary{font-weight:600;overflow-wrap:anywhere;}.supporthash{display:grid;min-width:0;gap:var(--sp-1);color:var(--hp-muted);font-size:var(--fs-s);}.supporthash code{overflow-wrap:anywhere;color:var(--hp-txt);}.supportpreview details{min-width:0;}.supportpreview summary{cursor:pointer;color:var(--hp-accent);}.supportprivacy{margin:0 !important;line-height:1.45;}.supporterror{background:color-mix(in srgb,var(--error-color,#db4437) 12%,transparent);border-color:color-mix(in srgb,var(--error-color,#db4437) 45%,var(--hp-line));}.supportsuccess{background:color-mix(in srgb,var(--success-color,#43a047) 12%,transparent);border-color:color-mix(in srgb,var(--success-color,#43a047) 45%,var(--hp-line));}.supportfooter{flex-wrap:wrap;}@media (max-width:520px){hp-dialog .supportbody{padding-inline:var(--sp-4);}hp-dialog .supportfooter{padding-inline:var(--sp-4);}.supportactions .btn,.supportactions .aboutlink{max-width:100%;}}hp-dialog .body{padding:var(--sp-5) var(--sp-6);display:flex;flex-direction:column;gap:var(--sp-3);}hp-dialog .tapconfirm-body{min-width:0;overflow-x:hidden;}hp-dialog .tapconfirm-body p{max-width:100%;min-width:0;margin:0;overflow-wrap:anywhere;white-space:normal;}hp-dialog .tapconfirm-line{color:var(--hp-muted);}hp-dialog .body label{font-size:var(--fs-s);color:var(--hp-muted);margin-top:var(--sp-3);}hp-dialog .body .namein,hp-dialog .body .areasel{width:100%;box-sizing:border-box;}hp-dialog.roomdialog .body{min-width:0;overflow-x:hidden;}hp-dialog.roomdialog .body>*{min-width:0;max-width:100%;box-sizing:border-box;}hp-dialog.roomdialog .srcrow{min-width:0;align-items:flex-start;}hp-dialog.roomdialog .srcrow>span:first-of-type{min-width:0;white-space:normal;overflow-wrap:anywhere;line-height:1.35;}hp-dialog.roomdialog .dropbtn>b,hp-dialog.roomdialog .dropbtn>.ref{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}hp-dialog .row{display:flex;justify-content:flex-end;gap:var(--sp-4);width:100%;min-width:0;box-sizing:border-box;padding:var(--sp-5) var(--sp-6);border-top:1px solid var(--hp-line);}hp-dialog>.row[slot='footer'] button{min-height:44px;}hp-dialog .row.dialog-action-footer{align-items:center;justify-content:flex-start;flex-wrap:wrap;row-gap:var(--sp-4);}hp-dialog .dialog-action-group{display:flex;flex:0 1 auto;flex-wrap:wrap;align-items:center;gap:var(--sp-4);max-width:100%;min-width:0;}hp-dialog .dialog-action-group .btn{flex:0 0 auto;min-height:44px;}hp-dialog .dialog-action-danger{margin-right:auto;}hp-dialog .dialog-action-commit{margin-left:auto;justify-content:flex-end;}hp-dialog .row.markerfooter{justify-content:space-between;align-items:center;flex-wrap:wrap;}hp-dialog .row.roomfooter{align-items:center;flex-wrap:wrap;}hp-dialog .row.infofooter{align-items:center;justify-content:flex-start;flex-wrap:wrap;gap:var(--sp-3);}hp-dialog .row.infofooter .btn{flex-shrink:0;}hp-dialog .row.infofooter .infofooter-close{margin-left:auto;}@media (max-width:480px){hp-dialog .row.infofooter{padding:var(--sp-4) var(--sp-5);}}.markeractions,.markersaveactions{display:flex;align-items:center;gap:var(--sp-4);}.markeractions:empty{display:none;}.markersaveactions{margin-left:auto;}.device-inbox{display:flex;flex-direction:column;gap:var(--sp-4);padding:var(--sp-5) var(--sp-6);min-width:0;}.device-inbox-dialog{--hp-dialog-wide-width:920px;}.device-inbox-head{display:grid;grid-template-columns:minmax(180px,1fr) auto;align-items:center;gap:var(--sp-4);}.device-inbox-search{width:100%;min-width:0;box-sizing:border-box;border:1px solid var(--hp-line);border-radius:var(--rad-m);background:transparent;color:var(--hp-txt);font:inherit;padding:11px 14px;}.device-inbox-tabs{display:flex;gap:var(--sp-2);overflow-x:auto;scrollbar-width:thin;padding-bottom:var(--sp-1);}.device-inbox-tabs button{flex:0 0 auto;border:1px solid var(--hp-line);border-radius:999px;background:transparent;color:var(--hp-txt);font:inherit;padding:8px 12px;cursor:pointer;}.device-inbox-tabs button.on{border-color:var(--hp-accent);background:color-mix(in srgb,var(--hp-accent) 18%,transparent);}.device-inbox-tabs button span{color:var(--hp-muted);margin-inline-start:4px;}.device-inbox-discovery{margin:8px 0;padding:8px 10px;border:1px solid var(--divider-color,#e0e0e0);border-radius:8px;}.device-inbox-discovery summary{cursor:pointer;font-weight:600;}.device-inbox-discovery .srcrow{display:flex;gap:6px;align-items:center;margin:8px 0;}.device-inbox-excluded{display:flex;flex-wrap:wrap;gap:6px;align-items:center;}.device-inbox-excluded>span{font-weight:500;}.device-inbox-chips{display:flex;flex-wrap:wrap;gap:4px;}.device-inbox-chips .chip{display:inline-flex;align-items:center;gap:2px;padding:1px 6px;border-radius:10px;background:var(--secondary-background-color,#f0f0f0);font-size:12px;}.device-inbox-chips .chip button{border:none;background:none;cursor:pointer;padding:0 2px;color:var(--secondary-text-color,#666);}.device-inbox-excluded input[type="text"]{flex:1 1 140px;min-width:120px;padding:4px 6px;border:1px solid var(--divider-color,#e0e0e0);border-radius:6px;background:var(--card-background-color,#fff);color:var(--primary-text-color,#212121);}.device-inbox-preview{margin:8px 0 4px;font-size:13px;opacity:0.85;}.device-inbox-filters{display:flex;flex-wrap:wrap;gap:var(--sp-4) var(--sp-6);color:var(--hp-muted);}.device-inbox-filters label{display:inline-flex;align-items:center;gap:var(--sp-2);cursor:pointer;}.device-inbox-filter-help{display:inline-flex;align-items:center;gap:var(--sp-1);min-width:0;}.device-inbox-results{display:grid;gap:var(--sp-3);min-width:0;}.device-inbox-row{display:grid;grid-template-columns:42px minmax(180px,1fr) minmax(180px,auto);align-items:center;gap:var(--sp-4);min-width:0;border:1px solid var(--hp-line);border-radius:var(--rad-m);padding:var(--sp-4);background:color-mix(in srgb,var(--hp-txt) 3%,transparent);}.device-inbox-icon{--mdc-icon-size:28px;color:var(--hp-txt);justify-self:center;}.device-inbox-copy{min-width:0;}.device-inbox-name{display:flex;align-items:center;flex-wrap:wrap;gap:var(--sp-2);}.device-inbox-new{border-radius:999px;background:var(--hp-accent);color:var(--text-primary-color,#fff);font-size:var(--fs-s);padding:2px 7px;}.device-inbox-meta,.device-inbox-reason,.device-inbox-copy code{display:block;color:var(--hp-muted);font-size:var(--fs-s);overflow-wrap:anywhere;white-space:normal;}.device-inbox-status{color:var(--error-color,#db4437);margin-inline-start:var(--sp-2);}.device-inbox-actions{display:flex;justify-content:flex-end;align-items:center;flex-wrap:wrap;gap:var(--sp-2);}.device-inbox-actions .btn{min-height:36px;padding:7px 10px;}.device-inbox-menu{position:relative;}.device-inbox-menu summary{list-style:none;cursor:pointer;}.device-inbox-menu summary::-webkit-details-marker{display:none;}.device-inbox-menu-items{position:absolute;z-index:2;inset-inline-end:0;top:calc(100% + var(--sp-1));display:grid;gap:var(--sp-1);min-width:180px;padding:var(--sp-2);border:1px solid var(--hp-line);border-radius:var(--rad-m);background:var(--hp-panel,var(--card-background-color,#fff));box-shadow:0 8px 24px rgba(0,0,0,.22);}.device-inbox-menu-items .btn{justify-content:flex-start;width:100%;}.device-inbox-empty{color:var(--hp-muted);text-align:center;padding:var(--sp-8);}.device-inbox-more{align-self:center;}@media (max-width:680px){.device-inbox{padding:var(--sp-4);}.device-inbox-head{grid-template-columns:minmax(0,1fr);}.device-inbox-head .btn{justify-self:stretch;}.device-inbox-tabs{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));overflow-x:visible;}.device-inbox-tabs button{min-width:0;overflow-wrap:anywhere;}.device-inbox-row{grid-template-columns:36px minmax(0,1fr);}.device-inbox-actions{grid-column:1 / -1;justify-content:flex-start;}}`];var dp={"editor.context_actions":"Actions: {object}","editor.tool_options":"Tool options: {tool}","editor.palette":"Palette: {tool}","editor.open_group":"Tool group: {group}","editor.group_active":"{group} — active: {item}","editor.disabled_action":"{action} is unavailable: {reason}","editor.loading":"Loading editor…","editor.loading_aria":"The plan editor is loading","editor.load_failed":"Could not load the editor.","editor.refresh_advice":"Refresh the page and try again.","editor.retry_advice":"Check your connection and press again.","version_mismatch.title":"House Plan versions do not match","version_mismatch.body":"If Home Assistant is still restarting, let it finish, then reload this page.","version_mismatch.frontend":"Card","version_mismatch.backend":"Integration","version_mismatch.reload":"Reload page","color_picker.title":"Color picker","color_picker.hue":"Hue","color_picker.saturation":"Saturation","color_picker.value":"Brightness","color_picker.hex":"Hex color","color_picker.invalid_hex":"Enter a 3- or 6-digit hex color","color_picker.confirm":"OK","btn.properties":"Properties","btn.keep_as_walls":"Keep as walls","btn.delete_room_keep_walls":"Delete room, keep walls","btn.delete_room_with_walls":"Delete room and walls","title.markup_select":"Select and edit walls and columns","title.markup_column":"Column: click a grid point to place a square column","markup.partition":"Partition","markup.column":"Column","markup.hint_column":"click a grid point to place a square column","history.wall_segment":"Add wall segment","history.column_add":"Add column","history.physical_edit":"Change physical object","history.physical_delete":"Delete physical object","history.physical_move":"Move physical object","history.wall_face_batch":"Create rooms from walls","toast.column_duplicate":"A column with the same centre and outer size already exists","physical.partition_properties":"Partition properties","physical.column_properties":"Column properties","physical.shape":"Shape","physical.square":"Square","physical.circle":"Circle","physical.diameter":"Diameter","physical.side":"Side","physical.rotation":"Rotation angle","physical.length":"Length","physical.allowed_range":"Allowed: {min}–{max} {unit}","physical.column_size_title":"Outer side of the square column placed by the click (1–150 cm).","card.title":"House plan","count.devices":"{n} dev.","empty.no_spaces":"No spaces yet.","nav.spaces":"House Plan spaces","empty.add_first":"Add the first space and upload a floor plan.","empty.read_only":"No spaces are configured. Ask an administrator to add one.","empty.install":'Install the House Plan integration and add it in "Devices & services".',"btn.add_space":"Add space","btn.cancel":"Cancel","btn.save":"Save","btn.close":"Close","btn.delete":"Delete","btn.copy":"Copy","btn.edit":"Edit","btn.open_in_ha":"Open in HA","btn.reset":"Reset","btn.attach":"Attach…","btn.upload":"Upload…","btn.replace":"Replace…","title.zoom_in":"Zoom in","title.zoom_out":"Zoom out","title.zoom_fit":"Fit all","title.configure_space":"Configure space","title.add_space":"Add space","title.markup_add":"Walls: draw a continuous chain; each accepted segment is saved independently. Shift locks to 45°","title.markup_merge":"Merge: click one room, then the neighbour it shares a wall with","title.markup_split":"Split a room: click the room, then two points on its walls","title.markup_delroom":"Delete room: click inside a room and confirm","title.need_plan":"Upload a floor-plan image","markup.add":"Walls","markup.merge":"Merge","markup.split":"Split","markup.resize":"Resize","title.markup_resize":"Resize rooms: drag an available horizontal or vertical wall handle","markup.hint_resize":"drag an available wall handle · the wall stops at the first unsafe position · Esc cancels · Ctrl+Z — undo","resize.disabled.diagonal":"This wall is angled; Resize supports only horizontal and vertical walls","resize.disabled.side-angle":"An adjoining wall is angled; Resize requires both adjoining walls to meet this wall at right angles","resize.disabled.duplicate-physical-wall":"A separate partition or column overlaps this wall; remove or move it before resizing","resize.disabled.partial-shared":"A neighbouring room uses only part of this wall, so it cannot be moved safely as one shared wall","resize.disabled.unequal-shared":"The neighbouring room uses different endpoints or wall length, so the walls cannot move together safely","resize.disabled.multiple-rooms":"Moving this wall would affect more than two rooms","resize.disabled.thickness-conflict":"The wall thickness cannot be preserved safely","resize.disabled.opening-conflict":"An opening on this wall cannot be moved safely","resize.disabled.invalid-geometry":"This wall cannot be resized without changing the plan structure","resize.limit_stopped":"Wall stopped: the next step would break a junction limit","resize.commit_failed":"Resize was cancelled because the final plan did not pass the geometry check","resize.preview_failed":"Resize stopped at the last safe position because the plan geometry could not be preserved","markup.opening":"Opening","markup.delete_room":"Delete room","history.undo":"Undo","history.redo":"Redo","history.undo_named":"Undo: {name} (Ctrl+Z)","history.redo_named":"Redo: {name} (Ctrl+Shift+Z / Ctrl+Y)","history.undo_empty":"Nothing to undo","history.redo_empty":"Nothing to redo","history.undone":"Undone: {name}","history.redone":"Redone: {name}","history.add_room":"Create room","history.split_room":"Split room","history.merge_rooms":"Merge rooms","history.resize_room":"Resize room","history.wall_thickness":"Change wall thickness","history.add_opening":"Add door or window opening","history.edit_opening":"Edit opening","history.move_opening":"Move opening","history.delete_opening":"Delete opening","history.delete_room_keep_walls":"Delete room, keep walls","history.delete_room_with_walls":"Delete room and walls","history.decor_add":"Add decor object","history.decor_edit":"Edit decor object","history.decor_move":"Move decor object","history.decor_transform":"Transform decor object","history.decor_delete":"Delete decor object","history.backdrop_transform":"Transform plan backdrop","history.device_move":"Move {name}","history.device_stale":"Device position history is no longer applicable and was cleared","opening.new":"New opening","opening.edit":"Opening","opening.door":"Door","opening.window":"Window","opening.gate":"Gate","opening.passage":"Open passage","opening.passage_binding_warning":"Saving will remove the open/close sensor and lock.","opening.invalid_passage_fields":"The open passage on plan “{room}” has unsupported settings: {fields}.","opening.type_label":"Type","opening.length_label":"Length, cm","opening.contact_label":"Open/close sensor","opening.lock_label":"Lock","opening.none":"— none —","opening.search_ph":"Search: name or entity id…","opening.invert":"Invert open/closed","opening.flip_h":"Hinge on the other jamb","opening.flip_v":"Opens to the other side","opening.open":"Open","opening.closed":"Closed","opening.locked":"Locked","opening.unlocked":"Unlocked","opening.state_unknown":"unavailable","opening.no_entities":"No sensors bound — a static symbol on the plan.","toast.opening_no_wall":"Click next to a room wall or independent wall","opening.host_partition":"Independent wall","opening.partition_orphan":"The independent wall for this opening no longer exists","opening.partition_jamb_margin":"Leave at least {distance} between the opening and the end of the wall","opening.rebind_partition":"Attach to another independent wall","confirm.delete_partition_openings_title":"Delete wall and openings?","confirm.delete_partition_openings_body":"This wall contains {count} opening(s). They will be deleted together.","confirm.delete_partition_openings_item":"• {type}, {length}","markup.hint_points":"points: {n} · Shift — 45° steps · Esc — finish chain · Ctrl+Z — undo a point · closing an area offers a room","markup.hint_start":"click a grid dot to start a wall chain","tip.lqi":"average zigbee signal:","tip.area":"area: {value}","info.device_header":"Device on the plan","info.model":"Model","info.state":"State","info.link":"Link","info.manuals":"Manuals","info.none":"No additional information","marker.new_device":"New device","marker.name_label":"Name (shown on the plan)","marker.name_ph":"Name","marker.binding_label":"Bind to an HA device","marker.binding_disabled":"disabled in Home Assistant","marker.virtual_option":"Virtual device (no binding)","marker.search_ph":"Search device / group…","marker.nothing_found":"nothing found","marker.room_label":"Room","marker.room_override":" (override placement)","marker.room_choose":"— select a room —","marker.room_auto":"— by device area (auto) —","marker.icon_label":"Icon","marker.icon_ph":"mdi:… (empty = auto)","marker.display_label":"Display","display.badge":"Icon + state","display.icon_ripple":"Icon + state and activity","display.static_icon":"Always static icon","display.value_static_icon":"Value + static icon","marker.display_hint_badge":"The icon and dynamic plate show device state without the ordinary activity pulse. Red alarms remain visible.","marker.display_hint_icon_ripple":"The icon, dynamic plate and pulse show a short pulse for events and a continuous pulse for work, motion or presence. Red alarms have separate priority.","marker.display_hint_value":"A selected or automatically resolved Home Assistant value replaces the icon while the plate continues to show state. Red alarms remain visible.","marker.display_hint_static_icon":"The theme-aware shell and icon always stay the same. State, activity, unavailability and alarms do not change the face.","marker.display_hint_value_static_icon":"The marker shows the selected value while the shell stays theme-aware. State, activity, unavailability and alarms do not change the marker colour.","marker.static_alarm_warning":"This device can report alarms. Static display hides the marker's visual alarm indication.","marker.preview.title":"Display preview","marker.preview.actual":"Now","marker.preview.example":"Example","marker.preview.integration":"Provided by","marker.preview.source":"Display source","marker.preview.current_state":"Current state","marker.preview.result":"On the plan","marker.preview.details":"Source details","marker.preview.select_source":"Choose a Home Assistant device or entity to see its actual display.","marker.preview.unknown_provider":"Unknown integration","marker.preview.virtual_provider":"House Plan · virtual device","marker.preview.no_source":"No active source","marker.preview.no_state":"No current state","marker.preview.mixed_states":"Several different states","marker.preview.multiple_sources":"{n} sources","marker.preview.more_sources":"+{n} more","marker.preview.scaled":"The preview is scaled to {n}% to fit. The saved size is unchanged.","marker.preview.demo_short":"Show short activity","marker.preview.demo_continuous":"Show continuous activity","marker.preview.stop_continuous":"Stop continuous activity","marker.preview.demo_short_notice":"Short activity example; the actual device state is unchanged.","marker.preview.demo_continuous_notice":"Continuous activity example; the actual device state is unchanged.","marker.preview.demo_already_visible":"The current state already shows a real activity or alarm effect.","marker.preview.reduced_motion":"System reduced-motion is enabled, so ordinary activity is shown as a dot.","marker.preview.reason.neutral":"Neutral dark plate","marker.preview.reason.working":"Yellow plate: the device is working now","marker.preview.reason.working_activity":"Yellow plate and activity effect: the device is working now","marker.preview.reason.open":"Orange plate: physically open or unlocked","marker.preview.reason.cover_icon_state":"Neutral plate; the cover entity controls the displayed state and icon","marker.preview.reason.presence":"Activity effect while presence is detected","marker.preview.reason.event":"Short activity effect after a detected event","marker.preview.reason.transition":"Activity effect while the device is moving or changing state","marker.preview.reason.media_neutral":"Media devices stay on a neutral dark plate while available","marker.preview.reason.unavailable":"Subdued neutral plate: unavailable or off","marker.preview.reason.alarm":"Red alarm plate; alarm indication is always shown","marker.preview.reason.live_states_disabled":"Live-state styling is disabled for this card","marker.preview.reason.value_no_state":"No usable state value; the icon is shown instead","marker.preview.reason.value_ambiguous_sources":"Several possible value sources; the icon is shown instead","marker.preview.reason.value_non_scalar":"The source did not return a simple value; the icon is shown instead","marker.preview.reason.value_virtual":"A virtual device has no Home Assistant value; the icon is shown instead","marker.preview.reason.vacuum_live_plan_only":"Live vacuum position and trail are available only on the full plan","marker.preview.reason.hidden_design_preview":"The device is hidden on the plan; this design preview remains visible","marker.preview.reason.composite_power_source":"State comes from the device Power entity; auxiliary switches are ignored","marker.preview.reason.activity_display_disabled":"The selected display mode does not show ordinary activity effects","marker.preview.reason.ha_disabled":"The Home Assistant binding is disabled and will be hidden on the plan","marker.preview.reason.orphaned":"The saved Home Assistant binding can no longer be found","marker.preview.reason.static_icon":"Static mode: device state does not change the icon","marker.preview.reason.value_static_icon":"Static mode with a value: device state does not change the marker colour","marker.activity_color":"Activity pulse color","marker.ripple_size":"Activity pulse size","marker.activity_alarm_note":"Color and size affect ordinary activity only and do not change red alarms.","marker.pulse_a11y_alarm":"Alarm","marker.pulse_a11y_event":"Recent event","marker.pulse_a11y_presence":"Presence detected","marker.pulse_a11y_transition":"Changing state","marker.pulse_a11y_running":"Working","marker.state_a11y_neutral":"Default state","marker.state_a11y_working":"Working","marker.state_a11y_open":"Open","marker.state_a11y_locked":"Locked","marker.state_a11y_unlocked":"Unlocked","marker.state_a11y_alarm":"Alarm","marker.state_a11y_unavailable":"Unavailable","marker.lqi_a11y_low":"LQI {value}, low signal","marker.lqi_a11y_mid":"LQI {value}, medium signal","marker.lqi_a11y_high":"LQI {value}, high signal","marker.size_label":"Icon size / rotation","marker.angle_label":"Rotate","marker.model_label":"Model","marker.model_ph":"e.g. Aqara T&H","marker.link_label":"Link","marker.desc_label":"Description","marker.desc_ph":"Notes, specs…","marker.manuals_label":"Manuals (PDF etc.)","marker.sub_device":"device","marker.sub_z2m_group":" · Z2M group","marker.sub_group":"group","marker.sub_helper":"helper","space.new":"New space","space.copy_title":"Copy space","space.copy_name":"New space name","space.copy_fallback":"Space","space.copy_create":"Create copy","space.copy_optimize_title":"Optimize before copying?","space.copy_optimize_body":"Before creating “{name}”, House Plan must optimize the entire plan, including other spaces. Continue?","space.copy_optimize_confirm":"Optimize and copy","space.copy_error_changed":"The plan changed while confirmation was open. Review it and try again.","space.copy_error_source_missing":"The source space no longer exists. Reopen its settings and try again.","space.copy_error_source_invalid":"House Plan could not validate every wall in this space. Fix the source space and try again.","space.copy_error_spaces_limit":"House Plan already has the maximum number of spaces.","space.copy_error_partitions_limit":"This space has too many walls to copy.","space.copy_error_openings_limit":"This space has too many openings to copy.","space.copy_error_decor_limit":"This space has too many background objects to copy.","space.copy_error_columns_limit":"This space has too many columns to copy.","space.copy_error_opening_host":"One of the openings is no longer attached to a wall. Fix or delete it before copying.","space.copy_error_geometry":"The copy would create unsafe wall geometry. Fix the source space and try again.","space.copy_error_optimize_geometry":"Copy stopped because optimizing the entire plan is unsafe for one of the spaces.","space.header":"Space","space.title_label":"Title","space.title_ph":"e.g. Garage","space.plan_label":"Floor plan (background)","space.no_plan":"no plan image","space.plan_alt":"plan","room.new":"New room","room.name_label":"Display name","room.name_ph":"e.g. Terrace","room.area_label":"Home Assistant area (unassigned)","room.no_area_option":"— no area —","room.default_name":"Room","device.unnamed":"unnamed","device.light_group":"light group","device.fallback":"device","device.virtual":"virtual device","confirm.delete_room_title":'Delete room "{name}"?',"confirm.delete_room_body":"Choose whether the room's exclusive physical walls should remain. Walls shared with another room are always kept.","confirm.remove_marker_title":"Delete device from the plan?","confirm.remove_marker_body":"The device will disappear completely and stop contributing to plan data. You can add it again later.","confirm.erase_decor":"Erase the {kind} object? You can undo this action from the editor history.","confirm.delete_space_title":"Delete space?","confirm.delete_space_body":"The space, all its rooms and all its plan markup will be deleted.","confirm.delete_space_vac_routes":"Robot map assignments will also be removed: {count}.","space.delete_blocked":"This space is still used by {n} device(s). Move them to another space or delete them first.","toast.pos_save_failed":"Failed to save position: {err}","toast.no_entity":"The device has no suitable entity","toast.ha_disabled_action":"A Home Assistant object that is disabled cannot be used on the plan.","toast.ha_disabled_show_device":"A device disabled in Home Assistant cannot be shown on the plan. Enable it in Home Assistant first.","toast.ha_disabled_show_entity":"An entity disabled in Home Assistant cannot be shown on the plan. Enable it in Home Assistant first.","toast.ha_disabled_add":"A disabled Home Assistant object cannot be added to the plan. Enable it in Home Assistant first.","toast.ha_binding_unverified":"The object status could not be verified through the Home Assistant registry. Display and actions are temporarily unavailable.","toast.markup_needs_server":"Markup is available after the config is moved to the server","toast.space_order_changed":"Order changed. If any card pins its floor by number, check those panels.","toast.conflict":"Config was changed in another window — data refreshed, repeat your last action","toast.cfg_save_failed":"Failed to save config: {err}","toast.room_overlap":"The outline overlaps room “{name}” — rooms must not overlap","toast.contour_cannot_close":"The outline cannot close because it is degenerate or intersects itself","toast.merge_not_adjacent":"Only rooms that share a wall can be merged","toast.rooms_merged":"Rooms merged into “{name}”","toast.split_pick_wall":"Start the cut on the room’s wall","toast.split_bad_cut":"The cut must run wall to wall inside the room, without crossing walls or itself","merge.header":"Merge rooms","merge.hint":"The merged room keeps one name and one area. The other area is released — its devices leave the plan until another room claims it.","merge.keep":"Keep","merge.no_area":"no area","toast.room_saved":"Room saved ({n}). Devices added: {added}. Outline the next one or exit markup.","toast.room_saved_no_area":"Room saved ({n}, no area). Outline the next one or exit markup.","toast.marker_needs_server":"Device editing is available after the config is moved to the server","toast.virtual_name_required":"Enter a name for the virtual device","toast.marker_saved":"Device saved","toast.marker_removed":"Device deleted from the plan","toast.integration_missing":"The House Plan integration is not installed — management unavailable","toast.plan_formats":"Supported formats: SVG, PNG, JPG, WebP","toast.plan_required":"Upload a floor plan — it is required","toast.space_added_onboard":"Space added. Outline the rooms: click grid dots and close the contour.","toast.space_added":"Space added","toast.space_copied":"Space “{name}” created","toast.space_saved":"Space saved","toast.space_deleted":"Space deleted","toast.delete_failed":"Delete failed: {err}","toast.error":"Error: {err}","toast.toggle_target_unavailable":"Target “{name}” is unavailable — no action was performed","toast.toggle_targets_unavailable":"Targets are unavailable: {names}. No action was performed","toast.file_failed":'File "{name}" was not uploaded: {err}',"toast.files_attached":"Files attached: {n}","err.unknown":"unknown error","err.code":"code {code}","err.too_large":"file larger than {mb} MB","err.bad_ext":"unsupported type (PDF/image expected)","err.unauthorized":"administrator rights required","editor.title":"Title","editor.default_floor":"Initial space","editor.default_floor_missing":"Initial space “{id}” no longer exists. Choose another space.","editor.floor":"Fixed space","editor.floor_none":"— not fixed —","editor.floor_index":"YAML index {index} (preserved)","fixed_floor.loading":"Loading the fixed space…","fixed_floor.invalid_title":"The fixed space is unavailable","fixed_floor.invalid_body":"Check floor in the card configuration. The configured value is: {value}","editor.icon_size":"Icon size, % of plan width","editor.show_temperature":"Show temperature","editor.live_states":"Live states (on/off, open…)","editor.light_pools":"Light pools and wall shadows","editor.show_signal":"Show zigbee signal (LQI)","editor.language":"Interface language","editor.lang_auto":"Auto (HA profile)","title.icon_rules":"Icon rules: which MDI icon devices get by name","rules.title":"Icon rules","rules.hint":"Rules are checked top-down against “device name + model” (case-insensitive regex); the first match wins. When nothing matches, the entity device class decides, then the generic chip icon.","rules.pattern_ph":"regex, e.g. plug|socket","rules.icon_ph":"mdi:power-socket-de","rules.add":"Add rule","rules.reset":"Reset to defaults","rules.test_ph":"Try a device name…","rules.invalid":"invalid regex","rules.saved":"Icon rules saved","btn.up":"Up","btn.down":"Down","tap.info":"Device card","tap.more_info":"HA more-info dialog","tap.toggle":"Toggle state","marker.tap_label":"Tap action for this device","tap.toggle_note":"The resolved state is shown below. Secure devices are never toggled from the plan.","import.title":"Create spaces from HA floors","import.hint":"Your Home Assistant already knows these floors. Pick the ones to turn into plan spaces — you will upload a floor-plan image for each one next. Rooms are then outlined by hand on the plan.","import.start":"Create {n} space(s)","import.manual":"Start from scratch","import.progress":"Floor {i} of {n}","import.done":"Spaces created. Outline the rooms: click grid dots and close the contour.","btn.skip":"Skip","space.scale_label":"Scale (grid cell size)","space.cell_cm.help":"Links the grid to real dimensions: lengths, areas, wall thickness, opening sizes and glow radius depend on it. Changing it after drawing changes the calculated dimensions of the whole space without moving its points on the plan.","space.cell_cm.help.aria":"Help: space scale","space.scale_unit":"cm per cell","space.scale_unit_imperial":"in per cell","space.display_section":"Display","space.show_borders":"Always show room borders","space.zero_wall_style":"Zero-thickness walls","space.zero_wall_style.help":"Dashed zero-thickness walls pass Glow and sun rays, while solid ones block them as zero-area barriers. The choice affects every such wall in the space even when its line is hidden in View.","space.zero_wall_style.help.aria":"Help: zero-thickness wall style","space.zero_wall_dashed":"Dashed","space.zero_wall_solid":"Solid","space.show_names":"Show room names (drag to move)","space.room_color":"Border & name color","space.opacity":"Opacity","space.fill_label":"Room fill","space.fill_mode.help":"“Custom colour” is styling, while “Light”, “Temperature” and “LQI” use current Home Assistant data; Glow is enabled separately.","space.fill_mode.help.aria":"Help: room fill mode","fill.none":"None","fill.lqi":"Zigbee signal","fill.light":"Lights","fill.custom":"Custom color","space.custom_fill":"Fill color","space.source_file":"I have a floor-plan image","space.source_draw":"No image — I'll outline rooms by hand","fill.temp":"Temperature","tip.temp_avg":"average temperature:","tip.hum_avg":"average humidity:","space_card.button":"Open the space plan","space_card.not_found":"Space “{id}” not found","space_card.loading":"Loading…","continuity.restore_plan":"Restoring floor plan…","continuity.restore_connection":"Restoring device connection…","continuity.retry":"Try again","editor.space":"Space","editor.framing":"Framing","editor.fit_content":"All visible content","editor.fit_house":"Tight to house geometry","editor.show_button":"Show button","editor.button_label":"Button label","editor.button_target":"Target dashboard path","marker.sub_entity":"entity","title.general_settings":"General settings","title.export_pdf":"Save as PDF","pdf.title":"Save as PDF","pdf.dimensions":"Show dimensions and areas","pdf.decor":"Show furniture and other decor","pdf.room_names":"Show room names","pdf.backdrop":"Show backdrop","pdf.save":"Save","pdf.saving":"Creating…","pdf.failed":"Could not create the PDF.","pdf.too_large":"The images exceed the 25 MB PDF limit.","pdf.asset_failed":"A backdrop or decor image could not be loaded.","pdf.scale":"Scale 1:{n}","pdf.north":"North","gs.title":"General settings","gs.light_group":"Fill: lights","gs.light_on":"Lights on","gs.light_off":"All lights off","gs.temp_group":"Fill: temperature","gs.temp_cold":"Cold","gs.temp_ok":"Comfortable","gs.temp_hot":"Hot","gs.lqi_group":"Fill: zigbee signal","gs.lqi_low":"Weak signal","gs.lqi_high":"Strong signal","gs.reset":"Reset to defaults","gs.saved":"General settings saved","gs.radar_show_live":"Show live presence on the plan","gs.radar_show_live_hint":"Hides or shows all live radar targets. This does not start or stop observation recording.","radar.title":"Presence on the plan","radar.help":"Connect this marker to exact Home Assistant radar entities, place the sensor and choose its coordinate profile. Live positions are clipped to the selected room.","radar.help.aria":"Help: presence radar settings","radar.enabled":"Use this presence radar","radar.show_live":"Show live targets","radar.configure":"Configure radar","radar.configure_on_plan":"Configure on plan","radar.change_installation":"Change installation","radar.no_contour":"This room has no boundary. Radar points will not be clipped.","radar.discard_setup_title":"Discard radar setup?","radar.discard_setup":"The unsaved radar setup will be lost.","radar.step_place_mount":"Mark the physical sensor position","radar.step_place_heading":"Mark a point straight ahead of the sensor","radar.step_reference":"Mark reference position {n}, then start measurement","radar.step_check_reference":"Mark an independent check position","radar.start_measure":"Start measurement","radar.countdown":"Stand at the mark in {seconds} s","radar.capturing":"Stand still and alone while measuring…","radar.fit_ready":"Calibration is ready","radar.check_third":"Check at another position","radar.check_complete":"Independent check completed","radar.error_distance":"Position difference: {distance}","radar.ambiguous_target":"More than one target was reported. Repeat the measurement alone.","radar.insufficient_samples":"Not enough current coordinates. Retry or use manual setup.","radar.bad_references":"Choose separated references in different directions from the sensor.","radar.ambiguous_sources":"The measurements allow two equally plausible directions. Choose reference points that distinguish left from right.","radar.bad_fit":"Measurements do not match. Check units, mounting point and references.","radar.desktop_hint":"Use a computer for precise setup. Editing on touch devices is best effort.","radar.detected":"House Plan recognized radar metadata for this device. Review the exact sources before saving.","radar.detected_ld2450":"House Plan found an ESPHome LD2450 coordinate set. Review the exact X/Y sources before saving.","radar.additional_actions":"Additional actions","radar.declare":"This is a presence radar","radar.profile":"Data profile","radar.profile_esphome_ld2450_v1":"ESPHome LD2450 (X/Y targets)","radar.profile_cartesian_v1":"Cartesian targets (X/Y)","radar.profile_polar_v1":"Polar target (distance/angle)","radar.profile_range_v1":"Distance only","radar.profile_zones_v1":"Zone states","radar.profile_presence_v1":"Presence only","radar.room":"Radar room","radar.room_choose":"Choose a room","radar.target":"Target {n}","radar.axis_x":"X coordinate entity","radar.axis_y":"Y coordinate entity","radar.add_target":"Add target slot","radar.range_channel":"Range channel {n}","radar.add_range":"Add range channel","radar.presence_gate":"Presence gate entity","radar.swap_axes":"Swap X and Y axes","radar.axis_x_sign":"X direction","radar.axis_y_sign":"Y direction","radar.distance_source":"Distance entity","radar.angle_source":"Angle entity","radar.angle_unit":"Angle unit","radar.degrees":"Degrees","radar.radians":"Radians","radar.angle_zero":"Zero-angle direction","radar.angle_forward":"Forward","radar.angle_right":"Right","radar.angle_clockwise":"Angles increase clockwise","radar.zone_source":"Zone entity","radar.occupancy_source":"Presence entity","radar.count_source":"Target count entity","radar.availability_source":"Availability entity","radar.source_choose":"Choose an entity","radar.source_optional":"Optional","radar.source_missing":"currently unavailable","radar.saved_unsupported":"This saved radar setup is unsupported or incomplete. It remains inactive; remove it or update House Plan before configuring it again.","radar.occupancy":"Presence (on/off)","radar.count":"Count","radar.mount":"Position and direction","radar.mount_hint":"This is the physical sensor position. Moving its decorative marker does not change it.","radar.heading":"Direction, °","radar.range_cm":"Range, cm","radar.fov_deg":"Field of view, °","radar.unit":"Source unit","radar.mirror":"Mirror the left/right axis","radar.remove":"Remove radar settings","radar.invalid":"Complete the radar room, sources and position before saving.","radar.check_sources":"Check live data","radar.checking":"Checking…","radar.health":"Connection status","radar.live_summary":"Current targets: {targets}; range arcs: {ranges}","radar.health_ok":"Current data received","radar.health_off":"No targets detected","radar.health_stale":"Some coordinate data is out of date","radar.health_partial":"Some sources are current; others are out of date","radar.health_restricted":"Access to one or more sources is restricted","radar.health_incomplete":"The current radar report is incomplete","radar.health_position_unavailable":"Presence reported; current position unavailable","radar.health_unavailable":"Sensor data unavailable","radar.health_needs_setup":"Installation needs setup","radar.health_inconsistent":"The sources report conflicting values","radar.health_unknown":"Current state is unknown","radar.health_disabled":"Radar is disabled","radar.error_invalid_radar":"Check the radar settings.","radar.error_invalid_selection":"Select an existing room and valid sources.","radar.error_source_restricted":"You do not have access to all selected sources.","radar.error_rate_limited":"Too many requests. Try again shortly.","radar.error_not_ready":"Radar processing is not ready.","radar.error_conflict":"The plan changed. Reopen the radar setup and try again.","radar.error_source_unavailable":"One or more selected radar sources are unavailable.","radar.error_unsupported_capability":"This radar capability is not supported by the installed integration.","radar.report_age":"{seconds} s ago","space.show_lqi":"Show zigbee signal (LQI) next to devices","space.hide_decor":"Hide the decorative layer","space.hide_decor_tip":"Lines, shapes, labels and furniture stay where they are — visible in the backdrop editor, not on the plan.","space.hide_openings":"Hide openings","space.hide_openings_tip":"Door, window and gate symbols are not drawn, but the openings keep working: light passes through, the sun comes in at a window, contact sensors still open them. The plan editor always shows them.","gs.light_none":"No light sources","mode.plan":"Plan editor","mode.devices":"Device editor","display.value":"Value + state","marker.subarea":"no area, manual","device.new":"New device — open its editor to dismiss","opening.unlock_action":"Unlock","opening.lock_action":"Lock","opening.lock_pending":"Working…","title.close_editor":"Close editor (back to view)","title.add_device":"Add a device to the plan","devbar.add":"Add","devbar.rules":"Icon rules","device_inbox.button":"Devices","device_inbox.title":"Devices on the plan","device_inbox.search":"Search devices, entities and integrations…","device_inbox.add_virtual":"Add virtual device","device_inbox.tab_on_plan":"On plan","device_inbox.tab_available":"Available","device_inbox.tab_hidden":"Hidden","device_inbox.tab_readd":"Available again","device_inbox.only_new":"New only","device_inbox.show_entities":"Show entities","device_inbox.show_hidden":"Show hidden on plan","device_inbox.show_hidden.help":"Temporarily shows hidden and disabled markers as editor-only ghosts on the plan. Saved device visibility does not change.","device_inbox.show_hidden.help.aria":"Help: show hidden devices on the plan","device_inbox.new":"New","device_inbox.find":"Find on plan","device_inbox.edit":"Edit","device_inbox.hide":"Hide","device_inbox.show":"Show","device_inbox.add":"Add","device_inbox.readd":"Add again","device_inbox.hide_available":"Hide from list","device_inbox.show_more":"Show more","device_inbox.more_actions":"More actions","device_inbox.find_hidden_hint":"Enable “Show hidden on plan” first","device_inbox.show_disabled":"Activate this binding in Home Assistant before showing it","device_inbox.empty_on_plan":"No matching devices are on the plan yet.","device_inbox.empty_available":"No devices are available to add.","device_inbox.empty_hidden":"There are no hidden devices.","device_inbox.empty_readd":"No removed devices are available to add again.","device_inbox.reason_visible_auto":"Discovered automatically","device_inbox.reason_visible_explicit":"Added explicitly","device_inbox.reason_manual_hidden":"Hidden by user","device_inbox.reason_automatic_hidden":"Hidden automatically","device_inbox.reason_service_entry":"Service-only registry entry","device_inbox.reason_excluded_integration":"Integration “{integration}” excluded by discovery filters","device_inbox.reason_excluded_domain":"Non-spatial entity type","device_inbox.reason_grouped_light":"Represented by a room light group","device_inbox.reason_represented_by_parent":"Represented by its parent device","device_inbox.reason_removed":"Previously removed from the plan","device_inbox.reason_available":"Available to add to the plan","device_inbox.reason_no_bound_room":"HA area is not linked to a plan room","device_inbox.status_ha_disabled":"Disabled in Home Assistant","device_inbox.status_orphaned":"Binding is no longer present in Home Assistant","device_inbox.status_unverified":"Home Assistant registry is temporarily unavailable","device_inbox.saved":"Device list updated","device_inbox.filters_excluded":"Excluded integrations","device_inbox.filters_group_lights":"Group room lights into one marker","device_inbox.filters_preview_appear":"will appear: {count}","device_inbox.filters_preview_hide":"will disappear: {count}","device_inbox.filters_preview_lights":"lights affected: {count}","device_inbox.filters_reset":"Restore recommended","device_inbox.filters_save":"Save filters","device_inbox.filters_search_ph":"Add an integration…","device_inbox.filters_title":"Discovery filters","space.roomcard_section":"Room card shows:","space.label_temp":"Temperature","space.label_hum":"Humidity","space.label_lqi":"Average Zigbee signal","space.label_light":"Lights on/off","roomcard.light_on":"On","roomcard.light_off":"Off","roomcard.light_partial":"{on} of {total}","toast.split_pick_inside":"Intermediate cut points must be inside the room","mode.decor":"Background editor","decor.select":"Select","decor.line":"Line","decor.rect":"Rectangle","decor.ellipse":"Oval","decor.text":"Text","decor.erase":"Erase","decor.erase_confirm_title":"Erase object?","decor.color":"Color","decor.width":"Line width","decor.line_style":"Line style","decor.line_style_solid":"Solid","decor.line_style_dashed":"Dashed","decor.fill":"Fill","decor.fill_color":"Fill color","decor.length":"Length","decor.size":"Size","decor.flip_h":"Flip horizontally","decor.flip_v":"Flip vertically","decor.angle":"Rotation angle, °","decor.text_size":"Text size","decor.backdrop_properties":"Plan backdrop properties","decor.text_title":"Text label","decor.object_title":"Edit {kind}","decor.text_label":"Text","decor.live_group":"Insert HA variable","decor.live_entity":"Entity","decor.live_entity_ph":"choose an entity","decor.live_attr":"Value","decor.live_attr_ph":"choose state or attribute","decor.live_state":"State","decor.backdrop":"Backdrop image","decor.backdrop_hint":"Drag to move; pull a corner to resize; use the top handle to rotate. Shift changes proportions or frees the angle.","decor.backdrop_reset":"Reset the picture","decor.backdrop_reset_done":"The picture is back at its original place and size","marker.icon_auto":"Auto: {icon} (by icon rules; pick one to override)","marker.icon_pin_auto":"Pin","mode.plan_tip":"Plan editor — the geometry of the home: draw and split/merge rooms, bind them to HA areas, place doors, windows and gates, move room cards, set the scale","mode.devices_tip":"Device editor — everything about icons: drag to position, click to edit binding/icon/display, add virtual devices, icon rules","mode.decor_tip":"Background editor — purely visual decor under the plan: lines, rectangles, ovals and text labels that never react to clicks","space.glow_enabled":"Light-source glow","gs.glow_group":"Light-source glow","gs.glow_base":"House darkness","gs.glow_light":"Default light color / intensity","gs.wall_group":"Walls","gs.wall_fill":"Wall fill","gs.glow_radius":"Glow radius","gs.glow_radius.help":"Sets the default glow radius in metres or feet; a device-specific radius overrides it.","gs.glow_radius.help.aria":"Help: default glow radius","gs.unit_m":"m","gs.unit_ft":"ft","marker.controls_label":"Controls other light sources","marker.controls.help":"With the “Toggle state” action, the listed sources toggle together with this marker. Their glow stays at their own markers, and the link alone does not turn the controlling marker into a light source.","marker.controls.help.aria":"Help: controlling other light sources","marker.controls_filter":"Search lights and switches…","info.controls":"Controls","marker.glow_radius_label":"Glow radius","marker.glow_radius.help":"Sets the glow radius in metres or feet; an empty value uses the radius from general settings.","marker.glow_radius.help.aria":"Help: glow radius","markup.wallthick":"Thickness","markup.select":"Select","title.markup_wallthick":"Thickness — click a wall to set its thickness from 0 to 100 cm.","markup.hint_wallthick":"click a wall · Esc closes without applying","wallthick.field":"Thickness","wallthick.unit_cm":"cm","wallthick.unit_in":"in","wallthick.apply_room":"Apply to all walls of this room","markup.draw_wall_title":"Thickness of each new wall segment (0–100 cm). Shared walls keep the existing value.","room.queue_progress":"Room {current} of {total}","toast.wall_rooms_saved":"Created rooms: {n}","toast.wall_chain_saved":"Wall chain saved","toast.wallthick_pick":"Click a wall","toast.wallthick_set":"Wall thickness set","toast.wallthick_cleared":"Wall thickness removed","toast.physical_range":"Enter a value from {min} to {max} {unit}","toast.zero_wall_opening_conflict":"Remove the opening on this wall segment first.","toast.zero_wall_ambiguous":"The wall segment is ambiguous. Simplify or adjust the junction.","toast.zero_wall_migration_blocked":"The space was not converted: {reason}. No data was changed.","toast.physical_angle":"Enter a rotation angle from 0° up to, but not including, 90°","toast.physical_limit":"The space has reached the limit for this type of geometry","toast.geometry_unsafe":"Change canceled: wall geometry could not be built safely.","junction.limit_angle":"The angle between walls is too sharp: {actual}°, minimum {limit}°.","junction.limit_valence":"Too many walls meet in one node: {actual}, maximum {limit}.","junction.limit_length":"The wall segment is too short: {actual} cm, minimum {limit} cm.","junction.limit_distance":"Walls and nodes are too close: {actual} cm, minimum {limit} cm.","junction.limit_clearance":"No room interior is left: {actual} cm², minimum {limit} cm².","junction.limit_check_failed":"The junction check could not run — the change was not saved","toast.wall_model_migration_blocked":"The wall model could not be updated: {reason}. The plan was not changed. Run “Optimize plans”; if the error repeats, fix the conflicting wall geometry.","toast.wall_model_client_outdated":"Update the card and reload the page before editing the plan.","wall_model.reason.invalid-room":"invalid room contour","wall_model.reason.zero-length":"zero-length wall segment","wall_model.reason.third-owner":"wall shared by more than two rooms","wall_model.reason.duplicate-id":"conflicting wall identifiers","wall_model.reason.thickness-conflict":"conflicting wall thickness values","wall_model.reason.opening-host":"opening cannot be assigned to one wall","toast.delete_room_pick":"Click inside the room you want to delete","toast.plan_snap_ambiguous":"Zoom in to choose the wall node","toast.wall_repair_ambiguous":"The room outline has more than one possible connection. Zoom in and connect it explicitly.","toast.wall_repair_too_large":"The gap is larger than 2 cm. Connect the walls before creating the room.","toast.wall_repair_changed":"The wall geometry changed. Try creating the room again.","toast.opening_on_zero_wall":"Openings cannot sit on a zero-thickness wall","marker.from_ha_option":"Pick from the HA list","marker.show_entities":"Show entities","marker.show_entities_tip":"Adds not only devices to the list, but all their entities too","marker.pick_ph":"Choose a device…","room.open_area":"Open the HA area","room.fit_action":"Fit room {name}","view.volumetric":"Volumetric view","view.flat":"Flat view","kiosk.title":"This screen's sizes","kiosk.hint":"Stored on this device only — every wall tablet or TV can have its own comfortable sizes.","kiosk.icon_scale":"Device icon size","kiosk.font_scale":"Room card text size","editor.kiosk":"Wall device (kiosk) mode","editor.cycle":"Auto-switch spaces every N seconds (kiosk, 0 = off)","room.settings_title":"Room settings","room.settings_section":"Room settings (override the space)","room.fill_label":"Fill in THIS room","fill.inherit":"As the space","room.custom_fill_space":"Space color","room.custom_fill_own":"Room color","room.temp_range_label":"Comfort range","room.temp_range_min":"Lower comfort-temperature bound","room.temp_range_max":"Upper comfort-temperature bound","room.temp_range_reset":"As the space","room.temp_range.help":"This range applies only to this room. Empty fields inherit the corresponding space bounds; if the bounds are reversed, House Plan uses the smaller value as the lower bound and the larger value as the upper bound.","room.temp_range.help.aria":"About the room comfort range","room.temp_src_label":"Temperature source","room.hum_src_label":"Humidity source","room.src_average":"Average over the room's sensors (default)","room.src_pick":"A specific HA device or entity","room.src_ph":"Choose a source…","toast.room_updated":"Room updated","space.card_font":"Room-card font size (whole space)","room.sizes_section":"Font sizes","room.name_scale":"Room name size","room.label_scale":"Metrics size","preview.room_name":"Living room","toast.cfg_reload_failed":"Could not reload the plan from the server: {err}","toast.locale_load_failed":"Could not load the language pack. English is used until the page reloads.","toast.furniture_art_load_failed":"Could not load the furniture drawings. Reload the page to show them.","room.settings_short":"Room settings","room.unnamed":"Unnamed room","marker.use_climate_temp":"Include the device temperature in the room","marker.use_climate_temp_tip":"Adds an air conditioner or thermostat current_temperature to the room average. Configure the external value badge separately below.","marker.value_badge_title":"Value badge","marker.value_badge.help":"Shows one selected value next to the icon. It does not affect room metrics, light, Glow or the tap action.","marker.value_badge.help.aria":"Help: device value badge","marker.value_badge_enabled":"Show a value badge","marker.value_badge_source":"Value","marker.value_badge_source.help":"Choose a specific state, supported attribute, or derived value of this device.","marker.value_badge_source.help.aria":"Help: value badge source","marker.value_badge_position":"Position","marker.value_badge_position.help":"The chosen side stays fixed and does not flip automatically at a plan edge.","marker.value_badge_position.help.aria":"Help: value badge position","marker.value_badge_right":"Right","marker.value_badge_bottom":"Below","marker.value_badge_left":"Left","marker.value_badge_top":"Above","marker.value_badge_empty":"This device has no available values","marker.value_badge_static":"A static icon does not show live values. The setting is preserved.","marker.value_badge_missing":"Source unavailable","marker.value_badge_missing_hint":"The saved source is currently unavailable. Keep it, disable the badge, or choose another value.","marker.value_badge_duplicate":"The same value is already shown inside the icon.","marker.value_badge_state":"State · {name}","marker.value_badge_marker_state":"Light-source state · {name}","marker.value_badge_lqi":"Average Zigbee signal quality","marker.value_badge_attr_current_temperature":"Current temperature · {name}","marker.value_badge_attr_temperature":"Target temperature · {name}","marker.value_badge_attr_current_humidity":"Current humidity · {name}","marker.value_badge_attr_humidity":"Humidity · {name}","marker.value_badge_attr_current_position":"Position · {name}","marker.value_badge_attr_percentage":"Speed · {name}","marker.value_badge_attr_brightness":"Brightness · {name}","marker.value_badge_attr_volume_level":"Volume · {name}","marker.value_badge_attr_battery_level":"Battery · {name}","marker.value_badge_attr_fan_speed":"Fan speed · {name}","marker.value_source":"Value source","marker.value_source.help":"Choose the value that replaces the icon. The tap action does not change.","marker.value_source.help.aria":"Help: value face source","marker.value_source_auto":"Automatic (as before)","marker.value_source_missing_hint":"The saved source is currently unavailable. The face shows — until it recovers or you choose another value.","marker.light_role_label":"Is this device a light source?","marker.light_role.help":"“Auto” uses the bound device's resolved role, “Always” forces its own source and “Never” excludes it; linked lights above remain independent.","marker.light_role.help.aria":"Help: whether this device is a light source","marker.light_role_auto_yes":"Auto (light source)","marker.light_role_auto_no":"Auto (not a light source)","marker.light_role_always":"Always a light source","marker.light_role_never":"Never a light source","marker.light_entity_label":"Leading light entity","marker.light_entity.help":"For a composite device, choose the entity whose state, colour and brightness represent this plan source. The automatic fallback remains compatible with older plans.","marker.light_entity.help.aria":"Help: leading light entity","marker.light_entity_auto":"Automatic ({entity})","marker.light_entity_none":"no controllable entity","marker.light_entity_missing":"The saved entity {entity} is unavailable. House Plan temporarily uses {fallback}; the saved choice will be restored if it returns.","marker.toggle_entity_label":"Entity to toggle","marker.toggle_entity.help":"For a composite device, choose the exact own light or switch operated by a tap. Automatic keeps the previous target rules and is independent from the leading light entity.","marker.toggle_entity.help.aria":"Help: entity to toggle","marker.toggle_entity_auto":"Automatic ({entity})","marker.toggle_entity_none":"no own controllable entity","marker.toggle_entity_missing":"The saved entity {entity} is no longer among this marker’s selectable channels. House Plan temporarily uses {fallback}; the saved choice will be restored if it returns.","marker.glow_color_label":"Glow colour and brightness","marker.glow_mode.help":"Use live source values, override only its colour, or fix both colour and brightness. The minimum is 1%; to disable the source, choose “Never”.","marker.glow_mode.help.aria":"Help: glow colour and brightness","marker.glow_mode_auto":"From source","marker.glow_mode_color":"Set colour","marker.glow_mode_fixed":"Set colour and brightness","marker.glow_color":"Glow colour","marker.glow_brightness":"Brightness","marker.glow_disabled_never":"Glow settings are unavailable because this marker is explicitly not a light source.","marker.glow_disabled_auto":"Auto mode found no spatial light source for this marker.","marker.glow_disabled_no_entity":"No active controllable Home Assistant entity is available for this spatial source.","marker.glow_passive_hint":"This source has no own Home Assistant data. Set its colour and brightness manually; its radius remains available.","marker.control_broken":"Saved source is missing or no longer marked as a light","marker.control_missing_label":"Missing plan light","marker.control_passive":"passive source","toast.marker_control_cycle":"This link would create a circular chain of light controls.","toast.marker_binding_required":"Choose a Home Assistant device before linking another light source.","confirm.unlock_title":"Unlock?","confirm.unlock_body":"House Plan will send an unlock command to this lock.","toast.files_migrate_failed":"Attachments could not be moved to the new binding, links keep pointing at the old files: {err}","space.pick_saved":"Already uploaded","space.pick_saved_hint":"Plans stored on the server, including ones you detached earlier","space.no_saved":"No plans stored on the server yet.","space.loading":"Loading…","space.used_by":"in use: {list}","space.in_use":"A space still uses this plan — detach it first","btn.use":"Use","confirm.delete_plan_title":"Delete plan file?","confirm.delete_plan_body":"The file will be deleted from the server. This action cannot be undone.","toast.plans_list_failed":"Could not list the stored plans: {err}","toast.plan_delete_failed":"Could not delete the plan: {err}","marker.hide":"Hide","marker.hide_tip":'The device will disappear from the plan after saving but will still count toward the room signal. Restore it through the "Devices" catalog in the device editor.',"marker.show":"Show","marker.show_tip":"The device will appear on the plan again after saving.","marker.hidden_ghost":"Device hidden by the user","marker.ha_disabled_device":"The device is disabled in Home Assistant and hidden from the plan.","marker.ha_disabled_entity":"The entity is disabled in Home Assistant and hidden from the plan.","marker.ha_disabled_all_entities":"The device has no active Home Assistant entities, so it is hidden from the plan.","marker.ha_registry_limited":"The full Home Assistant registry is unavailable to this user. The unverified object cannot be shown or used for now.","marker.delete_tip":"Completely delete the device from the plan and every aggregate. You can add it again later.","tap.run":"Run automation/script/scene","tap.none":"Do nothing","marker.run_target_label":"What to run","marker.run_search_ph":"Search: automation, script or scene…","marker.run_target_gone":"Target {id} not found — pick again","marker.tap_confirm":"Ask for confirmation","marker.tap_confirm_tip":"Show a confirmation dialog before acting — a guard against accidental taps.","marker.toggle_hint_single":"Target: {name} ({id}).","marker.virtual_light_target":"Virtual light: {name}.","marker.virtual_light_current":"Manual state: {state} → {effect}.","marker.virtual_light_state_on":"on","marker.virtual_light_state_off":"off","marker.toggle_hint_group":"Will toggle {count} source(s): {names}.","marker.toggle_hint_current":"Now: {state} → {effect}.","marker.toggle_hint_group_current":"Currently on: {on} of {count} → {effect}.","marker.toggle_hint_skipped":"Will be skipped ({count}): {targets}.","marker.toggle_effect_turn_on":"will turn on","marker.toggle_effect_turn_off":"will turn off","marker.toggle_effect_open":"will open","marker.toggle_effect_close":"will close","marker.toggle_effect_stop":"will stop","marker.toggle_effect_toggle":"state will toggle","marker.toggle_skip_missing":"not found","marker.toggle_skip_ha_disabled":"disabled in HA","marker.toggle_skip_unavailable":"unavailable","marker.toggle_skip_unsupported":"toggle is unsupported","marker.toggle_skip_secure":"blocked for security","marker.toggle_none_no_binding":"This device has no binding, so there is no state to toggle. Tapping will do nothing.","marker.toggle_none_no_actionable_entity":"This device has no state that can be toggled. Tapping will do nothing.","marker.toggle_none_configured_targets_missing":"The configured targets are unavailable. The device's own entity will not be substituted for them.","marker.toggle_none_ha_disabled":"The target is disabled in Home Assistant and cannot be used on the plan.","marker.toggle_none_unavailable":"The target is currently unavailable. Tapping will do nothing.","marker.toggle_none_unsupported":"Home Assistant exposes no safe toggle operation for this entity. Tapping will do nothing.","marker.toggle_none_secure":"Toggling locks, alarms and secure gates from the plan is blocked for security.","run.automation":"automation","run.script":"script","run.scene":"scene","confirm.tap_run":'Run "{name}"?',"confirm.tap_toggle":'Toggle "{name}"?',"confirm.current_state":"Current state: {state}","confirm.expected_state":"After switching: {state}","confirm.group_current":"on {on} of {total}","confirm.group_all_on":"all are on","confirm.group_all_off":"all are off","confirm.unavailable_targets":"Unavailable: {count}","confirm.expected_by_ha":"Home Assistant will determine the state","confirm.state_on":"On","confirm.state_off":"Off","confirm.state_open":"Open","confirm.state_closed":"Closed","confirm.state_opening":"Opening","confirm.state_closing":"Closing","confirm.state_stopped":"Stopped","confirm.state_unknown":"Unknown","toast.run_started":"Started: {name}","toast.run_target_missing":"Run target not found — check the device settings","toast.run_target_required":"Pick an automation, script or scene","toast.tap_target_changed":"The action target changed. Try again.","toast.virtual_light_toggle_failed":"Could not toggle the virtual light: {err}","toast.value_badge_source_required":"Choose a value for the badge","btn.run":"Run","vac.section":"Robot vacuum: live position","vac.autocal":"Set up automatically","vac.live":"Live position on the plan","vac.trail":"Show the robot's path","vac.autocal_no_rooms":"The integration reports no room list — open “Fit manually”","vac.route_warn_unmapped":"The robot is cleaning a map that is not assigned to any floor","vac.route_warn_needs_calibration":"The map is assigned to a floor but not calibrated","vac.route_warn_ambiguous":"Two maps are indistinguishable — no floor was chosen","vac.route_warn_missing_space":"The space of this map was deleted","vac.autocal_no_match":"Room names did not match (need ≥3 in common) — open “Fit manually”","vac.autocal_done":"Done: bound via {rooms} rooms. Start a cleanup and check","vac.cal_need_pos":"The robot is not reporting coordinates — start a cleanup and pause it","vac.cal_done":"Calibration saved. Start a cleanup and check","vac.cal_cancelled":"Calibration cancelled","vac.fit":"Fit manually","vac.fit_hint":"Drag the robot map into place, stretch by the corners","vac.fit_rotate":"Rotate 90°","vac.fit_mirror":"Mirror","vac.trail_never":"Never","vac.trail_cleaning":"While cleaning","vac.trail_always":"Always","gs.bg_group":"Stage background","gs.bg_color":"Background around the plan","gs.bg_default":"Theme default","gs.bg_theme":"theme default","gs.bg_mode":"Plan background","gs.bg_mode.help":"“Follows the Sun” uses sun.sun, falling back to the browser's local clock; Static always shows the selected colour.","gs.bg_mode.help.aria":"Help: general plan background","gs.bg_static":"Static color","gs.bg_daynight":"Follows the Sun","gs.sun_group":"Sun","gs.sun_missing":"The sun.sun entity was not found — the background follows your local clock; window rays are unavailable.","gs.north":"North on the plan","gs.north.help":"The angle is measured clockwise from the plan's upward vertical; north is required for window rays, not for the “Follows the Sun” background.","gs.north.help.aria":"Help: general north direction","gs.north_ph":"not set","gs.north_clear":"Clear","gs.north_letter":"N","gs.sun_rays":"Sunlight through windows","gs.sun_ray_origin":"Sun rays","gs.sun_ray_origin.inner":"From the inner window corners","gs.sun_ray_origin.outer":"From the outer window corners","gs.about_version":"Houseplan Card v{v}","gs.about_github":"GitHub · docs & issues","gs.about_telegram":"Telegram chat","support.title":"Help & feedback","space.bg_color":"Background around the plan","space.bg_inherit":"Inherit general","space.bg_inherited":"inherits general settings","space.bg_mode":"Plan background","space.bg_mode.help":"Inherit the general background or override this space with a static colour or “Follows the Sun”.","space.bg_mode.help.aria":"Help: space background","space.north":"North on the plan (override)","space.north.help":"Overrides general north for this space; the angle is measured clockwise from the plan's upward vertical and is used by window rays.","space.north.help.aria":"Help: north for this space","space.north_inherited":"inherited: {v}","space.sun_rays":"Sunlight through windows","space.sun_inherit":"Inherit general","space.sun_on":"On","space.sun_off":"Off","canvas.far_objects":"{n} object(s) far from the plan","canvas.show_far":"Show","canvas.home_tip":"The plan is over there — click to fit it","gs.grid_group":"Plan maintenance","gs.grid_hint":"Updates data models, aligns plan elements to the grid and merges redundant wall fragments. An exact report is shown before anything is stored.","gs.align_all":"Optimize plans","gs.align_title":"Optimize plans","gs.align_none":"All plans already use the current optimized data model.","gs.optimize_no_automatic_changes":"There are no automatic changes to apply. Review the items below.","gs.align_count":"{n} of {total} elements will move, by at most {cm} cm.","gs.align_where":"The largest shift is in “{s}”.","gs.align_turned":"Openings whose angle is corrected: {n}.","gs.align_preflight_failed":"Could not safely verify the geometry of the following spaces: {spaces}{more}.","gs.align_preflight_hint":"Plans were not changed. Copy the diagnostics with the button below and attach them to the bug report together with a space export.","gs.preflight_reason_prepare-exception":"Could not prepare the space geometry (exception while building the model)","gs.preflight_reason_wall-null":"The wall body did not build (the union came back empty)","gs.preflight_reason_wall-degraded-extra":"The wall body degraded with extra geometry","gs.preflight_reason_wall-failed-core":"The wall body core failed to assemble","gs.preflight_reason_wall-exception":"Wall construction threw an exception","gs.preflight_reason_floor-null":"The floor outline did not build","gs.preflight_reason_floor-exception":"Floor construction threw an exception","gs.preflight_copy":"Copy diagnostics","gs.preflight_copied":"Diagnostics copied","gs.preflight_update_hint":"The card and integration versions differ — update House Plan and retry.","gs.align_preflight_space":"Space {n}","gs.align_preflight_more":", and {n} more","gs.optimize_changes":"Model migrations: {m}; spaces updated: {c}; noisy coordinate values removed: {p}; merged real-wall fragments: {w}; merged zero-thickness wall fragments: {s}; independent walls: {i}.","gs.zero_walls_migrated":"Virtual wall spans converted: {n}.","gs.wall_segments_migrated":"Wall segments stabilised: {n}.","gs.room_drafts_migrated":"Unfinished contours converted to ordinary walls: {drafts}; wall segments: {segments}.","gs.optimize_lattice_summary":"Noisy coordinate values canonicalized: {n}; maximum movement: {cm} cm.","gs.optimize_lattice_space":"{space}: coordinate values canonicalized: {n}; off-grid values left unchanged: {far}.","gs.optimize_coincident_partitions":"Hidden independent wall sections absorbed into room walls: {n}.","gs.optimize_openings_rehosted":"Openings reattached to room walls: {n}.","gs.optimize_walls_straightened":"Walls straightened: {n}; maximum movement: {cm} cm.","gs.optimize_walls_straightened_where":"Largest wall correction: {s}.","gs.optimize_walls_straighten_skipped":"Near-axis walls left unchanged because they could not be repaired safely: {n}.","gs.optimize_glow_migration":"Legacy Glow: {spaces} spaces → no data fill + independent Glow; {rooms} rooms → inherited data fill + independent Glow.","gs.optimize_references":"References repaired: spaces — {spaces}; rooms — {rooms}; positions — {positions}; devices detached from missing spaces — {detached}.","gs.optimize_reference_more":", and {n} more","gs.optimize_orphans_removed":"Forgotten records removed: {total} — room labels: {rooms}; devices: {devices}; group markers: {groups}. They belonged to spaces deleted earlier.","gs.optimize_live_positions":"Old positions in deleted spaces belong to existing objects: {n}{names}. They will be kept.","gs.optimize_live_positions_remove":"Old positions in deleted spaces belong to existing objects: {n}{names}. They are selected for removal.","gs.optimize_live_names":": {names}{more}","gs.optimize_live_remove":"Remove old positions","gs.optimize_live_keep":"Keep old positions","gs.optimize_live_selected":"Old positions will be removed after Optimize is applied.","gs.optimize_unverified":"Could not safely verify positions: {n}. They were left unchanged.","gs.optimize_registry_limited":"Full administrator access to the Home Assistant registries is required for a safe check.","gs.optimize_vacuum_warning":"Vacuum room mappings that still need review: {n}.","gs.optimize_details":"Details","gs.optimize_details_more":"And {n} more records.","gs.optimize_detail_removed":"will be removed","gs.optimize_detail_live":"will be kept","gs.optimize_detail_unverified":"not verified","gs.optimize_detail_room_label":"room label","gs.optimize_detail_device":"device","gs.optimize_detail_group":"group marker","gs.optimize_detail_unknown":"unknown owner","gs.optimize_detail_item":"{status}: {kind} {id}; old space {space}","gs.align_warn":"Elements deliberately placed between grid nodes will move. One undo is available after the operation, only until the next plan edit.","gs.align_run":"Optimize","gs.align_done":"Plans optimized: {n} elements moved, {m} records maintained, {r} references repaired","gs.optimize_undo":"Undo last optimization","gs.optimize_undone":"The last optimization was undone","decor.furniture":"Furniture","decor.image":"Image","decor.image_title":"Custom images","decor.image_upload":"Upload image","decor.image_replace":"Replace image","decor.image_uploading":"Uploading…","decor.image_asset":"Image file","decor.image_pick_hint":"Upload an image or choose one already used in House Plan.","decor.image_place_hint":"Click on the plan to place the image.","decor.image_none":"No uploaded images yet.","decor.image_unavailable":"Image unavailable","decor.image_used":"Used in {n} objects","decor.image_upload_failed":"Could not upload the image: {err}","decor.image_error_capacity":"The custom image storage limit has been reached.","decor.image_in_use":"Remove every placed copy before deleting this image.","decor.image_delete_title":"Delete image file?","decor.image_delete_message":"Delete “{name}” from House Plan? This cannot be undone.","furn.title":"Furniture library","furn.symbol":"Symbol","furn.group_furniture":"Furniture","furn.group_appliance":"Appliances","furn.group_sanitary":"Plumbing","furn.group_other":"Other","furn.width":"Width","furn.depth":"Depth","furn.back_to_categories":"All categories","furn.pick_hint":"Choose a category, then a symbol.","furn.place_hint":"Click on the plan — the piece lands against the nearest wall. Shift places it free.","furn.cat_air_conditioner":"Air conditioners","furn.cat_armchair":"Armchairs","furn.cat_bathtub":"Bathtubs","furn.cat_bed":"Beds","furn.cat_bidet":"Bidets","furn.cat_boiler":"Water heaters","furn.cat_chair":"Chairs","furn.cat_coffee_table":"Coffee tables","furn.cat_cooktop":"Cooktops","furn.cat_dining_table":"Dining tables","furn.cat_dishwasher":"Dishwashers","furn.cat_dryer":"Dryers","furn.cat_fireplace":"Fireplaces","furn.cat_fridge":"Refrigerators","furn.cat_kitchen_cabinet":"Kitchen cabinets","furn.cat_kitchen_sink":"Kitchen sinks","furn.cat_nightstand":"Cabinets","furn.cat_plant":"Plants","furn.cat_rug":"Rugs","furn.cat_shelving":"Shelving","furn.cat_shower":"Showers","furn.cat_sink":"Sinks","furn.cat_sofa":"Sofas","furn.cat_stairs":"Stairs","furn.cat_toilet":"Toilets","furn.cat_tv":"Televisions","furn.cat_wardrobe":"Wardrobes","furn.cat_washer":"Washing machines","furn.cat_work_table":"Desks","furn.sym_sofa":"Two-seat sofa","furn.sym_sofa_three_seat":"Three-seat sofa","furn.sym_sofa_corner_right":"Right sectional sofa","furn.sym_armchair":"Soft armchair","furn.sym_armchair_office":"Office chair","furn.sym_coffee_table":"Rectangular coffee table","furn.sym_coffee_table_round":"Round coffee table","furn.sym_coffee_table_oval":"Oval coffee table","furn.sym_coffee_table_rounded":"Rounded coffee table","furn.sym_table_dining":"Rectangular dining table","furn.sym_table_round":"Round table","furn.sym_table_dining_oval":"Oval dining table","furn.sym_table_dining_rounded":"Rounded dining table","furn.sym_chair":"Chair","furn.sym_chair_bar":"Bar stool","furn.sym_desk":"Rectangular desk","furn.sym_desk_corner":"Corner desk","furn.sym_bed_double":"Double bed","furn.sym_bed_single":"Single bed","furn.sym_nightstand":"Bedside table","furn.sym_cabinet_tv":"TV cabinet","furn.sym_cabinet_shoe":"Shoe cabinet","furn.sym_cabinet_sink":"Sink cabinet","furn.sym_wardrobe":"Wardrobe","furn.sym_bookshelf":"Bookcase","furn.sym_wall_unit":"Wall unit","furn.sym_kitchen_floor":"Kitchen floor module","furn.sym_kitchen_floor_corner":"Kitchen floor corner module","furn.sym_kitchen_wall":"Kitchen wall module","furn.sym_kitchen_wall_corner":"Kitchen wall corner module","furn.sym_shelf_floor":"Floor shelving unit","furn.sym_shelf_wall":"Wall shelf","furn.sym_fridge":"Fridge","furn.sym_stove":"Four-burner cooktop","furn.sym_cooktop_two":"Two-burner cooktop","furn.sym_dishwasher":"Dishwasher","furn.sym_washer":"Washing machine","furn.sym_dryer":"Tumble dryer","furn.sym_tv":"TV on stand","furn.sym_tv_wall":"Wall-mounted TV","furn.sym_ac":"Air conditioner","furn.sym_water_heater":"Water heater","furn.sym_toilet":"Floor-standing toilet","furn.sym_toilet_built_in":"Built-in toilet","furn.sym_bathtub":"Rectangular bathtub","furn.sym_bathtub_corner":"Corner bathtub","furn.sym_shower":"Shower","furn.sym_sink":"Washbasin","furn.sym_kitchen_sink":"Single kitchen sink","furn.sym_kitchen_sink_double":"Double kitchen sink","furn.sym_bidet":"Floor-standing bidet","furn.sym_bidet_built_in":"Built-in bidet","furn.sym_stairs":"Stairs","furn.sym_fireplace":"Fireplace","furn.sym_plant":"Plant","furn.sym_rug":"Rug","common.yes":"Yes","common.no":"No","vac.diag_source":"Source","vac.diag_platform":"Integration","vac.diag_status":"Status","vac.diag_position":"Position","vac.diag_rooms":"Rooms","vac.diag_rooms_value":"{total} · {matched} names match · {readiness}","vac.autocal_ready":"auto-calibration available","vac.autocal_not_ready":"need 3 matching names","vac.diag_path":"Integration path","vac.diag_map":"Map ID","vac.source_none":"not selected","vac.source_status_ok":"Ready","vac.source_status_missing":"Missing","vac.source_status_disabled":"Disabled in Home Assistant","vac.source_status_unavailable":"Unavailable","vac.source_status_unverified":"Cannot verify with current permissions","vac.source_status_unsupported":"No position data","vac.source_status_none":"No source","vac.source_banner_missing":"The saved source no longer exists. It was not replaced automatically; choose another source or restore it in Home Assistant.","vac.source_banner_disabled":"The saved source is disabled in Home Assistant. Enable it there or choose another source.","vac.source_banner_unverified":"Current Home Assistant permissions cannot verify this saved source. It remains pinned and will not be replaced automatically.","vac.choose_source":"Choose source","vac.source_auto":"Automatic","vac.source_auto_hint":"Use a compatible entity from this device","vac.all_cameras":"All cameras","vac.all_cameras_warn":"A camera may not provide robot data. Choose one only if it is your vacuum map.","vac.all_cameras_empty":"No other camera entities found.","vac.platform_unknown":"unknown integration","vac.cap_position":"position","vac.cap_rooms_short":"rooms","vac.cap_path":"path","vac.cap_map":"map ID","vac.cap_none":"no robot data detected","vac.xcme_hint":"Enable these Xiaomi Cloud Map Extractor attributes:","vac.documentation":"Documentation","vac.residual_title":"Check automatic calibration","vac.residual_message":"The matched rooms disagree by up to {error}. Apply this approximate calibration, refine it manually, or cancel without changing the saved setup.","vac.apply_proposal":"Apply","gs.backup_group":"Backup and transfer","gs.backup_hint":"Download a portable JSON backup or preview and import a backup made by House Plan.","backup.export_open":"Export","backup.import_open":"Import","backup.export_title":"Export House Plan","backup.import_title":"Import House Plan","backup.export_hint":"Choose whether the backup should contain the whole House Plan configuration or only the current space.","backup.full":"Full backup","backup.current_space":"Current space","backup.current_space_title":"Current space: {title}","backup.no_current_space":"No current space","backup.plan_only":"Plan only","backup.plan_only_hint":"Keep rooms, walls, openings, decor and room-label positions without devices or Home Assistant bindings.","backup.plan_only_preview":"This file contains the plan only","backup.privacy_warning":"The archive keeps names, Home Assistant identifiers and exact coordinates. Internal plans and attachments are referenced, not embedded; runtime states and vacuum trails are not included.","backup.download":"Download JSON","backup.export_done":"Backup downloaded","backup.reading":"Checking the backup…","backup.revalidated":"The plan changed after this preview. The summary was refreshed; review it and confirm again.","backup.error.support_invalid_message":"Check the support message and try again.","backup.error.support_package_too_large":"The anonymized support package exceeds the 8 MiB limit.","backup.error.support_preview_expired":"The support attachment preview expired or is no longer available.","backup.error.support_rate_limited":"Too many support reports or previews were requested. Try again later.","backup.error.support_rejected":"The report did not pass support service validation.","backup.error.support_unavailable":"The private support service is temporarily unavailable.","backup.error.unauthorized":"You do not have permission to export or import this plan.","backup.error.not_ready":"House Plan is not ready yet. Try again in a moment.","backup.error.too_large":"The backup exceeds the 8 MiB limit.","backup.error.invalid_json":"The selected file is not valid JSON.","backup.error.invalid_format":"The selected file is not a House Plan backup.","backup.error.invalid_image":"The image is damaged or does not match its format.","backup.error.unsupported_export_version":"This backup format is not supported by the installed version.","backup.error.unsupported_image":"Use a supported PNG, JPEG, WebP or SVG image.","backup.error.future_model":"The backup was created by a newer House Plan data model.","backup.error.invalid_config":"The backup contains an invalid House Plan configuration.","backup.error.wall_model_migration_blocked":"The backup wall model could not be upgraded safely. Optimize the source plan first, then export it again.","backup.error.invalid_layout":"The backup contains invalid object positions.","backup.error.invalid_content":"The backup contains invalid or inconsistent content references.","backup.error.space_not_found":"The selected space no longer exists.","backup.error.capacity_exceeded":"Adding this backup would exceed the plan limits.","backup.error.preview_expired":"The preview expired. Select the backup file again.","backup.error.preview_owner_mismatch":"This preview belongs to another Home Assistant user.","backup.error.conflict":"The plan changed after the preview. Review the refreshed summary.","backup.error.content_confirmation_required":"Confirm that unavailable local content may be detached.","backup.error.commit_failed":"The backup could not be applied safely. The previous plan was restored or is pending recovery.","backup.error.missing_plan":"A referenced plan file disappeared after the preview. Review the backup again.","backup.error.missing_content":"A referenced local attachment disappeared after the preview. Review the backup again.","backup.error.marker_control_missing":"A linked plan light is missing from the backup.","backup.error.marker_control_not_light":"A linked plan target is no longer marked as a light source.","backup.error.marker_control_self":"A light source cannot control itself.","backup.error.marker_control_cycle":"The backup contains a circular chain of light controls.","backup.error.duplicate_marker_control":"The backup contains a duplicate plan-light link.","backup.error.no_backup":"There is no import or optimization snapshot to restore.","backup.error.in_use":"The item is still in use","backup.error.invalid_data":"The request carries invalid data","backup.error.invalid_light_entity":"The leading light must be a light.* or switch.* entity","backup.error.invalid_marker_control":"Invalid marker control reference","backup.error.invalid_name":"The name is invalid","backup.error.invalid_partition_opening_host":"The opening must keep its partition host","backup.error.invalid_partition_opening_jamb_margin":"The opening leaves no physical jamb at the wall end","backup.error.invalid_passage_fields":"An open passage cannot carry door-only settings","backup.error.invalid_space_id":"Unknown space","backup.error.invalid_toggle_entity":"The toggle entity must be light.* or switch.*","backup.error.invalid_value_badge":"Invalid value badge settings","backup.error.invalid_value_badge_attribute":"Invalid value badge attribute","backup.error.invalid_value_badge_position":"Invalid value badge position","backup.error.invalid_value_badge_source":"Invalid value badge source","backup.error.invalid_vacuum_map_route":"Check how the robot's maps are assigned to spaces.","backup.error.invalid_value_source":"Invalid value source","backup.error.invalid_value_source_attribute":"Invalid value source attribute","backup.error.io_error":"A file operation failed on the server","backup.error.not_toggleable":"This device cannot be toggled","backup.error.nothing_to_repair":"Nothing to repair","backup.error.space_in_use":"The space is still referenced","backup.error.value_badge_source_required":"The value badge needs a source","backup.error.wall_model_client_outdated":"The plan was updated elsewhere — reload the page","backup.same_source":"Created on this Home Assistant instance","backup.foreign_source":"Created on another Home Assistant instance","backup.created":"Created: {value}","backup.versions":"Card {card}; integration {integration}; data model {model}","backup.count_spaces":"Spaces: {n}","backup.count_rooms":"Rooms: {n}","backup.count_walls":"Walls: {n}","backup.count_openings":"Openings: {n}","backup.count_decor":"Decor objects: {n}","backup.count_markers":"Devices: {n}","backup.count_layout":"Positions: {n}","backup.bindings":"Bindings — devices: {device}, entities: {entity}, virtual: {virtual}; positions without a space: {legacy}","backup.binding_status":"Target status — active: {active}, disabled: {disabled}, missing: {missing}","backup.missing_areas":"Areas missing on the target: {areas}","backup.dropped_marker_links":"Plan-light links outside this transferred space were omitted: {n}.","backup.room_drafts_migrated":"Legacy unfinished contours converted to ordinary walls: {drafts}; wall segments: {segments}.","backup.repaired_target_refs":"Existing references restored by this space import: {n}.","backup.preserved_unresolved_refs":"References that could not be restored unambiguously were preserved: {n}.","backup.preserved_unresolved_hint":"No data was guessed or deleted. After the import, run Optimize plans to inspect the remaining references.","backup.import_details":"Import reference details","backup.import_detail.incoming_remapped":"References updated inside the imported copy: {n}","backup.import_detail.target_repaired":"Existing references restored: {n}","backup.import_detail.preserved_unresolved":"Unresolved references preserved: {n}","backup.import_detail.collisions":"Destination conflicts preserved safely: {n}","backup.import_detail.dropped_links":"Incoming links omitted by transfer rules: {n}","backup.import_detail.bounded_lineages":"Overly nested identifiers left bounded: {n}","backup.replace_warning":"This replaces the current configuration and layout. Uploaded files are never deleted. One undo remains available until the next plan edit.","backup.foreign_bookkeeping":"Instance-specific known/new-device bookkeeping will not be imported.","backup.final_name":"New space name","backup.target_settings":"The target instance's global settings remain unchanged.","backup.duplicates":"Bindings already present: {n}","backup.skip":"Skip duplicate devices","backup.virtual_copy":"Add safe static virtual copies","backup.content":"Referenced content","backup.decor_images_summary":"Custom images: {objects} objects, {assets} files; missing files: {missing}.","backup.content_available":"available locally","backup.content_external":"external link","backup.content_detach_required":"will be detached","backup.confirm_detach":"I understand that unavailable internal plans and attachments will be detached from the imported configuration.","backup.confirm_missing_images":"I understand that missing custom images will remain as repair placeholders and other unavailable local files will be detached.","backup.replace":"Replace","backup.add":"Add space","backup.space_done":"Space imported: {rooms} rooms, {markers} devices, {refs} existing references restored","backup.full_done":"Backup restored: {spaces} spaces, {rooms} rooms, {markers} devices","backup.undo_import":"Undo last full import","backup.import_undone":"Full import undone","backdrop.large_title":"Large image","backdrop.large_body":"This image is {w}×{h} ({fileMb} MB file) and needs about {decodedMb} MB of memory to display. On tablets this can crash the page.","backdrop.unknown_body":"The image dimensions could not be read — the file may be damaged. Continuing may crash the page on tablets.","backdrop.reduced_dimensions":"Reduced copy: {w}×{h} px.","backdrop.use_downscaled":"Upload a reduced copy","backdrop.reducing":"Reducing…","backdrop.keep_original":"Keep the original","backdrop.too_large_title":"Image is too large","backdrop.too_large_body":"This image exceeds what browsers can display ({w}×{h}, limit {limit} px per side). Please reduce it in a desktop editor and upload again.","backdrop.downscale_failed":"Could not create the reduced copy. The original plan was not changed."};const up=new WeakSet,pp=new WeakSet;function _p(e,t,i){const n=i?t.state(i):"ready";return i&&"pending"===n?(pp.has(e)||(e.inert=!0,e.setAttribute("aria-busy","true"),pp.add(e)),t.ensure(i).then(()=>{e.isConnected&&e.requestUpdate()}),up.has(e)?"warm":"cold"):(pp.delete(e)&&(e.inert=!1,e.removeAttribute("aria-busy")),i&&(e.setAttribute("lang","fallback"===n?"en":i),up.add(e)),"ready")}function mp(){return j``}const gp=[{code:"en",nativeLabel:"English",dictionary:dp},{code:"ru",nativeLabel:"Русский",dictionary:{"editor.context_actions":"Действия: {object}","editor.tool_options":"Параметры инструмента: {tool}","editor.palette":"Палитра: {tool}","editor.open_group":"Группа инструментов: {group}","editor.group_active":"{group} — активно: {item}","editor.disabled_action":"{action} недоступно: {reason}","editor.loading":"Загружаем редактор…","editor.loading_aria":"Редактор плана загружается","editor.load_failed":"Не удалось загрузить редактор.","editor.refresh_advice":"Обновите страницу и повторите попытку.","editor.retry_advice":"Проверьте сеть и нажмите ещё раз.","version_mismatch.title":"Версии House Plan не совпадают","version_mismatch.body":"Если Home Assistant ещё перезапускается, дождитесь завершения, затем перезагрузите эту страницу.","version_mismatch.frontend":"Карточка","version_mismatch.backend":"Интеграция","version_mismatch.reload":"Перезагрузить страницу","color_picker.title":"Выбор цвета","color_picker.hue":"Оттенок","color_picker.saturation":"Насыщенность","color_picker.value":"Яркость","color_picker.hex":"Цвет HEX","color_picker.invalid_hex":"Введите цвет HEX из 3 или 6 цифр","color_picker.confirm":"ОК","btn.properties":"Свойства","btn.keep_as_walls":"Оставить стенами","btn.delete_room_keep_walls":"Удалить комнату, оставить стены","btn.delete_room_with_walls":"Удалить комнату и стены","title.markup_select":"Выбор и редактирование стен и колонн","title.markup_column":"Колонна: кликните точку сетки для квадратной колонны","markup.partition":"Перегородка","markup.column":"Колонна","markup.hint_column":"кликните точку сетки, чтобы поставить квадратную колонну","history.wall_segment":"Добавление отрезка стены","history.column_add":"Добавление колонны","history.physical_edit":"Изменение физического объекта","history.physical_delete":"Удаление физического объекта","history.physical_move":"Перемещение физического объекта","history.wall_face_batch":"Создание комнат из стен","toast.column_duplicate":"Колонна с тем же центром и внешним размером уже существует","physical.partition_properties":"Свойства перегородки","physical.column_properties":"Свойства колонны","physical.shape":"Форма","physical.square":"Квадрат","physical.circle":"Круг","physical.diameter":"Диаметр","physical.side":"Сторона","physical.rotation":"Угол поворота","physical.length":"Длина","physical.allowed_range":"Допустимо: {min}–{max} {unit}","physical.column_size_title":"Внешняя сторона квадратной колонны, создаваемой кликом (1–150 см).","card.title":"План дома","count.devices":"{n} устр.","empty.no_spaces":"Пространств пока нет.","nav.spaces":"Пространства House Plan","empty.add_first":"Добавьте первое пространство и загрузите план этажа.","empty.read_only":"Пространства не настроены. Попросите администратора добавить первое.","empty.install":"Установите интеграцию House Plan и добавьте запись в «Устройства и службы».","btn.add_space":"Добавить пространство","btn.cancel":"Отмена","btn.save":"Сохранить","btn.close":"Закрыть","btn.delete":"Удалить","btn.copy":"Копировать","btn.edit":"Редактировать","btn.open_in_ha":"Открыть в HA","btn.reset":"Сброс","btn.attach":"Прикрепить…","btn.upload":"Загрузить…","btn.replace":"Заменить…","title.zoom_in":"Приблизить","title.zoom_out":"Отдалить","title.zoom_fit":"Вписать всё","title.configure_space":"Настроить пространство","title.add_space":"Добавить пространство","title.markup_add":"Стены: рисуйте непрерывную цепочку; каждый принятый отрезок сохраняется отдельно. Shift фиксирует 45°","title.markup_merge":"Объединить: клик по одной комнате, затем по соседней с общей стеной","title.markup_split":"Разделить комнату: клик по комнате, затем две точки на её стенах","title.markup_delroom":"Удалить комнату: кликните внутри комнаты и подтвердите удаление","title.need_plan":"Загрузите подложку (план этажа)","markup.add":"Стены","markup.merge":"Объединить","markup.split":"Разделить","markup.resize":"Размер","title.markup_resize":"Изменение размера комнат: тяните доступную ручку горизонтальной или вертикальной стены","markup.hint_resize":"тяните доступную ручку стены · стена упирается в первую небезопасную позицию · Esc — отмена · Ctrl+Z — отмена шага","resize.disabled.diagonal":"Стена расположена под углом: Resize поддерживает только горизонтальные и вертикальные стены","resize.disabled.side-angle":"Примыкающая стена расположена под углом: для Resize обе примыкающие стены должны образовывать прямой угол","resize.disabled.duplicate-physical-wall":"Стену перекрывает отдельная перегородка или колонна; удалите или переместите её перед изменением размера","resize.disabled.partial-shared":"Соседняя комната использует только часть этой стены, поэтому её нельзя безопасно двигать как одну общую стену","resize.disabled.unequal-shared":"У соседней комнаты другие конечные точки или длина стены, поэтому стены нельзя безопасно двигать вместе","resize.disabled.multiple-rooms":"Перемещение затронуло бы больше двух комнат","resize.disabled.thickness-conflict":"Толщину стены нельзя безопасно сохранить","resize.disabled.opening-conflict":"Проём на этой стене нельзя безопасно переместить","resize.disabled.invalid-geometry":"Эту стену нельзя переместить без изменения структуры плана","resize.limit_stopped":"Стена остановлена: дальше нарушается ограничение стыков","resize.commit_failed":"Изменение размера отменено: итоговый план не прошёл проверку геометрии","resize.preview_failed":"Стена остановлена в последней безопасной позиции: геометрию плана нельзя сохранить без потерь","markup.opening":"Проём","markup.delete_room":"Удалить комнату","history.undo":"Отменить","history.redo":"Повторить","history.undo_named":"Отменить: {name} (Ctrl+Z)","history.redo_named":"Повторить: {name} (Ctrl+Shift+Z / Ctrl+Y)","history.undo_empty":"Нет операций для отмены","history.redo_empty":"Нет операций для повтора","history.undone":"Отменено: {name}","history.redone":"Повторено: {name}","history.add_room":"Создание комнаты","history.split_room":"Разделение комнаты","history.merge_rooms":"Объединение комнат","history.resize_room":"Изменение размера комнаты","history.wall_thickness":"Изменение толщины стены","history.add_opening":"Добавление дверного или оконного проёма","history.edit_opening":"Изменение проёма","history.move_opening":"Перемещение проёма","history.delete_opening":"Удаление проёма","history.delete_room_keep_walls":"Удаление комнаты с сохранением стен","history.delete_room_with_walls":"Удаление комнаты и её стен","history.decor_add":"Добавление объекта декора","history.decor_edit":"Изменение объекта декора","history.decor_move":"Перемещение объекта декора","history.decor_transform":"Трансформация объекта декора","history.decor_delete":"Удаление объекта декора","history.backdrop_transform":"Трансформация подложки плана","history.device_move":"Перемещение: {name}","history.device_stale":"История позиций больше неприменима и была очищена","opening.new":"Новый проём","opening.edit":"Проём","opening.door":"Дверь","opening.window":"Окно","opening.gate":"Ворота","opening.passage":"Открытый проём","opening.passage_binding_warning":"При сохранении датчик открытия и замок будут удалены.","opening.invalid_passage_fields":"У открытого проёма на плане «{room}» есть недопустимые параметры: {fields}.","opening.type_label":"Тип","opening.length_label":"Длина, см","opening.contact_label":"Датчик открытия","opening.lock_label":"Замок","opening.none":"— нет —","opening.search_ph":"Поиск: имя или entity_id…","opening.invert":"Инвертировать открыто/закрыто","opening.flip_h":"Петли с другой стороны","opening.flip_v":"Открывается в другую сторону","opening.open":"Открыто","opening.closed":"Закрыто","opening.locked":"Заперто","opening.unlocked":"Не заперто","opening.state_unknown":"недоступно","opening.no_entities":"Датчики не привязаны — статичный символ на плане.","toast.opening_no_wall":"Кликните рядом со стеной комнаты или независимой стеной","opening.host_partition":"Независимая стена","opening.partition_orphan":"Независимая стена этого проёма больше не существует","opening.partition_jamb_margin":"Оставьте от края проёма до торца стены минимум {distance}","opening.rebind_partition":"Привязать к другой независимой стене","confirm.delete_partition_openings_title":"Удалить стену и проёмы?","confirm.delete_partition_openings_body":"В стене есть проёмы: {count}. Они будут удалены вместе со стеной.","confirm.delete_partition_openings_item":"• {type}, {length}","markup.hint_points":"точек: {n} · Shift — шаг 45° · Esc — завершить цепочку · Ctrl+Z — убрать точку · при замыкании будет предложена комната","markup.hint_start":"кликните точку сетки, чтобы начать цепочку стен","tip.lqi":"средний сигнал zigbee:","tip.area":"площадь: {value}","info.device_header":"Устройство на плане","info.model":"Модель","info.state":"Состояние","info.link":"Ссылка","info.manuals":"Инструкции","info.none":"Нет дополнительной информации","marker.new_device":"Новое устройство","marker.name_label":"Имя (отображается на плане)","marker.name_ph":"Название","marker.binding_label":"Привязка к устройству HA","marker.binding_disabled":"деактивировано в Home Assistant","marker.virtual_option":"Виртуальное устройство (без привязки)","marker.search_ph":"Поиск устройства / группы…","marker.nothing_found":"ничего не найдено","marker.room_label":"Комната","marker.room_override":" (переопределить размещение)","marker.room_choose":"— выберите комнату —","marker.room_auto":"— по зоне устройства (авто) —","marker.icon_label":"Иконка","marker.icon_ph":"mdi:… (пусто = авто)","marker.display_label":"Отображение","display.badge":"Значок + состояние","display.icon_ripple":"Значок + состояние и активность","display.static_icon":"Всегда статичный значок","display.value_static_icon":"Значение + статичный значок","marker.display_hint_badge":"Значок и динамическая подложка показывают состояние устройства без обычной пульсации активности. Красная тревога сохраняется.","marker.display_hint_icon_ripple":"Значок, динамическая подложка и пульсация: короткая — для событий, постоянная — для работы, движения или присутствия. Красная тревога имеет отдельный приоритет.","marker.display_hint_value":"Значок заменяется выбранным или автоматически найденным значением Home Assistant; подложка продолжает показывать состояние. Красная тревога сохраняется.","marker.display_hint_static_icon":"Подложка в цветах темы и значок всегда остаются одинаковыми. Состояния, активность, недоступность и тревоги не меняют отображение.","marker.display_hint_value_static_icon":"Маркер показывает выбранное значение, а подложка остаётся в цветах темы. Состояния, активность, недоступность и тревоги не меняют цвет маркера.","marker.static_alarm_warning":"Это устройство может сообщать о тревогах. Статичный режим скрывает визуальную тревогу маркера.","marker.preview.title":"Предпросмотр отображения","marker.preview.actual":"Сейчас","marker.preview.example":"Пример","marker.preview.integration":"Интеграция","marker.preview.source":"Источник отображения","marker.preview.current_state":"Текущее состояние","marker.preview.result":"На плане","marker.preview.details":"Подробнее об источниках","marker.preview.select_source":"Выберите устройство или сущность Home Assistant, чтобы увидеть фактическое отображение.","marker.preview.unknown_provider":"Интеграция неизвестна","marker.preview.virtual_provider":"House Plan · виртуальное устройство","marker.preview.no_source":"Нет активного источника","marker.preview.no_state":"Нет текущего состояния","marker.preview.mixed_states":"Несколько разных состояний","marker.preview.multiple_sources":"Источников: {n}","marker.preview.more_sources":"ещё {n}","marker.preview.scaled":"Предпросмотр уменьшен до {n}%, чтобы поместиться. Сохранённый размер не изменится.","marker.preview.demo_short":"Показать краткую активность","marker.preview.demo_continuous":"Показать постоянную активность","marker.preview.stop_continuous":"Остановить постоянную активность","marker.preview.demo_short_notice":"Пример краткой активности; фактическое состояние устройства не меняется.","marker.preview.demo_continuous_notice":"Пример постоянной активности; фактическое состояние устройства не меняется.","marker.preview.demo_already_visible":"Текущее состояние уже показывает реальную активность или тревогу.","marker.preview.reduced_motion":"В системе включено уменьшение движения, поэтому обычная активность показана точкой.","marker.preview.reason.neutral":"Нейтральная тёмная подложка","marker.preview.reason.working":"Жёлтая подложка: устройство сейчас работает","marker.preview.reason.working_activity":"Жёлтая подложка и эффект активности: устройство сейчас работает","marker.preview.reason.open":"Оранжевая подложка: физически открыто или разблокировано","marker.preview.reason.cover_icon_state":"Нейтральная подложка; состояние и значок определяет сущность шторы или заслонки","marker.preview.reason.presence":"Эффект активности, пока обнаружено присутствие","marker.preview.reason.event":"Короткий эффект активности после события","marker.preview.reason.transition":"Эффект активности во время движения или смены состояния","marker.preview.reason.media_neutral":"Медиаустройство остаётся на нейтральной тёмной подложке, пока доступно","marker.preview.reason.unavailable":"Приглушённая нейтральная подложка: отключено или недоступно","marker.preview.reason.alarm":"Красная тревожная подложка; тревога отображается всегда","marker.preview.reason.live_states_disabled":"Оформление по живым состояниям отключено в настройках карточки","marker.preview.reason.value_no_state":"Нет подходящего значения состояния — вместо него показан значок","marker.preview.reason.value_ambiguous_sources":"Подходит несколько источников значения — вместо него показан значок","marker.preview.reason.value_non_scalar":"Источник вернул не простое значение — вместо него показан значок","marker.preview.reason.value_virtual":"У виртуального устройства нет значения HA — вместо него показан значок","marker.preview.reason.vacuum_live_plan_only":"Живая позиция и след пылесоса доступны только на полном плане","marker.preview.reason.hidden_design_preview":"Устройство скрыто на плане, но его оформление видно в предпросмотре","marker.preview.reason.composite_power_source":"Состояние берётся из сущности питания устройства; вспомогательные переключатели не учитываются","marker.preview.reason.activity_display_disabled":"Выбранный режим отображения не показывает обычные эффекты активности","marker.preview.reason.ha_disabled":"Привязка отключена в Home Assistant, поэтому устройство будет скрыто на плане","marker.preview.reason.orphaned":"Сохранённая привязка Home Assistant больше не найдена","marker.preview.reason.static_icon":"Статичный режим: состояние устройства не меняет значок","marker.preview.reason.value_static_icon":"Статичный режим со значением: состояние устройства не меняет цвет маркера","marker.activity_color":"Цвет пульсации активности","marker.ripple_size":"Размер пульсации активности","marker.activity_alarm_note":"Цвет и размер относятся только к обычной активности и не влияют на красную тревогу.","marker.pulse_a11y_alarm":"Тревога","marker.pulse_a11y_event":"Недавнее событие","marker.pulse_a11y_presence":"Обнаружено присутствие","marker.pulse_a11y_transition":"Изменение состояния","marker.pulse_a11y_running":"Работает","marker.state_a11y_neutral":"Обычное состояние","marker.state_a11y_working":"Работает","marker.state_a11y_open":"Открыто","marker.state_a11y_locked":"Заблокировано","marker.state_a11y_unlocked":"Разблокировано","marker.state_a11y_alarm":"Тревога","marker.state_a11y_unavailable":"Недоступно","marker.lqi_a11y_low":"LQI {value}, слабый сигнал","marker.lqi_a11y_mid":"LQI {value}, средний сигнал","marker.lqi_a11y_high":"LQI {value}, сильный сигнал","marker.size_label":"Размер / поворот значка","marker.angle_label":"Поворот","marker.model_label":"Модель","marker.model_ph":"напр. Aqara T&H","marker.link_label":"Ссылка","marker.desc_label":"Описание","marker.desc_ph":"Заметки, характеристики…","marker.manuals_label":"Инструкции (PDF и т.п.)","marker.sub_device":"устройство","marker.sub_z2m_group":" · Z2M-группа","marker.sub_group":"группа","marker.sub_helper":"хелпер","space.new":"Новое пространство","space.copy_title":"Копирование пространства","space.copy_name":"Название нового пространства","space.copy_fallback":"Пространство","space.copy_create":"Создать копию","space.copy_optimize_title":"Оптимизировать перед копированием?","space.copy_optimize_body":"Перед созданием «{name}» House Plan должен оптимизировать весь план, включая другие пространства. Продолжить?","space.copy_optimize_confirm":"Оптимизировать и скопировать","space.copy_error_changed":"План изменился, пока было открыто подтверждение. Проверьте его и повторите попытку.","space.copy_error_source_missing":"Исходного пространства больше нет. Снова откройте его настройки и повторите попытку.","space.copy_error_source_invalid":"House Plan не смог проверить все стены этого пространства. Исправьте исходное пространство и повторите попытку.","space.copy_error_spaces_limit":"В House Plan уже создано максимальное число пространств.","space.copy_error_partitions_limit":"В этом пространстве слишком много стен для копирования.","space.copy_error_openings_limit":"В этом пространстве слишком много проёмов для копирования.","space.copy_error_decor_limit":"В этом пространстве слишком много элементов подложки для копирования.","space.copy_error_columns_limit":"В этом пространстве слишком много колонн для копирования.","space.copy_error_opening_host":"Один из проёмов больше не привязан к стене. Исправьте или удалите его перед копированием.","space.copy_error_geometry":"Копия создаст небезопасную геометрию стен. Исправьте исходное пространство и повторите попытку.","space.copy_error_optimize_geometry":"Копирование остановлено: оптимизация всего плана небезопасна для одного из пространств.","space.header":"Пространство","space.title_label":"Название","space.title_ph":"Например: Гараж","space.plan_label":"Подложка (план)","space.no_plan":"нет подложки","space.plan_alt":"план","room.new":"Новая комната","room.name_label":"Отображаемое имя","room.name_ph":"Например: Терраса","room.area_label":"Зона Home Assistant (свободные)","room.no_area_option":"— без зоны —","room.default_name":"Комната","device.unnamed":"без имени","device.light_group":"группа света","device.fallback":"устройство","device.virtual":"виртуальное устройство","confirm.delete_room_title":"Удалить комнату «{name}»?","confirm.delete_room_body":"Выберите, нужно ли оставить физические стены, принадлежащие только этой комнате. Общие с другой комнатой стены сохраняются всегда.","confirm.remove_marker_title":"Удалить устройство с плана?","confirm.remove_marker_body":"Устройство исчезнет полностью и перестанет участвовать в данных плана. Позже его можно будет добавить заново.","confirm.erase_decor":"Стереть объект «{kind}»? Действие можно отменить из истории редактора.","confirm.delete_space_title":"Удалить пространство?","confirm.delete_space_body":"Пространство, все его комнаты и вся разметка плана будут удалены.","confirm.delete_space_vac_routes":"Также будет снято сопоставление карт роботов: {count}.","space.delete_blocked":"Это пространство всё ещё используется устройствами: {n}. Сначала перенесите их в другое пространство или удалите.","toast.pos_save_failed":"Не удалось сохранить позицию: {err}","toast.no_entity":"У устройства нет подходящей сущности","toast.ha_disabled_action":"Деактивированный объект Home Assistant нельзя использовать на плане.","toast.ha_disabled_show_device":"Деактивированное в Home Assistant устройство нельзя показать на плане. Сначала активируйте его в Home Assistant.","toast.ha_disabled_show_entity":"Деактивированную в Home Assistant сущность нельзя показать на плане. Сначала активируйте её в Home Assistant.","toast.ha_disabled_add":"Деактивированный объект Home Assistant нельзя добавить на план. Сначала активируйте его в Home Assistant.","toast.ha_binding_unverified":"Статус объекта не удалось подтвердить по реестру Home Assistant. Отображение и действия временно недоступны.","toast.markup_needs_server":"Разметка доступна после переноса конфига на сервер","toast.space_order_changed":"Порядок изменён. Если где-то этаж карточки задан номером, проверьте такие панели.","toast.conflict":"Конфиг изменён в другом окне — данные обновлены, повторите последнее действие","toast.cfg_save_failed":"Не удалось сохранить конфиг: {err}","toast.room_overlap":"Контур накладывается на комнату «{name}» — комнаты не должны накладываться","toast.contour_cannot_close":"Контур нельзя замкнуть: он вырожден или пересекает сам себя","toast.merge_not_adjacent":"Объединять можно только комнаты с общей стеной","toast.rooms_merged":"Комнаты объединены в «{name}»","toast.split_pick_wall":"Начните разрез на стене комнаты","toast.split_bad_cut":"Разрез — от стены до стены внутри комнаты, без пересечения стен и самого себя","merge.header":"Объединение комнат","merge.hint":"У объединённой комнаты одно имя и одна зона. Вторая зона освобождается — её устройства уйдут с плана, пока их не заберёт другая комната.","merge.keep":"Оставить","merge.no_area":"без зоны","toast.room_saved":"Комната сохранена ({n}). Устройств добавлено: {added}. Обведите следующую или выйдите из разметки.","toast.room_saved_no_area":"Комната сохранена ({n}, без зоны). Обведите следующую или выйдите из разметки.","toast.marker_needs_server":"Редактирование устройств доступно после переноса конфига на сервер","toast.virtual_name_required":"Укажите имя виртуального устройства","toast.marker_saved":"Устройство сохранено","toast.marker_removed":"Устройство удалено с плана","toast.integration_missing":"Интеграция House Plan не установлена — управление недоступно","toast.plan_formats":"Поддерживаются SVG, PNG, JPG, WebP","toast.plan_required":"Загрузите подложку — план этажа обязателен","toast.space_added_onboard":"Пространство добавлено. Обведите комнаты: кликайте по точкам сетки и замкните контур.","toast.space_added":"Пространство добавлено","toast.space_copied":"Пространство «{name}» создано","toast.space_saved":"Пространство сохранено","toast.space_deleted":"Пространство удалено","toast.delete_failed":"Ошибка удаления: {err}","toast.error":"Ошибка: {err}","toast.toggle_target_unavailable":"Цель «{name}» недоступна — действие не выполнено","toast.toggle_targets_unavailable":"Цели недоступны: {names}. Действие не выполнено","toast.file_failed":"Файл «{name}» не загружен: {err}","toast.files_attached":"Прикреплено файлов: {n}","err.unknown":"неизвестная ошибка","err.code":"код {code}","err.too_large":"файл больше {mb} МБ","err.bad_ext":"недопустимый тип (нужен PDF/изображение)","err.unauthorized":"нужны права администратора","editor.title":"Заголовок","editor.default_floor":"Стартовое пространство","editor.default_floor_missing":"Стартовое пространство «{id}» больше не существует. Выберите другое.","editor.floor":"Закреплённое пространство","editor.floor_none":"— не закреплять —","editor.floor_index":"YAML-индекс {index} (сохранён)","fixed_floor.loading":"Загружаем закреплённое пространство…","fixed_floor.invalid_title":"Закреплённое пространство недоступно","fixed_floor.invalid_body":"Проверьте floor в конфигурации карточки. Настроенное значение: {value}","editor.icon_size":"Размер иконок, % ширины плана","editor.show_temperature":"Показывать температуру","editor.live_states":"Живые состояния (вкл/выкл, открыто…)","editor.light_pools":"Световые пулы и тени от стен","editor.show_signal":"Показывать сигнал zigbee (LQI)","editor.language":"Язык интерфейса","editor.lang_auto":"Авто (профиль HA)","title.icon_rules":"Правила иконок: какая MDI-иконка достаётся устройству по имени","rules.title":"Правила иконок","rules.hint":"Правила проверяются сверху вниз по строке «имя устройства + модель» (regex без учёта регистра); срабатывает первое совпадение. Если ничего не подошло — решает device class сущности, затем — иконка-заглушка.","rules.pattern_ph":"regex, напр. розетк|plug","rules.icon_ph":"mdi:power-socket-de","rules.add":"Добавить правило","rules.reset":"Сбросить к умолчаниям","rules.test_ph":"Проверьте имя устройства…","rules.invalid":"некорректный regex","rules.saved":"Правила иконок сохранены","btn.up":"Вверх","btn.down":"Вниз","tap.info":"Карточка устройства","tap.more_info":"Диалог HA (more-info)","tap.toggle":"Переключить состояние","marker.tap_label":"Действие по нажатию для этого устройства","tap.toggle_note":"Под селектором показано, какое состояние изменится. Защищённые устройства не переключаются с плана.","import.title":"Создать пространства из этажей HA","import.hint":"Home Assistant уже знает эти этажи. Отметьте, какие превратить в пространства плана — далее для каждого попросим картинку плана. Комнаты затем обводятся вручную по плану.","import.start":"Создать: {n}","import.manual":"Начать с нуля","import.progress":"Этаж {i} из {n}","import.done":"Пространства созданы. Обведите комнаты: кликайте по точкам сетки и замкните контур.","btn.skip":"Пропустить","space.scale_label":"Масштаб (размер клетки сетки)","space.cell_cm.help":"Связывает сетку с реальными размерами: от значения зависят длины и площади, толщина стен, размеры проёмов и радиус свечения. Изменение после разметки меняет расчётные размеры всего пространства, но не двигает его точки на плане.","space.cell_cm.help.aria":"Подсказка: масштаб пространства","space.scale_unit":"см на клетку","space.scale_unit_imperial":"дюйм на клетку","space.display_section":"Отображение","space.show_borders":"Всегда отображать границы комнат","space.zero_wall_style":"Стены нулевой толщины","space.zero_wall_style.help":"Пунктирные стены нулевой толщины пропускают Glow и солнечные лучи, сплошные блокируют их как барьер нулевой площади. Выбор меняет все такие стены пространства, даже когда их линии скрыты в просмотре.","space.zero_wall_style.help.aria":"Подсказка: вид стен нулевой толщины","space.zero_wall_dashed":"Пунктирные","space.zero_wall_solid":"Сплошные","space.show_names":"Отображать названия комнат (перетаскиваются)","space.room_color":"Цвет границ и названий","space.opacity":"Прозрачность","space.fill_label":"Заливка комнат","space.fill_mode.help":"«Свой цвет» задаёт оформление, а «Свет», «Температура» и «LQI» используют текущие данные Home Assistant; Glow включается отдельно.","space.fill_mode.help.aria":"Подсказка: режим заливки комнат","fill.none":"Нет","fill.lqi":"По силе зигби-сигнала","fill.light":"По освещению","fill.custom":"Свой цвет","space.custom_fill":"Цвет заливки","space.source_file":"У меня есть картинка плана","space.source_draw":"Нет подложки — нарисую комнаты вручную","fill.temp":"По температуре","tip.temp_avg":"средняя температура:","tip.hum_avg":"средняя влажность:","space_card.button":"Перейти к пространству","space_card.not_found":"Пространство «{id}» не найдено","space_card.loading":"Загрузка…","continuity.restore_plan":"Восстанавливаем план…","continuity.restore_connection":"Восстанавливаем подключение к устройствам…","continuity.retry":"Повторить","editor.space":"Пространство","editor.framing":"Кадрирование","editor.fit_content":"Всё видимое содержимое","editor.fit_house":"Плотно по геометрии дома","editor.show_button":"Показывать кнопку","editor.button_label":"Текст кнопки","editor.button_target":"Путь дашборда (куда вести)","marker.sub_entity":"сущность","title.general_settings":"Общие настройки","title.export_pdf":"Сохранить в PDF","pdf.title":"Сохранение в PDF","pdf.dimensions":"Отображать размеры и площади","pdf.decor":"Отображать мебель и другой декор","pdf.room_names":"Отображать названия комнат","pdf.backdrop":"Отображать подложку","pdf.save":"Сохранить","pdf.saving":"Формируем…","pdf.failed":"Не удалось создать PDF.","pdf.too_large":"Размер изображений превышает лимит PDF 25 МБ.","pdf.asset_failed":"Не удалось загрузить подложку или изображение декора.","pdf.scale":"Масштаб 1:{n}","pdf.north":"Север","gs.title":"Общие настройки","gs.light_group":"Заливка: освещение","gs.light_on":"Свет включён","gs.light_off":"Весь свет выключен","gs.temp_group":"Заливка: температура","gs.temp_cold":"Холодно","gs.temp_ok":"Комфорт","gs.temp_hot":"Жарко","gs.lqi_group":"Заливка: зигби-сигнал","gs.lqi_low":"Слабый сигнал","gs.lqi_high":"Сильный сигнал","gs.reset":"Сбросить к умолчаниям","gs.saved":"Общие настройки сохранены","gs.radar_show_live":"Показывать текущее присутствие на плане","gs.radar_show_live_hint":"Скрывает или показывает все живые цели радаров. Это не запускает и не останавливает запись наблюдений.","radar.title":"Присутствие на плане","radar.help":"Свяжите маркер с точными сущностями радара Home Assistant, укажите положение датчика и профиль координат. Живые позиции обрезаются по выбранной комнате.","radar.help.aria":"Подсказка: настройки радара присутствия","radar.enabled":"Использовать этот радар присутствия","radar.show_live":"Показывать живые цели","radar.configure":"Настроить радар","radar.configure_on_plan":"Настроить на плане","radar.change_installation":"Сменить установку","radar.no_contour":"У комнаты нет контура. Точки радара не будут обрезаться по комнате.","radar.discard_setup_title":"Отменить настройку радара?","radar.discard_setup":"Несохранённая настройка радара будет потеряна.","radar.step_place_mount":"Укажите физическое положение датчика","radar.step_place_heading":"Укажите точку прямо перед датчиком","radar.step_reference":"Укажите контрольное положение {n}, затем начните измерение","radar.step_check_reference":"Укажите независимое проверочное положение","radar.start_measure":"Начать измерение","radar.countdown":"Встаньте в отмеченное место через {seconds} с","radar.capturing":"Стойте неподвижно и в одиночестве…","radar.fit_ready":"Калибровка готова","radar.check_third":"Проверить в другом положении","radar.check_complete":"Независимая проверка завершена","radar.error_distance":"Расхождение положения: {distance}","radar.ambiguous_target":"Обнаружено несколько целей. Повторите измерение в одиночестве.","radar.insufficient_samples":"Недостаточно актуальных координат. Повторите или настройте вручную.","radar.bad_references":"Выберите разнесённые положения в разных направлениях от датчика.","radar.ambiguous_sources":"Измерения допускают два одинаково вероятных направления. Выберите точки, по которым можно различить левую и правую стороны.","radar.bad_fit":"Измерения не совпадают. Проверьте единицы, положение датчика и контрольные точки.","radar.desktop_hint":"Для точной настройки используйте компьютер. Редактирование на тач-устройствах поддерживается по остаточному принципу.","radar.detected":"House Plan распознал признаки радара у этого устройства. Перед сохранением проверьте точные источники.","radar.detected_ld2450":"House Plan нашёл набор координат ESPHome LD2450. Перед сохранением проверьте точные источники X/Y.","radar.additional_actions":"Дополнительные действия","radar.declare":"Это радар присутствия","radar.profile":"Профиль данных","radar.profile_esphome_ld2450_v1":"ESPHome LD2450 (цели X/Y)","radar.profile_cartesian_v1":"Декартовы цели (X/Y)","radar.profile_polar_v1":"Полярная цель (дальность/угол)","radar.profile_range_v1":"Только дальность","radar.profile_zones_v1":"Состояния зон","radar.profile_presence_v1":"Только присутствие","radar.room":"Комната радара","radar.room_choose":"Выберите комнату","radar.target":"Цель {n}","radar.axis_x":"Сущность координаты X","radar.axis_y":"Сущность координаты Y","radar.add_target":"Добавить слот цели","radar.range_channel":"Канал дальности {n}","radar.add_range":"Добавить канал дальности","radar.presence_gate":"Сущность присутствия для слота","radar.swap_axes":"Поменять оси X и Y местами","radar.axis_x_sign":"Направление X","radar.axis_y_sign":"Направление Y","radar.distance_source":"Сущность дальности","radar.angle_source":"Сущность угла","radar.angle_unit":"Единица угла","radar.degrees":"Градусы","radar.radians":"Радианы","radar.angle_zero":"Направление нулевого угла","radar.angle_forward":"Вперёд","radar.angle_right":"Вправо","radar.angle_clockwise":"Угол растёт по часовой стрелке","radar.zone_source":"Сущность зоны","radar.occupancy_source":"Сущность присутствия","radar.count_source":"Сущность количества целей","radar.availability_source":"Сущность доступности","radar.source_choose":"Выберите сущность","radar.source_optional":"Необязательно","radar.source_missing":"сейчас недоступна","radar.saved_unsupported":"Сохранённая настройка радара не поддерживается или неполна. Она неактивна; удалите её либо обновите House Plan перед повторной настройкой.","radar.occupancy":"Присутствие (вкл/выкл)","radar.count":"Количество","radar.mount":"Положение и направление","radar.mount_hint":"Это физическое положение датчика. Перемещение его декоративного маркера не меняет установку.","radar.heading":"Направление, °","radar.range_cm":"Дальность, см","radar.fov_deg":"Угол обзора, °","radar.unit":"Единица источника","radar.mirror":"Отразить ось влево/вправо","radar.remove":"Удалить настройки радара","radar.invalid":"Перед сохранением заполните комнату, источники и положение радара.","radar.check_sources":"Проверить живые данные","radar.checking":"Проверяем…","radar.health":"Состояние подключения","radar.live_summary":"Текущих целей: {targets}; дуг дальности: {ranges}","radar.health_ok":"Актуальные данные получены","radar.health_off":"Цели не обнаружены","radar.health_stale":"Часть координат устарела","radar.health_partial":"Часть источников актуальна, часть устарела","radar.health_restricted":"Нет доступа к одному или нескольким источникам","radar.health_incomplete":"Текущий отчёт радара неполон","radar.health_position_unavailable":"Есть присутствие, но актуальное положение недоступно","radar.health_unavailable":"Данные датчика недоступны","radar.health_needs_setup":"Требуется настроить установку","radar.health_inconsistent":"Источники передают противоречивые данные","radar.health_unknown":"Текущее состояние неизвестно","radar.health_disabled":"Радар отключён","radar.error_invalid_radar":"Проверьте настройки радара.","radar.error_invalid_selection":"Выберите существующую комнату и допустимые источники.","radar.error_source_restricted":"Нет доступа ко всем выбранным источникам.","radar.error_rate_limited":"Слишком много запросов. Повторите чуть позже.","radar.error_not_ready":"Обработка данных радара ещё не готова.","radar.error_conflict":"План изменился. Откройте настройку радара заново и повторите попытку.","radar.error_source_unavailable":"Один или несколько выбранных источников радара недоступны.","radar.error_unsupported_capability":"Установленная интеграция не поддерживает эту возможность радара.","radar.report_age":"{seconds} с назад","space.show_lqi":"Показывать зигби-сигнал (LQI) у устройств","space.hide_decor":"Скрыть декоративный слой","space.hide_decor_tip":"Линии, фигуры, надписи и мебель остаются на месте — их видно в редакторе подложки, но не на плане.","space.hide_openings":"Скрыть проёмы","space.hide_openings_tip":"Двери, окна и ворота не рисуются, но продолжают работать: свет проходит, солнце светит в окна, датчики открытия срабатывают. В редакторе плана проёмы видно всегда.","gs.light_none":"Нет источников света","mode.plan":"Редактор плана","mode.devices":"Редактор устройств","display.value":"Значение + состояние","marker.subarea":"без зоны, вручную","device.new":"Новое устройство — откройте его редактор, чтобы снять отметку","opening.unlock_action":"Открыть замок","opening.lock_action":"Закрыть замок","opening.lock_pending":"Выполняется…","title.close_editor":"Закрыть редактор (вернуться к просмотру)","title.add_device":"Добавить устройство на план","devbar.add":"Добавить","devbar.rules":"Правила иконок","device_inbox.button":"Устройства","device_inbox.title":"Устройства на плане","device_inbox.search":"Поиск по устройствам, сущностям и интеграциям…","device_inbox.add_virtual":"Добавить виртуальное устройство","device_inbox.tab_on_plan":"На плане","device_inbox.tab_available":"Доступны","device_inbox.tab_hidden":"Скрытые","device_inbox.tab_readd":"Доступны снова","device_inbox.only_new":"Только новые","device_inbox.show_entities":"Показывать сущности","device_inbox.show_hidden":"Показывать скрытые на плане","device_inbox.show_hidden.help":"Временно показывает на плане скрытые и деактивированные маркеры служебными призраками только в редакторе устройств. Сохранённая видимость устройств не меняется.","device_inbox.show_hidden.help.aria":"Подсказка: показывать скрытые устройства на плане","device_inbox.new":"Новое","device_inbox.find":"Найти на плане","device_inbox.edit":"Настроить","device_inbox.hide":"Скрыть","device_inbox.show":"Показать","device_inbox.add":"Добавить","device_inbox.readd":"Добавить заново","device_inbox.hide_available":"Скрыть из списка","device_inbox.show_more":"Показать ещё","device_inbox.more_actions":"Другие действия","device_inbox.find_hidden_hint":"Сначала включите «Показывать скрытые на плане»","device_inbox.show_disabled":"Перед показом активируйте эту привязку в Home Assistant","device_inbox.empty_on_plan":"На плане пока нет подходящих устройств.","device_inbox.empty_available":"Нет доступных устройств для добавления.","device_inbox.empty_hidden":"Скрытых устройств нет.","device_inbox.empty_readd":"Нет удалённых устройств, доступных для повторного добавления.","device_inbox.reason_visible_auto":"Найдено автоматически","device_inbox.reason_visible_explicit":"Добавлено явно","device_inbox.reason_manual_hidden":"Скрыто пользователем","device_inbox.reason_automatic_hidden":"Скрыто автоматически","device_inbox.reason_service_entry":"Служебная запись реестра","device_inbox.reason_excluded_integration":"Исключена интеграция «{integration}»","device_inbox.reason_excluded_domain":"Непространственный тип сущности","device_inbox.reason_grouped_light":"Представлено группой света комнаты","device_inbox.reason_represented_by_parent":"Представлено родительским устройством","device_inbox.reason_removed":"Ранее удалено с плана","device_inbox.reason_available":"Можно добавить на план","device_inbox.reason_no_bound_room":"Зона HA не связана с комнатой плана","device_inbox.status_ha_disabled":"Отключено в Home Assistant","device_inbox.status_orphaned":"Привязка больше не найдена в Home Assistant","device_inbox.status_unverified":"Реестр Home Assistant временно недоступен","device_inbox.saved":"Список устройств обновлён","device_inbox.filters_excluded":"Исключённые интеграции","device_inbox.filters_group_lights":"Объединять светильники комнаты в один маркер","device_inbox.filters_preview_appear":"появится: {count}","device_inbox.filters_preview_hide":"скроется: {count}","device_inbox.filters_preview_lights":"затронет светильников: {count}","device_inbox.filters_reset":"Вернуть рекомендуемые","device_inbox.filters_save":"Сохранить фильтры","device_inbox.filters_search_ph":"Добавить интеграцию…","device_inbox.filters_title":"Фильтры обнаружения","space.roomcard_section":"В карточке комнаты:","space.label_temp":"Температура","space.label_hum":"Влажность","space.label_lqi":"Средний Zigbee-сигнал","space.label_light":"Свет вкл/выкл","roomcard.light_on":"Вкл","roomcard.light_off":"Выкл","roomcard.light_partial":"{on} из {total}","toast.split_pick_inside":"Промежуточные точки разреза — внутри комнаты","mode.decor":"Редактор подложки","decor.select":"Выбрать","decor.line":"Линия","decor.rect":"Прямоугольник","decor.ellipse":"Овал","decor.text":"Надпись","decor.erase":"Стереть","decor.erase_confirm_title":"Стереть объект?","decor.color":"Цвет","decor.width":"Толщина линии","decor.line_style":"Стиль линии","decor.line_style_solid":"Сплошная","decor.line_style_dashed":"Пунктирная","decor.fill":"Заливка","decor.fill_color":"Цвет заливки","decor.length":"Длина","decor.size":"Размер","decor.flip_h":"Отзеркалить по горизонтали","decor.flip_v":"Отзеркалить по вертикали","decor.angle":"Угол поворота, °","decor.text_size":"Размер текста","decor.backdrop_properties":"Свойства картинки-подложки","decor.text_title":"Надпись","decor.object_title":"Редактирование: {kind}","decor.text_label":"Текст","decor.live_group":"Вставить переменную HA","decor.live_entity":"Сущность","decor.live_entity_ph":"выберите сущность","decor.live_attr":"Значение","decor.live_attr_ph":"выберите состояние или атрибут","decor.live_state":"Состояние","decor.backdrop":"Картинка-подложка","decor.backdrop_hint":"Тяните картинку — перемещение; угол — размер; верхнюю ручку — поворот. Shift меняет пропорции или снимает шаг угла.","decor.backdrop_reset":"Вернуть картинку","decor.backdrop_reset_done":"Картинка вернулась на своё место и в свой размер","marker.icon_auto":"Авто: {icon} (по правилам иконок; выберите свою, чтобы заменить)","marker.icon_pin_auto":"Закрепить","mode.plan_tip":"Редактор плана — геометрия дома: рисование и объединение/разделение комнат, привязка к зонам HA, двери, окна и ворота, карточки комнат, масштаб","mode.devices_tip":"Редактор устройств — всё про значки: перетаскивание, клик — настройка привязки/иконки/отображения, виртуальные устройства, правила иконок","mode.decor_tip":"Редактор подложки — чисто визуальный декор под планом: линии, прямоугольники, овалы и надписи, не реагирующие на клики","space.glow_enabled":"Свечение источников света","gs.glow_group":"Свечение источников света","gs.glow_base":"Темнота дома","gs.glow_light":"Цвет света по умолчанию / интенсивность","gs.wall_group":"Стены","gs.wall_fill":"Цвет заливки стен","gs.glow_radius":"Радиус свечения","gs.glow_radius.help":"Задаёт общий радиус светового пятна в метрах или футах; персональный радиус устройства заменяет это значение.","gs.glow_radius.help.aria":"Подсказка: общий радиус свечения","gs.unit_m":"м","gs.unit_ft":"фут","marker.controls_label":"Управляет другими источниками света","marker.controls.help":"При действии «Переключить состояние» перечисленные источники переключаются вместе с этим маркером. Их световые пятна остаются у собственных маркеров, а эта связь сама по себе не делает управляющий маркер источником света.","marker.controls.help.aria":"Подсказка: управление другими источниками света","marker.controls_filter":"Поиск ламп и выключателей…","info.controls":"Управляет","marker.glow_radius_label":"Радиус свечения","marker.glow_radius.help":"Задаёт радиус свечения в метрах или футах; пустое значение использует радиус из общих настроек.","marker.glow_radius.help.aria":"Подсказка: радиус свечения","markup.wallthick":"Толщина","markup.select":"Выбрать","title.markup_wallthick":"Толщина — клик по стене задаёт толщину от 0 до 100 см.","markup.hint_wallthick":"клик по стене · Esc закрывает без применения","wallthick.field":"Толщина","wallthick.unit_cm":"см","wallthick.unit_in":"дюйм","wallthick.apply_room":"Применить ко всем стенам комнаты","markup.draw_wall_title":"Толщина каждого нового сегмента стены (0–100 см). Общие стены сохраняют существующее значение.","room.queue_progress":"Комната {current} из {total}","toast.wall_rooms_saved":"Создано комнат: {n}","toast.wall_chain_saved":"Цепочка стен сохранена","toast.wallthick_pick":"Кликните по стене","toast.wallthick_set":"Толщина стены задана","toast.wallthick_cleared":"Толщина стены убрана","toast.physical_range":"Введите значение от {min} до {max} {unit}","toast.zero_wall_opening_conflict":"Сначала удалите проём на этом участке стены.","toast.zero_wall_ambiguous":"Не удалось однозначно выбрать участок стены. Уточните геометрию узла.","toast.zero_wall_migration_blocked":"Пространство не преобразовано: {reason}. Данные не изменены.","toast.physical_angle":"Введите угол поворота от 0° до 90°, не включая 90°","toast.physical_limit":"В пространстве достигнут лимит объектов этого типа","toast.geometry_unsafe":"Изменение отменено: геометрию стен нельзя безопасно построить.","junction.limit_angle":"Слишком острый угол между стенами: {actual}°, минимум {limit}°.","junction.limit_valence":"Слишком много стен в одном узле: {actual}, максимум {limit}.","junction.limit_length":"Слишком короткий участок стены: {actual} см, минимум {limit} см.","junction.limit_distance":"Стены и узлы слишком близко: {actual} см, минимум {limit} см.","junction.limit_clearance":"Внутри комнаты не остаётся места: {actual} см², минимум {limit} см².","junction.limit_check_failed":"Проверку стыков выполнить не удалось — изменение не сохранено","toast.wall_model_migration_blocked":"Не удалось обновить модель стен: {reason}. План не изменён. Запустите «Оптимизировать планы»; если ошибка повторится, исправьте конфликтующую геометрию стен.","toast.wall_model_client_outdated":"Обновите карточку и перезагрузите страницу перед редактированием плана.","wall_model.reason.invalid-room":"некорректный контур комнаты","wall_model.reason.zero-length":"отрезок стены нулевой длины","wall_model.reason.third-owner":"стена принадлежит более чем двум комнатам","wall_model.reason.duplicate-id":"конфликт идентификаторов стен","wall_model.reason.thickness-conflict":"конфликт значений толщины стены","wall_model.reason.opening-host":"проём нельзя однозначно привязать к стене","toast.delete_room_pick":"Кликните внутри комнаты, которую нужно удалить","toast.plan_snap_ambiguous":"Увеличьте масштаб, чтобы выбрать узел стены","toast.wall_repair_ambiguous":"У контура несколько возможных соединений. Увеличьте масштаб и соедините стены явно.","toast.wall_repair_too_large":"Разрыв больше 2 см. Соедините стены перед созданием комнаты.","toast.wall_repair_changed":"Геометрия стен изменилась. Попробуйте создать комнату ещё раз.","toast.opening_on_zero_wall":"Проёмы на стене нулевой толщины запрещены","marker.from_ha_option":"Выбрать из списка HA","marker.show_entities":"Показывать сущности","marker.show_entities_tip":"Добавляет в список не только устройства, но и все их сущности","marker.pick_ph":"Выберите устройство…","room.open_area":"Открыть зону в HA","room.fit_action":"Вписать комнату {name}","view.volumetric":"Объёмный вид","view.flat":"Плоский вид","kiosk.title":"Размеры на этом экране","kiosk.hint":"Хранится только на этом устройстве — у каждого настенного планшета или ТВ свои удобные размеры.","kiosk.icon_scale":"Размер значков устройств","kiosk.font_scale":"Размер текста карточек комнат","editor.kiosk":"Режим настенного устройства (киоск)","editor.cycle":"Автосмена пространств каждые N секунд (киоск, 0 = выкл)","room.settings_title":"Настройки комнаты","room.settings_section":"Настройки комнаты (переопределяют пространство)","room.fill_label":"Заливка в ЭТОЙ комнате","fill.inherit":"Как у пространства","room.custom_fill_space":"Цвет пространства","room.custom_fill_own":"Цвет комнаты","room.temp_range_label":"Диапазон комфорта","room.temp_range_min":"Нижняя граница комфортной температуры","room.temp_range_max":"Верхняя граница комфортной температуры","room.temp_range_reset":"Как у пространства","room.temp_range.help":"Диапазон применяется только к этой комнате. Пустое поле наследует соответствующую границу пространства; если границы поменялись местами, House Plan использует меньшую как нижнюю, а большую как верхнюю.","room.temp_range.help.aria":"О диапазоне комфорта комнаты","room.temp_src_label":"Источник температуры","room.hum_src_label":"Источник влажности","room.src_average":"Средняя по датчикам комнаты (по умолчанию)","room.src_pick":"Конкретное устройство или сущность HA","room.src_ph":"Выберите источник…","toast.room_updated":"Комната обновлена","space.card_font":"Размер шрифта карточек комнат (всё пространство)","room.sizes_section":"Размеры шрифтов","room.name_scale":"Размер названия","room.label_scale":"Размер подписей","preview.room_name":"Гостиная","toast.cfg_reload_failed":"Не удалось перечитать план с сервера: {err}","toast.locale_load_failed":"Не удалось загрузить языковой пакет. До перезагрузки страницы используется английский.","toast.furniture_art_load_failed":"Не удалось загрузить изображения мебели. Обновите страницу, чтобы их показать.","room.settings_short":"Настройки комнаты","room.unnamed":"Комната без имени","marker.use_climate_temp":"Учитывать температуру устройства в комнате","marker.use_climate_temp_tip":"Добавляет current_temperature кондиционера или термостата в среднюю температуру комнаты. Внешний бейдж со значением настраивается отдельно ниже.","marker.value_badge_title":"Бейдж со значением","marker.value_badge.help":"Показывает одно выбранное значение рядом со значком. Не влияет на комнатные показатели, свет, Glow и действие по нажатию.","marker.value_badge.help.aria":"Подсказка: бейдж со значением устройства","marker.value_badge_enabled":"Отображать бейдж со значением","marker.value_badge_source":"Значение","marker.value_badge_source.help":"Выберите конкретное состояние, поддерживаемый атрибут или производное значение этого устройства.","marker.value_badge_source.help.aria":"Подсказка: источник значения бейджа","marker.value_badge_position":"Расположение","marker.value_badge_position.help":"Выбранная сторона сохраняется постоянно и не переворачивается автоматически у края плана.","marker.value_badge_position.help.aria":"Подсказка: расположение бейджа","marker.value_badge_right":"Справа","marker.value_badge_bottom":"Снизу","marker.value_badge_left":"Слева","marker.value_badge_top":"Сверху","marker.value_badge_empty":"У этого устройства нет доступных значений","marker.value_badge_static":"Статичный значок не показывает живые значения. Настройка сохранится.","marker.value_badge_missing":"Источник недоступен","marker.value_badge_missing_hint":"Сохранённый источник сейчас недоступен. Можно сохранить его, отключить бейдж или выбрать другой.","marker.value_badge_duplicate":"То же значение уже показано внутри значка.","marker.value_badge_state":"Состояние · {name}","marker.value_badge_marker_state":"Состояние источника света · {name}","marker.value_badge_lqi":"Качество Zigbee-сигнала (среднее)","marker.value_badge_attr_current_temperature":"Текущая температура · {name}","marker.value_badge_attr_temperature":"Целевая температура · {name}","marker.value_badge_attr_current_humidity":"Текущая влажность · {name}","marker.value_badge_attr_humidity":"Влажность · {name}","marker.value_badge_attr_current_position":"Положение · {name}","marker.value_badge_attr_percentage":"Скорость · {name}","marker.value_badge_attr_brightness":"Яркость · {name}","marker.value_badge_attr_volume_level":"Громкость · {name}","marker.value_badge_attr_battery_level":"Заряд батареи · {name}","marker.value_badge_attr_fan_speed":"Скорость вентилятора · {name}","marker.value_source":"Источник значения","marker.value_source.help":"Выберите, что заменит значок. Действие по нажатию не изменится.","marker.value_source.help.aria":"Подсказка: источник значения внутри значка","marker.value_source_auto":"Автоматически (как раньше)","marker.value_source_missing_hint":"Сохранённый источник сейчас недоступен. До его восстановления или выбора другого значения внутри будет показано —.","marker.light_role_label":"Является источником света","marker.light_role.help":"«Авто» использует фактическую роль привязанного устройства, «Всегда» принудительно создаёт собственный источник, а «Никогда» исключает его; связанные лампы выше остаются независимыми.","marker.light_role.help.aria":"Подсказка: является ли устройство источником света","marker.light_role_auto_yes":"Автоматически (источник света)","marker.light_role_auto_no":"Автоматически (не источник света)","marker.light_role_always":"Всегда источник света","marker.light_role_never":"Никогда не источник света","marker.light_entity_label":"Ведущая сущность света","marker.light_entity.help":"Для составного устройства выберите сущность, состояние, цвет и яркость которой представляют этот источник на плане. Автоматический вариант сохраняет совместимость со старыми планами.","marker.light_entity.help.aria":"Подсказка: ведущая сущность света","marker.light_entity_auto":"Автоматически ({entity})","marker.light_entity_none":"нет управляемой сущности","marker.light_entity_missing":"Сохранённая сущность {entity} недоступна. Временно используется {fallback}; выбор восстановится, если сущность вернётся.","marker.toggle_entity_label":"Переключаемая сущность","marker.toggle_entity.help":"Для составного устройства выберите собственную лампу или переключатель, которой управляет нажатие. Автоматический вариант сохраняет прежние правила цели и не зависит от ведущей сущности света.","marker.toggle_entity.help.aria":"Подсказка: переключаемая сущность","marker.toggle_entity_auto":"Автоматически ({entity})","marker.toggle_entity_none":"нет собственной управляемой сущности","marker.toggle_entity_missing":"Сохранённой сущности {entity} больше нет среди выбираемых каналов этого маркера. Временно используется {fallback}; выбор восстановится, если сущность вернётся.","marker.glow_color_label":"Цвет и яркость свечения","marker.glow_mode.help":"Используйте данные источника, задайте только цвет или зафиксируйте цвет и яркость. Минимум — 1%; чтобы отключить источник, выберите «Никогда».","marker.glow_mode.help.aria":"Подсказка: цвет и яркость свечения","marker.glow_mode_auto":"Из источника","marker.glow_mode_color":"Задать цвет","marker.glow_mode_fixed":"Задать цвет и яркость","marker.glow_color":"Цвет свечения","marker.glow_brightness":"Яркость","marker.glow_disabled_never":"Настройки свечения недоступны: маркер явно исключён из источников света.","marker.glow_disabled_auto":"В автоматическом режиме у этого маркера не найден пространственный источник света.","marker.glow_disabled_no_entity":"Для пространственного источника нет активной управляемой сущности Home Assistant.","marker.glow_passive_hint":"У источника нет собственных данных Home Assistant. Задайте цвет и яркость вручную; радиус остаётся доступным.","marker.control_broken":"Сохранённый источник отсутствует или больше не отмечен как источник света","marker.control_missing_label":"Отсутствующий источник на плане","marker.control_passive":"пассивный источник","toast.marker_control_cycle":"Такая связь создаст циклическую цепочку управления светом.","toast.marker_binding_required":"Сначала выберите устройство Home Assistant, затем добавьте управляемый источник света.","confirm.unlock_title":"Открыть замок?","confirm.unlock_body":"House Plan отправит этому замку команду открытия.","toast.files_migrate_failed":"Не удалось перенести вложения к новой привязке, ссылки остались на старые файлы: {err}","space.pick_saved":"Уже загруженные","space.pick_saved_hint":"Планы, сохранённые на сервере, включая отцеплённые ранее","space.no_saved":"На сервере пока нет сохранённых планов.","space.loading":"Загрузка…","space.used_by":"используется: {list}","space.in_use":"План используется пространством — сначала отцепите его","btn.use":"Выбрать","confirm.delete_plan_title":"Удалить файл плана?","confirm.delete_plan_body":"Файл будет удалён с сервера. Это действие нельзя отменить.","toast.plans_list_failed":"Не удалось получить список планов: {err}","toast.plan_delete_failed":"Не удалось удалить план: {err}","marker.hide":"Скрыть","marker.hide_tip":"Устройство исчезнет с плана после сохранения, но продолжит участвовать в расчёте сигнала комнаты. Вернуть его можно через каталог «Устройства» в редакторе устройств.","marker.show":"Показать","marker.show_tip":"Устройство снова появится на плане после сохранения.","marker.hidden_ghost":"Устройство скрыто пользователем","marker.ha_disabled_device":"Устройство деактивировано в Home Assistant и скрыто с плана.","marker.ha_disabled_entity":"Сущность деактивирована в Home Assistant и скрыта с плана.","marker.ha_disabled_all_entities":"У устройства нет активных сущностей Home Assistant, поэтому оно скрыто с плана.","marker.ha_registry_limited":"Полный реестр Home Assistant недоступен этому пользователю. Неподтверждённый объект временно нельзя показывать или использовать.","marker.delete_tip":"Полностью удалить устройство с плана и из всех расчётов. Позже его можно добавить заново.","tap.run":"Запустить автоматизацию/скрипт/сцену","tap.none":"Ничего не делать","marker.run_target_label":"Что запускать","marker.run_search_ph":"Поиск: автоматизация, скрипт или сцена…","marker.run_target_gone":"Цель {id} не найдена — выберите заново","marker.tap_confirm":"Спрашивать подтверждение","marker.tap_confirm_tip":"Перед выполнением показать диалог подтверждения — защита от случайных нажатий.","marker.toggle_hint_single":"Цель: {name} ({id}).","marker.virtual_light_target":"Виртуальный свет: {name}.","marker.virtual_light_current":"Ручное состояние: {state} → {effect}.","marker.virtual_light_state_on":"включён","marker.virtual_light_state_off":"выключен","marker.toggle_hint_group":"Переключатся источники ({count}): {names}.","marker.toggle_hint_current":"Сейчас: {state} → {effect}.","marker.toggle_hint_group_current":"Сейчас включено {on} из {count} → {effect}.","marker.toggle_hint_skipped":"Не будут затронуты ({count}): {targets}.","marker.toggle_effect_turn_on":"включится","marker.toggle_effect_turn_off":"выключится","marker.toggle_effect_open":"откроется","marker.toggle_effect_close":"закроется","marker.toggle_effect_stop":"остановится","marker.toggle_effect_toggle":"состояние переключится","marker.toggle_skip_missing":"не найдено","marker.toggle_skip_ha_disabled":"деактивировано в HA","marker.toggle_skip_unavailable":"недоступно","marker.toggle_skip_unsupported":"переключение не поддерживается","marker.toggle_skip_secure":"заблокировано из соображений безопасности","marker.toggle_none_no_binding":"У устройства нет привязки, состояние переключать нечем. По нажатию ничего не произойдёт.","marker.toggle_none_no_actionable_entity":"У устройства нет состояния, которое можно переключить. По нажатию ничего не произойдёт.","marker.toggle_none_configured_targets_missing":"Настроенные цели сейчас недоступны. Собственная сущность устройства не будет подставлена вместо них.","marker.toggle_none_ha_disabled":"Цель деактивирована в Home Assistant и не может использоваться на плане.","marker.toggle_none_unavailable":"Цель сейчас недоступна. По нажатию ничего не произойдёт.","marker.toggle_none_unsupported":"Для этой сущности Home Assistant не предоставляет безопасного переключения. По нажатию ничего не произойдёт.","marker.toggle_none_secure":"Переключение замков, сигнализации и защитных ворот с плана заблокировано из соображений безопасности.","run.automation":"автоматизация","run.script":"скрипт","run.scene":"сцена","confirm.tap_run":"Запустить «{name}»?","confirm.tap_toggle":"Переключить «{name}»?","confirm.current_state":"Текущее состояние: {state}","confirm.expected_state":"После переключения: {state}","confirm.group_current":"включено {on} из {total}","confirm.group_all_on":"все включены","confirm.group_all_off":"все выключены","confirm.unavailable_targets":"Недоступно: {count}","confirm.expected_by_ha":"Состояние определит Home Assistant","confirm.state_on":"Включено","confirm.state_off":"Выключено","confirm.state_open":"Открыто","confirm.state_closed":"Закрыто","confirm.state_opening":"Открывается","confirm.state_closing":"Закрывается","confirm.state_stopped":"Остановлено","confirm.state_unknown":"Неизвестно","toast.run_started":"Запущено: {name}","toast.run_target_missing":"Цель запуска не найдена — проверьте настройки устройства","toast.run_target_required":"Выберите автоматизацию, скрипт или сцену","toast.tap_target_changed":"Цель действия изменилась. Повторите попытку.","toast.virtual_light_toggle_failed":"Не удалось переключить виртуальный свет: {err}","toast.value_badge_source_required":"Выберите значение для бейджа","btn.run":"Выполнить","vac.section":"Робот-пылесос: живая позиция","vac.autocal":"Настроить автоматически","vac.live":"Живая позиция на плане","vac.trail":"Показывать путь робота","vac.autocal_no_rooms":"Интеграция не отдаёт список комнат — откройте «Подогнать вручную»","vac.route_warn_unmapped":"Робот убирает на карте, которая не сопоставлена ни одному этажу","vac.route_warn_needs_calibration":"Карта сопоставлена этажу, но не откалибрована","vac.route_warn_ambiguous":"Две карты неразличимы — этаж не выбран","vac.route_warn_missing_space":"Пространство этой карты удалено","vac.autocal_no_match":"Не совпали имена комнат (нужно ≥3 общих) — откройте «Подогнать вручную»","vac.autocal_done":"Готово: привязка по {rooms} комнатам. Запустите уборку и проверьте","vac.cal_need_pos":"Робот сейчас не отдаёт координаты — запустите уборку и поставьте на паузу","vac.cal_done":"Калибровка сохранена. Запустите уборку и проверьте","vac.cal_cancelled":"Калибровка отменена","vac.fit":"Подогнать вручную","vac.fit_hint":"Перетащите карту робота на место, растяните за уголки","vac.fit_rotate":"Повернуть 90°","vac.fit_mirror":"Отразить","vac.trail_never":"Не показывать никогда","vac.trail_cleaning":"Во время уборки","vac.trail_always":"Показывать всегда","gs.bg_group":"Фон сцены","gs.bg_color":"Цвет фона вокруг плана","gs.bg_default":"Как в теме","gs.bg_theme":"по умолчанию — из темы","gs.bg_mode":"Фон плана","gs.bg_mode.help":"«Следует за Солнцем» использует sun.sun, а при недоступности — локальные часы браузера; статичный режим всегда показывает выбранный цвет.","gs.bg_mode.help.aria":"Подсказка: общий фон плана","gs.bg_static":"Статичный цвет","gs.bg_daynight":"Следует за Солнцем","gs.sun_group":"Солнце","gs.sun_missing":"Сущность sun.sun не найдена — фон следует локальным часам, а оконные лучи недоступны.","gs.north":"Север на плане","gs.north.help":"Угол отсчитывается по часовой стрелке от верхней вертикали плана; север нужен для оконных лучей, а не для фона «Следует за Солнцем».","gs.north.help.aria":"Подсказка: общее направление севера","gs.north_ph":"не задан","gs.north_clear":"Сбросить","gs.north_letter":"С","gs.sun_rays":"Солнце в окнах","gs.sun_ray_origin":"Лучи солнца","gs.sun_ray_origin.inner":"От внутренних углов окон","gs.sun_ray_origin.outer":"От внешних углов окон","gs.about_version":"Houseplan Card v{v}","gs.about_github":"GitHub · документация и issues","gs.about_telegram":"Чат в Telegram","support.title":"Помощь и обратная связь","space.bg_color":"Цвет фона вокруг плана","space.bg_inherit":"Наследовать общий","space.bg_inherited":"наследуется из общих настроек","space.bg_mode":"Фон плана","space.bg_mode.help":"Выберите наследование общего фона либо переопределите это пространство статичным цветом или режимом «Следует за Солнцем».","space.bg_mode.help.aria":"Подсказка: фон пространства","space.north":"Север на плане (переопределение)","space.north.help":"Переопределяет общий север для этого пространства; угол отсчитывается по часовой стрелке от верхней вертикали плана и используется оконными лучами.","space.north.help.aria":"Подсказка: север для пространства","space.north_inherited":"наследуется: {v}","space.sun_rays":"Солнце в окнах","space.sun_inherit":"Наследовать общий","space.sun_on":"Вкл","space.sun_off":"Выкл","canvas.far_objects":"Объектов далеко от плана: {n}","canvas.show_far":"Показать","canvas.home_tip":"План там — нажмите, чтобы вписать","gs.grid_group":"Обслуживание планов","gs.grid_hint":"Обновляет модели данных, выравнивает элементы по сетке и объединяет лишние фрагменты стен. Перед записью будет показан точный отчёт.","gs.align_all":"Оптимизировать планы","gs.align_title":"Оптимизировать планы","gs.align_none":"Все планы уже используют актуальную и оптимальную модель данных.","gs.optimize_no_automatic_changes":"Автоматических изменений нет. Проверьте пункты ниже.","gs.align_count":"Сдвинется элементов: {n} из {total}, максимум на {cm} см.","gs.align_where":"Наибольший сдвиг — в пространстве «{s}».","gs.align_turned":"Проёмов с исправлением угла: {n}.","gs.align_preflight_failed":"Не удалось безопасно проверить геометрию следующих пространств: {spaces}{more}.","gs.align_preflight_hint":"Планы не изменены. Скопируйте диагностику кнопкой ниже и приложите её к отчёту об ошибке вместе с экспортом пространства.","gs.preflight_reason_prepare-exception":"Не удалось подготовить геометрию пространства (исключение при сборке модели)","gs.preflight_reason_wall-null":"Тело стен не построилось (объединение вернуло пустоту)","gs.preflight_reason_wall-degraded-extra":"Тело стен деградировало с лишней геометрией","gs.preflight_reason_wall-failed-core":"Ядро тела стен не собралось","gs.preflight_reason_wall-exception":"Построение стен упало с исключением","gs.preflight_reason_floor-null":"Контур пола не построился","gs.preflight_reason_floor-exception":"Построение пола упало с исключением","gs.preflight_copy":"Скопировать диагностику","gs.preflight_copied":"Диагностика скопирована","gs.preflight_update_hint":"Версии карточки и интеграции различаются — обновите House Plan и повторите.","gs.align_preflight_space":"Пространство {n}","gs.align_preflight_more":" и ещё {n}","gs.optimize_changes":"Миграций модели: {m}; обновлено пространств: {c}; устранён шум координат: {p}; объединено отрезков реальных стен: {w}; объединено отрезков стен нулевой толщины: {s}; независимых: {i}.","gs.zero_walls_migrated":"Преобразовано виртуальных участков: {n}.","gs.wall_segments_migrated":"Стабилизировано сегментов стен: {n}.","gs.room_drafts_migrated":"Незавершённые контуры преобразованы в обычные стены: {drafts}; отрезков: {segments}.","gs.optimize_lattice_summary":"Канонизировано шумовых значений координат: {n}; максимальный сдвиг: {cm} см.","gs.optimize_lattice_space":"{space}: канонизировано значений координат: {n}; оставлено значений вне сетки: {far}.","gs.optimize_coincident_partitions":"Скрытые участки независимых стен поглощены стенами комнат: {n}.","gs.optimize_openings_rehosted":"Проёмы перепривязаны к стенам комнат: {n}.","gs.optimize_walls_straightened":"Выпрямлено стен: {n}; максимальное перемещение: {cm} см.","gs.optimize_walls_straightened_where":"Максимальная правка стены: {s}.","gs.optimize_walls_straighten_skipped":"Оставлено почти осевых стен, которые нельзя безопасно выпрямить: {n}.","gs.optimize_glow_migration":"Старый Glow: пространств — {spaces} → без заливки данных + независимый Glow; комнат — {rooms} → наследуемая заливка + независимый Glow.","gs.optimize_references":"Исправлено ссылок: пространства — {spaces}; комнаты — {rooms}; позиции — {positions}; устройств отвязано от отсутствующих пространств — {detached}.","gs.optimize_reference_more":", и ещё {n}","gs.optimize_orphans_removed":"Убрано забытых записей: {total} — подписи комнат: {rooms}; устройства: {devices}; групповые метки: {groups}. Все они принадлежали пространствам, удалённым ранее.","gs.optimize_live_positions":"Старые позиции в удалённых пространствах принадлежат существующим объектам: {n}{names}. Они будут сохранены.","gs.optimize_live_positions_remove":"Старые позиции в удалённых пространствах принадлежат существующим объектам: {n}{names}. Они выбраны для удаления.","gs.optimize_live_names":": {names}{more}","gs.optimize_live_remove":"Убрать старые позиции","gs.optimize_live_keep":"Сохранить старые позиции","gs.optimize_live_selected":"Старые позиции будут убраны после применения оптимизации.","gs.optimize_unverified":"Не удалось безопасно проверить позиций: {n}. Они оставлены без изменений.","gs.optimize_registry_limited":"Для безопасной проверки нужен полный доступ администратора к реестрам Home Assistant.","gs.optimize_vacuum_warning":"Сопоставления комнат пылесоса требуют проверки: {n}.","gs.optimize_details":"Подробности","gs.optimize_details_more":"И ещё записей: {n}.","gs.optimize_detail_removed":"будет удалено","gs.optimize_detail_live":"будет сохранено","gs.optimize_detail_unverified":"не проверено","gs.optimize_detail_room_label":"подпись комнаты","gs.optimize_detail_device":"устройство","gs.optimize_detail_group":"групповая метка","gs.optimize_detail_unknown":"неизвестный владелец","gs.optimize_detail_item":"{status}: {kind} {id}; прежнее пространство {space}","gs.align_warn":"Элементы, намеренно поставленные между узлами, будут сдвинуты. После операции доступна одна отмена — только до следующего изменения плана.","gs.align_run":"Оптимизировать","gs.align_done":"Планы оптимизированы: сдвинуто элементов — {n}, обслужено записей — {m}, исправлено ссылок — {r}","gs.optimize_undo":"Отменить последнюю оптимизацию","gs.optimize_undone":"Последняя оптимизация отменена","decor.furniture":"Мебель","decor.image":"Изображение","decor.image_title":"Свои изображения","decor.image_upload":"Загрузить изображение","decor.image_replace":"Заменить изображение","decor.image_uploading":"Загрузка…","decor.image_asset":"Файл изображения","decor.image_pick_hint":"Загрузите изображение или выберите уже используемое в House Plan.","decor.image_place_hint":"Кликните по плану, чтобы разместить изображение.","decor.image_none":"Загруженных изображений пока нет.","decor.image_unavailable":"Изображение недоступно","decor.image_used":"Используется в объектах: {n}","decor.image_upload_failed":"Не удалось загрузить изображение: {err}","decor.image_error_capacity":"Хранилище пользовательских изображений заполнено.","decor.image_in_use":"Перед удалением файла удалите все размещённые копии.","decor.image_delete_title":"Удалить файл изображения?","decor.image_delete_message":"Удалить «{name}» из House Plan? Это действие нельзя отменить.","furn.title":"Библиотека мебели","furn.symbol":"Символ","furn.group_furniture":"Мебель","furn.group_appliance":"Техника","furn.group_sanitary":"Сантехника","furn.group_other":"Прочее","furn.width":"Ширина","furn.depth":"Глубина","furn.back_to_categories":"Все категории","furn.pick_hint":"Выберите категорию, затем символ.","furn.place_hint":"Кликните по плану — предмет встанет к ближайшей стене. Shift — свободно.","furn.cat_air_conditioner":"Кондиционеры","furn.cat_armchair":"Кресла","furn.cat_bathtub":"Ванны","furn.cat_bed":"Кровати","furn.cat_bidet":"Биде","furn.cat_boiler":"Бойлеры","furn.cat_chair":"Стулья","furn.cat_coffee_table":"Журнальные столы","furn.cat_cooktop":"Варочные панели","furn.cat_dining_table":"Обеденные столы","furn.cat_dishwasher":"Посудомоечные машины","furn.cat_dryer":"Сушильные машины","furn.cat_fireplace":"Камины","furn.cat_fridge":"Холодильники","furn.cat_kitchen_cabinet":"Кухонные шкафы","furn.cat_kitchen_sink":"Кухонные мойки","furn.cat_nightstand":"Тумбы","furn.cat_plant":"Растения","furn.cat_rug":"Ковры","furn.cat_shelving":"Стеллажи","furn.cat_shower":"Душевые","furn.cat_sink":"Раковины","furn.cat_sofa":"Диваны","furn.cat_stairs":"Лестницы","furn.cat_toilet":"Унитазы","furn.cat_tv":"Телевизоры","furn.cat_wardrobe":"Шкафы","furn.cat_washer":"Стиральные машины","furn.cat_work_table":"Рабочие столы","furn.sym_sofa":"Диван двухместный","furn.sym_sofa_three_seat":"Диван трёхместный","furn.sym_sofa_corner_right":"Угловой диван, правый","furn.sym_armchair":"Кресло мягкое","furn.sym_armchair_office":"Кресло офисное","furn.sym_coffee_table":"Журнальный стол, прямоугольный","furn.sym_coffee_table_round":"Журнальный стол, круглый","furn.sym_coffee_table_oval":"Журнальный стол, овальный","furn.sym_coffee_table_rounded":"Журнальный стол, скруглённый","furn.sym_table_dining":"Обеденный стол, прямоугольный","furn.sym_table_round":"Круглый стол","furn.sym_table_dining_oval":"Обеденный стол, овальный","furn.sym_table_dining_rounded":"Обеденный стол, скруглённый","furn.sym_chair":"Стул","furn.sym_chair_bar":"Барный стул","furn.sym_desk":"Рабочий стол, прямоугольный","furn.sym_desk_corner":"Рабочий стол, угловой","furn.sym_bed_double":"Двуспальная кровать","furn.sym_bed_single":"Односпальная кровать","furn.sym_nightstand":"Тумба прикроватная","furn.sym_cabinet_tv":"Тумба под телевизор","furn.sym_cabinet_shoe":"Тумба для обуви","furn.sym_cabinet_sink":"Тумба под раковину","furn.sym_wardrobe":"Шкаф гардеробный","furn.sym_bookshelf":"Шкаф книжный","furn.sym_wall_unit":"Шкаф-стенка","furn.sym_kitchen_floor":"Кухонный напольный модуль","furn.sym_kitchen_floor_corner":"Кухонный напольный угловой модуль","furn.sym_kitchen_wall":"Кухонный навесной модуль","furn.sym_kitchen_wall_corner":"Кухонный навесной угловой модуль","furn.sym_shelf_floor":"Стеллаж напольный","furn.sym_shelf_wall":"Полка настенная","furn.sym_fridge":"Холодильник","furn.sym_stove":"Варочная панель, 4 конфорки","furn.sym_cooktop_two":"Варочная панель, 2 конфорки","furn.sym_dishwasher":"Посудомоечная машина","furn.sym_washer":"Стиральная машина","furn.sym_dryer":"Сушильная машина","furn.sym_tv":"Телевизор на подставке","furn.sym_tv_wall":"Телевизор на кронштейне","furn.sym_ac":"Кондиционер","furn.sym_water_heater":"Бойлер","furn.sym_toilet":"Унитаз напольный","furn.sym_toilet_built_in":"Унитаз встроенный","furn.sym_bathtub":"Ванна прямоугольная","furn.sym_bathtub_corner":"Ванна угловая","furn.sym_shower":"Душ","furn.sym_sink":"Раковина","furn.sym_kitchen_sink":"Кухонная мойка одинарная","furn.sym_kitchen_sink_double":"Кухонная мойка двойная","furn.sym_bidet":"Биде напольное","furn.sym_bidet_built_in":"Биде встроенное","furn.sym_stairs":"Лестница","furn.sym_fireplace":"Камин","furn.sym_plant":"Растение","furn.sym_rug":"Ковёр","common.yes":"Да","common.no":"Нет","vac.diag_source":"Источник","vac.diag_platform":"Интеграция","vac.diag_status":"Статус","vac.diag_position":"Позиция","vac.diag_rooms":"Комнаты","vac.diag_rooms_value":"{total} · совпало имён: {matched} · {readiness}","vac.autocal_ready":"автокалибровка доступна","vac.autocal_not_ready":"нужно 3 совпавших имени","vac.diag_path":"Путь интеграции","vac.diag_map":"ID карты","vac.source_none":"не выбран","vac.source_status_ok":"Готов","vac.source_status_missing":"Не найден","vac.source_status_disabled":"Деактивирован в Home Assistant","vac.source_status_unavailable":"Недоступен","vac.source_status_unverified":"Нельзя проверить с текущими правами","vac.source_status_unsupported":"Нет данных позиции","vac.source_status_none":"Нет источника","vac.source_banner_missing":"Сохранённый источник больше не существует. Он не заменён автоматически: выберите другой или восстановите его в Home Assistant.","vac.source_banner_disabled":"Сохранённый источник деактивирован в Home Assistant. Активируйте его там или выберите другой.","vac.source_banner_unverified":"Текущих прав Home Assistant недостаточно для проверки источника. Привязка сохранена и не будет заменена автоматически.","vac.choose_source":"Выбрать источник","vac.source_auto":"Автоматически","vac.source_auto_hint":"Использовать совместимую сущность этого устройства","vac.all_cameras":"Все камеры","vac.all_cameras_warn":"Камера может не отдавать данные робота. Выбирайте её только если это карта вашего пылесоса.","vac.all_cameras_empty":"Других сущностей камеры не найдено.","vac.platform_unknown":"интеграция неизвестна","vac.cap_position":"позиция","vac.cap_rooms_short":"комнаты","vac.cap_path":"путь","vac.cap_map":"ID карты","vac.cap_none":"данные робота не обнаружены","vac.xcme_hint":"Включите атрибуты Xiaomi Cloud Map Extractor:","vac.documentation":"Документация","vac.residual_title":"Проверьте автокалибровку","vac.residual_message":"Совпавшие комнаты расходятся максимум на {error}. Примените приблизительную калибровку, подгоните её вручную либо отмените без изменения сохранённых настроек.","vac.apply_proposal":"Применить","gs.backup_group":"Резервная копия и перенос","gs.backup_hint":"Скачайте переносимую JSON-копию или проверьте и импортируйте копию, созданную House Plan.","backup.export_open":"Экспорт","backup.import_open":"Импорт","backup.export_title":"Экспорт House Plan","backup.import_title":"Импорт House Plan","backup.export_hint":"Выберите, должна ли копия содержать всю конфигурацию House Plan или только текущее пространство.","backup.full":"Полная копия","backup.current_space":"Текущее пространство","backup.current_space_title":"Текущее пространство: {title}","backup.no_current_space":"Нет текущего пространства","backup.plan_only":"Только планировка","backup.plan_only_hint":"Сохранить комнаты, стены, проёмы, декор и позиции подписей комнат без устройств и привязок Home Assistant.","backup.plan_only_preview":"Файл содержит только планировку","backup.privacy_warning":"Архив сохраняет названия, идентификаторы Home Assistant и точные координаты. Внутренние планы и вложения указываются ссылками, но не вкладываются; текущие состояния и маршруты пылесосов не включаются.","backup.download":"Скачать JSON","backup.export_done":"Резервная копия скачана","backup.reading":"Проверяем резервную копию…","backup.revalidated":"После предпросмотра план изменился. Сводка обновлена — проверьте её и подтвердите ещё раз.","backup.error.support_invalid_message":"Проверьте сообщение для поддержки и повторите попытку.","backup.error.support_package_too_large":"Обезличенный пакет для поддержки превышает лимит 8 МиБ.","backup.error.support_preview_expired":"Предпросмотр вложения для поддержки истёк или больше недоступен.","backup.error.support_rate_limited":"Запрошено слишком много репортов или предпросмотров. Повторите позже.","backup.error.support_rejected":"Репорт не прошёл проверку службы поддержки.","backup.error.support_unavailable":"Закрытая служба поддержки временно недоступна.","backup.error.unauthorized":"У вас нет прав на экспорт или импорт этого плана.","backup.error.not_ready":"House Plan ещё не готов. Повторите попытку через несколько секунд.","backup.error.too_large":"Размер резервной копии превышает 8 МиБ.","backup.error.invalid_json":"Выбранный файл не является корректным JSON.","backup.error.invalid_format":"Выбранный файл не является резервной копией House Plan.","backup.error.invalid_image":"Изображение повреждено или не соответствует своему формату.","backup.error.unsupported_export_version":"Эта версия формата резервной копии не поддерживается установленной версией.","backup.error.unsupported_image":"Используйте поддерживаемое изображение PNG, JPEG, WebP или SVG.","backup.error.future_model":"Резервная копия создана в более новой версии модели данных House Plan.","backup.error.invalid_config":"Резервная копия содержит некорректную конфигурацию House Plan.","backup.error.wall_model_migration_blocked":"Не удалось безопасно обновить модель стен из резервной копии. Сначала оптимизируйте исходный план и повторите экспорт.","backup.error.invalid_layout":"Резервная копия содержит некорректные позиции объектов.","backup.error.invalid_content":"Резервная копия содержит некорректные или несогласованные ссылки на файлы.","backup.error.space_not_found":"Выбранное пространство больше не существует.","backup.error.capacity_exceeded":"Добавление этой копии превысит ограничения размера плана.","backup.error.preview_expired":"Время предпросмотра истекло. Выберите файл резервной копии заново.","backup.error.preview_owner_mismatch":"Этот предпросмотр принадлежит другому пользователю Home Assistant.","backup.error.conflict":"После предпросмотра план изменился. Проверьте обновлённую сводку.","backup.error.content_confirmation_required":"Подтвердите отсоединение недоступных локальных файлов.","backup.error.commit_failed":"Не удалось безопасно применить копию. Предыдущий план восстановлен или ожидает восстановления.","backup.error.missing_plan":"После предпросмотра исчез связанный файл плана. Проверьте копию ещё раз.","backup.error.missing_content":"После предпросмотра исчез связанный локальный файл. Проверьте копию ещё раз.","backup.error.marker_control_missing":"В резервной копии отсутствует связанный источник света на плане.","backup.error.marker_control_not_light":"Связанная цель больше не отмечена как источник света.","backup.error.marker_control_self":"Источник света не может управлять самим собой.","backup.error.marker_control_cycle":"Резервная копия содержит циклическую цепочку управления светом.","backup.error.duplicate_marker_control":"Резервная копия содержит повторяющуюся связь с источником света.","backup.error.no_backup":"Нет снимка импорта или оптимизации, который можно восстановить.","backup.error.in_use":"Элемент ещё используется","backup.error.invalid_data":"Запрос содержит некорректные данные","backup.error.invalid_light_entity":"Ведущий свет должен быть сущностью light.* или switch.*","backup.error.invalid_marker_control":"Некорректная ссылка управления маркером","backup.error.invalid_name":"Некорректное имя","backup.error.invalid_partition_opening_host":"Проём должен сохранить свою перегородку-носитель","backup.error.invalid_partition_opening_jamb_margin":"Проём не оставляет физического простенка у края стены","backup.error.invalid_passage_fields":"Открытый проход не может нести настройки двери","backup.error.invalid_space_id":"Неизвестное пространство","backup.error.invalid_toggle_entity":"Сущность переключения должна быть light.* или switch.*","backup.error.invalid_value_badge":"Некорректные настройки бейджа значения","backup.error.invalid_value_badge_attribute":"Некорректный атрибут бейджа значения","backup.error.invalid_value_badge_position":"Некорректная позиция бейджа значения","backup.error.invalid_value_badge_source":"Некорректный источник бейджа значения","backup.error.invalid_vacuum_map_route":"Проверьте сопоставление карт робота пространствам.","backup.error.invalid_value_source":"Некорректный источник значения","backup.error.invalid_value_source_attribute":"Некорректный атрибут источника значения","backup.error.io_error":"Файловая операция на сервере не удалась","backup.error.not_toggleable":"Это устройство нельзя переключить","backup.error.nothing_to_repair":"Нечего чинить","backup.error.space_in_use":"На пространство ещё есть ссылки","backup.error.value_badge_source_required":"Бейджу значения нужен источник","backup.error.wall_model_client_outdated":"План обновлён в другом месте — перезагрузите страницу","backup.same_source":"Создано на этом экземпляре Home Assistant","backup.foreign_source":"Создано на другом экземпляре Home Assistant","backup.created":"Создано: {value}","backup.versions":"Карточка {card}; интеграция {integration}; модель данных {model}","backup.count_spaces":"Пространств: {n}","backup.count_rooms":"Комнат: {n}","backup.count_walls":"Стен: {n}","backup.count_openings":"Проёмов: {n}","backup.count_decor":"Объектов декора: {n}","backup.count_markers":"Устройств: {n}","backup.count_layout":"Позиций: {n}","backup.bindings":"Привязки — устройства: {device}, сущности: {entity}, виртуальные: {virtual}; позиций без пространства: {legacy}","backup.binding_status":"Статус на целевом экземпляре — активных: {active}, деактивированных: {disabled}, отсутствующих: {missing}","backup.missing_areas":"На целевом экземпляре отсутствуют зоны: {areas}","backup.dropped_marker_links":"Связи с источниками света вне переносимого пространства пропущены: {n}.","backup.room_drafts_migrated":"Старые незавершённые контуры преобразованы в обычные стены: {drafts}; отрезков: {segments}.","backup.repaired_target_refs":"Существующих ссылок восстановлено этим импортом: {n}.","backup.preserved_unresolved_refs":"Неоднозначные ссылки сохранены без изменений: {n}.","backup.preserved_unresolved_hint":"House Plan ничего не угадывал и не удалял. После импорта запустите «Оптимизировать планы», чтобы проверить оставшиеся ссылки.","backup.import_details":"Подробности восстановления ссылок","backup.import_detail.incoming_remapped":"Ссылок обновлено внутри импортируемой копии: {n}","backup.import_detail.target_repaired":"Существующих ссылок восстановлено: {n}","backup.import_detail.preserved_unresolved":"Неразрешимых ссылок сохранено: {n}","backup.import_detail.collisions":"Конфликтов назначения безопасно сохранено: {n}","backup.import_detail.dropped_links":"Входящих связей пропущено по правилам переноса: {n}","backup.import_detail.bounded_lineages":"Чрезмерно вложенных идентификаторов ограничено: {n}","backup.replace_warning":"Текущая конфигурация и расположение будут заменены. Загруженные файлы не удаляются. Одну отмену можно выполнить до следующего изменения плана.","backup.foreign_bookkeeping":"Служебные списки известных и новых устройств другого экземпляра импортированы не будут.","backup.final_name":"Название нового пространства","backup.target_settings":"Глобальные настройки целевого экземпляра не изменятся.","backup.duplicates":"Уже существующих привязок: {n}","backup.skip":"Пропустить повторяющиеся устройства","backup.virtual_copy":"Добавить безопасные статичные виртуальные копии","backup.content":"Связанное содержимое","backup.decor_images_summary":"Свои изображения: объектов — {objects}, файлов — {assets}; отсутствует файлов — {missing}.","backup.content_available":"доступно локально","backup.content_external":"внешняя ссылка","backup.content_detach_required":"будет отвязано","backup.confirm_detach":"Я понимаю, что недоступные внутренние планы и вложения будут отвязаны от импортируемой конфигурации.","backup.confirm_missing_images":"Я понимаю, что отсутствующие свои изображения останутся восстанавливаемыми заглушками, а остальные недоступные локальные файлы будут отвязаны.","backup.replace":"Заменить","backup.add":"Добавить пространство","backup.space_done":"Пространство импортировано: комнат — {rooms}, устройств — {markers}, существующих ссылок восстановлено — {refs}","backup.full_done":"Копия восстановлена: пространств — {spaces}, комнат — {rooms}, устройств — {markers}","backup.undo_import":"Отменить последний полный импорт","backup.import_undone":"Полный импорт отменён","backdrop.large_title":"Большое изображение","backdrop.large_body":"Изображение {w}×{h} ({fileMb} МБ), для показа потребуется около {decodedMb} МБ памяти. На планшетах это может привести к падению страницы.","backdrop.unknown_body":"Не удалось прочитать размеры изображения — файл может быть повреждён. Продолжение может привести к падению страницы на планшете.","backdrop.reduced_dimensions":"Уменьшенная копия: {w}×{h} px.","backdrop.use_downscaled":"Загрузить уменьшенную копию","backdrop.reducing":"Уменьшаем…","backdrop.keep_original":"Оставить оригинал","backdrop.too_large_title":"Изображение слишком большое","backdrop.too_large_body":"Изображение превышает возможности браузера ({w}×{h}, предел {limit} px по стороне). Уменьшите его в редакторе на компьютере и загрузите снова.","backdrop.downscale_failed":"Не удалось создать уменьшенную копию. Текущий план не изменён."}},{code:"de",nativeLabel:"Deutsch",loadDictionary:async function(e){const t=0===e?await import("./de-DCJ5g8AN.js"):await import(new URL("./de-DCJ5g8AN.js?retry",import.meta.url).href);return{dictionary:t.dictionary,fingerprint:t.fingerprint}}},{code:"fr",nativeLabel:"Français",loadDictionary:async function(e){const t=0===e?await import("./fr-Y07FWZ2v.js"):await import(new URL("./fr-Y07FWZ2v.js?retry",import.meta.url).href);return{dictionary:t.dictionary,fingerprint:t.fingerprint}}}],fp=dp,vp=new Set;const yp=new class{constructor(e,t,i=console.warn,n){this.entries=e,this.expectedFingerprint=t,this.warn=i,this.loadFailed=n,this.dictionaries=new Map,this.pending=new Map,this.failed=new Set;for(const t of e)t.dictionary&&this.dictionaries.set(t.code,t.dictionary)}state(e){return this.dictionaries.has(e)?"ready":this.failed.has(e)?"fallback":"pending"}dictionary(e){return this.dictionaries.get(e)}ensure(e){if("pending"!==this.state(e))return Promise.resolve();const t=this.pending.get(e);if(t)return t;const i=this.entries.find(t=>t.code===e),n=this.load(i).finally(()=>this.pending.delete(e));return this.pending.set(e,n),n}async load(e){if(!e?.loadDictionary)return void(e&&this.failed.add(e.code));let t;for(const i of[0,1])try{const t=await e.loadDictionary(i);if(t.fingerprint!==this.expectedFingerprint)throw new Error(`locale fingerprint mismatch for ${e.code}`);return this.dictionaries.set(e.code,t.dictionary),void this.failed.delete(e.code)}catch(e){t=e}this.failed.add(e.code),this.warn(`[houseplan] unable to load ${e.code} locale; using English`,t),this.loadFailed?.(e.code)}}(gp,"4da0d706a85c3f1c08ab6de960deb5feb08baaf9055265234e7bd1b554332653",console.warn,function(e){for(const t of vp)t(e)});function bp(e){const t=xp(e)?.code??"en";return yp.dictionary(t)??fp}function wp(e){return"string"==typeof e?e.trim().replaceAll("_","-").toLowerCase():""}const kp=new Map(gp.map(e=>[wp(e.code),e]));function xp(e){return kp.get(wp(e))}function Sp(e,t){const i=[{value:"",label:e},...gp.map(({code:e,nativeLabel:t})=>({value:e,label:t}))],n="string"==typeof t?t:"";return n&&!i.some(e=>e.value===n)&&i.push({value:n,label:xp(n)?.nativeLabel??n}),i}function $p(e,t){return function(e,t,i,n){const r=new Map(i.map(e=>[wp(e),e])),o=r.get(wp(e));if(o)return o;const s=wp(t),a=r.get(s);return a||(r.get(s.split("-")[0]||"")??n)}(t,e?.locale?.language||e?.language,gp.map(({code:e})=>e),"en")}function Mp(e,t,i){return on(bp(e)[t]??fp[t]??t,i)}function Rp(e,t){const i=bp(e)[t]??fp[t];return"string"==typeof i&&i.trim().length>0}function Cp(e,t,i,n){return{ox:0,oy:0}}function Tp(e,t){const i=(e.angle+90)*Math.PI/180,n=Wa(16,t),r=e.gateFace?-n*e.gateFace.side:n*(e.flipV?-1:1);return[[e.x+Math.cos(i)*r,e.y+Math.sin(i)*r],r<0]}function Dp(e){const t=e.length/2,i=e.face.cm>0?e.face.cm/e.cellCm*e.gridPitch/2:Wa(4,e.cellCm),n="gate"===e.type?Math.sin(10*Math.PI/180)*t:0;return{half:t,jambHalf:i,gateDepth:n,outlineHalf:Math.max(Wa(16,e.cellCm),i+Wa(8,e.cellCm),n+Wa(8,e.cellCm)),hitHalf:Math.max(Wa(20,e.cellCm),i+Wa(10,e.cellCm),n+Wa(12,e.cellCm))}}function Ap(e,t,i){e.minX=Math.min(e.minX,t),e.minY=Math.min(e.minY,i),e.maxX=Math.max(e.maxX,t),e.maxY=Math.max(e.maxY,i)}function Pp(e,t,i,n,r,o,s,a){const l=Math.min(s,a)*Math.PI/180,c=Math.max(s,a)*Math.PI/180,h=(e,t)=>{const i=Math.atan2(t,e),n=[l,c];for(let e=-3;e<=3;e++){const t=e*Math.PI-i,r=Math.PI/2+e*Math.PI-i;t>l&&tl&&r0&&[e.length,e.angle,t[0],t[1]].every(Number.isFinite)))return null;const{half:i,jambHalf:n}=Dp(e),r=ja(e.cellCm),o=1.75*r,s=1.25*r,a=.75*r,l={minX:-i-s,minY:-n-s,maxX:i+s,maxY:n+s},c={minX:1/0,minY:1/0,maxX:-1/0,maxY:-1/0};if("window"===e.type)Pp(c,-i,0,i,-o,o,-90,0),Pp(c,i,-i,0,-o,o,0,90),Ap(c,-i-a,-i-a),Ap(c,i+a,a);else if("gate"===e.type){const t=10*e.face.side;Pp(c,-i,0,i,-o,o,0,t),Pp(c,i,-i,0,-o,o,-t,0)}else Pp(c,-i,0,e.length,-o,o,-90,0),Ap(c,-i-a,-e.length-a),Ap(c,i+a,a);const[h,d]=Fp(e),u={...l};Ap(u,c.minX+h,c.minY+d),Ap(u,c.maxX+h,c.maxY+d);const p=e.flipH?-1:1,_="gate"===e.type?1:e.flipV?-1:1,m=e.angle*Math.PI/180,g=Math.cos(m),f=Math.sin(m),v={minX:1/0,minY:1/0,maxX:-1/0,maxY:-1/0};for(const e of[u.minX,u.maxX])for(const i of[u.minY,u.maxY]){const n=e*p,r=i*_;Ap(v,t[0]+n*g-r*f,t[1]+n*f+r*g)}return v}function Ip(e){if("passage"===e.type)return W``;const t=Math.max(0,Math.min(1,e.amount)),{half:i,jambHalf:n}=Dp(e),r=ja(e.cellCm),o=1.75*r,s=e.flipH?-1:1,a=e.flipV?-1:1,l="gate"===e.type?1:a,[c,h]=Fp(e);let d;if("window"===e.type){const o=Math.PI/2*i,s=e.face.cm>0?W``:W``;d=W`
${l}
`}_renderRoomSource(e){return this._editorRuntimeOrThrow()._renderRoomSource(e)}_renderRoomDialog(){return this._editorRuntimeOrThrow()._renderRoomDialog()}}Sv.properties={_tabDrag:{state:!0},_hdrH:{state:!0},_booting:{state:!0},_bootFading:{state:!0},_bootSoft:{state:!0},_continuityEpoch:{state:!0},_editorRuntimeLoadingVisible:{state:!0},_backdropGuard:{state:!0},_tapConfirm:{state:!0},_dangerConfirm:{state:!0},hass:{attribute:!1},panelHost:{type:Boolean,attribute:"panel-host",reflect:!0},narrow:{attribute:!1},_config:{state:!0},_space:{state:!0},_devices:{state:!0},_selId:{state:!0},_toast:{state:!0},_mode:{state:!0},_tool:{state:!0},_wallDialog:{state:!0},_drawWallField:{state:!0},_activeWallChainId:{state:!0},_physicalSel:{state:!0},_physicalDialog:{state:!0},_partitionDeleteDialog:{state:!0},_roomDeleteDialog:{state:!0},_physicalDrag:{state:!0},_physicalRotate:{state:!0},_duplicateColumnId:{state:!0},_opMeasure:{state:!0},_path:{state:!0},_cursorPt:{state:!0},_mergeSel:{state:!0},_openingPreset:{state:!0},_openingDialog:{state:!0},_openingInfo:{state:!0},_mergeDialog:{state:!0},_splitSel:{state:!0},_decorTool:{state:!0},_decorStyle:{state:!0},_decorDraft:{state:!0},_decorSel:{state:!0},_decorEraseConfirm:{state:!0},_decorTextDialog:{state:!0},_decorShapeDialog:{state:!0},_backdropDialog:{state:!0},_furnPalette:{state:!0},_decorImagePalette:{state:!0},_decorAssetCatalog:{state:!0},_decorAssetBusy:{state:!0},_furnCategory:{state:!0},_furnPreviewInput:{state:!0},_bdDrag:{state:!0},_dtBox:{state:!0},_dtDrag:{state:!0},_kioskDialog:{state:!0},_vacFit:{state:!0},_vacAllCamerasFor:{state:!0},_vacCalConfirm:{state:!0},_kioskDots:{state:!0},_areaSel:{state:!0},_nameSel:{state:!0},_roomDialog:{state:!0},_roomEditId:{state:!0},_roomFill:{state:!0},_roomCustomFill:{state:!0},_roomTempMin:{state:!0},_roomTempMax:{state:!0},_roomTempSrc:{state:!0},_roomHumSrc:{state:!0},_roomSrcOpen:{state:!0},_roomSrcFilter:{state:!0},_roomNameScale:{state:!0},_roomLabelScale:{state:!0},_spaceDialog:{state:!0},_infoCard:{state:!0},_deviceInbox:{state:!0},_rulesDialog:{state:!0},_settingsDialog:{state:!0},_pdfDialog:{state:!0},_supportDialog:{state:!0},_alignDialog:{state:!0},_preflightClipboardFallback:{state:!0},_backupExportDialog:{state:!0},_backupImportDialog:{state:!0},_importDialog:{state:!0},_markerDialog:{state:!0}},Sv.ZOOM_MAX=8,Sv.ZOOM_MIN=1/3,Sv.styles=[hp,vg],customElements.get("houseplan-card")||customElements.define("houseplan-card",Sv),window.customCards=window.customCards||[],window.customCards.find(e=>"houseplan-card"===e.type)||window.customCards.push({type:"houseplan-card",name:"House Plan Card",description:"Interactive house plan: spaces, rooms and devices with live states and drag layout."}),console.info(`%c HOUSEPLAN-CARD %c v${ov} `,"background:#3ea6ff;color:#04121f;font-weight:700","");export{Yl as $,G as A,Ep as B,$_ as C,le as D,U as E,Og as F,wi as G,Ur as H,$i as I,Mi as J,Ut as K,Ci as L,ol as M,Ka as N,Mo as O,ni as P,Bo as Q,A_ as R,P_ as S,Ss as T,ao as U,Zo as V,_i as W,Yo as X,U_ as Y,ql as Z,cl as _,dh as a,kr as a$,Gl as a0,Fs as a1,gs as a2,Ps as a3,ia as a4,Ls as a5,Ac as a6,Dc as a7,si as a8,nl as a9,eu as aA,tu as aB,Dg as aC,ti as aD,oi as aE,zn as aF,Vn as aG,gm as aH,Fr as aI,_m as aJ,El as aK,Wl as aL,rc as aM,tl as aN,oc as aO,Jl as aP,ws as aQ,oa as aR,os as aS,fa as aT,Ba as aU,j_ as aV,ya as aW,Is as aX,Eg as aY,gn as aZ,br as a_,tp as aa,cp as ab,zs as ac,Ro as ad,ap as ae,Qu as af,is as ag,Os as ah,ip as ai,la as aj,da as ak,ko as al,So as am,no as an,B_ as ao,Qo as ap,rl as aq,Xo as ar,Xa as as,Za as at,nn as au,rn as av,Xi as aw,Zi as ax,el as ay,uc as az,oh as b,F_ as b$,wr as b0,yr as b1,mn as b2,Oe as b3,Rp as b4,df as b5,Io as b6,ll as b7,Qt as b8,ei as b9,Hr as bA,jr as bB,qr as bC,zr as bD,Dr as bE,Pr as bF,Er as bG,Un as bH,Tr as bI,Ar as bJ,tc as bK,Lr as bL,ic as bM,Xl as bN,Ul as bO,nc as bP,Ql as bQ,ec as bR,cm as bS,ns as bT,Dp as bU,sp as bV,Jf as bW,op as bX,pa as bY,Vf as bZ,Qf as b_,Gr as ba,ba as bb,$c as bc,q_ as bd,$o as be,qu as bf,V_ as bg,yi as bh,mi as bi,Fi as bj,Ha as bk,Ma as bl,$a as bm,es as bn,ts as bo,ra as bp,Rl as bq,Oa as br,Ia as bs,Zn as bt,Jn as bu,ki as bv,bs as bw,ys as bx,K_ as by,Y_ as bz,j as c,Gf as c$,li as c0,np as c1,lp as c2,Di as c3,fi as c4,ai as c5,vi as c6,rs as c7,zi as c8,Cn as c9,Q_ as cA,G_ as cB,Or as cC,fn as cD,Ng as cE,uo as cF,xr as cG,Ee as cH,qe as cI,Ne as cJ,Vc as cK,Jc as cL,ah as cM,Lc as cN,Qc as cO,Kc as cP,Yc as cQ,sh as cR,nh as cS,Oc as cT,Fc as cU,jn as cV,zc as cW,Wn as cX,ci as cY,Kf as cZ,Ip as c_,Yp as ca,Xp as cb,Md as cc,Pu as cd,qi as ce,Vi as cf,Xn as cg,qn as ch,Zd as ci,nm as cj,xo as ck,Qd as cl,Xd as cm,_n as cn,dn as co,hn as cp,Ga as cq,N_ as cr,cn as cs,ln as ct,an as cu,sn as cv,Ua as cw,Rc as cx,Mc as cy,nv as cz,sa as d,ua as d$,Tl as d0,Es as d1,ds as d2,us as d3,Ie as d4,du as d5,Zp as d6,Jp as d7,su as d8,Bu as d9,Co as dA,pi as dB,nu as dC,ou as dD,il as dE,Ol as dF,Ic as dG,of as dH,sf as dI,Cp as dJ,lf as dK,uf as dL,Ml as dM,af as dN,cf as dO,Da as dP,Js as dQ,Tp as dR,Ri as dS,k_ as dT,Cf as dU,Tf as dV,mf as dW,S_ as dX,ja as dY,Wr as dZ,Ea as d_,Bd as da,Ld as db,Od as dc,Cd as dd,Pn as de,$d as df,Jd as dg,Tn as dh,g_ as di,Hp as dj,Ed as dk,Nd as dl,Td as dm,Ru as dn,ji as dp,Hi as dq,Li as dr,Lp as ds,Bi as dt,Ni as du,Cc as dv,Va as dw,Tc as dx,Wi as dy,Ui as dz,pe as e,Ir as e0,Nr as e1,Na as e2,Pl as e3,X_ as e4,La as e5,pm as e6,Sp as e7,_p as e8,yp as e9,mp as ea,Jt as eb,$g as ec,Z_ as ed,Ji as ee,Qi as ef,Wt as eg,Sv as eh,rh as f,Ao as g,Fo as h,_e as i,Po as j,Wa as k,$p as l,Oo as m,ch as n,_h as o,o as p,he as q,ph as r,on as s,Kt as t,hp as u,Mp as v,W as w,e_ as x,w_ as y,x_ as z};
+ `}_renderRoomSource(e){return this._editorRuntimeOrThrow()._renderRoomSource(e)}_renderRoomDialog(){return this._editorRuntimeOrThrow()._renderRoomDialog()}}Sv.properties={_tabDrag:{state:!0},_hdrH:{state:!0},_booting:{state:!0},_bootFading:{state:!0},_bootSoft:{state:!0},_continuityEpoch:{state:!0},_editorRuntimeLoadingVisible:{state:!0},_backdropGuard:{state:!0},_tapConfirm:{state:!0},_dangerConfirm:{state:!0},hass:{attribute:!1},panelHost:{type:Boolean,attribute:"panel-host",reflect:!0},narrow:{attribute:!1},_config:{state:!0},_space:{state:!0},_devices:{state:!0},_selId:{state:!0},_toast:{state:!0},_mode:{state:!0},_tool:{state:!0},_wallDialog:{state:!0},_drawWallField:{state:!0},_activeWallChainId:{state:!0},_physicalSel:{state:!0},_physicalDialog:{state:!0},_partitionDeleteDialog:{state:!0},_roomDeleteDialog:{state:!0},_physicalDrag:{state:!0},_physicalRotate:{state:!0},_duplicateColumnId:{state:!0},_opMeasure:{state:!0},_path:{state:!0},_cursorPt:{state:!0},_mergeSel:{state:!0},_openingPreset:{state:!0},_openingDialog:{state:!0},_openingInfo:{state:!0},_mergeDialog:{state:!0},_splitSel:{state:!0},_decorTool:{state:!0},_decorStyle:{state:!0},_decorDraft:{state:!0},_decorSel:{state:!0},_decorEraseConfirm:{state:!0},_decorTextDialog:{state:!0},_decorShapeDialog:{state:!0},_backdropDialog:{state:!0},_furnPalette:{state:!0},_decorImagePalette:{state:!0},_decorAssetCatalog:{state:!0},_decorAssetBusy:{state:!0},_furnCategory:{state:!0},_furnPreviewInput:{state:!0},_bdDrag:{state:!0},_dtBox:{state:!0},_dtDrag:{state:!0},_kioskDialog:{state:!0},_vacFit:{state:!0},_vacAllCamerasFor:{state:!0},_vacCalConfirm:{state:!0},_kioskDots:{state:!0},_areaSel:{state:!0},_nameSel:{state:!0},_roomDialog:{state:!0},_roomEditId:{state:!0},_roomFill:{state:!0},_roomCustomFill:{state:!0},_roomTempMin:{state:!0},_roomTempMax:{state:!0},_roomTempSrc:{state:!0},_roomHumSrc:{state:!0},_roomSrcOpen:{state:!0},_roomSrcFilter:{state:!0},_roomNameScale:{state:!0},_roomLabelScale:{state:!0},_spaceDialog:{state:!0},_infoCard:{state:!0},_deviceInbox:{state:!0},_rulesDialog:{state:!0},_settingsDialog:{state:!0},_pdfDialog:{state:!0},_supportDialog:{state:!0},_alignDialog:{state:!0},_preflightClipboardFallback:{state:!0},_backupExportDialog:{state:!0},_backupImportDialog:{state:!0},_importDialog:{state:!0},_markerDialog:{state:!0}},Sv.ZOOM_MAX=8,Sv.ZOOM_MIN=1/3,Sv.styles=[hp,vg],customElements.get("houseplan-card")||customElements.define("houseplan-card",Sv),window.customCards=window.customCards||[],window.customCards.find(e=>"houseplan-card"===e.type)||window.customCards.push({type:"houseplan-card",name:"House Plan Card",description:"Interactive house plan: spaces, rooms and devices with live states and drag layout."}),console.info(`%c HOUSEPLAN-CARD %c v${ov} `,"background:#3ea6ff;color:#04121f;font-weight:700","");export{Ss as $,G as A,Lp as B,Bi as C,Hi as D,U as E,Ni as F,si as G,ol as H,nl as I,ni as J,tp as K,cp as L,zs as M,Ro as N,ap as O,Qu as P,is as Q,Os as R,ip as S,ji as T,la as U,da as V,Oo as W,Mo as X,Bo as Y,A_ as Z,P_ as _,dh as a,Yl as a$,ao as a0,Zo as a1,_i as a2,Yo as a3,ko as a4,So as a5,no as a6,B_ as a7,Ka as a8,Qo as a9,le as aA,W as aB,sa as aC,Ao as aD,Fo as aE,Po as aF,Wa as aG,o as aH,he as aI,Kt as aJ,hp as aK,Mp as aL,e_ as aM,w_ as aN,x_ as aO,Ep as aP,$_ as aQ,Og as aR,wi as aS,Ur as aT,$i as aU,Mi as aV,Ut as aW,Ci as aX,U_ as aY,ql as aZ,cl as a_,rl as aa,Xo as ab,Xa as ac,Za as ad,nn as ae,rn as af,Xi as ag,Zi as ah,el as ai,Fs as aj,uc as ak,Cc as al,Ga as am,Dc as an,Va as ao,Tc as ap,wr as aq,mn as ar,yr as as,Wi as at,hn as au,Eg as av,xr as aw,fn as ax,Ac as ay,Ui as az,oh as b,Y_ as b$,Gl as b0,gs as b1,Ps as b2,ia as b3,Ls as b4,eu as b5,tu as b6,ti as b7,oi as b8,zn as b9,Qt as bA,ei as bB,Gr as bC,ba as bD,$c as bE,q_ as bF,$o as bG,qu as bH,V_ as bI,yi as bJ,mi as bK,Fi as bL,Ha as bM,Ma as bN,$a as bO,es as bP,ts as bQ,ra as bR,Rl as bS,Oa as bT,Ia as bU,Zn as bV,Jn as bW,ki as bX,bs as bY,ys as bZ,K_ as b_,Vn as ba,gm as bb,Fr as bc,_m as bd,El as be,Wl as bf,rc as bg,tl as bh,oc as bi,Jl as bj,ws as bk,oa as bl,os as bm,fa as bn,Ba as bo,j_ as bp,ya as bq,Is as br,gn as bs,br as bt,kr as bu,Oe as bv,Rp as bw,df as bx,Io as by,ll as bz,j as c,Ne as c$,Hr as c0,jr as c1,qr as c2,zr as c3,Dr as c4,Pr as c5,Er as c6,Un as c7,Tr as c8,Ar as c9,zi as cA,Cn as cB,Pu as cC,Vi as cD,qn as cE,Zd as cF,nm as cG,xo as cH,Qd as cI,Xd as cJ,dn as cK,N_ as cL,cn as cM,ln as cN,an as cO,sn as cP,Ua as cQ,Rc as cR,Mc as cS,nv as cT,Q_ as cU,G_ as cV,Or as cW,Ng as cX,uo as cY,Ee as cZ,qe as c_,tc as ca,Lr as cb,ic as cc,Xl as cd,Ul as ce,nc as cf,Ql as cg,ec as ch,cm as ci,ns as cj,Dp as ck,sp as cl,Jf as cm,op as cn,pa as co,Vf as cp,Qf as cq,F_ as cr,li as cs,np as ct,lp as cu,Di as cv,fi as cw,ai as cx,vi as cy,rs as cz,Dg as d,ua as d$,Vc as d0,Jc as d1,ah as d2,Lc as d3,Qc as d4,Kc as d5,Yc as d6,sh as d7,nh as d8,Oc as d9,Co as dA,pi as dB,nu as dC,ou as dD,il as dE,Ol as dF,Ic as dG,of as dH,sf as dI,Cp as dJ,lf as dK,uf as dL,Ml as dM,af as dN,cf as dO,Da as dP,Js as dQ,Tp as dR,Ri as dS,k_ as dT,Cf as dU,Tf as dV,mf as dW,S_ as dX,ja as dY,Wr as dZ,Ea as d_,Fc as da,jn as db,zc as dc,Wn as dd,ci as de,Kf as df,Ip as dg,Gf as dh,Tl as di,Es as dj,ds as dk,us as dl,Ie as dm,du as dn,Zp as dp,Jp as dq,su as dr,Bu as ds,Bd as dt,Ld as du,Od as dv,Pn as dw,$d as dx,Jd as dy,Tn as dz,pe as e,Ir as e0,Nr as e1,Na as e2,Pl as e3,X_ as e4,La as e5,pm as e6,Sp as e7,_p as e8,yp as e9,mp as ea,Jt as eb,$g as ec,Z_ as ed,Ji as ee,Qi as ef,Wt as eg,Sv as eh,rh as f,_n as g,g_ as h,_e as i,Xp as j,Hp as k,$p as l,Ed as m,ch as n,_h as o,Nd as p,Cd as q,ph as r,on as s,Td as t,Ru as u,Yp as v,Md as w,Xn as x,qi as y,Li as z};
diff --git a/custom_components/houseplan/frontend/houseplan-assets/houseplan-editor-runtime-BmdEXc9r.js b/custom_components/houseplan/frontend/houseplan-assets/houseplan-editor-runtime-BmdEXc9r.js
deleted file mode 100644
index e790b3f6..00000000
--- a/custom_components/houseplan/frontend/houseplan-assets/houseplan-editor-runtime-BmdEXc9r.js
+++ /dev/null
@@ -1,2879 +0,0 @@
-globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="34d1dbfc181acaf58842dfced0e6aa3a899aef6b8d1eeba53732ef729a63137e";import{e as t,i as e,E as s,s as i,a as o,n as a,f as n,b as r,l,o as h,r as c,A as d,c as p,D as u,w as _,N as m,d as g,g as f,h as b,j as v,k as y,m as $,p as w,q as k,t as x,u as S,v as M,x as C,y as P,z as D,B as I,C as T,F as R,G as z,H as A,I as F,J as N,K as E,L as H,M as O,O as L,P as B,Q as W,R as j,S as G,T as q,U,V as K,W as V,X as J,Y,Z as X,_ as Z,$ as Q,a0 as tt,a1 as et,a2 as st,a3 as it,a4 as ot,a5 as at,a6 as nt,a7 as rt,a8 as lt,a9 as ht,aa as ct,ab as dt,ac as pt,ad as ut,ae as _t,af as mt,ag as gt,ah as ft,ai as bt,aj as vt,ak as yt,al as $t,am as wt,an as kt,ao as xt,ap as St,aq as Mt,ar as Ct,as as Pt,at as Dt,au as It,av as Tt,aw as Rt,ax as zt,ay as At,az as Ft,aA as Nt,aB as Et,aC as Ht,aD as Ot,aE as Lt,aF as Bt,aG as Wt,aH as jt,aI as Gt,aJ as qt,aK as Ut,aL as Kt,aM as Vt,aN as Jt,aO as Yt,aP as Xt,aQ as Zt,aR as Qt,aS as te,aT as ee,aU as se,aV as ie,aW as oe,aX as ae,aY as ne,aZ as re,a_ as le,a$ as he,b0 as ce,b1 as de,b2 as pe,b3 as ue,b4 as _e,b5 as me,b6 as ge,b7 as fe,b8 as be,b9 as ve,ba as ye,bb as $e,bc as we,bd as ke,be as xe,bf as Se,bg as Me,bh as Ce,bi as Pe,bj as De,bk as Ie,bl as Te,bm as Re,bn as ze,bo as Ae,bp as Fe,bq as Ne,br as Ee,bs as He,bt as Oe,bu as Le,bv as Be,bw as We,bx as je,by as Ge,bz as qe,bA as Ue,bB as Ke,bC as Ve,bD as Je,bE as Ye,bF as Xe,bG as Ze,bH as Qe,bI as ts,bJ as es,bK as ss,bL as is,bM as os,bN as as,bO as ns,bP as rs,bQ as ls,bR as hs,bS as cs,bT as ds,bU as ps,bV as us,bW as _s,bX as ms,bY as gs,bZ as fs,b_ as bs,b$ as vs,c0 as ys,c1 as $s,c2 as ws,c3 as ks,c4 as xs,c5 as Ss,c6 as Ms,c7 as Cs,c8 as Ps,c9 as Ds,ca as Is,cb as Ts,cc as Rs,cd as zs,ce as As,cf as Fs,cg as Ns,ch as Es,ci as Hs,cj as Os,ck as Ls,cl as Bs,cm as Ws,cn as js,co as Gs,cp as qs,cq as Us,cr as Ks,cs as Vs,ct as Js,cu as Ys,cv as Xs,cw as Zs,cx as Qs,cy as ti,cz as ei,cA as si,cB as ii,cC as oi,cD as ai,cE as ni,cF as ri,cG as li,cH as hi,cI as ci,cJ as di,cK as pi,cL as ui,cM as _i,cN as mi,cO as gi,cP as fi,cQ as bi,cR as vi,cS as yi,cT as $i,cU as wi,cV as ki,cW as xi,cX as Si,cY as Mi,cZ as Ci,c_ as Pi,c$ as Di,d0 as Ii,d1 as Ti,d2 as Ri,d3 as zi,d4 as Ai,d5 as Fi,d6 as Ni,d7 as Ei,d8 as Hi,d9 as Oi,da as Li,db as Bi,dc as Wi,dd as ji,de as Gi,df as qi,dg as Ui,dh as Ki,di as Vi,dj as Ji,dk as Yi,dl as Xi,dm as Zi,dn as Qi,dp as to,dq as eo,dr as so,ds as io,dt as oo,du as ao,dv as no,dw as ro,dx as lo,dy as ho,dz as co,dA as po,dB as uo,dC as _o,dD as mo,dE as go,dF as fo}from"./houseplan-card-BKJrmMEj.js";import{F as bo,f as vo,p as yo,c as $o,e as wo,r as ko,a as xo,s as So}from"./backdrop-pick-eS5vEdSu.js";import{t as Mo,h as Co,m as Po,T as Do}from"./zigbee-topology-CW_HKDoT.js";import{GENERATED_FURNITURE_ART as Io,FURNITURE_ART_FINGERPRINT as To}from"./furniture-plan-art.generated-BfO1XOcD.js";const Ro={},zo=t(class extends e{constructor(){super(...arguments),this.ot=Ro}render(t,e){return e()}update(t,[e,i]){if(Array.isArray(e)){if(Array.isArray(this.ot)&&this.ot.length===e.length&&e.every((t,e)=>t===this.ot[e]))return s}else if(this.ot===e)return s;return this.ot=Array.isArray(e)?Array.from(e):e,this.render(e,i)}});var Ao={"gs.hint":"Fill colors apply to every space; each color has its own opacity. Which fill mode a space uses is set in that space's dialog.","gs.show_room_tooltip":"Show the room information window on hover","support.about_group":"About the card","support.guide_group":"Documentation","support.guide":"User guide","support.form_group":"Send a report or suggestion","support.contact":"Contact details (email/tg/WhatsApp), optional.","support.message":"Message","support.attach":"Attach anonymized information from your plan","support.attach_hint":"Includes only allowed plan geometry, settings and bounded runtime facts. Excludes names, Home Assistant IDs, live states, URLs, files, and your message/contact.","support.geometry_warning":"The package contains no names or Home Assistant IDs, but it does contain the exact geometry and dimensions of your home.","support.close_busy_title":"Stop the current operation?","support.close_busy_body":"House Plan is preparing or sending the report. Closing now stops waiting for the result.","support.building":"Preparing anonymized data…","support.preview_summary":"Package v{version} · {spaces} spaces · {size} KiB","support.prepared":"Snapshot prepared {n} min ago","support.show_data":"Show data","support.download":"Download JSON","support.refresh":"Refresh snapshot","support.privacy":"When you send, your message, optional contact and, if selected, exact geometry leave your Home Assistant through the House Plan project relay and are visible to maintainers. The project node keeps the report for up to 30 days. Network infrastructure sees your HA server address, but House Plan does not retain it raw; rate-limit and idempotency metadata is kept for up to 24 hours.","support.error_title":"The report was not sent","support.manual_recovery":"You can keep the message and attachment and continue manually:","support.copy_message":"Copy message","support.success":"Report sent: {id}. Save this number when contacting support.","support.copy_id":"Copy ID","support.sending":"Sending…","support.retry":"Retry","support.send":"Send","support.update_required":"Update the House Plan card and integration to compatible versions to send reports.","support.message_copied":"Message copied","support.id_copied":"Report ID copied","support.copy_failed":"Could not access the clipboard. Select and copy the text manually.","support.validation.message_required":"Enter a message.","support.validation.message_too_long":"The message must contain no more than 10,000 characters.","support.validation.contact_too_long":"Contact details must contain no more than 320 characters.","support.validation.preview_missing":"Wait for the attachment preview or turn the attachment off.","support.validation.preview_expired":"The attachment preview expired. Refresh the snapshot.","support.error.support_invalid_message":"Check the message and try again.","support.error.support_preview_expired":"The attachment preview expired or is no longer available. Refresh the snapshot.","support.error.support_package_too_large":"The anonymized package exceeds the 8 MiB limit.","support.error.support_rate_limited":"Too many reports or previews were requested. Try again later.","support.error.support_unavailable":"The private support service is temporarily unavailable. Your draft remains here.","support.error.support_rejected":"The report did not pass the support service validation.","support.error.unauthorized":"You do not have permission to send this report.","vac.routes_section":"Maps and floors","vac.routes_current_map":"Current map","vac.routes_no_map":"no telemetry","vac.routes_status":"Routing","vac.routes_state_ready":"map assigned and calibrated","vac.routes_state_needs_calibration":"map assigned, calibration needed","vac.routes_state_unmapped":"current map is not assigned to a floor","vac.routes_state_ambiguous":"two maps are indistinguishable — no floor is chosen","vac.routes_state_missing_space":"the map's space was deleted","vac.routes_state_none":"no map data","vac.routes_empty":"No map is assigned to a floor yet.","vac.route_map_default":"no map id","vac.route_active":"Active","vac.route_space":"Space","vac.route_space_none":"not selected","vac.route_status_ready":"ready","vac.route_status_needs_calibration":"needs calibration","vac.route_status_ambiguous":"ambiguous","vac.route_status_missing_space":"space deleted","vac.route_missing_space_group":"Deleted space","vac.route_add_current":"Add current map","vac.route_delete":"Remove map","vac.route_delete_title":"Remove the map from its floor?","vac.route_delete_body":"Calibration and saved paths for this map will be removed. Continue?","vac.route_delete_confirm":"Remove","vac.route_space_title":"Move the map to another space?","vac.route_space_body":"Calibration and saved paths for this map will be removed. Continue?","vac.route_space_confirm":"Move","vac.route_missing_space_hint":"One of the maps points at a deleted space: pick a new one or remove the map. Until then the robot is not drawn for that map.","vac.route_default_hint":"The source reports no stable map id. Several floors cannot be told apart without another source or the robot's own selected map.","vac.route_target_hint":"The dock stays in the “{space}” space regardless of the current map.","vac.route_add_source":"Add a map source","vac.route_add_source_hint":"For integrations that give each map its own camera. The “All cameras” section above widens this list.","vac.route_source_no_map":"no map reported"};const Fo={en:Ao,ru:{"gs.hint":"Цвета заливок действуют на все пространства; у каждого цвета своя прозрачность. Какой режим заливки использует пространство — задаётся в его диалоге.","gs.show_room_tooltip":"Показывать окно с информацией при наведении на комнату","support.about_group":"О карточке","support.guide_group":"Документация","support.guide":"Руководство пользователя","support.form_group":"Отправить репорт или предложение","support.contact":"Контакт для связи (email/tg/WhatsApp), необязательно.","support.message":"Сообщение","support.attach":"Прикрепить обезличенную информацию из вашего плана","support.attach_hint":"В пакет входят только разрешённые геометрия, настройки и ограниченные сведения о среде. Не входят имена, HA id, текущие состояния, URL, файлы, сообщение и контакт.","support.geometry_warning":"Пакет не содержит имён и HA id, но содержит точную геометрию и размеры дома.","support.close_busy_title":"Прервать текущую операцию?","support.close_busy_body":"House Plan подготавливает или отправляет репорт. При закрытии ожидание результата прекратится.","support.building":"Подготавливаем обезличенные данные…","support.preview_summary":"Пакет v{version} · пространств: {spaces} · {size} КиБ","support.prepared":"Снимок подготовлен {n} мин назад","support.show_data":"Показать данные","support.download":"Скачать JSON","support.refresh":"Обновить снимок","support.privacy":"При отправке сообщение, необязательный контакт и, если выбран пакет, точная геометрия покидают ваш Home Assistant через relay проекта House Plan и доступны мейнтейнерам. Узел проекта хранит репорт до 30 дней. Сетевая инфраструктура видит адрес сервера HA, но House Plan не сохраняет его в исходном виде; метаданные лимитов и идемпотентности хранятся до 24 часов.","support.error_title":"Репорт не отправлен","support.manual_recovery":"Сообщение и вложение можно сохранить и продолжить вручную:","support.copy_message":"Копировать сообщение","support.success":"Репорт отправлен: {id}. Сохраните номер для связи с поддержкой.","support.copy_id":"Копировать ID","support.sending":"Отправляем…","support.retry":"Повторить","support.send":"Отправить","support.update_required":"Обновите карточку и интеграцию House Plan до совместимых версий, чтобы отправлять репорты.","support.message_copied":"Сообщение скопировано","support.id_copied":"ID репорта скопирован","support.copy_failed":"Не удалось получить доступ к буферу обмена. Выделите и скопируйте текст вручную.","support.validation.message_required":"Введите сообщение.","support.validation.message_too_long":"Сообщение должно содержать не более 10 000 символов.","support.validation.contact_too_long":"Контакт должен содержать не более 320 символов.","support.validation.preview_missing":"Дождитесь предпросмотра вложения или отключите его.","support.validation.preview_expired":"Предпросмотр вложения истёк. Обновите снимок.","support.error.support_invalid_message":"Проверьте сообщение и повторите попытку.","support.error.support_preview_expired":"Предпросмотр вложения истёк или больше недоступен. Обновите снимок.","support.error.support_package_too_large":"Обезличенный пакет превышает лимит 8 МиБ.","support.error.support_rate_limited":"Запрошено слишком много репортов или предпросмотров. Повторите позже.","support.error.support_unavailable":"Закрытая служба поддержки временно недоступна. Черновик сохранён в этом окне.","support.error.support_rejected":"Репорт не прошёл проверку службы поддержки.","support.error.unauthorized":"У вас нет прав на отправку этого репорта.","vac.routes_section":"Карты и этажи","vac.routes_current_map":"Текущая карта","vac.routes_no_map":"источник молчит","vac.routes_status":"Маршрутизация","vac.routes_state_ready":"карта сопоставлена и откалибрована","vac.routes_state_needs_calibration":"карта сопоставлена, нужна калибровка","vac.routes_state_unmapped":"текущая карта не сопоставлена этажу","vac.routes_state_ambiguous":"две карты неразличимы — этаж не выбирается","vac.routes_state_missing_space":"пространство карты удалено","vac.routes_state_none":"нет данных о карте","vac.routes_empty":"Ни одна карта ещё не сопоставлена этажу.","vac.route_map_default":"без идентификатора","vac.route_active":"Текущая","vac.route_space":"Пространство","vac.route_space_none":"не выбрано","vac.route_status_ready":"готова","vac.route_status_needs_calibration":"нужна калибровка","vac.route_status_ambiguous":"неоднозначна","vac.route_status_missing_space":"пространство удалено","vac.route_missing_space_group":"Пространство удалено","vac.route_add_current":"Добавить текущую карту","vac.route_delete":"Удалить карту","vac.route_delete_title":"Удалить карту с этажа?","vac.route_delete_body":"Калибровка и сохранённые пути этой карты будут удалены. Продолжить?","vac.route_delete_confirm":"Удалить","vac.route_space_title":"Перенести карту в другое пространство?","vac.route_space_body":"Калибровка и сохранённые пути этой карты будут удалены. Продолжить?","vac.route_space_confirm":"Перенести","vac.route_missing_space_hint":"Одна из карт ссылается на удалённое пространство: выберите новое или удалите карту. Пока ссылка не исправлена, робот на этой карте не рисуется.","vac.route_default_hint":"Источник не сообщает стабильный идентификатор карты. Несколько этажей нельзя различить без другого источника или собственной карты робота.","vac.route_target_hint":"Док остаётся в пространстве «{space}» независимо от текущей карты.","vac.route_add_source":"Добавить источник карты","vac.route_add_source_hint":"Для интеграций, где у каждой карты своя камера. Список расширяется разделом «Все камеры» выше.","vac.route_source_no_map":"карта не читается"},de:{"gs.hint":"Füllfarben gelten für jeden Bereich; jede Farbe hat ihre eigene Deckkraft. Der Füllmodus wird in den Einstellungen des jeweiligen Bereichs festgelegt.","gs.show_room_tooltip":"Rauminformationen beim Darüberfahren anzeigen","support.about_group":"Über die Karte","support.guide_group":"Dokumentation","support.guide":"Benutzerhandbuch","support.form_group":"Bericht oder Vorschlag senden","support.contact":"Kontakt (E-Mail/tg/WhatsApp), optional.","support.message":"Nachricht","support.attach":"Anonymisierte Informationen aus dem Plan anhängen","support.attach_hint":"Enthält nur erlaubte Plangeometrie, Einstellungen und begrenzte Laufzeitdaten. Namen, Home-Assistant-IDs, Live-Zustände, URLs, Dateien, Nachricht und Kontakt werden ausgeschlossen.","support.geometry_warning":"Das Paket enthält keine Namen oder Home-Assistant-IDs, aber die exakte Geometrie und die Maße Ihres Hauses.","support.close_busy_title":"Aktuellen Vorgang abbrechen?","support.close_busy_body":"House Plan bereitet den Bericht vor oder sendet ihn. Beim Schließen wird nicht weiter auf das Ergebnis gewartet.","support.building":"Anonymisierte Daten werden vorbereitet…","support.preview_summary":"Paket v{version} · {spaces} Bereiche · {size} KiB","support.prepared":"Schnappschuss vor {n} Min. erstellt","support.show_data":"Daten anzeigen","support.download":"JSON herunterladen","support.refresh":"Schnappschuss aktualisieren","support.privacy":"Beim Senden verlassen Ihre Nachricht, der optionale Kontakt und, falls ausgewählt, die exakte Geometrie Ihren Home Assistant über das House-Plan-Projektrelay und sind für die Maintainer sichtbar. Der Projektserver speichert den Bericht bis zu 30 Tage. Die Netzwerkinfrastruktur sieht die Adresse Ihres HA-Servers, House Plan speichert sie jedoch nicht im Rohformat; Limit- und Idempotenzdaten bleiben bis zu 24 Stunden erhalten.","support.error_title":"Der Bericht wurde nicht gesendet","support.manual_recovery":"Nachricht und Anhang können gespeichert und manuell weitergegeben werden:","support.copy_message":"Nachricht kopieren","support.success":"Bericht gesendet: {id}. Bewahren Sie diese Nummer für den Support auf.","support.copy_id":"ID kopieren","support.sending":"Wird gesendet…","support.retry":"Erneut versuchen","support.send":"Senden","support.update_required":"Aktualisieren Sie House-Plan-Karte und Integration auf kompatible Versionen, um Berichte zu senden.","support.message_copied":"Nachricht kopiert","support.id_copied":"Berichts-ID kopiert","support.copy_failed":"Kein Zugriff auf die Zwischenablage. Markieren und kopieren Sie den Text manuell.","support.validation.message_required":"Geben Sie eine Nachricht ein.","support.validation.message_too_long":"Die Nachricht darf höchstens 10.000 Zeichen enthalten.","support.validation.contact_too_long":"Der Kontakt darf höchstens 320 Zeichen enthalten.","support.validation.preview_missing":"Warten Sie auf die Vorschau oder deaktivieren Sie den Anhang.","support.validation.preview_expired":"Die Anhangsvorschau ist abgelaufen. Aktualisieren Sie den Schnappschuss.","support.error.support_invalid_message":"Prüfen Sie die Nachricht und versuchen Sie es erneut.","support.error.support_preview_expired":"Die Anhangsvorschau ist abgelaufen oder nicht mehr verfügbar. Aktualisieren Sie den Schnappschuss.","support.error.support_package_too_large":"Das anonymisierte Paket überschreitet das Limit von 8 MiB.","support.error.support_rate_limited":"Zu viele Berichte oder Vorschauen wurden angefordert. Versuchen Sie es später erneut.","support.error.support_unavailable":"Der private Supportdienst ist vorübergehend nicht verfügbar. Der Entwurf bleibt in diesem Fenster erhalten.","support.error.support_rejected":"Der Bericht hat die Prüfung des Supportdienstes nicht bestanden.","support.error.unauthorized":"Sie dürfen diesen Bericht nicht senden.","vac.routes_section":"Karten und Etagen","vac.routes_current_map":"Aktuelle Karte","vac.routes_no_map":"keine Telemetrie","vac.routes_status":"Zuordnung","vac.routes_state_ready":"Karte zugeordnet und kalibriert","vac.routes_state_needs_calibration":"Karte zugeordnet, Kalibrierung nötig","vac.routes_state_unmapped":"aktuelle Karte keiner Etage zugeordnet","vac.routes_state_ambiguous":"zwei Karten nicht unterscheidbar — keine Etage gewählt","vac.routes_state_missing_space":"der Raum der Karte wurde gelöscht","vac.routes_state_none":"keine Kartendaten","vac.routes_empty":"Noch keine Karte einer Etage zugeordnet.","vac.route_map_default":"ohne Karten-ID","vac.route_active":"Aktiv","vac.route_space":"Raum","vac.route_space_none":"nicht gewählt","vac.route_status_ready":"bereit","vac.route_status_needs_calibration":"Kalibrierung nötig","vac.route_status_ambiguous":"mehrdeutig","vac.route_status_missing_space":"Raum gelöscht","vac.route_missing_space_group":"Gelöschter Bereich","vac.route_add_current":"Aktuelle Karte hinzufügen","vac.route_delete":"Karte entfernen","vac.route_delete_title":"Karte von der Etage entfernen?","vac.route_delete_body":"Kalibrierung und gespeicherte Pfade dieser Karte werden entfernt. Fortfahren?","vac.route_delete_confirm":"Entfernen","vac.route_space_title":"Karte in einen anderen Raum verschieben?","vac.route_space_body":"Kalibrierung und gespeicherte Pfade dieser Karte werden entfernt. Fortfahren?","vac.route_space_confirm":"Verschieben","vac.route_missing_space_hint":"Eine Karte verweist auf einen gelöschten Raum: neuen wählen oder Karte entfernen. Bis dahin wird der Roboter für diese Karte nicht gezeichnet.","vac.route_default_hint":"Die Quelle meldet keine stabile Karten-ID. Mehrere Etagen lassen sich ohne andere Quelle oder die vom Roboter gewählte Karte nicht unterscheiden.","vac.route_target_hint":"Die Station bleibt unabhängig von der aktuellen Karte im Raum „{space}“.","vac.route_add_source":"Kartenquelle hinzufügen","vac.route_add_source_hint":"Für Integrationen, die jeder Karte eine eigene Kamera geben. Der Abschnitt „Alle Kameras“ oben erweitert diese Liste.","vac.route_source_no_map":"keine Karte gemeldet"},fr:{"gs.hint":"Les couleurs de remplissage s’appliquent à tous les espaces ; chaque couleur possède sa propre opacité. Le mode de remplissage utilisé par un espace se règle dans la boîte de dialogue de cet espace.","gs.show_room_tooltip":"Afficher les informations de la pièce au survol","support.about_group":"À propos de la carte","support.guide_group":"Documentation d’aide","support.guide":"Guide utilisateur","support.form_group":"Envoyer un rapport ou une suggestion","support.contact":"Contact (e-mail/tg/WhatsApp), facultatif.","support.message":"Votre message","support.attach":"Joindre des informations anonymisées de votre plan","support.attach_hint":"Inclut uniquement la géométrie, les réglages autorisés et des données d’exécution limitées. Exclut les noms, identifiants Home Assistant, états en direct, URL, fichiers, message et contact.","support.geometry_warning":"Le paquet ne contient ni noms ni identifiants Home Assistant, mais il contient la géométrie et les dimensions exactes de votre logement.","support.close_busy_title":"Interrompre l’opération en cours ?","support.close_busy_body":"House Plan prépare ou envoie le rapport. Fermer maintenant arrête l’attente du résultat.","support.building":"Préparation des données anonymisées…","support.preview_summary":"Paquet v{version} · {spaces} espaces · {size} Kio","support.prepared":"Instantané préparé il y a {n} min","support.show_data":"Afficher les données","support.download":"Télécharger le JSON","support.refresh":"Actualiser l’instantané","support.privacy":"Lors de l’envoi, votre message, le contact facultatif et, si elle est sélectionnée, la géométrie exacte quittent votre Home Assistant via le relais du projet House Plan et sont visibles par les mainteneurs. Le serveur du projet conserve le rapport jusqu’à 30 jours. L’infrastructure réseau voit l’adresse de votre serveur HA, mais House Plan ne la conserve pas en clair ; les métadonnées de limitation et d’idempotence sont gardées jusqu’à 24 heures.","support.error_title":"Le rapport n’a pas été envoyé","support.manual_recovery":"Vous pouvez conserver le message et la pièce jointe puis continuer manuellement :","support.copy_message":"Copier le message","support.success":"Rapport envoyé : {id}. Conservez ce numéro pour contacter l’assistance.","support.copy_id":"Copier l’ID","support.sending":"Envoi…","support.retry":"Réessayer","support.send":"Envoyer","support.update_required":"Mettez à jour la carte et l’intégration House Plan vers des versions compatibles pour envoyer des rapports.","support.message_copied":"Message copié","support.id_copied":"ID du rapport copié","support.copy_failed":"Impossible d’accéder au presse-papiers. Sélectionnez et copiez le texte manuellement.","support.validation.message_required":"Saisissez un message.","support.validation.message_too_long":"Le message ne doit pas dépasser 10 000 caractères.","support.validation.contact_too_long":"Le contact ne doit pas dépasser 320 caractères.","support.validation.preview_missing":"Attendez l’aperçu de la pièce jointe ou désactivez-la.","support.validation.preview_expired":"L’aperçu de la pièce jointe a expiré. Actualisez l’instantané.","support.error.support_invalid_message":"Vérifiez le message et réessayez.","support.error.support_preview_expired":"L’aperçu de la pièce jointe a expiré ou n’est plus disponible. Actualisez l’instantané.","support.error.support_package_too_large":"Le paquet anonymisé dépasse la limite de 8 Mio.","support.error.support_rate_limited":"Trop de rapports ou d’aperçus ont été demandés. Réessayez plus tard.","support.error.support_unavailable":"Le service d’assistance privé est temporairement indisponible. Le brouillon reste dans cette fenêtre.","support.error.support_rejected":"Le rapport n’a pas passé la validation du service d’assistance.","support.error.unauthorized":"Vous n’êtes pas autorisé à envoyer ce rapport.","vac.routes_section":"Cartes et étages","vac.routes_current_map":"Carte actuelle","vac.routes_no_map":"aucune télémétrie","vac.routes_status":"Routage","vac.routes_state_ready":"carte assignée et calibrée","vac.routes_state_needs_calibration":"carte assignée, calibrage requis","vac.routes_state_unmapped":"carte actuelle non assignée à un étage","vac.routes_state_ambiguous":"deux cartes indiscernables — aucun étage choisi","vac.routes_state_missing_space":"l'espace de la carte a été supprimé","vac.routes_state_none":"aucune donnée de carte","vac.routes_empty":"Aucune carte n'est encore assignée à un étage.","vac.route_map_default":"sans identifiant","vac.route_active":"Active","vac.route_space":"Espace","vac.route_space_none":"non sélectionné","vac.route_status_ready":"prête","vac.route_status_needs_calibration":"calibrage requis","vac.route_status_ambiguous":"ambiguë","vac.route_status_missing_space":"espace supprimé","vac.route_missing_space_group":"Espace supprimé","vac.route_add_current":"Ajouter la carte actuelle","vac.route_delete":"Supprimer la carte","vac.route_delete_title":"Retirer la carte de son étage ?","vac.route_delete_body":"Le calibrage et les trajets enregistrés de cette carte seront supprimés. Continuer ?","vac.route_delete_confirm":"Supprimer","vac.route_space_title":"Déplacer la carte vers un autre espace ?","vac.route_space_body":"Le calibrage et les trajets enregistrés de cette carte seront supprimés. Continuer ?","vac.route_space_confirm":"Déplacer","vac.route_missing_space_hint":"Une carte pointe vers un espace supprimé : choisissez-en un autre ou supprimez la carte. D'ici là, le robot n'est pas dessiné pour cette carte.","vac.route_default_hint":"La source ne fournit pas d'identifiant de carte stable. Plusieurs étages ne peuvent pas être distingués sans une autre source ou la carte sélectionnée du robot.","vac.route_target_hint":"La station reste dans l'espace « {space} » quelle que soit la carte actuelle.","vac.route_add_source":"Ajouter une source de carte","vac.route_add_source_hint":"Pour les intégrations qui donnent à chaque carte sa propre caméra. La section « Toutes les caméras » ci-dessus élargit cette liste.","vac.route_source_no_map":"aucune carte signalée"}};function No(t,e,s){return i(Fo[t]?.[e]??Ao[e]??e,s)}function Eo(t,e,s,i,o){return{markerId:t,source:i,mapId:o,space:e.length?"":s}}function Ho(t,e,s){return{...t,space:s.has(e)?e:""}}function Oo(t,e=Math.random){const s=new Set(t);for(let t=0;t<64;t+=1){const t="vr_"+Math.floor(16777215*e()).toString(36).padStart(5,"0");if(!s.has(t))return t}return"vr_"+Date.now().toString(36)}function Lo(t,e,s){return t.map(t=>t.id===e?{...t,calibration:s}:t)}const Bo=new WeakMap,Wo=(t,e)=>{const s=(t._serverCfg?.spaces||[]).find(t=>t?.id===e);return String(s?.name||s?.id||e)};function jo(t,e,s){const i=t.host,n=l(i.hass,i._config?.language),r=(t,e)=>No(n,t,e),u=e.marker?.vacuum||{},_=Array.isArray(u.map_routes),m=i._vacSource(e)||"",g=o(e.id,u,e.space,m),f=(i._serverCfg?.spaces||[]).filter(t=>"string"==typeof t?.id&&!!t.id).map(t=>({id:t.id,name:String(t.name||t.id)})),b=new Set(f.map(t=>t.id)),v=h(g,[m],t=>i._vacObservedMapId(e,t)),y=c({routes:g,observed:v,spaceIds:b}),$="ready"===y.kind||"needs_calibration"===y.kind||"missing_space"===y.kind?y.route.id:"",w=m?v[m]:void 0,k=async s=>{let o=_?u.map_routes??null:null;if(!o&&(o=function(t,e,s,i){if(!s)return null;const o=t?.calibration;if(!o||"object"!=typeof o)return null;const n=new Set,r=[];for(const t of Object.keys(o)){const l=a(o[t]);if(!l)continue;const h=i(n);n.add(h),r.push({id:h,source:s,map_id:t,space:e,calibration:l})}return r.length?r:null}(u,e.space,m,t=>Oo(t))??[],!m&&Object.keys(u.calibration||{}).length))return!1;const n=s(o);return!!n&&(async s=>{const o=i._serverCfg;if(!o)return!1;const a=JSON.parse(JSON.stringify(o));a.markers=a.markers||[];let n=a.markers.find(t=>t.id===e.id);if(!n){if("device"!==e.bindingKind&&"entity"!==e.bindingKind||!e.bindingRef)return!1;n={id:e.id,binding:`${e.bindingKind}:${e.bindingRef}`,space:e.space||null,area:e.area||null,hidden:!!e.hidden},a.markers.push(n)}n.vacuum={...n.vacuum||{},map_routes:s},delete n.vacuum.calibration;const r=i._adoption.beginOptimistic(o,a);i._adoption.stageLocalConfig(a),i._regSignature="",i._maybeRebuildDevices(),i.requestUpdate(),i._saveConfigDebounced.pending()&&i._saveConfigDebounced.cancel();try{return await t._saveConfigNow(),!0}catch(t){return i._rollbackOptimistic(r),i._regSignature="",i._maybeRebuildDevices(),i.requestUpdate(),i._showToast(i._t("toast.cfg_save_failed",{err:i._errText(t)})),!1}})(n)},x=s.candidates.filter(t=>t.entityId!==m&&!g.some(e=>e.source===t.entityId)),S=async(t,e)=>{if(!e||e===t.space)return;await i._confirmDanger({key:"vacuum_route_space",kind:"warning",title:r("vac.route_space_title"),message:r("vac.route_space_body"),objectName:t.map_id||r("vac.route_map_default"),confirmLabel:r("vac.route_space_confirm"),cancelLabel:i._t("btn.cancel")})&&await k(s=>function(t,e,s,i){return t.map(t=>t.id===e?{...t,id:i,space:s,calibration:null}:t)}(s,t.id,e,Oo(new Set(g.map(t=>t.id)))))},M=new Map(f.map((t,e)=>[t.id,e])),C=(t,e)=>t.map_id.localeCompare(e.map_id)||t.source.localeCompare(e.source)||t.id.localeCompare(e.id),P=g.filter(t=>b.has(t.space)).sort((t,e)=>(M.get(t.space)??0)-(M.get(e.space)??0)||C(t,e)),D=g.filter(t=>!b.has(t.space)).sort(C),I=[...P,...D],T=!!m&&void 0!==w&&!g.some(t=>t.source===m&&t.map_id===w);let R=Bo.get(t);const z=R?.source||"",A=R?.mapId||"",F=!!R&&g.some(t=>t.source===z&&t.map_id===A);R&&(R.markerId!==e.id||i._vacObservedMapId(e,R.source)!==R.mapId||F&&!R.saving)&&(Bo.delete(t),R=void 0),R?.space&&!b.has(R.space)&&(R=Ho(R,"",b),Bo.set(t,R));const N=s=>p`
-
`}_discoveryFilterState(t){const e=this.host._settings,s=void 0!==t.draftGroupLights?t.draftGroupLights:!1!==e.group_lights,i=e.exclude_integrations,o=void 0!==t.draftExcluded?null===t.draftExcluded?[...Ai]:t.draftExcluded:i?[...i]:[...Ai],a=void 0!==t.draftExcluded?null===t.draftExcluded:!i,n=void 0!==t.draftGroupLights||void 0!==t.draftExcluded;return{groupLights:s,excluded:o.sort(),usesProductList:a,dirty:n}}_registryIntegrations(){const t=new Set,e=this.host._fullRegistryHass;for(const s of Object.values(e?.entities||{}))s?.platform&&t.add(String(s.platform));for(const s of Object.values(e?.devices||{})){const e=s?.identifiers?.[0],i=Array.isArray(e)?e[0]:null;i&&t.add(String(i))}return[...t].sort()}_discoveryFilterPreview(t){const e=this._discoveryFilterState(t),s=[e.groupLights?1:0,e.usesProductList?"p":e.excluded.join(","),this.host._cfgEpoch,this.host._regSignature].join("|");if(this._discoveryPreviewMemo?.key===s)return this._discoveryPreviewMemo.value;const i={hass:this.host.hass,registry:this.host._haRegistry,areaToSpace:Object.fromEntries(Object.entries(this.host._areaToSpace).map(([t,e])=>[t,e.space])),markers:this.host._markers,showAll:this.host._showAll,firstSpaceId:this.host._model[0]?.id||"",loc:t=>this.host._t(t),iconRules:this.host._iconRules},o=(t,e)=>new Set(_o({...i,settings:t,excluded:e})),a=(t,e)=>new Set(mo({...i,settings:t,excluded:e}).map(t=>t.bindingRef||t.id)),n=Fi(this.host._settings),r={...this.host._settings,group_lights:e.groupLights},l=new Set(e.excluded),h=o(this.host._settings,n),c=o(r,l),d=a(this.host._settings,n),p=a(r,l);let u=0,_=0,m=0;const g=t=>t.includes("light.");for(const t of h)c.has(t)||(u++,g(t)&&m++);for(const t of c)h.has(t)||(_++,g(t)&&m++);for(const t of p)d.has(t)||(u++,g(t)&&m++);for(const t of d)p.has(t)||(_++,g(t)&&m++);const f={appear:u,hide:_,lights:m};return this._discoveryPreviewMemo={key:s,value:f},f}async _saveDiscoveryFilters(t){const e=this.host._serverCfg;if(!e)return;const s=this._discoveryFilterState(t),i={...e.settings};s.groupLights?delete i.group_lights:i.group_lights=!1,s.usesProductList?delete i.exclude_integrations:i.exclude_integrations=s.excluded,this.host._serverCfg={...e,settings:i},this.host._deviceInboxMemo=null,this._discoveryPreviewMemo=null,this.host._regSignature="",this.host._deviceInbox&&(this.host._deviceInbox={...t,draftGroupLights:void 0,draftExcluded:void 0}),this._saveConfig(),this.host._maybeRebuildDevices(),this.host.requestUpdate()}_renderDiscoveryFilters(t){const e=this._discoveryFilterState(t),s=e=>this.host._deviceInbox={...t,...e},i=t.filtersOpen&&e.dirty?this._discoveryFilterPreview(t):null,o=this._registryIntegrations().filter(t=>!e.excluded.includes(t));return p`s({filtersOpen:t.target.open})}>
- ${this.host._t("device_inbox.filters_title")}
-
-
-
- `}}export{ld as EDITOR_RUNTIME_FINGERPRINT,hd as HouseplanEditorRuntime};
diff --git a/custom_components/houseplan/frontend/houseplan-assets/houseplan-editor-runtime-Dun21GNm.js b/custom_components/houseplan/frontend/houseplan-assets/houseplan-editor-runtime-Dun21GNm.js
new file mode 100644
index 00000000..cc890851
--- /dev/null
+++ b/custom_components/houseplan/frontend/houseplan-assets/houseplan-editor-runtime-Dun21GNm.js
@@ -0,0 +1,2879 @@
+globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="4da0d706a85c3f1c08ab6de960deb5feb08baaf9055265234e7bd1b554332653";import{e as t,i as e,E as s,s as i,a as o,n as a,f as n,b as r,l,o as h,r as c,A as d,c as p,d as u,g as _,h as m,v as g,j as f,k as b,m as v,p as y,q as $,t as w,u as k,w as x,x as S,T as M,y as C,D as P,z as D,B as I,C as T,F as R,G as z,H as A,I as F,J as N,K as E,L as H,M as O,N as L,O as B,P as W,Q as j,R as G,S as q,U,V as K,W as V,X as J,Y,Z as X,_ as Z,$ as Q,a0 as tt,a1 as et,a2 as st,a3 as it,a4 as ot,a5 as at,a6 as nt,a7 as rt,a8 as lt,a9 as ht,aa as ct,ab as dt,ac as pt,ad as ut,ae as _t,af as mt,ag as gt,ah as ft,ai as bt,aj as vt,ak as yt,al as $t,am as wt,an as kt,ao as xt,ap as St,aq as Mt,ar as Ct,as as Pt,at as Dt,au as It,av as Tt,aw as Rt,ax as zt,ay as At,az as Ft,aA as Nt,aB as Et,aC as Ht,aD as Ot,aE as Lt,aF as Bt,aG as Wt,aH as jt,aI as Gt,aJ as qt,aK as Ut,aL as Kt,aM as Vt,aN as Jt,aO as Yt,aP as Xt,aQ as Zt,aR as Qt,aS as te,aT as ee,aU as se,aV as ie,aW as oe,aX as ae,aY as ne,aZ as re,a_ as le,a$ as he,b0 as ce,b1 as de,b2 as pe,b3 as ue,b4 as _e,b5 as me,b6 as ge,b7 as fe,b8 as be,b9 as ve,ba as ye,bb as $e,bc as we,bd as ke,be as xe,bf as Se,bg as Me,bh as Ce,bi as Pe,bj as De,bk as Ie,bl as Te,bm as Re,bn as ze,bo as Ae,bp as Fe,bq as Ne,br as Ee,bs as He,bt as Oe,bu as Le,bv as Be,bw as We,bx as je,by as Ge,bz as qe,bA as Ue,bB as Ke,bC as Ve,bD as Je,bE as Ye,bF as Xe,bG as Ze,bH as Qe,bI as ts,bJ as es,bK as ss,bL as is,bM as os,bN as as,bO as ns,bP as rs,bQ as ls,bR as hs,bS as cs,bT as ds,bU as ps,bV as us,bW as _s,bX as ms,bY as gs,bZ as fs,b_ as bs,b$ as vs,c0 as ys,c1 as $s,c2 as ws,c3 as ks,c4 as xs,c5 as Ss,c6 as Ms,c7 as Cs,c8 as Ps,c9 as Ds,ca as Is,cb as Ts,cc as Rs,cd as zs,ce as As,cf as Fs,cg as Ns,ch as Es,ci as Hs,cj as Os,ck as Ls,cl as Bs,cm as Ws,cn as js,co as Gs,cp as qs,cq as Us,cr as Ks,cs as Vs,ct as Js,cu as Ys,cv as Xs,cw as Zs,cx as Qs,cy as ti,cz as ei,cA as si,cB as ii,cC as oi,cD as ai,cE as ni,cF as ri,cG as li,cH as hi,cI as ci,cJ as di,cK as pi,cL as ui,cM as _i,cN as mi,cO as gi,cP as fi,cQ as bi,cR as vi,cS as yi,cT as $i,cU as wi,cV as ki,cW as xi,cX as Si,cY as Mi,cZ as Ci,c_ as Pi,c$ as Di,d0 as Ii,d1 as Ti,d2 as Ri,d3 as zi,d4 as Ai,d5 as Fi,d6 as Ni,d7 as Ei,d8 as Hi,d9 as Oi,da as Li,db as Bi,dc as Wi,dd as ji,de as Gi,df as qi,dg as Ui,dh as Ki,di as Vi,dj as Ji,dk as Yi,dl as Xi,dm as Zi,dn as Qi,dp as to,dq as eo,dr as so,ds as io,dt as oo,du as ao,dv as no,dw as ro,dx as lo,dy as ho,dz as co,dA as po,dB as uo,dC as _o,dD as mo,dE as go,dF as fo}from"./houseplan-card-CAm75-22.js";import{F as bo,f as vo,p as yo,c as $o,e as wo,r as ko,a as xo,s as So}from"./backdrop-pick-DhTL8Q8P.js";import{t as Mo,h as Co,m as Po,T as Do}from"./zigbee-topology-CmbCVeQJ.js";import{GENERATED_FURNITURE_ART as Io,FURNITURE_ART_FINGERPRINT as To}from"./furniture-plan-art.generated-CDfS5UbT.js";const Ro={},zo=t(class extends e{constructor(){super(...arguments),this.ot=Ro}render(t,e){return e()}update(t,[e,i]){if(Array.isArray(e)){if(Array.isArray(this.ot)&&this.ot.length===e.length&&e.every((t,e)=>t===this.ot[e]))return s}else if(this.ot===e)return s;return this.ot=Array.isArray(e)?Array.from(e):e,this.render(e,i)}});var Ao={"gs.hint":"Fill colors apply to every space; each color has its own opacity. Which fill mode a space uses is set in that space's dialog.","gs.show_room_tooltip":"Show the room information window on hover","support.about_group":"About the card","support.guide_group":"Documentation","support.guide":"User guide","support.form_group":"Send a report or suggestion","support.contact":"Contact details (email/tg/WhatsApp), optional.","support.message":"Message","support.attach":"Attach anonymized information from your plan","support.attach_hint":"Includes only allowed plan geometry, settings and bounded runtime facts. Excludes names, Home Assistant IDs, live states, URLs, files, and your message/contact.","support.geometry_warning":"The package contains no names or Home Assistant IDs, but it does contain the exact geometry and dimensions of your home.","support.close_busy_title":"Stop the current operation?","support.close_busy_body":"House Plan is preparing or sending the report. Closing now stops waiting for the result.","support.building":"Preparing anonymized data…","support.preview_summary":"Package v{version} · {spaces} spaces · {size} KiB","support.prepared":"Snapshot prepared {n} min ago","support.show_data":"Show data","support.download":"Download JSON","support.refresh":"Refresh snapshot","support.privacy":"When you send, your message, optional contact and, if selected, exact geometry leave your Home Assistant through the House Plan project relay and are visible to maintainers. The project node keeps the report for up to 30 days. Network infrastructure sees your HA server address, but House Plan does not retain it raw; rate-limit and idempotency metadata is kept for up to 24 hours.","support.error_title":"The report was not sent","support.manual_recovery":"You can keep the message and attachment and continue manually:","support.copy_message":"Copy message","support.success":"Report sent: {id}. Save this number when contacting support.","support.copy_id":"Copy ID","support.sending":"Sending…","support.retry":"Retry","support.send":"Send","support.update_required":"Update the House Plan card and integration to compatible versions to send reports.","support.message_copied":"Message copied","support.id_copied":"Report ID copied","support.copy_failed":"Could not access the clipboard. Select and copy the text manually.","support.validation.message_required":"Enter a message.","support.validation.message_too_long":"The message must contain no more than 10,000 characters.","support.validation.contact_too_long":"Contact details must contain no more than 320 characters.","support.validation.preview_missing":"Wait for the attachment preview or turn the attachment off.","support.validation.preview_expired":"The attachment preview expired. Refresh the snapshot.","support.error.support_invalid_message":"Check the message and try again.","support.error.support_preview_expired":"The attachment preview expired or is no longer available. Refresh the snapshot.","support.error.support_package_too_large":"The anonymized package exceeds the 8 MiB limit.","support.error.support_rate_limited":"Too many reports or previews were requested. Try again later.","support.error.support_unavailable":"The private support service is temporarily unavailable. Your draft remains here.","support.error.support_rejected":"The report did not pass the support service validation.","support.error.unauthorized":"You do not have permission to send this report.","vac.routes_section":"Maps and floors","vac.routes_current_map":"Current map","vac.routes_no_map":"no telemetry","vac.routes_status":"Routing","vac.routes_state_ready":"map assigned and calibrated","vac.routes_state_needs_calibration":"map assigned, calibration needed","vac.routes_state_unmapped":"current map is not assigned to a floor","vac.routes_state_ambiguous":"two maps are indistinguishable — no floor is chosen","vac.routes_state_missing_space":"the map's space was deleted","vac.routes_state_none":"no map data","vac.routes_empty":"No map is assigned to a floor yet.","vac.route_map_default":"no map id","vac.route_active":"Active","vac.route_space":"Space","vac.route_space_none":"not selected","vac.route_status_ready":"ready","vac.route_status_needs_calibration":"needs calibration","vac.route_status_ambiguous":"ambiguous","vac.route_status_missing_space":"space deleted","vac.route_missing_space_group":"Deleted space","vac.route_add_current":"Add current map","vac.route_delete":"Remove map","vac.route_delete_title":"Remove the map from its floor?","vac.route_delete_body":"Calibration and saved paths for this map will be removed. Continue?","vac.route_delete_confirm":"Remove","vac.route_space_title":"Move the map to another space?","vac.route_space_body":"Calibration and saved paths for this map will be removed. Continue?","vac.route_space_confirm":"Move","vac.route_missing_space_hint":"One of the maps points at a deleted space: pick a new one or remove the map. Until then the robot is not drawn for that map.","vac.route_default_hint":"The source reports no stable map id. Several floors cannot be told apart without another source or the robot's own selected map.","vac.route_target_hint":"The dock stays in the “{space}” space regardless of the current map.","vac.route_add_source":"Add a map source","vac.route_add_source_hint":"For integrations that give each map its own camera. The “All cameras” section above widens this list.","vac.route_source_no_map":"no map reported"};const Fo={en:Ao,ru:{"gs.hint":"Цвета заливок действуют на все пространства; у каждого цвета своя прозрачность. Какой режим заливки использует пространство — задаётся в его диалоге.","gs.show_room_tooltip":"Показывать окно с информацией при наведении на комнату","support.about_group":"О карточке","support.guide_group":"Документация","support.guide":"Руководство пользователя","support.form_group":"Отправить репорт или предложение","support.contact":"Контакт для связи (email/tg/WhatsApp), необязательно.","support.message":"Сообщение","support.attach":"Прикрепить обезличенную информацию из вашего плана","support.attach_hint":"В пакет входят только разрешённые геометрия, настройки и ограниченные сведения о среде. Не входят имена, HA id, текущие состояния, URL, файлы, сообщение и контакт.","support.geometry_warning":"Пакет не содержит имён и HA id, но содержит точную геометрию и размеры дома.","support.close_busy_title":"Прервать текущую операцию?","support.close_busy_body":"House Plan подготавливает или отправляет репорт. При закрытии ожидание результата прекратится.","support.building":"Подготавливаем обезличенные данные…","support.preview_summary":"Пакет v{version} · пространств: {spaces} · {size} КиБ","support.prepared":"Снимок подготовлен {n} мин назад","support.show_data":"Показать данные","support.download":"Скачать JSON","support.refresh":"Обновить снимок","support.privacy":"При отправке сообщение, необязательный контакт и, если выбран пакет, точная геометрия покидают ваш Home Assistant через relay проекта House Plan и доступны мейнтейнерам. Узел проекта хранит репорт до 30 дней. Сетевая инфраструктура видит адрес сервера HA, но House Plan не сохраняет его в исходном виде; метаданные лимитов и идемпотентности хранятся до 24 часов.","support.error_title":"Репорт не отправлен","support.manual_recovery":"Сообщение и вложение можно сохранить и продолжить вручную:","support.copy_message":"Копировать сообщение","support.success":"Репорт отправлен: {id}. Сохраните номер для связи с поддержкой.","support.copy_id":"Копировать ID","support.sending":"Отправляем…","support.retry":"Повторить","support.send":"Отправить","support.update_required":"Обновите карточку и интеграцию House Plan до совместимых версий, чтобы отправлять репорты.","support.message_copied":"Сообщение скопировано","support.id_copied":"ID репорта скопирован","support.copy_failed":"Не удалось получить доступ к буферу обмена. Выделите и скопируйте текст вручную.","support.validation.message_required":"Введите сообщение.","support.validation.message_too_long":"Сообщение должно содержать не более 10 000 символов.","support.validation.contact_too_long":"Контакт должен содержать не более 320 символов.","support.validation.preview_missing":"Дождитесь предпросмотра вложения или отключите его.","support.validation.preview_expired":"Предпросмотр вложения истёк. Обновите снимок.","support.error.support_invalid_message":"Проверьте сообщение и повторите попытку.","support.error.support_preview_expired":"Предпросмотр вложения истёк или больше недоступен. Обновите снимок.","support.error.support_package_too_large":"Обезличенный пакет превышает лимит 8 МиБ.","support.error.support_rate_limited":"Запрошено слишком много репортов или предпросмотров. Повторите позже.","support.error.support_unavailable":"Закрытая служба поддержки временно недоступна. Черновик сохранён в этом окне.","support.error.support_rejected":"Репорт не прошёл проверку службы поддержки.","support.error.unauthorized":"У вас нет прав на отправку этого репорта.","vac.routes_section":"Карты и этажи","vac.routes_current_map":"Текущая карта","vac.routes_no_map":"источник молчит","vac.routes_status":"Маршрутизация","vac.routes_state_ready":"карта сопоставлена и откалибрована","vac.routes_state_needs_calibration":"карта сопоставлена, нужна калибровка","vac.routes_state_unmapped":"текущая карта не сопоставлена этажу","vac.routes_state_ambiguous":"две карты неразличимы — этаж не выбирается","vac.routes_state_missing_space":"пространство карты удалено","vac.routes_state_none":"нет данных о карте","vac.routes_empty":"Ни одна карта ещё не сопоставлена этажу.","vac.route_map_default":"без идентификатора","vac.route_active":"Текущая","vac.route_space":"Пространство","vac.route_space_none":"не выбрано","vac.route_status_ready":"готова","vac.route_status_needs_calibration":"нужна калибровка","vac.route_status_ambiguous":"неоднозначна","vac.route_status_missing_space":"пространство удалено","vac.route_missing_space_group":"Пространство удалено","vac.route_add_current":"Добавить текущую карту","vac.route_delete":"Удалить карту","vac.route_delete_title":"Удалить карту с этажа?","vac.route_delete_body":"Калибровка и сохранённые пути этой карты будут удалены. Продолжить?","vac.route_delete_confirm":"Удалить","vac.route_space_title":"Перенести карту в другое пространство?","vac.route_space_body":"Калибровка и сохранённые пути этой карты будут удалены. Продолжить?","vac.route_space_confirm":"Перенести","vac.route_missing_space_hint":"Одна из карт ссылается на удалённое пространство: выберите новое или удалите карту. Пока ссылка не исправлена, робот на этой карте не рисуется.","vac.route_default_hint":"Источник не сообщает стабильный идентификатор карты. Несколько этажей нельзя различить без другого источника или собственной карты робота.","vac.route_target_hint":"Док остаётся в пространстве «{space}» независимо от текущей карты.","vac.route_add_source":"Добавить источник карты","vac.route_add_source_hint":"Для интеграций, где у каждой карты своя камера. Список расширяется разделом «Все камеры» выше.","vac.route_source_no_map":"карта не читается"},de:{"gs.hint":"Füllfarben gelten für jeden Bereich; jede Farbe hat ihre eigene Deckkraft. Der Füllmodus wird in den Einstellungen des jeweiligen Bereichs festgelegt.","gs.show_room_tooltip":"Rauminformationen beim Darüberfahren anzeigen","support.about_group":"Über die Karte","support.guide_group":"Dokumentation","support.guide":"Benutzerhandbuch","support.form_group":"Bericht oder Vorschlag senden","support.contact":"Kontakt (E-Mail/tg/WhatsApp), optional.","support.message":"Nachricht","support.attach":"Anonymisierte Informationen aus dem Plan anhängen","support.attach_hint":"Enthält nur erlaubte Plangeometrie, Einstellungen und begrenzte Laufzeitdaten. Namen, Home-Assistant-IDs, Live-Zustände, URLs, Dateien, Nachricht und Kontakt werden ausgeschlossen.","support.geometry_warning":"Das Paket enthält keine Namen oder Home-Assistant-IDs, aber die exakte Geometrie und die Maße Ihres Hauses.","support.close_busy_title":"Aktuellen Vorgang abbrechen?","support.close_busy_body":"House Plan bereitet den Bericht vor oder sendet ihn. Beim Schließen wird nicht weiter auf das Ergebnis gewartet.","support.building":"Anonymisierte Daten werden vorbereitet…","support.preview_summary":"Paket v{version} · {spaces} Bereiche · {size} KiB","support.prepared":"Schnappschuss vor {n} Min. erstellt","support.show_data":"Daten anzeigen","support.download":"JSON herunterladen","support.refresh":"Schnappschuss aktualisieren","support.privacy":"Beim Senden verlassen Ihre Nachricht, der optionale Kontakt und, falls ausgewählt, die exakte Geometrie Ihren Home Assistant über das House-Plan-Projektrelay und sind für die Maintainer sichtbar. Der Projektserver speichert den Bericht bis zu 30 Tage. Die Netzwerkinfrastruktur sieht die Adresse Ihres HA-Servers, House Plan speichert sie jedoch nicht im Rohformat; Limit- und Idempotenzdaten bleiben bis zu 24 Stunden erhalten.","support.error_title":"Der Bericht wurde nicht gesendet","support.manual_recovery":"Nachricht und Anhang können gespeichert und manuell weitergegeben werden:","support.copy_message":"Nachricht kopieren","support.success":"Bericht gesendet: {id}. Bewahren Sie diese Nummer für den Support auf.","support.copy_id":"ID kopieren","support.sending":"Wird gesendet…","support.retry":"Erneut versuchen","support.send":"Senden","support.update_required":"Aktualisieren Sie House-Plan-Karte und Integration auf kompatible Versionen, um Berichte zu senden.","support.message_copied":"Nachricht kopiert","support.id_copied":"Berichts-ID kopiert","support.copy_failed":"Kein Zugriff auf die Zwischenablage. Markieren und kopieren Sie den Text manuell.","support.validation.message_required":"Geben Sie eine Nachricht ein.","support.validation.message_too_long":"Die Nachricht darf höchstens 10.000 Zeichen enthalten.","support.validation.contact_too_long":"Der Kontakt darf höchstens 320 Zeichen enthalten.","support.validation.preview_missing":"Warten Sie auf die Vorschau oder deaktivieren Sie den Anhang.","support.validation.preview_expired":"Die Anhangsvorschau ist abgelaufen. Aktualisieren Sie den Schnappschuss.","support.error.support_invalid_message":"Prüfen Sie die Nachricht und versuchen Sie es erneut.","support.error.support_preview_expired":"Die Anhangsvorschau ist abgelaufen oder nicht mehr verfügbar. Aktualisieren Sie den Schnappschuss.","support.error.support_package_too_large":"Das anonymisierte Paket überschreitet das Limit von 8 MiB.","support.error.support_rate_limited":"Zu viele Berichte oder Vorschauen wurden angefordert. Versuchen Sie es später erneut.","support.error.support_unavailable":"Der private Supportdienst ist vorübergehend nicht verfügbar. Der Entwurf bleibt in diesem Fenster erhalten.","support.error.support_rejected":"Der Bericht hat die Prüfung des Supportdienstes nicht bestanden.","support.error.unauthorized":"Sie dürfen diesen Bericht nicht senden.","vac.routes_section":"Karten und Etagen","vac.routes_current_map":"Aktuelle Karte","vac.routes_no_map":"keine Telemetrie","vac.routes_status":"Zuordnung","vac.routes_state_ready":"Karte zugeordnet und kalibriert","vac.routes_state_needs_calibration":"Karte zugeordnet, Kalibrierung nötig","vac.routes_state_unmapped":"aktuelle Karte keiner Etage zugeordnet","vac.routes_state_ambiguous":"zwei Karten nicht unterscheidbar — keine Etage gewählt","vac.routes_state_missing_space":"der Raum der Karte wurde gelöscht","vac.routes_state_none":"keine Kartendaten","vac.routes_empty":"Noch keine Karte einer Etage zugeordnet.","vac.route_map_default":"ohne Karten-ID","vac.route_active":"Aktiv","vac.route_space":"Raum","vac.route_space_none":"nicht gewählt","vac.route_status_ready":"bereit","vac.route_status_needs_calibration":"Kalibrierung nötig","vac.route_status_ambiguous":"mehrdeutig","vac.route_status_missing_space":"Raum gelöscht","vac.route_missing_space_group":"Gelöschter Bereich","vac.route_add_current":"Aktuelle Karte hinzufügen","vac.route_delete":"Karte entfernen","vac.route_delete_title":"Karte von der Etage entfernen?","vac.route_delete_body":"Kalibrierung und gespeicherte Pfade dieser Karte werden entfernt. Fortfahren?","vac.route_delete_confirm":"Entfernen","vac.route_space_title":"Karte in einen anderen Raum verschieben?","vac.route_space_body":"Kalibrierung und gespeicherte Pfade dieser Karte werden entfernt. Fortfahren?","vac.route_space_confirm":"Verschieben","vac.route_missing_space_hint":"Eine Karte verweist auf einen gelöschten Raum: neuen wählen oder Karte entfernen. Bis dahin wird der Roboter für diese Karte nicht gezeichnet.","vac.route_default_hint":"Die Quelle meldet keine stabile Karten-ID. Mehrere Etagen lassen sich ohne andere Quelle oder die vom Roboter gewählte Karte nicht unterscheiden.","vac.route_target_hint":"Die Station bleibt unabhängig von der aktuellen Karte im Raum „{space}“.","vac.route_add_source":"Kartenquelle hinzufügen","vac.route_add_source_hint":"Für Integrationen, die jeder Karte eine eigene Kamera geben. Der Abschnitt „Alle Kameras“ oben erweitert diese Liste.","vac.route_source_no_map":"keine Karte gemeldet"},fr:{"gs.hint":"Les couleurs de remplissage s’appliquent à tous les espaces ; chaque couleur possède sa propre opacité. Le mode de remplissage utilisé par un espace se règle dans la boîte de dialogue de cet espace.","gs.show_room_tooltip":"Afficher les informations de la pièce au survol","support.about_group":"À propos de la carte","support.guide_group":"Documentation d’aide","support.guide":"Guide utilisateur","support.form_group":"Envoyer un rapport ou une suggestion","support.contact":"Contact (e-mail/tg/WhatsApp), facultatif.","support.message":"Votre message","support.attach":"Joindre des informations anonymisées de votre plan","support.attach_hint":"Inclut uniquement la géométrie, les réglages autorisés et des données d’exécution limitées. Exclut les noms, identifiants Home Assistant, états en direct, URL, fichiers, message et contact.","support.geometry_warning":"Le paquet ne contient ni noms ni identifiants Home Assistant, mais il contient la géométrie et les dimensions exactes de votre logement.","support.close_busy_title":"Interrompre l’opération en cours ?","support.close_busy_body":"House Plan prépare ou envoie le rapport. Fermer maintenant arrête l’attente du résultat.","support.building":"Préparation des données anonymisées…","support.preview_summary":"Paquet v{version} · {spaces} espaces · {size} Kio","support.prepared":"Instantané préparé il y a {n} min","support.show_data":"Afficher les données","support.download":"Télécharger le JSON","support.refresh":"Actualiser l’instantané","support.privacy":"Lors de l’envoi, votre message, le contact facultatif et, si elle est sélectionnée, la géométrie exacte quittent votre Home Assistant via le relais du projet House Plan et sont visibles par les mainteneurs. Le serveur du projet conserve le rapport jusqu’à 30 jours. L’infrastructure réseau voit l’adresse de votre serveur HA, mais House Plan ne la conserve pas en clair ; les métadonnées de limitation et d’idempotence sont gardées jusqu’à 24 heures.","support.error_title":"Le rapport n’a pas été envoyé","support.manual_recovery":"Vous pouvez conserver le message et la pièce jointe puis continuer manuellement :","support.copy_message":"Copier le message","support.success":"Rapport envoyé : {id}. Conservez ce numéro pour contacter l’assistance.","support.copy_id":"Copier l’ID","support.sending":"Envoi…","support.retry":"Réessayer","support.send":"Envoyer","support.update_required":"Mettez à jour la carte et l’intégration House Plan vers des versions compatibles pour envoyer des rapports.","support.message_copied":"Message copié","support.id_copied":"ID du rapport copié","support.copy_failed":"Impossible d’accéder au presse-papiers. Sélectionnez et copiez le texte manuellement.","support.validation.message_required":"Saisissez un message.","support.validation.message_too_long":"Le message ne doit pas dépasser 10 000 caractères.","support.validation.contact_too_long":"Le contact ne doit pas dépasser 320 caractères.","support.validation.preview_missing":"Attendez l’aperçu de la pièce jointe ou désactivez-la.","support.validation.preview_expired":"L’aperçu de la pièce jointe a expiré. Actualisez l’instantané.","support.error.support_invalid_message":"Vérifiez le message et réessayez.","support.error.support_preview_expired":"L’aperçu de la pièce jointe a expiré ou n’est plus disponible. Actualisez l’instantané.","support.error.support_package_too_large":"Le paquet anonymisé dépasse la limite de 8 Mio.","support.error.support_rate_limited":"Trop de rapports ou d’aperçus ont été demandés. Réessayez plus tard.","support.error.support_unavailable":"Le service d’assistance privé est temporairement indisponible. Le brouillon reste dans cette fenêtre.","support.error.support_rejected":"Le rapport n’a pas passé la validation du service d’assistance.","support.error.unauthorized":"Vous n’êtes pas autorisé à envoyer ce rapport.","vac.routes_section":"Cartes et étages","vac.routes_current_map":"Carte actuelle","vac.routes_no_map":"aucune télémétrie","vac.routes_status":"Routage","vac.routes_state_ready":"carte assignée et calibrée","vac.routes_state_needs_calibration":"carte assignée, calibrage requis","vac.routes_state_unmapped":"carte actuelle non assignée à un étage","vac.routes_state_ambiguous":"deux cartes indiscernables — aucun étage choisi","vac.routes_state_missing_space":"l'espace de la carte a été supprimé","vac.routes_state_none":"aucune donnée de carte","vac.routes_empty":"Aucune carte n'est encore assignée à un étage.","vac.route_map_default":"sans identifiant","vac.route_active":"Active","vac.route_space":"Espace","vac.route_space_none":"non sélectionné","vac.route_status_ready":"prête","vac.route_status_needs_calibration":"calibrage requis","vac.route_status_ambiguous":"ambiguë","vac.route_status_missing_space":"espace supprimé","vac.route_missing_space_group":"Espace supprimé","vac.route_add_current":"Ajouter la carte actuelle","vac.route_delete":"Supprimer la carte","vac.route_delete_title":"Retirer la carte de son étage ?","vac.route_delete_body":"Le calibrage et les trajets enregistrés de cette carte seront supprimés. Continuer ?","vac.route_delete_confirm":"Supprimer","vac.route_space_title":"Déplacer la carte vers un autre espace ?","vac.route_space_body":"Le calibrage et les trajets enregistrés de cette carte seront supprimés. Continuer ?","vac.route_space_confirm":"Déplacer","vac.route_missing_space_hint":"Une carte pointe vers un espace supprimé : choisissez-en un autre ou supprimez la carte. D'ici là, le robot n'est pas dessiné pour cette carte.","vac.route_default_hint":"La source ne fournit pas d'identifiant de carte stable. Plusieurs étages ne peuvent pas être distingués sans une autre source ou la carte sélectionnée du robot.","vac.route_target_hint":"La station reste dans l'espace « {space} » quelle que soit la carte actuelle.","vac.route_add_source":"Ajouter une source de carte","vac.route_add_source_hint":"Pour les intégrations qui donnent à chaque carte sa propre caméra. La section « Toutes les caméras » ci-dessus élargit cette liste.","vac.route_source_no_map":"aucune carte signalée"}};function No(t,e,s){return i(Fo[t]?.[e]??Ao[e]??e,s)}function Eo(t,e,s,i,o){return{markerId:t,source:i,mapId:o,space:e.length?"":s}}function Ho(t,e,s){return{...t,space:s.has(e)?e:""}}function Oo(t,e=Math.random){const s=new Set(t);for(let t=0;t<64;t+=1){const t="vr_"+Math.floor(16777215*e()).toString(36).padStart(5,"0");if(!s.has(t))return t}return"vr_"+Date.now().toString(36)}function Lo(t,e,s){return t.map(t=>t.id===e?{...t,calibration:s}:t)}const Bo=new WeakMap,Wo=(t,e)=>{const s=(t._serverCfg?.spaces||[]).find(t=>t?.id===e);return String(s?.name||s?.id||e)};function jo(t,e,s){const i=t.host,n=l(i.hass,i._config?.language),r=(t,e)=>No(n,t,e),u=e.marker?.vacuum||{},_=Array.isArray(u.map_routes),m=i._vacSource(e)||"",g=o(e.id,u,e.space,m),f=(i._serverCfg?.spaces||[]).filter(t=>"string"==typeof t?.id&&!!t.id).map(t=>({id:t.id,name:String(t.name||t.id)})),b=new Set(f.map(t=>t.id)),v=h(g,[m],t=>i._vacObservedMapId(e,t)),y=c({routes:g,observed:v,spaceIds:b}),$="ready"===y.kind||"needs_calibration"===y.kind||"missing_space"===y.kind?y.route.id:"",w=m?v[m]:void 0,k=async s=>{let o=_?u.map_routes??null:null;if(!o&&(o=function(t,e,s,i){if(!s)return null;const o=t?.calibration;if(!o||"object"!=typeof o)return null;const n=new Set,r=[];for(const t of Object.keys(o)){const l=a(o[t]);if(!l)continue;const h=i(n);n.add(h),r.push({id:h,source:s,map_id:t,space:e,calibration:l})}return r.length?r:null}(u,e.space,m,t=>Oo(t))??[],!m&&Object.keys(u.calibration||{}).length))return!1;const n=s(o);return!!n&&(async s=>{const o=i._serverCfg;if(!o)return!1;const a=JSON.parse(JSON.stringify(o));a.markers=a.markers||[];let n=a.markers.find(t=>t.id===e.id);if(!n){if("device"!==e.bindingKind&&"entity"!==e.bindingKind||!e.bindingRef)return!1;n={id:e.id,binding:`${e.bindingKind}:${e.bindingRef}`,space:e.space||null,area:e.area||null,hidden:!!e.hidden},a.markers.push(n)}n.vacuum={...n.vacuum||{},map_routes:s},delete n.vacuum.calibration;const r=i._adoption.beginOptimistic(o,a);i._adoption.stageLocalConfig(a),i._regSignature="",i._maybeRebuildDevices(),i.requestUpdate(),i._saveConfigDebounced.pending()&&i._saveConfigDebounced.cancel();try{return await t._saveConfigNow(),!0}catch(t){return i._rollbackOptimistic(r),i._regSignature="",i._maybeRebuildDevices(),i.requestUpdate(),i._showToast(i._t("toast.cfg_save_failed",{err:i._errText(t)})),!1}})(n)},x=s.candidates.filter(t=>t.entityId!==m&&!g.some(e=>e.source===t.entityId)),S=async(t,e)=>{if(!e||e===t.space)return;await i._confirmDanger({key:"vacuum_route_space",kind:"warning",title:r("vac.route_space_title"),message:r("vac.route_space_body"),objectName:t.map_id||r("vac.route_map_default"),confirmLabel:r("vac.route_space_confirm"),cancelLabel:i._t("btn.cancel")})&&await k(s=>function(t,e,s,i){return t.map(t=>t.id===e?{...t,id:i,space:s,calibration:null}:t)}(s,t.id,e,Oo(new Set(g.map(t=>t.id)))))},M=new Map(f.map((t,e)=>[t.id,e])),C=(t,e)=>t.map_id.localeCompare(e.map_id)||t.source.localeCompare(e.source)||t.id.localeCompare(e.id),P=g.filter(t=>b.has(t.space)).sort((t,e)=>(M.get(t.space)??0)-(M.get(e.space)??0)||C(t,e)),D=g.filter(t=>!b.has(t.space)).sort(C),I=[...P,...D],T=!!m&&void 0!==w&&!g.some(t=>t.source===m&&t.map_id===w);let R=Bo.get(t);const z=R?.source||"",A=R?.mapId||"",F=!!R&&g.some(t=>t.source===z&&t.map_id===A);R&&(R.markerId!==e.id||i._vacObservedMapId(e,R.source)!==R.mapId||F&&!R.saving)&&(Bo.delete(t),R=void 0),R?.space&&!b.has(R.space)&&(R=Ho(R,"",b),Bo.set(t,R));const N=s=>p`
+
`}_discoveryFilterState(t){const e=this.host._settings,s=void 0!==t.draftGroupLights?t.draftGroupLights:!1!==e.group_lights,i=e.exclude_integrations,o=void 0!==t.draftExcluded?null===t.draftExcluded?[...Zi]:t.draftExcluded:i?[...i]:[...Zi],a=void 0!==t.draftExcluded?null===t.draftExcluded:!i,n=void 0!==t.draftGroupLights||void 0!==t.draftExcluded;return{groupLights:s,excluded:o.sort(),usesProductList:a,dirty:n}}_registryIntegrations(){const t=new Set,e=this.host._fullRegistryHass;for(const s of Object.values(e?.entities||{}))s?.platform&&t.add(String(s.platform));for(const s of Object.values(e?.devices||{})){const e=s?.identifiers?.[0],i=Array.isArray(e)?e[0]:null;i&&t.add(String(i))}return[...t].sort()}_discoveryFilterPreview(t){const e=this._discoveryFilterState(t),s=[e.groupLights?1:0,e.usesProductList?"p":e.excluded.join(","),this.host._cfgEpoch,this.host._regSignature].join("|");if(this._discoveryPreviewMemo?.key===s)return this._discoveryPreviewMemo.value;const i={hass:this.host.hass,registry:this.host._haRegistry,areaToSpace:Object.fromEntries(Object.entries(this.host._areaToSpace).map(([t,e])=>[t,e.space])),markers:this.host._markers,showAll:this.host._showAll,firstSpaceId:this.host._model[0]?.id||"",loc:t=>this.host._t(t),iconRules:this.host._iconRules},o=(t,e)=>new Set(_o({...i,settings:t,excluded:e})),a=(t,e)=>new Set(mo({...i,settings:t,excluded:e}).map(t=>t.bindingRef||t.id)),n=Qi(this.host._settings),r={...this.host._settings,group_lights:e.groupLights},l=new Set(e.excluded),h=o(this.host._settings,n),c=o(r,l),d=a(this.host._settings,n),p=a(r,l);let u=0,_=0,m=0;const g=t=>t.includes("light.");for(const t of h)c.has(t)||(u++,g(t)&&m++);for(const t of c)h.has(t)||(_++,g(t)&&m++);for(const t of p)d.has(t)||(u++,g(t)&&m++);for(const t of d)p.has(t)||(_++,g(t)&&m++);const f={appear:u,hide:_,lights:m};return this._discoveryPreviewMemo={key:s,value:f},f}async _saveDiscoveryFilters(t){const e=this.host._serverCfg;if(!e)return;const s=this._discoveryFilterState(t),i={...e.settings};s.groupLights?delete i.group_lights:i.group_lights=!1,s.usesProductList?delete i.exclude_integrations:i.exclude_integrations=s.excluded,this.host._serverCfg={...e,settings:i},this.host._deviceInboxMemo=null,this._discoveryPreviewMemo=null,this.host._regSignature="",this.host._deviceInbox&&(this.host._deviceInbox={...t,draftGroupLights:void 0,draftExcluded:void 0}),this._saveConfig(),this.host._maybeRebuildDevices(),this.host.requestUpdate()}_renderDiscoveryFilters(t){const e=this._discoveryFilterState(t),s=e=>this.host._deviceInbox={...t,...e},i=t.filtersOpen&&e.dirty?this._discoveryFilterPreview(t):null,o=this._registryIntegrations().filter(t=>!e.excluded.includes(t));return p`s({filtersOpen:t.target.open})}>
+ ${this.host._t("device_inbox.filters_title")}
+
+
`:d}`:d}`}_renderRoomDialog(){return Kn.call(this)}}export{pd as EDITOR_RUNTIME_FINGERPRINT,ud as HouseplanEditorRuntime};
diff --git a/dist/houseplan-assets/houseplan-onboarding-runtime-DE7rHApS.js b/custom_components/houseplan/frontend/houseplan-assets/houseplan-onboarding-runtime-DZtjID7S.js
similarity index 97%
rename from dist/houseplan-assets/houseplan-onboarding-runtime-DE7rHApS.js
rename to custom_components/houseplan/frontend/houseplan-assets/houseplan-onboarding-runtime-DZtjID7S.js
index 217d33c5..1bd24a5b 100644
--- a/dist/houseplan-assets/houseplan-onboarding-runtime-DE7rHApS.js
+++ b/custom_components/houseplan/frontend/houseplan-assets/houseplan-onboarding-runtime-DZtjID7S.js
@@ -1,4 +1,4 @@
-globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="34d1dbfc181acaf58842dfced0e6aa3a899aef6b8d1eeba53732ef729a63137e";import{l as t,b4 as s,A as e,v as a,c as o,cn as l,co as i,cp as h,cq as c,b1 as n,cr as r,cw as p,cs as d,ct as _,cu as u,cv as g,cx as m,cy as b,dv as $,dw as v,dx as f,b0 as y,b2 as w,dy as D}from"./houseplan-card-BKJrmMEj.js";import{c as k,e as S,r as C,a as M}from"./backdrop-pick-eS5vEdSu.js";const F=1e3,x=t=>{if(!t.trim())return null;const s=Number(t.replace(",","."));return Number.isFinite(s)?s:null},T="34d1dbfc181acaf58842dfced0e6aa3a899aef6b8d1eeba53732ef729a63137e";class L{constructor(t){this.host=t,this._toggleServerPlans=async()=>{const t=this.host._spaceDialog;if(t)if(t.pickSaved)this.host._spaceDialog={...t,pickSaved:!1};else{this.host._spaceDialog={...t,pickSaved:!0,savedBusy:!0};try{const t=await this.host.hass.callWS({type:"houseplan/plans/list"}),s=this.host._spaceDialog;s&&(this.host._spaceDialog={...s,saved:t?.plans||[],savedBusy:!1})}catch(t){const s=this.host._spaceDialog;s&&(this.host._spaceDialog={...s,saved:[],savedBusy:!1}),this.host._showToast(this.host._t("toast.plans_list_failed",{err:this.host._errText(t)}))}}}}_help(l){const i=`${l}.aria`,h=t(this.host.hass,this.host._config?.language);return s(h,l)&&s(h,i)?o`{if(!t.trim())return null;const s=Number(t.replace(",","."));return Number.isFinite(s)?s:null},T="4da0d706a85c3f1c08ab6de960deb5feb08baaf9055265234e7bd1b554332653";class L{constructor(t){this.host=t,this._toggleServerPlans=async()=>{const t=this.host._spaceDialog;if(t)if(t.pickSaved)this.host._spaceDialog={...t,pickSaved:!1};else{this.host._spaceDialog={...t,pickSaved:!0,savedBusy:!0};try{const t=await this.host.hass.callWS({type:"houseplan/plans/list"}),s=this.host._spaceDialog;s&&(this.host._spaceDialog={...s,saved:t?.plans||[],savedBusy:!1})}catch(t){const s=this.host._spaceDialog;s&&(this.host._spaceDialog={...s,saved:[],savedBusy:!1}),this.host._showToast(this.host._t("toast.plans_list_failed",{err:this.host._errText(t)}))}}}}_help(l){const i=`${l}.aria`,h=t(this.host.hass,this.host._config?.language);return s(h,l)&&s(h,i)?o``:e}_openSpaceDialog(t,s){if(!this.host._serverStorage||!this.host._serverCfg)return void this.host._showToast(this.host._t("toast.integration_missing"));if("edit"===t){const e=this.host._serverCfg.spaces.find(t=>t.id===s);if(!e)return;const a=l(e),o=e.settings?.custom_fill&&"object"==typeof e.settings.custom_fill?i(e.settings.custom_fill):null,p="none"===a.fill?{...o||h,a:0}:o;return void(this.host._spaceDialog={mode:t,spaceId:s,title:e.title,planUrl:e.plan_url||null,planFile:null,source:e.plan_url?"file":"draw",showBorders:a.showBorders,showNames:a.showNames,zeroWallStyle:r(e),displayTouched:!0,hideDecor:a.hideDecor,hideOpenings:a.hideOpenings,roomColor:a.color,roomOpacity:a.opacity,fillMode:"none"===a.fill?"custom":a.fill,customFill:p,glowEnabled:a.glow,bgColor:a.bgColor,bgMode:"static"===e.settings?.bg_mode||"daynight"===e.settings?.bg_mode?e.settings.bg_mode:null,northDeg:n({},e.settings),sunRays:"boolean"==typeof e.settings?.sun_rays?e.settings.sun_rays:null,tempMin:a.tempMin,tempMax:a.tempMax,showLqi:a.showLqi??this.host._config?.show_signal??!0,cardFontScale:a.cardFontScale,labelTemp:a.labelTemp,labelHum:a.labelHum,labelLqi:a.labelLqi,labelLight:a.labelLight,cellCm:Number(e.cell_cm)>0?Number(e.cell_cm):5,cellCmInput:c(Number(e.cell_cm)>0?Number(e.cell_cm):5,this.host._imperial),cellCmTouched:!1,busy:!1})}const e=p(this.host._imperial);this.host._spaceDialog={mode:t,title:"",planUrl:null,planFile:null,...m(),hideDecor:!1,hideOpenings:!1,zeroWallStyle:"dashed",roomColor:g,roomOpacity:u,fillMode:"custom",customFill:{...h,a:0},glowEnabled:!0,bgColor:null,bgMode:"daynight",northDeg:null,sunRays:null,tempMin:_,tempMax:d,showLqi:this.host._config?.show_signal??!0,cardFontScale:1,labelTemp:!1,labelHum:!1,labelLqi:!1,labelLight:!1,cellCm:e,cellCmInput:c(e,this.host._imperial),cellCmTouched:!1,busy:!1}}async _pickPlanFile(t){const s=t.target,e=s.files?.[0];if(!e||!this.host._spaceDialog)return;s.value="";const a=await k(e);if("reject"===a.kind)return void this.host._showToast(this.host._t("toast.plan_formats"));if("guard"===a.kind)return void(this.host._backdropGuard=a.state);const o=await S(e,a.ext,e.name);this.host._spaceDialog&&(this.host._spaceDialog={...this.host._spaceDialog,planFile:o})}_renderBackdropGuard(){return C(this.host,t=>{this.host._spaceDialog&&(this.host._spaceDialog={...this.host._spaceDialog,planFile:t})},()=>{this.host._backdropGuard=null},this.host.hass)??e}_useServerPlan(t){const s=this.host._spaceDialog;s&&(this.host._spaceDialog={...s,planUrl:t,planFile:null,pickSaved:!1,savedAspect:void 0},this.host._aspectJob=this._readPlanAspect(t))}async _readPlanAspect(t){for(let s=0;s<40;s++){const s=this.host._display(t);if(s){const e=await new Promise(t=>{const e=new Image;e.onload=()=>t(e.naturalWidth&&e.naturalHeight?e.naturalWidth/e.naturalHeight:0),e.onerror=()=>t(0),e.src=s}),a=this.host._spaceDialog;return a&&a.planUrl===t&&Number.isFinite(e)&&e>0?(this.host._spaceDialog={...a,savedAspect:e},e):0}if(await new Promise(t=>setTimeout(t,150)),this.host._spaceDialog?.planUrl!==t)return 0}return 0}async _deleteServerPlan(t){const s=this.host._spaceDialog,e=s?.saved?.find(s=>s.name===t);if(!s||!e||e.used_by.length||e.url===s.planUrl)return;const a=await this.host._confirmDanger({key:"delete-plan",kind:"destructive",title:this.host._t("confirm.delete_plan_title"),message:this.host._t("confirm.delete_plan_body"),objectName:t,confirmLabel:this.host._t("btn.delete"),cancelLabel:this.host._t("btn.cancel")}),o=this.host._spaceDialog,l=o?.saved?.find(s=>s.name===t);if(a&&o&&l&&l.url===e.url&&l.modified===e.modified&&!l.used_by.length&&l.url!==o.planUrl)try{await this.host.hass.callWS({type:"houseplan/plans/delete",name:t});const s=this.host._spaceDialog;s?.saved&&(this.host._spaceDialog={...s,saved:s.saved.filter(s=>s.name!==t)})}catch(t){this.host._showToast(this.host._t("toast.plan_delete_failed",{err:this.host._errText(t)}))}}_renderServerPlans(t){if(t.savedBusy)return o`
${this.host._t("space.loading")}
`;const s=t.saved||[];if(!s.length)return o`
${this.host._t("space.no_saved")}
`;return o`
${s.map(s=>{return o`
diff --git a/custom_components/houseplan/frontend/houseplan-assets/hp-zigbee-topology-overlay-DU0yXG-C.js b/custom_components/houseplan/frontend/houseplan-assets/hp-zigbee-topology-overlay-DU0yXG-C.js
new file mode 100644
index 00000000..dceb90ae
--- /dev/null
+++ b/custom_components/houseplan/frontend/houseplan-assets/hp-zigbee-topology-overlay-DU0yXG-C.js
@@ -0,0 +1,33 @@
+globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="4da0d706a85c3f1c08ab6de960deb5feb08baaf9055265234e7bd1b554332653";import{aI as e,l as t,A as i,eb as r,aB as o,c as s,aH as n}from"./houseplan-card-CAm75-22.js";import{t as a,a as h,r as d}from"./zigbee-topology-CmbCVeQJ.js";import{zigbeeTopologyRuntimeSnapshot as p,subscribeZigbeeTopology as l}from"./zigbee-topology-runtime-HfConMDX.js";function c(e,t,i,r,o,s=9,n=4.5){const a=t.x-e.x,h=t.y-e.y,d=Math.hypot(a,h),p=d-Math.max(0,i)-Math.max(0,r);if(!Number.isFinite(d)||d<=0||p<4)return null;const l=a/d,c=h/d,_="toward-neighbor"===o,u=_?{x:t.x-l*Math.max(0,r),y:t.y-c*Math.max(0,r)}:{x:e.x+l*Math.max(0,i),y:e.y+c*Math.max(0,i)},b=Math.min(s,Math.max(4,.45*p)),m=Math.min(n,.5*b),v=_?-1:1,g=u.x+l*b*v,y=u.y+c*b*v,x=-c;return{tip:u,points:[u,{x:g+x*m,y:y+l*m},{x:g-x*m,y:y-l*m}]}}const _={revision:0,topologies:[],states:{}},u="data-hp-zigbee-topology-endpoint";class b extends e{constructor(){super(...arguments),this.devices=[],this.currentSpace="",this._runtime=_,this._hovered="",this._desiredEndpointIds=new Set,this._endpointSetDirty=!1,this._endpointElements=new Set,this._pointerOver=e=>{if(!this._mouseAllowed(e))return void this._clear();const t=this._deviceFromEvent(e),i=t?.dataset.id||"";i&&i!==this._hovered&&(this._hovered=i,this.requestUpdate())},this._pointerOut=e=>{const t=this._deviceFromEvent(e);if(!t||t.dataset.id!==this._hovered)return;const i=e.relatedTarget instanceof Element?e.relatedTarget.closest('[data-hp="device"]'):null;i?.dataset.id!==this._hovered&&this._clear()},this._pointerDown=e=>{"mouse"!==e.pointerType&&this._clear()}}connectedCallback(){super.connectedCallback();const e=this.getRootNode();e.host&&"undefined"!=typeof MutationObserver&&(this._hoverGateObserver=new MutationObserver(()=>{e.host.hasAttribute("data-pointer-hover")||this._clear()}),this._hoverGateObserver.observe(e.host,{attributes:!0,attributeFilter:["data-pointer-hover"]})),queueMicrotask(()=>this._connectParent())}disconnectedCallback(){this._release?.(),this._release=void 0,this._disconnectParent(),this._hoverGateObserver?.disconnect(),this._hoverGateObserver=void 0,this._hovered="",this._desiredEndpointIds.clear(),super.disconnectedCallback()}updated(e){e.has("hass")&&(this._release?.(),this._acceptRuntime(p(this.hass)),this._release=l(this.hass,()=>{this._acceptRuntime(p(this.hass))}));const t=e.has("currentSpace")||e.has("devices")||e.has("registry");t&&(this._mappedMemo=void 0,this.devices.some(e=>e.id===this._hovered&&e.space===this.currentSpace)||this._clear()),this._connectParent(),(this._endpointSetDirty||t)&&this._syncEndpointOwnership()}_acceptRuntime(e){e.revision===this._runtime.revision&&e.topologies===this._runtime.topologies&&e.states===this._runtime.states||(this._setDesiredEndpointIds([]),this._clearEndpointOwnership(),this._endpointSetDirty=!1,this._runtime=e,this._mappedMemo=void 0,this.requestUpdate())}_connectParent(){const e=this.parentElement;e&&e!==this._parent&&(this._disconnectParent(),this._parent=e,e.addEventListener("pointerover",this._pointerOver),e.addEventListener("pointerout",this._pointerOut),e.addEventListener("pointerdown",this._pointerDown,!0),"undefined"!=typeof MutationObserver&&(this._markerObserver=new MutationObserver(()=>this._syncEndpointOwnership()),this._markerObserver.observe(e,{childList:!0})),this._syncEndpointOwnership())}_disconnectParent(){this._parent?.removeEventListener("pointerover",this._pointerOver),this._parent?.removeEventListener("pointerout",this._pointerOut),this._parent?.removeEventListener("pointerdown",this._pointerDown,!0),this._markerObserver?.disconnect(),this._markerObserver=void 0,this._clearEndpointOwnership(),this._parent=void 0}_deviceFromEvent(e){for(const t of e.composedPath())if(t instanceof HTMLElement&&"device"===t.dataset.hp)return t;return null}_mouseAllowed(e){const t=this.getRootNode();return"mouse"===e.pointerType&&t.host?.hasAttribute?.("data-pointer-hover")}_clear(){this._setDesiredEndpointIds([]),this._clearEndpointOwnership(),this._endpointSetDirty=!1,this._hovered&&(this._hovered="",this.requestUpdate())}_setDesiredEndpointIds(e){const t=new Set(e);t.size===this._desiredEndpointIds.size&&[...t].every(e=>this._desiredEndpointIds.has(e))||(this._desiredEndpointIds=t,this._endpointSetDirty=!0)}_marker(e){return[...this._parent?.querySelectorAll('.dev[data-hp="device"][data-id]')||[]].find(t=>t.dataset.id===e)||null}_clearEndpointOwnership(){for(const e of this._endpointElements)e.removeAttribute(u);for(const e of this._parent?.querySelectorAll(`[${u}]`)||[])e.removeAttribute(u);this._endpointElements.clear()}_syncEndpointOwnership(){const e=new Set;for(const t of this._desiredEndpointIds){const i=this._marker(t);i&&e.add(i)}for(const t of this._endpointElements)e.has(t)||t.removeAttribute(u);for(const t of this._parent?.querySelectorAll(`[${u}]`)||[])e.has(t)||t.removeAttribute(u);for(const t of e)this._endpointElements.has(t)&&t.hasAttribute(u)||t.setAttribute(u,"");this._endpointElements=e,this._endpointSetDirty=!1}_position(e,t,i){const r=this._marker(e);if(!r)return null;const o=Number.parseFloat(r.style.left),s=Number.parseFloat(r.style.top),n=r.getBoundingClientRect();return Number.isFinite(o)&&Number.isFinite(s)?{x:o*t/100,y:s*i/100,width:n.width,height:n.height}:null}_targetText(e){if("remote-space"===e.kind){const i=this.spaces?.find(t=>t.id===e.spaceId)?.title;return"string"==typeof i&&i.trim()||a(t(this.hass),"route_other_space")}return a(t(this.hass),"unplaced-coordinator"===e.kind?"route_coordinator_not_on_plan":"route_device_not_on_plan")}_markerClearance(e){return.61*Math.max(e.width,e.height)+3}_points(e){return e.map(e=>`${e.x.toFixed(2)},${e.y.toFixed(2)}`).join(" ")}render(){if(!this._hovered||!this.registry||!this._runtime.topologies.length)return this._setDesiredEndpointIds([]),i;const e=this._mappedMemo,n=e&&e.runtime===this._runtime&&e.devices===this.devices&&e.registry===this.registry?e.mapped:h(this._runtime.topologies,this.devices,this.registry);e&&n===e.mapped||(this._mappedMemo={runtime:this._runtime,devices:this.devices,registry:this.registry,mapped:n});const p=d(n,this.currentSpace,this._hovered),l=this.clientWidth||this._parent?.clientWidth||1,_=this.clientHeight||this._parent?.clientHeight||1,u=this._position(this._hovered,l,_);if(!u)return this._setDesiredEndpointIds([]),i;const b=p.lines.map(e=>({...e,point:this._position(e.neighborMarkerId,l,_)})).filter(e=>!!e.point).map(e=>{const t=void 0===e.lqi?"rgba(145,155,165,.85)":r(e.lqi),i=e.routeDirection?c(u,e.point,this._markerClearance(u),this._markerClearance(e.point),e.routeDirection):null;return{...e,color:t,arrow:i}}),m=u.x>l/2,v=this._markerClearance(u)+18,g=p.parentTargets.map((e,t)=>{const i=30*(t-(p.parentTargets.length-1)/2),r={x:u.x+(m?-v:v),y:Math.max(14,Math.min(_-14,u.y+i))};return{target:e,point:r,arrow:c(u,r,this._markerClearance(u),0,"toward-neighbor")}});return this._setDesiredEndpointIds(b.length||g.length||p.remoteCount?[this._hovered,...b.map(e=>e.neighborMarkerId)]:[]),s`
+ ${b.length||g.length?o``:i}
+ ${b.map(e=>s``)}
+ ${g.map(e=>s`
`:i}
- `}}m.properties={hass:{attribute:!1},devices:{attribute:!1},registry:{attribute:!1},currentSpace:{type:String,attribute:"current-space"},spaces:{attribute:!1},viewKey:{attribute:!1}},m.styles=n`:host{position:absolute;inset:0;z-index:7;display:block;pointer-events:none;}svg{position:absolute;inset:0;width:100%;height:100%;overflow:visible;}line{vector-effect:non-scaling-stroke;stroke-linecap:round;}.route-arrow{vector-effect:non-scaling-stroke;}svg,line,polygon,.halo,.remote,.parent-bubble{pointer-events:none;}.halo{position:absolute;width:calc(var(--device-base-size,4cqw) * 1.22);height:calc(var(--device-base-size,4cqw) * 1.22);transform:translate(-50%,-50%);box-sizing:border-box;border:2px solid rgba(120,190,220,.82);border-radius:50%;box-shadow:0 0 0 4px rgba(120,190,220,.16);}.remote,.parent-bubble{position:absolute;transform:translate(12px,calc(-100% - 12px));border:1px solid rgba(255,255,255,.7);border-radius:999px;padding:3px 7px;color:#fff;background:rgba(28,31,36,.88);box-shadow:0 2px 7px rgba(0,0,0,.28);white-space:nowrap;font:600 11px/1.2 system-ui,sans-serif;}.parent-bubble.right{transform:translate(0,-50%);}.parent-bubble.left{transform:translate(-100%,-50%);}@media (forced-colors:active){line{stroke:Highlight !important;}.route-arrow{fill:Highlight !important;}.halo{border-color:Highlight;box-shadow:none;}.remote,.parent-bubble{color:CanvasText;background:Canvas;border-color:CanvasText;}}`,customElements.get("hp-zigbee-topology-overlay")||customElements.define("hp-zigbee-topology-overlay",m);export{m as HpZigbeeTopologyOverlay};
diff --git a/dist/houseplan-assets/iso-scene-render-CCE-TeKM.js b/custom_components/houseplan/frontend/houseplan-assets/iso-scene-render-Dh7Z_AR9.js
similarity index 94%
rename from dist/houseplan-assets/iso-scene-render-CCE-TeKM.js
rename to custom_components/houseplan/frontend/houseplan-assets/iso-scene-render-Dh7Z_AR9.js
index 7a50e815..b9b9bef8 100644
--- a/dist/houseplan-assets/iso-scene-render-CCE-TeKM.js
+++ b/custom_components/houseplan/frontend/houseplan-assets/iso-scene-render-Dh7Z_AR9.js
@@ -1,4 +1,4 @@
-globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="34d1dbfc181acaf58842dfced0e6aa3a899aef6b8d1eeba53732ef729a63137e";import{dH as e,dI as t,b5 as n,dJ as o,dK as i,dL as a,k as r,dM as s,dN as l,dO as c,dP as d,a4 as f,dQ as u,aj as h,bY as p,bX as m,dR as g,ak as w,P as y,dS as M,cV as b,dT as x,A as v,w as S,dU as $,dV as k,dW as z,dX as P,dY as C}from"./houseplan-card-BKJrmMEj.js";const I=e=>`${Number(e[0].toFixed(4))} ${Number(e[1].toFixed(4))}`;function T(e){let t=0;for(let n=0;nArray.isArray(e)&&Number.isFinite(e[0])&&Number.isFinite(e[1])).map(e=>[Number(e[0]),Number(e[1])]),n=t[t.length-1];return t.length>1&&t[0][0]===n[0]&&t[0][1]===n[1]&&t.pop(),t}(e);if(n.length<3)return[];const o=!t;return T(n)>0===o?n:[...n].reverse()}function O(e,t,o){return e.length?`M ${e.map(e=>I(n(e,o,t))).join(" L ")} Z`:""}function B(e,t,n){const o=t[1]-e[1],i=-(t[0]-e[0]),a=n.rotDeg*Math.PI/180;return o*Math.sin(a)+i*Math.cos(a)}function N(t,o,i=e){if(!Number.isFinite(o)||o<0)throw new Error("invalid floor edge height");const a=(t||[]).map(e=>(e||[]).map((e,t)=>function(e,t){const n=j(e,t);if(!n.length)return n;let o=0;for(let e=1;e0)).filter(e=>e.length>=3&&Math.abs(T(e))>=1e-9)).filter(e=>e.length&&T(e[0])>0);a.sort((e,t)=>{const n=e[0][0],o=t[0][0];return n[0]-o[0]||n[1]-o[1]||Math.abs(T(t[0]))-Math.abs(T(e[0]))});const r=[],s=[];let l=0;for(let e=0;ee.depth-t.depth||e.component-t.component||e.edge-t.edge),{footprintPath:r.join(" "),sides:s,componentCount:a.length,edgeCount:l}}function H(e,t){return e^=Math.round(64*(Number.isFinite(t)?t:0)),Math.imul(e,16777619)>>>0}const R=Object.freeze({revision:3,leafThicknessRatio:.04,frameThicknessRatio:.05,doorTurnDeg:50,windowTurnDeg:65,gateTurnDeg:10,gateTopRatio:.88,windowFrameBottomRatio:.38,windowFrameTopRatio:1,windowSashBottomRatio:.4,windowSashTopRatio:.98,windowGlassBottomRatio:.45,windowGlassTopRatio:.93,doorTopRatio:.92});R.leafThicknessRatio,R.frameThicknessRatio;const A=e=>e.every(Number.isFinite);function F(e,t){return Object.freeze([Object.is(e,-0)?0:e,Object.is(t,-0)?0:t])}function V(e,t){return[e[0]+t[0],e[1]+t[1]]}function L(e,t){return[e[0]-t[0],e[1]-t[1]]}function G(e,t){return[e[0]*t,e[1]*t]}function D(e,t,n,o){const i=e[0]*n,a=e[1]*o,r=t*Math.PI/180;return[i*Math.cos(r)-a*Math.sin(r),i*Math.sin(r)+a*Math.cos(r)]}function W(e,t,n,i,a,r,s){const l=e.flipH?-1:1,c="gate"===e.type?1:e.flipV?-1:1,d="door"===e.type||"gate"===e.type?e.face:o(e.type,e.flipV,e.angle,e.face);return{leaf:t,hinge:V([e.x+d.ox,e.y+d.oy],D(n,e.angle,l,c)),closedVector:D(i,e.angle,l,c),quarterVector:D([-i[1],i[0]],e.angle,l,c),turnDeg:a,bottom:r,top:s}}const E=e=>`${Number(e[0].toFixed(4))} ${Number(e[1].toFixed(4))}`;function q(e,t,o,i,a={}){const r=o.map(e=>n(e.point,e.z,i)),s=i.rotDeg*Math.PI/180,l=i.tiltDeg*Math.PI/180,c=o.reduce((e,t)=>e+(t.point[0]*Math.sin(s)+t.point[1]*Math.cos(s))*Math.sin(l)+t.z*Math.cos(l),0)/o.length;return Object.freeze({kind:e,material:t,d:`M ${r.map(E).join(" L ")} Z`,cameraDepth:c,depth:Math.max(...r.map(e=>e[1])),...a})}function _(e,t,n,o,i,a,r,s={}){return q(e,t,[{point:n,z:i},{point:o,z:i},{point:o,z:a},{point:n,z:a}],r,s)}function U(t,o,i=e){const a=Math.max(0,Math.min(1,Number.isFinite(o)?o:0));return t.leaves.map(e=>{const o=function(e,t){const n=e.turnDeg*t*Math.PI/180;return[e.hinge[0]+e.closedVector[0]*Math.cos(n)+e.quarterVector[0]*Math.sin(n),e.hinge[1]+e.closedVector[1]*Math.cos(n)+e.quarterVector[1]*Math.sin(n)]}(e,a),r=n(e.hinge,e.bottom,i),s=n(o,e.bottom,i),l=n(o,e.top,i),c=n(e.hinge,e.top,i),d="window"===t.type?"light-window":"matte-leaf",f="window"===t.type?function(e,t,n,o){const i=e.windowProfile;if(!i)throw new Error("missing isometric window profile");const a=L(n,t.hinge),r=Math.hypot(a[0],a[1]);if(!(r>1e-9))return Object.freeze([]);const s=F(a[0]/r,a[1]/r),l=Math.min(i.member,r/4,(i.sashTop-i.sashBottom)/4),c=V(t.hinge,G(s,l)),d=L(n,G(s,l)),f=Math.min(.35*e.frameThickness,.02*r),u=F(-s[1]*f/2,s[0]*f/2),h=V(c,u),p=V(d,u),m=L(c,u),g=L(d,u),w=[_("window-sash-side","light-frame",t.hinge,c,i.sashBottom,i.sashTop,o,{edge:"hinge"}),_("window-sash-side","light-frame",d,n,i.sashBottom,i.sashTop,o,{edge:"tip"}),_("window-sash-bottom","light-frame",t.hinge,n,i.sashBottom,i.sashBottom+l,o),_("window-sash-top","light-frame",t.hinge,n,i.sashTop-l,i.sashTop,o),_("window-glass","glass-side",h,p,i.glassBottom,i.glassTop,o),_("window-glass","glass-side",g,m,i.glassBottom,i.glassTop,o),q("window-glass-top","glass-top",[{point:h,z:i.glassTop},{point:p,z:i.glassTop},{point:g,z:i.glassTop},{point:m,z:i.glassTop}],o)];return Object.freeze(w.sort((e,t)=>e.depth-t.depth||e.kind.localeCompare(t.kind)||String(e.edge||"").localeCompare(String(t.edge||""))))}(t,e,o,i):function(e,t,n,o){const i=L(t,e.hinge),a=Math.hypot(i[0],i[1]);if(!(a>1e-9&&n>0))return Object.freeze([]);const r=F(-i[1]*n/(2*a),i[0]*n/(2*a)),s=V(e.hinge,r),l=V(t,r),c=L(e.hinge,r),d=L(t,r),f=[_("leaf-back","matte-leaf",d,c,e.bottom,e.top,o),_("leaf-front","matte-leaf",s,l,e.bottom,e.top,o),_("leaf-edge","matte-leaf",c,s,e.bottom,e.top,o,{edge:"hinge"}),_("leaf-edge","matte-leaf",l,d,e.bottom,e.top,o,{edge:"tip"}),q("leaf-top","matte-leaf",[{point:s,z:e.top},{point:c,z:e.top},{point:d,z:e.top},{point:l,z:e.top}],o)];return Object.freeze(f.sort((e,t)=>e.depth-t.depth||e.kind.localeCompare(t.kind)||String(e.edge||"").localeCompare(String(t.edge||""))))}(e,o,t.leafThickness,i);return Object.freeze({id:t.id,sourceIndex:t.sourceIndex,type:t.type,leaf:e.leaf,d:`M ${E(r)} L ${E(s)} L ${E(l)} L ${E(c)} Z`,shadowD:`M ${E(n(e.hinge,0,i))} L ${E(n(o,0,i))}`,depth:Math.max(r[1],s[1]),material:d,thickness:"window"===t.type?0:t.leafThickness,surfaces:f})})}const K=1e-9,Z=(e,t)=>`${e}\0${t}`,X=e=>e.length>=2&&Number.isFinite(e[0])&&Number.isFinite(e[1]);function Y(e){let t=0;for(let n=0;n=3&&e.every(X)&&Math.abs(Y(e))>K}function Q(e,t,n){const o=n[0]-t[0],i=n[1]-t[1],a=o*o+i*i,r=a?Math.max(0,Math.min(1,((e[0]-t[0])*o+(e[1]-t[1])*i)/a)):0;return Math.hypot(e[0]-t[0]-r*o,e[1]-t[1]-r*i)}function ee(e,t,n=1e-7){for(let o=0;oe[1]!=r[1]>e[1]&&e[0]<(r[0]-a[0])*(e[1]-a[1])/(r[1]-a[1])+a[0]&&(n=!n)}return n}function ne(e){return Math.max(0,Math.abs(Y(e.outer))-(e.holes||[]).reduce((e,t)=>e+Math.abs(Y(t)),0))}function oe(e){return!!e.id&&J(e.outer)&&(e.holes||[]).every(J)&&ne(e)>K}function ie(e,t){if(!oe(t)||ee(e,t.outer)||!te(e,t.outer))return!1;for(const n of t.holes||[])if(ee(e,n)||te(e,n))return!1;return!0}function ae(e){if(!oe(e))return null;if(e.safePoint&&ie(e.safePoint,e))return[e.safePoint[0],e.safePoint[1]];const t=e.outer.map(e=>e[0]),n=e.outer.map(e=>e[1]),o=Math.min(...t),i=Math.max(...t),a=Math.min(...n),r=Math.max(...n),s=[[(o+i)/2,(a+r)/2],[t.reduce((e,t)=>e+t,0)/t.length,n.reduce((e,t)=>e+t,0)/n.length]];for(let t=0;t{if(!ie(t,e))return;const n=function(e,t){let n=1/0;for(const o of[t.outer,...t.holes||[]])for(let t=0;tc+K&&(l=t,c=n)};s.forEach(d);for(let e=1;e<16;e++)for(let t=1;t<16;t++)d([o+(i-o)*e/16,a+(r-a)*t/16]);return l}function re(e){if(!X(e.floorAnchor))return null;const t=e.roomsValidated?e.rooms:e.rooms.filter(oe),n=e.preferredRoomId&&t.find(t=>t.id===e.preferredRoomId)||null;let o=null;return"device"===e.kind?(n&&ie(e.floorAnchor,n)&&(o=n),o||(o=t.filter(t=>ie(e.floorAnchor,t)).sort((e,t)=>ne(e)-ne(t)||((e,t)=>et?1:0)(e.id,t.id))[0]||null)):o=n,o?{id:o.id,area:ne(o),safePoint:e.roomsValidated&&o.safePoint?[o.safePoint[0],o.safePoint[1]]:ae(o)}:null}function se(t,o,i,a=e,r=[0,0]){if(!X(t)||!X(o)||o[0]<0||o[1]<0||!Number.isFinite(i)||!X(r))throw new Error("invalid isometric overlay footprint");return[[t[0]-o[0],t[1]-o[1]],[t[0]+o[0],t[1]-o[1]],[t[0]+o[0],t[1]+o[1]],[t[0]-o[0],t[1]+o[1]]].map(e=>{const t=n(e,i,a);return[t[0]+r[0],t[1]+r[1]]})}function le(e,t,n){return(t[0]-e[0])*(n[1]-e[1])-(t[1]-e[1])*(n[0]-e[0])}function ce(e,t,n,o){const i=le(e,t,n),a=le(e,t,o),r=le(n,o,e),s=le(n,o,t);return(i>K&&a<-K||i<-K&&a>K)&&(r>K&&s<-K||r<-K&&s>K)||(Math.abs(i)<=K&&Q(n,e,t)<=K||Math.abs(a)<=K&&Q(o,e,t)<=K||Math.abs(r)<=K&&Q(e,n,o)<=K||Math.abs(s)<=K&&Q(t,n,o)<=K)}function de(e,t,n,o){return ce(e,t,n,o)?0:Math.min(Q(e,n,o),Q(t,n,o),Q(n,e,t),Q(o,e,t))}const fe=new WeakMap;function ue(e){if(!e.length)return null;let t=1/0,n=1/0,o=-1/0,i=-1/0;for(const a of e){if(!X(a))return null;t=Math.min(t,a[0]),n=Math.min(n,a[1]),o=Math.max(o,a[0]),i=Math.max(i,a[1])}return[t,n,o,i]}function he(e,t){if(!t)return ue(e.outer);if(fe.has(e))return fe.get(e)??null;const n=ue(e.outer);return fe.set(e,n),n}function pe(e,t,n){return e[0]<=t[2]+n&&e[2]>=t[0]-n&&e[1]<=t[3]+n&&e[3]>=t[1]-n}function me(e,t,n,o){return Math.min(t[0],n[0])<=e[2]+o&&Math.max(t[0],n[0])>=e[0]-o&&Math.min(t[1],n[1])<=e[3]+o&&Math.max(t[1],n[1])>=e[1]-o}function ge(e,t,n,o,i){const a=he(n,i);if(!a||!pe(t,a,o))return!1;if(e.some(e=>function(e,t){return!!te(e,t.outer)&&!(t.holes||[]).some(t=>te(e,t))}(e,n)))return!0;if(n.outer.some(n=>n[0]>=t[0]&&n[0]<=t[2]&&n[1]>=t[1]&&n[1]<=t[3]&&te(n,e)))return!0;for(const i of[n.outer,...n.holes||[]])for(let n=0;n{const e=[],t=Math.floor(48);for(let n=-t;n<=t;n++)for(let o=-t;o<=t;o++)o*o+n*n>t*t||e.push(Object.freeze([1*o,1*n]));return e.sort((e,t)=>e[0]*e[0]+e[1]*e[1]-(t[0]*t[0]+t[1]*t[1])||e[1]-t[1]||e[0]-t[0]),e})()),xe=Object.freeze(be.map(e=>Object.freeze({offset:e,distance:Math.hypot(e[0],e[1])}))),ve=Object.freeze(xe.filter(e=>e.offset[0]%4==0&&e.offset[1]%4==0));function Se(e){return xe.filter(t=>Math.abs(t.offset[0]-e[0])<=4&&Math.abs(t.offset[1]-e[1])<=4)}function $e(e,t){return[t[0]-e.screenHalfSize[0],t[1]-e.screenHalfSize[1],t[0]+e.screenHalfSize[0],t[1]+e.screenHalfSize[1]]}function ke(e,t){return[e[0]-t,e[1]-t,e[2]+t,e[3]+t]}function ze(e,t,n){const o=Math.min(e[2],t[2])-Math.max(e[0],t[0])+n,i=Math.min(e[3],t[3])-Math.max(e[1],t[1])+n;return o>K&&i>K?o*i:0}function Pe(e,t,n){const o=n.tiltDeg*Math.PI/180;return a([e[0],e[1]+t*n.zScale*Math.sin(o)],n)}function Ce(e,t,n,o){const i=[t[0]*n,t[1]*n];if(!o&&Math.abs(i[0]-e.nudgeScene[0])<=K&&Math.abs(i[1]-e.nudgeScene[1])<=K)return e;const a=[i[0]-e.nudgeScene[0],i[1]-e.nudgeScene[1]],r=[e.raisedScene[0]+i[0],e.raisedScene[1]+i[1]],s=Math.hypot(t[0],t[1]);return{...e,visualScene:r,footprint:e.footprint.map(e=>[e[0]+a[0],e[1]+a[1]]),nudgeScene:i,nudgeCss:t,nudgeDistanceCss:s,nudged:s>K,capped:e.capped||o,status:o?"degraded":e.status,reason:o?"overlay-collision":e.reason,tether:Me(e.floorScene,r,!1)}}const Ie="34d1dbfc181acaf58842dfced0e6aa3a899aef6b8d1eeba53732ef729a63137e",Te=e=>"wall-side"===e.layer?0:"wall-top"===e.layer?1:2,je=e=>{if("wall-side"===e.layer)return`${e.face.polygon}:${e.face.ring}:${e.face.edge}`;if("wall-top"===e.layer)return String(e.face.component);const t=e.surface;return`${t.sourceIndex}:${t.leaf??-1}:${t.kind}:${t.jamb??-1}:${t.edge??""}:${t.id}:${t.material}`};function Oe(e,t){const n=[...e.sides.map(e=>({layer:"wall-side",depth:e.depth,face:e})),...e.topFaces.map(e=>({layer:"wall-top",depth:e.depth,face:e})),...t.map(e=>({layer:"opening",depth:e.depth,surface:e}))];n.sort((e,t)=>e.depth-t.depth||Te(e)-Te(t)||je(e).localeCompare(je(t)));const o=new Map;for(const e of n){if("opening"!==e.layer)continue;const t=`${e.surface.type}\0${e.surface.id}`,n=o.get(t)||[];n.push(e),o.set(t,n)}for(const e of o.values())e.sort((e,t)=>{const n="opening"===e.layer?e.surface:null,o="opening"===t.layer?t.surface:null;return(n?.cameraDepth??n?.depth??0)-(o?.cameraDepth??o?.depth??0)||je(e).localeCompare(je(t))});const i=new Map;return Object.freeze(n.map(e=>{if("opening"!==e.layer)return e;const t=`${e.surface.type}\0${e.surface.id}`,n=i.get(t)||0;return i.set(t,n+1),o.get(t)?.[n]||e}))}const Be=Object.freeze({textLatinAdvance:.72,textWideAsciiAdvance:1,textWideAdvance:1.1,textSpaceAdvance:.4,textWidthSafety:1.08,deviceShellInset:.134375,deviceShellGap:.1,deviceSectionGap:.08,deviceBadgeMinWidth:.7875,deviceBadgeHeight:.7875,deviceBadgeInlinePadding:.28,deviceValueInlinePadding:.32,deviceAuxiliaryExtent:.7,deviceLqiFontSize:.38,deviceLqiTop:.734375,deviceLqiBelowBottomBadgeTop:1.571875,devicePadding:.08,roomNameLineHeight:1.25,roomAreaLinkWidth:1.1,roomMetricsTopGap:.15,roomMetricFontSize:.75,roomMetricLineHeight:1.25,roomMetricIconWidth:1.05,roomMetricInnerGap:.12,roomMetricRowGap:.55,roomMetricMinWidth:11,roomPadding:.4,openingLockHalfSize:.62,roomMetricTextCharacters:Object.freeze({temperature:10,humidity:8,lqi:6,light:24})});function Ne(e){return[...String(e)].reduce((e,t)=>/\s/.test(t)?e+Be.textSpaceAdvance:/[MW@#%&]/.test(t)?e+Be.textWideAsciiAdvance:e+(t.codePointAt(0)>255?Be.textWideAdvance:Be.textLatinAdvance),0)*Be.textWidthSafety}function He(e,t){return Ne(e)*P(t||e)}function Re(e,t){return[Math.max(Math.abs(e.left),Math.abs(e.right))+t,Math.max(Math.abs(e.top),Math.abs(e.bottom))+t]}function Ae(e){if("opening-lock"===e.kind){const t=(Number.isFinite(e.size)&&e.size>0?e.size:0)*Be.openingLockHalfSize;return[t,t]}if("room-label"===e.kind){const t=Number.isFinite(e.font)&&e.font>0?e.font:0,n=b(e.room.settings?.name_scale),o=b(e.room.settings?.label_scale),i=(Ne(e.room.name||"")+(e.room.area?Be.roomAreaLinkWidth:0))*n,a=Be.roomNameLineHeight*n,r=[e.display.labelTemp?Be.roomMetricTextCharacters.temperature:0,e.display.labelHum?Be.roomMetricTextCharacters.humidity:0,e.display.labelLqi&&e.room.area?Be.roomMetricTextCharacters.lqi:0,e.display.labelLight?Be.roomMetricTextCharacters.light:0].filter(e=>e>0),s=Be.roomMetricFontSize*o,l=r.length?Math.max(Be.roomMetricMinWidth,r.reduce((e,t)=>e+Be.roomMetricIconWidth+Be.roomMetricInnerGap+t*Be.textLatinAdvance*Be.textWidthSafety,0)+(r.length-1)*Be.roomMetricRowGap)*s:0,c=r.length?s*Be.roomMetricLineHeight:0,d=Re({left:-Math.max(i,l)/2,right:Math.max(i,l)/2,top:-a/2,bottom:r.length?a/2+Be.roomMetricsTopGap+c:a/2},Be.roomPadding);return[d[0]*t,d[1]*t]}const t=Number.isFinite(e.core)&&e.core>0?e.core:0,n=e.presentation,o=null==n.valueText?1:Math.max(1,He(n.valueText,n.valueFullText||n.valueText)+Be.deviceValueInlinePadding),i=[];n.valueBadge&&i.push(Math.max(Be.deviceBadgeMinWidth,He(n.valueBadge.text,n.valueBadge.fullText||n.valueBadge.text)+Be.deviceBadgeInlinePadding));for(const e of x(n)){const t=e.text+e.suffix;i.push(Math.max(Be.deviceBadgeMinWidth,He(t,t)+Be.deviceBadgeInlinePadding))}const a=n.valueBadge?.position||"right";let r;if(!i.length||"left"!==a&&"right"!==a)if(i.length){const e=i.reduce((e,t)=>e+t,0)+(i.length-1)*Be.deviceSectionGap,t=Math.max(o,e),n=1+Be.deviceShellGap+Be.deviceBadgeHeight;r="bottom"===a?{left:-t/2-Be.deviceShellInset,right:t/2+Be.deviceShellInset,top:-.5-Be.deviceShellInset,bottom:-.5+n+Be.deviceShellInset}:{left:-t/2-Be.deviceShellInset,right:t/2+Be.deviceShellInset,top:.5-n-Be.deviceShellInset,bottom:.5+Be.deviceShellInset}}else r={left:-.5-Be.deviceShellInset,right:-.5+o+Be.deviceShellInset,top:-.5-Be.deviceShellInset,bottom:.5+Be.deviceShellInset};else{const e=Math.max(...i),t=i.length*Be.deviceBadgeHeight+(i.length-1)*Be.deviceSectionGap,n=o+Be.deviceShellGap+e,s=Math.max(1,t);r="right"===a?{left:-.5-Be.deviceShellInset,right:-.5+n+Be.deviceShellInset,top:-s/2-Be.deviceShellInset,bottom:s/2+Be.deviceShellInset}:{left:.5-n-Be.deviceShellInset,right:.5+Be.deviceShellInset,top:-s/2-Be.deviceShellInset,bottom:s/2+Be.deviceShellInset}}const s=Be.deviceAuxiliaryExtent;if(r.left=Math.min(r.left,-s),r.right=Math.max(r.right,s),r.top=Math.min(r.top,-s),r.bottom=Math.max(r.bottom,s),n.pulse.animated){const e=Math.max(1,n.pulse.diameterScale)/2;r.left=Math.min(r.left,-e),r.right=Math.max(r.right,e),r.top=Math.min(r.top,-e),r.bottom=Math.max(r.bottom,e)}if(null!=n.lqiText){const e="bottom"===n.valueBadge?.position?Be.deviceLqiBelowBottomBadgeTop:Be.deviceLqiTop,t=Ne(n.lqiText)*Be.deviceLqiFontSize/2;r.left=Math.min(r.left,-t),r.right=Math.max(r.right,t),r.bottom=Math.max(r.bottom,e+Be.deviceLqiFontSize)}const l=Re(r,Be.devicePadding);return[l[0]*t,l[1]*t]}function Fe(e,t){return e.flatMap((e,n)=>e.orphanReason?[]:[{id:String(e.id||n),sourceIndex:n,type:e.type,x:e.rx,y:e.ry,angle:Number(e.angle)||0,length:e.rlen>0?e.rlen:.9*t,flipH:!!e.flip_h,flipV:!!e.flip_v}])}function Ve(e){return{id:e.id,x:e.x,y:e.y,w:e.w,h:e.h,poly:e.poly,wall_ids:e.wall_ids}}function Le(e,t){const n=e?.partitionHost;if(!n)return null;const o="gate"===t.type?!t.flipV:t.flipV;return{sourceIndex:t.sourceIndex,hostId:n.host.id,t:n.t,depth:n.depth,face:m(n,o)}}function Ge(n,o=R){const i=Fe(n.openings,n.coordinateScale),a=i.map(e=>Le(n.openings[e.sourceIndex],e)),s=r(t,n.cellCm),m=r(l,n.cellCm),g=r(c,n.cellCm);return{key:`${n.space.id}|${function(e){let t=2166136261;const n=e=>{if("number"!=typeof e)if("string"!=typeof e)if("boolean"!=typeof e)if(Array.isArray(e)){t=H(t,e.length);for(const t of e)n(t)}else{if(e&&"object"==typeof e){const t=e;for(const e of Object.keys(t).sort())n(e),n(t[e]);return}t=H(t,-1)}else t=H(t,e?1:0);else for(const n of e)t=H(t,n.codePointAt(0)||0);else t=H(t,e)};return n(e),t.toString(36)}({rooms:n.space.rooms.map(Ve),walls:n.walls,openCuts:n.openCuts,openings:i,openingHosts:a,openingGeometryPolicy:o,partitions:n.space.partitions,columns:n.space.wall_columns,cellCm:n.cellCm,gridPitch:n.gridPitch,wallKeyPitch:n.wallKeyPitch,camera:e,wallHeight:s,raisedHeight:g,floorEdgeHeight:m,algorithm:5})}`,build:()=>{n.onBuild();const r=d(n.space,n.cellCm,n.gridPitch,2e-4*n.gridPitch,n.partitionCuts()).all,l=n.roomOpenings(),c=n.walls.length||r.length?f(n.space.rooms,n.walls,n.openCuts,l,n.wallKeyPitch,n.cellCm,n.gridPitch,n.coordinateScale,r):null;if(c&&("failed-core"===c.status||"not-applicable"===c.status))throw new Error("wall boolean geometry failed");const m=c?.paperGeom??u(n.space.rooms,n.walls,n.openCuts,n.wallKeyPitch,n.cellCm,n.gridPitch,n.coordinateScale);if(!m)throw new Error("floor boolean geometry failed");const g=c?.openingIndex||h(n.space.rooms,n.walls,n.openCuts,n.wallKeyPitch,n.cellCm,n.gridPitch,n.coordinateScale),w=i.map((e,i)=>{const r=a[i],l="gate"===e.type?!e.flipV:e.flipV,c=r?r.face:n.walls.length||"gate"===e.type?p(g,{x:e.x,y:e.y,angle:e.angle,length:e.length,flip_v:l}):{ox:0,oy:0,cm:0,side:-1};return function(e,n=t,o=R){const i=e.face.cm??0;if(!A([e.x,e.y,e.angle,e.length,e.face.ox,e.face.oy,i,n])||!(e.length>0)||!(n>0)||-1!==e.face.side&&1!==e.face.side||i<0)throw new Error("invalid isometric opening input");const a=e.length/2,r=e.angle*Math.PI/180,s=F(Math.cos(r),Math.sin(r)),l=F(-Math.sin(r),Math.cos(r)),c=F(e.x,e.y),d=F(e.x-s[0]*a,e.y-s[1]*a),f=F(e.x+s[0]*a,e.y+s[1]*a),u=F(e.face.ox,e.face.oy),h=F(d[0]+u[0],d[1]+u[1]),p=F(f[0]+u[0],f[1]+u[1]),m=F(d[0]-u[0],d[1]-u[1]),g=F(f[0]-u[0],f[1]-u[1]),w=Object.freeze({center:c,tangent:s,normal:l,start:d,end:f}),y=Object.freeze({side:e.face.side,cm:i,depth:2*Math.hypot(e.face.ox,e.face.oy),offset:u,selectedStart:h,selectedEnd:p,oppositeStart:m,oppositeEnd:g}),M="passage"===e.type?[]:[Object.freeze({jamb:0,center:d,selected:h,opposite:m}),Object.freeze({jamb:1,center:f,selected:p,opposite:g})];let b;if("passage"===e.type)b=[];else if("gate"===e.type){const t=e.face.side*o.gateTurnDeg;b=[W(e,0,[-a,0],[a,0],t,0,n*o.gateTopRatio),W(e,1,[a,0],[-a,0],-t,0,n*o.gateTopRatio)]}else b="window"===e.type?[W(e,0,[-a,0],[a,0],-o.windowTurnDeg,n*o.windowSashBottomRatio,n*o.windowSashTopRatio),W(e,1,[a,0],[-a,0],o.windowTurnDeg,n*o.windowSashBottomRatio,n*o.windowSashTopRatio)]:[W(e,0,[-a,0],[e.length,0],-o.doorTurnDeg,0,n*o.doorTopRatio)];const x="window"===e.type?Object.freeze({frameBottom:n*o.windowFrameBottomRatio,frameTop:n*o.windowFrameTopRatio,sashBottom:n*o.windowSashBottomRatio,sashTop:n*o.windowSashTopRatio,glassBottom:n*o.windowGlassBottomRatio,glassTop:n*o.windowGlassTopRatio,member:n*o.frameThicknessRatio}):null;return Object.freeze({id:e.id,sourceIndex:e.sourceIndex,type:e.type,wallHeight:n,leafThickness:n*o.leafThicknessRatio,frameThickness:n*o.frameThicknessRatio,windowProfile:x,axis:w,face:y,reveals:Object.freeze(M),leaves:Object.freeze(b.map(e=>Object.freeze({...e,hinge:F(e.hinge[0],e.hinge[1]),closedVector:F(e.closedVector[0],e.closedVector[1]),quarterVector:F(e.quarterVector[0],e.quarterVector[1])})))})}({...e,face:c},s,o)}),y=Object.freeze(w);return{walls:c?.components.flatMap(e=>e.geom)||[],floor:m,openings:y,openingSurfaces:Object.freeze(y.flatMap(t=>function(t,n=e){if("passage"===t.type)return Object.freeze([]);const o=[];if(t.face.depth>1e-9)for(const e of t.reveals)o.push(_("jamb-reveal","reveal",e.selected,e.opposite,0,t.wallHeight,n,{jamb:e.jamb}));if("window"!==t.type||!t.leaves.length)return Object.freeze(o.sort((e,t)=>e.depth-t.depth||e.kind.localeCompare(t.kind)||(e.jamb??0)-(t.jamb??0)));const i=t.windowProfile;if(!i)throw new Error("missing isometric window profile");const a=i.frameBottom,r=i.frameTop,s=Math.min(t.frameThickness,Math.hypot(t.axis.end[0]-t.axis.start[0],t.axis.end[1]-t.axis.start[1])/4,(r-a)/4),l=V(t.axis.start,G(t.axis.tangent,s)),c=L(t.axis.end,G(t.axis.tangent,s)),d=t.face.depth>1e-9?[t.face.offset,F(-t.face.offset[0],-t.face.offset[1])]:[t.face.offset];for(const e of d){const i=V(t.axis.start,e),d=V(t.axis.end,e),f=V(l,e),u=V(c,e);o.push(_("window-frame-side","light-frame",i,f,a,r,n,{jamb:0}),_("window-frame-side","light-frame",u,d,a,r,n,{jamb:1}),_("window-frame-top","light-frame",f,u,Math.max(a,r-s),r,n))}return t.face.depth>1e-9&&o.push(q("window-sill","light-sill",[{point:t.face.selectedStart,z:a},{point:t.face.selectedEnd,z:a},{point:t.face.oppositeEnd,z:a},{point:t.face.oppositeStart,z:a}],n)),Object.freeze(o.sort((e,t)=>e.depth-t.depth||e.kind.localeCompare(t.kind)||(e.jamb??0)-(t.jamb??0)))}(t).map(e=>Object.freeze({...e,id:t.id,sourceIndex:t.sourceIndex,type:t.type}))))}}}}const De=e=>Array.isArray(e)?e:[];function We(e,t){const o=e=>De(e).flatMap(e=>Array.isArray(e)&&Number.isFinite(e[0])&&Number.isFinite(e[1])?[n([Number(e[0]),Number(e[1])],t)]:[]);return De(e).flatMap(e=>{const t=De(e);if(!t.length)return[];const n=o(t[0]);if(n.length<3)return[];return[{outer:n,holes:t.slice(1).map(o).filter(e=>e.length>=3)}]})}function Ee(o){const i=r(t,o.cellCm),a=r(l,o.cellCm),s=r(c,o.cellCm),d=$(o.cache,o.source.key);let f=d.hit?d.value:void 0;if(!f){const r=o.source.build(),s=function(o,i=e,a=t){if(!Number.isFinite(a)||a<0)throw new Error("invalid wall height");const r=[],s=[],l=[],c=[];let d=0;for(let e=0;e<(o||[]).length;e++){const t=o[e],f=[];let u=-1/0;for(let o=0;o<(t||[]).length;o++){const s=j(t[o],o>0);if(s.length<3||Math.abs(T(s))<1e-9)continue;const h=O(s,i,a);r.push(h),f.push(h),u=Math.max(u,...s.map(e=>n(e,a,i)[1])),d+=s.length;for(let t=0;te.depth-t.depth||e.polygon-t.polygon||e.ring-t.ring||e.edge-t.edge),s.sort((e,t)=>e.depth-t.depth||e.component-t.component),{topPath:r.join(" "),topFaces:s,sides:l,contactPath:c.join(" "),edgeCount:d}}(r.walls,e,i),l=We(r.walls,i);f={geometry:s,floor:N(r.floor,a),wallSilhouettes:Object.freeze([...l,...s.sides.map(e=>({outer:e.points}))]),openings:r.openings,openingSurfaces:r.openingSurfaces},k(o.cache,o.source.key,f,8)}const u=function(e){let t=1/0,n=1/0,o=-1/0,i=-1/0;const a=(e,a=0)=>{t=Math.min(t,e[0]-a),n=Math.min(n,e[1]-a),o=Math.max(o,e[0]+a),i=Math.max(i,e[1]+a)};for(const t of e)if("passage"!==t.type){a(t.axis.start),a(t.axis.end),a(t.face.selectedStart),a(t.face.selectedEnd),a(t.face.oppositeStart),a(t.face.oppositeEnd);for(const e of t.leaves){const n=Math.hypot(e.closedVector[0],e.closedVector[1])+t.leafThickness/2;a(e.hinge,n)}}return A([t,n,o,i])?{x:t,y:n,w:o-t,h:i-n}:null}(f.openings),h=u?qe(o.liveFrame,u):o.liveFrame,p=z({rect:h,wallHeight:i,openingHeight:i,floorDepth:a,raisedHeight:s});return{key:o.source.key,...f,frame:p}}const qe=(e,t)=>{const n=Math.min(e.x,t.x),o=Math.min(e.y,t.y);return{x:n,y:o,w:Math.max(e.x+e.w,t.x+t.w)-n,h:Math.max(e.y+e.h,t.y+t.h)-o}},_e=e=>{if(!e.length||!e.every(e=>Number.isFinite(e[0])&&Number.isFinite(e[1])))return null;const t=e.map(e=>e[0]),n=e.map(e=>e[1]),o=Math.min(...t),i=Math.min(...n);return{x:o,y:i,w:Math.max(...t)-o,h:Math.max(...n)-i}},Ue=(e,t)=>{const n=e.placement,o=t?n.visualScene:n.raisedScene,[i,a]=e.screenHalfSize,r=t?n.footprint:n.footprint.map(e=>[e[0]-n.nudgeScene[0],e[1]-n.nudgeScene[1]]);return[n.floorScene,...r,[o[0]-i,o[1]-a],[o[0]+i,o[1]-a],[o[0]+i,o[1]+a],[o[0]-i,o[1]+a]]},Ke=(e,t)=>void 0===t?e:e.filter(e=>e.placement.owner?.id===t);function Ze(e,t){return e?_e(Ke(e.entries,t).flatMap(e=>Ue(e,!0))):null}function Xe(e){const t=Ke(e.entries,e.ownerId),n=_e(t.flatMap(e=>Ue(e,!1))),o=n?qe(e.baseBounds,n):e.baseBounds,i=e.targetView(o);if(!(i&&i.w>0&&i.h>0&&[i.x,i.y,i.w,i.h].every(Number.isFinite)))return null;const a=e.stageSize;if(!(n&&a&&a.width>0&&a.height>0))return{bounds:o,view:i};const r=e=>Math.max(e.w/a.width,e.h/a.height),s=t=>{const o=48*t,i={x:n.x-o,y:n.y-o,w:n.w+2*o,h:n.h+2*o},a=qe(e.baseBounds,i),r=e.targetView(a);return r&&[r.x,r.y,r.w,r.h].every(Number.isFinite)&&r.w>0&&r.h>0?{bounds:a,view:r}:null};let l=0,c=Math.max(r(i),Number.EPSILON),d=s(c);for(let e=0;d&&r(d.view)>c*(1+1e-10)&&e<24;e++)l=c,c*=2,d=s(c);if(!d)return null;for(let e=0;e<40;e++){const e=(l+c)/2,t=s(e);if(!t)return null;r(t.view)<=e?(c=e,d=t):l=e}return d}const Ye=new WeakMap,Je=2048,Qe=new WeakMap,et=new WeakMap,tt=new WeakMap;function nt(e,t){if(e.size!==t.size)return!1;for(const[n,o]of t)if(e.get(n)!==o)return!1;return!0}function ot(e){const t=Ye.get(e.rooms);if(t)return t;const n=e.rooms.flatMap((e,t)=>{const n=y(e);return n&&n.length>=3?[{room:e,index:t,poly:n}]:[]}),o=Object.freeze(n.map(({room:e,index:t,poly:o})=>{const i=M(o,n.filter(e=>e.index!==t).map(e=>e.poly)),a={id:e.id||`room-index-${t}`,outer:o.map(e=>[e[0],e[1]]),holes:i.map(e=>e.map(e=>[e[0],e[1]]))};return{room:e,overlayRoom:{...a,safePoint:ae(a)||void 0}}}));return Ye.set(e.rooms,o),o}function it(o){const a=o.stageSize&&o.stageSize.width>0&&o.stageSize.height>0?Math.max(o.view.w/o.stageSize.width,o.view.h/o.stageSize.height):Math.max(o.view.w,o.view.h)/1e3,l=ot(o.space),c=l.map(e=>e.overlayRoom),d=r(t,o.cellCm),f=r(i,o.cellCm),u=new Map,h=new Map,p=new Map,m=[];let g=Qe.get(o.wallSilhouettes);g||(g=new Map,Qe.set(o.wallSilhouettes,g));let w=et.get(l);w||(w=new Map,et.set(l,w));const y=o.iconPct*s(o.space)*o.kioskIconScale/100,M=o.deviceBasePct*s(o.space)*o.kioskIconScale/100,b=(r,s,l,u,h)=>{const p=`${!1===o.resolveCollisions?"fit":"live"}\0${r}\0${s}`,m=[l[0],l[1],u[0],u[1],h||"",d,f].join("|"),y=`${m}|${a}`,M=$(g,p);if(M.hit&&M.value.signature===y)return M.value.placement;if(M.hit&&M.value.shapeSignature===m&&a<=M.value.unitsPerPixel){const e=M.value.placement,t=e.nudgeDistanceCss*M.value.unitsPerPixel/a;if(!e.nearWallBefore||e.cleared&&t<=48)return e}const b=`${r}\0${s}`,x=[l[0],l[1],h||""].join("|"),v=$(w,b),S=v.hit&&v.value.signature===x?v.value.owner:re({kind:r,floorAnchor:l,rooms:c,roomsValidated:!0,preferredRoomId:h});v.hit&&v.value.signature===x||k(w,b,{signature:x,owner:S},Je);const z=function(o){const a=o.camera||e,r=o.wallHeight??t,s=o.visualOffset??i,l=o.sceneUnitsPerCssPixel??1,c=o.safetyGapCssPx??4,d=o.maxNudgeCssPx??48;if(!X(o.floorAnchor)||!X(o.footprintHalfSize)||o.footprintHalfSize[0]<0||o.footprintHalfSize[1]<0||!Number.isFinite(r)||r<0||!Number.isFinite(s)||s<0||!Number.isFinite(l)||l<=0||!Number.isFinite(c)||c<0||!Number.isFinite(d)||d<0)throw new Error("invalid isometric overlay input");const f=[o.floorAnchor[0],o.floorAnchor[1]],u=n(f,0,a),h=(p=o.kind,!o.showBorders||"device"!==p&&"room-label"!==p&&"opening-lock"!==p?"floor":"raised");var p;if("floor"===h)return{plane:h,owner:null,floorAnchor:f,floorScene:u,raisedScene:u,visualScene:u,footprint:[],nudgeScene:[0,0],nudgeCss:[0,0],nudgeDistanceCss:0,nudged:!1,nearWallBefore:!1,nearWallAfter:!1,cleared:!0,capped:!1,grounding:{center:u,visible:!1},tether:Me(u,u,!1),status:"ok",reason:null};const m=s,g=n(f,m,a),w=o.ownerAlreadyResolved?o.resolvedOwner??null:re(o),y=o.wallGeometryValidated??o.wallSilhouettes.every(we),M=c*l,b=se(f,o.footprintHalfSize,m,a),x=e=>{const t=ue(e);return!!t&&o.wallSilhouettes.some(n=>ge(e,t,n,M,!0===o.wallGeometryValidated))},v=!y||x(b);let S=0,$=[0,0],k=null,z=!1,P=y?"ok":"degraded",C=y?null:"invalid-wall-geometry";if(y&&v)if(w)if(w.safePoint){const e=o.rooms.find(e=>e.id===w.id)||null,t=n(w.safePoint,m,a),i=t[0]-g[0],r=t[1]-g[1],s=Math.hypot(i,r);if(s<=K)P="degraded",C="invalid-safe-point";else{const t=i/s,n=r/s,a=Math.min(d,s/l),c=a*l/s,u=[f[0]+(w.safePoint[0]-f[0])*c,f[1]+(w.safePoint[1]-f[1])*c],h=[t*a*l,n*a*l],p=ue([...b,...b.map(e=>[e[0]+h[0],e[1]+h[1]])]),m=p?o.wallSilhouettes.filter(e=>{const t=he(e,!0===o.wallGeometryValidated);return!!t&&pe(p,t,M)}):o.wallSilhouettes,g=!!e&&ye(f,u,e),y=e=>{const i=[t*e*l,n*e*l],a=b.map(e=>[e[0]+i[0],e[1]+i[1]]),r=ue(a);return!!r&&m.some(e=>ge(a,r,e,M,!0===o.wallGeometryValidated))},x=o.nudgeHintCss;if(Number.isFinite(x)&&x>=0&&x<=a){const t=x*l/s,n=[f[0]+(w.safePoint[0]-f[0])*t,f[1]+(w.safePoint[1]-f[1])*t];(g||e&&ye(f,n,e))&&!y(x)&&(S=x,k=!1)}if(null===k){let t=null,n=0,o=!1;const i=Math.ceil(a);for(let r=1;r<=i;r++){const i=Math.min(a,r),c=i*l/s,d=[f[0]+(w.safePoint[0]-f[0])*c,f[1]+(w.safePoint[1]-f[1])*c];if(!(g||e&&ye(f,d,e))){o=!0;break}if(!y(i)){t=i;break}n=i}if(null!==t){let e=n,o=t;for(let t=0;t<14;t++){const t=(e+o)/2;y(t)?e=t:o=t}S=o}else S=n,z=!0,P="degraded",C=o?"owner-boundary":"nudge-cap"}$=[t*S*l,n*S*l]}}else P="degraded",C="invalid-safe-point";else P="degraded",C="missing-owner";const I=[g[0]+$[0],g[1]+$[1]],T=se(f,o.footprintHalfSize,m,a,$),j=!y||(k??x(T)),O=S>K;return{plane:h,owner:w,floorAnchor:f,floorScene:u,raisedScene:g,visualScene:I,footprint:T,nudgeScene:$,nudgeCss:[$[0]/l,$[1]/l],nudgeDistanceCss:S,nudged:O,nearWallBefore:v,nearWallAfter:j,cleared:!j,capped:z,grounding:{center:u,visible:!1},tether:Me(u,I,!1),status:P,reason:C}}({kind:r,floorAnchor:l,rooms:c,roomsValidated:!0,preferredRoomId:h,ownerAlreadyResolved:!0,resolvedOwner:S,nudgeHintCss:M.hit&&M.value.shapeSignature===m?M.value.placement.nudgeDistanceCss*M.value.unitsPerPixel/a:void 0,showBorders:!0,wallSilhouettes:!1===o.resolveCollisions?[]:o.wallSilhouettes,wallGeometryValidated:!0,footprintHalfSize:u,wallHeight:d,visualOffset:f,sceneUnitsPerCssPixel:a});return k(g,p,{signature:y,shapeSignature:m,unitsPerPixel:a,placement:z},Je),z};for(const e of o.devices){const t=o.positionOf(e),n=o.presentationOf(e,o.showLqi),i=M*n.scale,a=Ae({kind:"device",core:i,presentation:n}),r=e.marker?.room_id||l.find(t=>!!e.area&&t.room.area===e.area)?.overlayRoom.id||null,s=b("device",e.id,[t.x,t.y],a,r);u.set(e.id,s),m.push({id:e.id,kind:"device",placement:s,groundRadius:Math.max(.32*i,2),screenHalfSize:a})}for(const{room:e,overlayRoom:t}of l){if(!o.display.showNames||!e.name)continue;const n=o.labelPositionOf(e,o.space.id),i=.5*y*(o.labelScaleOf(e)*o.kioskFontScale*o.display.cardFontScale),a=Ae({kind:"room-label",font:i,room:e,display:o.display}),r=b("room-label",t.id,[n.x,n.y],a,t.id);h.set(e,r),m.push({id:t.id,kind:"room-label",placement:r,groundRadius:Math.max(.75*i,2),screenHalfSize:a})}const x=o.openings.filter(e=>!e.orphanReason&&("door"===e.type||"gate"===e.type)&&"string"==typeof e.lock&&!!e.lock&&o.openingEntityAvailable(e.lock));if(x.length){const e=o.openingWallIndex();for(const t of x){const n=rt(t,e,o.cellCm),i=n.floorAnchor,a=.62*y,r=Ae({kind:"opening-lock",size:a}),s=b("opening-lock",String(t.id),i,r,n.preferredRoomId);p.set(String(t.id),s),m.push({id:String(t.id),kind:"opening-lock",placement:s,groundRadius:Math.max(.28*a,2),screenHalfSize:r})}}const v=!1===o.resolveCollisions?"fit":"live";let S=tt.get(o.wallSilhouettes);S||(S=new Map,tt.set(o.wallSilhouettes,S));const z=S.get(v),P=m.map(e=>{const t=e.placement;return[e.kind,e.id,t.floorAnchor[0],t.floorAnchor[1],t.raisedScene[0],t.raisedScene[1],t.nudgeScene[0],t.nudgeScene[1],t.owner?.id||"",t.status,t.reason||"",e.screenHalfSize[0],e.screenHalfSize[1],a].join("|")}).sort().join("");if(z?.collisionSignature===P&&nt(z.rooms,h))return z;const C="live"===v?function(t){const n=t.sceneUnitsPerCssPixel,o=t.maxNudgeCssPx??48,a=t.safetyGapCssPx??4,r=t.visualOffset??i,s=t.camera||e;if(!(n>0&&Number.isFinite(n)&&o>=0&&Number.isFinite(o)&&a>=0&&Number.isFinite(a)))throw new Error("invalid isometric overlay collision input");const l=a*n,c=64*n,d=new Map(t.rooms.filter(oe).map(e=>[e.id,e])),f=t.wallSilhouettes.every(we),u=[],h=new Map,p=new Map,m=[],g=[...t.items].sort((e,t)=>e.placement.nudgeDistanceCss-t.placement.nudgeDistanceCss||Z(e.kind,e.id).localeCompare(Z(t.kind,t.id))),w=e=>[Math.floor(e[0]/c),Math.floor(e[1]/c),Math.floor(e[2]/c),Math.floor(e[3]/c)],y=e=>{const[t,n,o,i]=w(ke(e,l)),a=new Set;for(let e=n;e<=i;e++)for(let n=t;n<=o;n++)for(const t of h.get(`${n}:${e}`)||[])a.add(t);return[...a].sort((e,t)=>e-t)},M=e=>{const t=u.push(e)-1,[n,o,i,a]=w(e.bounds);for(let e=o;e<=a;e++)for(let o=n;o<=i;o++){const n=`${o}:${e}`,i=h.get(n)||[];i.push(t),h.set(n,i)}};for(const e of g){const i=Z(e.kind,e.id),a=e.placement,c=[a.nudgeScene[0]/n,a.nudgeScene[1]/n],h=a.footprint.map(e=>[e[0]-a.nudgeScene[0],e[1]-a.nudgeScene[1]]),g=a.owner&&d.get(a.owner.id)||null,b=Pe(a.visualScene,r,s),x=f&&h.length?t.wallSilhouettes.filter(e=>{const t=he(e,!0);if(!t)return!1;const i=o*n,a=ue(h);return!!a&&pe(ke(a,i),t,l)}):t.wallSilhouettes,v=y(ke($e(e,a.raisedScene),o*n)),S=e=>{const t=[];let n=0;for(const o of v){const i=ze(e,u[o].bounds,l);i>K&&(t.push(o),n+=i)}return{conflicts:t,penalty:n}},$=t=>{if(Math.hypot(t[0],t[1])>o+K)return null;const i=[t[0]*n,t[1]*n],r=Math.abs(i[0]-a.nudgeScene[0])<=K&&Math.abs(i[1]-a.nudgeScene[1])<=K,s=[a.raisedScene[0]+i[0],a.raisedScene[1]+i[1]],l=$e(e,s),{conflicts:c,penalty:d}=S(l);return{offsetScene:i,sameAsBase:r,visualScene:s,bounds:l,conflicts:c,penalty:d}},k=g?ue(g.outer):null,z=new Map;for(let e=0;e{const[t,n,o,i]=w(ke(e,l)),a=[];C+=1;for(let e=n;e<=i;e++)for(let n=t;n<=o;n++)for(const t of z.get(`${n}:${e}`)||[])P[t]!==C&&(P[t]=C,a.push(x[t]));return a},T=e=>{if(e.sameAsBase)return!0;if(!f||!g)return!1;const t=Pe(e.visualScene,r,s);if(k&&(t[0]k[2]||t[1]k[3]))return!1;if(!ie(t,g))return!1;if(ie(b,g)&&!ye(b,t,g))return!1;const n=h.map(t=>[t[0]+e.offsetScene[0],t[1]+e.offsetScene[1]]),o=ue(n);return!!o&&!I(o).some(e=>ge(n,o,e,l,!0))};let j=(e=>{const t=$(e);return t&&T(t)?{placement:Ce(a,e,n,!1),bounds:t.bounds,conflicts:t.conflicts,penalty:t.penalty}:null})(c);const O=e=>{let t=e;for(const o of Se(e.placement.nudgeCss)){if(o.distance>=t.placement.nudgeDistanceCss-K)continue;const e=$(o.offset);e&&!e.conflicts.length&&T(e)&&(t={placement:Ce(a,o.offset,n,!1),bounds:e.bounds,conflicts:e.conflicts,penalty:e.penalty})}return t};if(!j||j.conflicts.length){for(const e of ve){if(e.distance>o+K)break;const t=e.offset;if(Math.abs(t[0]-c[0])<=K&&Math.abs(t[1]-c[1])<=K)continue;const i=$(t);if(!i)continue;if(j&&i.conflicts.length&&!(i.penaltyK&&m.push(Object.freeze([u[e].key,i]));p.set(i,j.placement),M({key:i,bounds:j.bounds})}return{placements:p,residualPairs:Object.freeze(m)}}({items:m.flatMap(e=>"room-label"===e.kind?[]:[{id:e.id,kind:e.kind,placement:e.placement,screenHalfSize:e.screenHalfSize}]),rooms:c,wallSilhouettes:o.wallSilhouettes,sceneUnitsPerCssPixel:a,visualOffset:f}):{placements:new Map,residualPairs:[]},I=Object.freeze(m.map(e=>{if("room-label"===e.kind)return e;const t=C.placements.get(Z(e.kind,e.id))||e.placement;return t===e.placement?e:{...e,placement:t}})),T=new Map,j=new Map;for(const e of I)"device"===e.kind?T.set(e.id,e.placement):"opening-lock"===e.kind&&j.set(e.id,e.placement);const O={devices:T,rooms:h,locks:j,entries:I,collisionSignature:P,residualPairs:Object.freeze([...C.residualPairs])};return z&&function(e,t){return e.length===t.length&&t.every((t,n)=>{const o=e[n];return o.id===t.id&&o.kind===t.kind&&o.placement===t.placement&&o.groundRadius===t.groundRadius&&o.screenHalfSize[0]===t.screenHalfSize[0]&&o.screenHalfSize[1]===t.screenHalfSize[1]})}(z.entries,O.entries)&&nt(z.devices,O.devices)&&nt(z.rooms,O.rooms)&&nt(z.locks,O.locks)?z:(S.set(v,O),O)}function at(e,t,n){return rt(e,t,n).floorAnchor}function rt(e,t,n){const o=!e.flip_v,i="gate"===e.type?e.partitionHost?m(e.partitionHost,o):p(t,{x:e.rx,y:e.ry,angle:e.angle,length:e.rlen,flip_v:o}):null,[a,r]=g({x:e.rx,y:e.ry,angle:e.angle,flipV:!!e.flip_v,gateFace:i},n);if(e.partitionHost)return{floorAnchor:a,preferredRoomId:null};const s=w(t,{x:e.rx,y:e.ry,angle:e.angle,length:e.rlen},!0),l=r?"negative":"positive";return{floorAnchor:a,preferredRoomId:s[l]?.roomId||null}}function st(e){let t=!1;try{t="undefined"!=typeof CSS&&"function"==typeof CSS.supports&&CSS.supports("filter","blur(1px)")}catch{t=!1}let n=!1;try{n="function"==typeof matchMedia&&matchMedia("(forced-colors: active)").matches}catch{n=!0}return function(e){const t=!!e.showBorders;return{structural:t,panels:t&&!e.hideOpenings,shadows:t&&e.filtersSupported&&!e.forcedColors,materialNuance:t&&e.filtersSupported&&!e.forcedColors,floorSymbols:!e.hideOpenings&&!t}}({showBorders:e.showBorders,hideOpenings:e.hideOpenings,filtersSupported:t,forcedColors:n})}function lt(e,t,n,o){if(!e.panels||!t)return[];return t.openings.flatMap(e=>{const t=n[e.sourceIndex];return t?U(e,o(t)):[]}).sort((e,t)=>e.depth-t.depth||e.sourceIndex-t.sourceIndex||e.leaf-t.leaf)}function ct(e){const t=st(e.display),n=t.panels?lt(t,e.scene,e.openings,e.amountOf):[],o=e.overlays(t),i=t=>({layers:t,panels:n,overlays:o,underlay:mt(t,e.scene?.floor,e.cellCm),shadows:gt(t,n,e.scene?.geometry,e.cellCm),walls:wt(e.projection,t,e.scene,n,e.cellCm),grounds:ht(o,t,e.cellCm),raised:pt()});try{return i(t)}catch(e){if(!t.shadows&&!t.materialNuance)throw e;return i({...t,shadows:!1,materialNuance:!1})}}const dt=()=>S``;function ft(e){return`translate(${r(4,e)} ${r(8,e)})`}function ut(e,t,n){const o=C(n);return S`
+globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="4da0d706a85c3f1c08ab6de960deb5feb08baaf9055265234e7bd1b554332653";import{dH as e,dI as t,bx as n,dJ as o,dK as i,dL as a,aG as r,dM as s,dN as l,dO as c,dP as d,b3 as f,dQ as u,U as h,co as p,cn as m,dR as g,V as w,J as y,dS as M,db as b,dT as x,A as v,aB as S,dU as $,dV as k,dW as z,dX as P,dY as C}from"./houseplan-card-CAm75-22.js";const I=e=>`${Number(e[0].toFixed(4))} ${Number(e[1].toFixed(4))}`;function T(e){let t=0;for(let n=0;nArray.isArray(e)&&Number.isFinite(e[0])&&Number.isFinite(e[1])).map(e=>[Number(e[0]),Number(e[1])]),n=t[t.length-1];return t.length>1&&t[0][0]===n[0]&&t[0][1]===n[1]&&t.pop(),t}(e);if(n.length<3)return[];const o=!t;return T(n)>0===o?n:[...n].reverse()}function O(e,t,o){return e.length?`M ${e.map(e=>I(n(e,o,t))).join(" L ")} Z`:""}function B(e,t,n){const o=t[1]-e[1],i=-(t[0]-e[0]),a=n.rotDeg*Math.PI/180;return o*Math.sin(a)+i*Math.cos(a)}function N(t,o,i=e){if(!Number.isFinite(o)||o<0)throw new Error("invalid floor edge height");const a=(t||[]).map(e=>(e||[]).map((e,t)=>function(e,t){const n=j(e,t);if(!n.length)return n;let o=0;for(let e=1;e0)).filter(e=>e.length>=3&&Math.abs(T(e))>=1e-9)).filter(e=>e.length&&T(e[0])>0);a.sort((e,t)=>{const n=e[0][0],o=t[0][0];return n[0]-o[0]||n[1]-o[1]||Math.abs(T(t[0]))-Math.abs(T(e[0]))});const r=[],s=[];let l=0;for(let e=0;ee.depth-t.depth||e.component-t.component||e.edge-t.edge),{footprintPath:r.join(" "),sides:s,componentCount:a.length,edgeCount:l}}function H(e,t){return e^=Math.round(64*(Number.isFinite(t)?t:0)),Math.imul(e,16777619)>>>0}const R=Object.freeze({revision:3,leafThicknessRatio:.04,frameThicknessRatio:.05,doorTurnDeg:50,windowTurnDeg:65,gateTurnDeg:10,gateTopRatio:.88,windowFrameBottomRatio:.38,windowFrameTopRatio:1,windowSashBottomRatio:.4,windowSashTopRatio:.98,windowGlassBottomRatio:.45,windowGlassTopRatio:.93,doorTopRatio:.92});R.leafThicknessRatio,R.frameThicknessRatio;const A=e=>e.every(Number.isFinite);function F(e,t){return Object.freeze([Object.is(e,-0)?0:e,Object.is(t,-0)?0:t])}function V(e,t){return[e[0]+t[0],e[1]+t[1]]}function L(e,t){return[e[0]-t[0],e[1]-t[1]]}function G(e,t){return[e[0]*t,e[1]*t]}function D(e,t,n,o){const i=e[0]*n,a=e[1]*o,r=t*Math.PI/180;return[i*Math.cos(r)-a*Math.sin(r),i*Math.sin(r)+a*Math.cos(r)]}function W(e,t,n,i,a,r,s){const l=e.flipH?-1:1,c="gate"===e.type?1:e.flipV?-1:1,d="door"===e.type||"gate"===e.type?e.face:o(e.type,e.flipV,e.angle,e.face);return{leaf:t,hinge:V([e.x+d.ox,e.y+d.oy],D(n,e.angle,l,c)),closedVector:D(i,e.angle,l,c),quarterVector:D([-i[1],i[0]],e.angle,l,c),turnDeg:a,bottom:r,top:s}}const E=e=>`${Number(e[0].toFixed(4))} ${Number(e[1].toFixed(4))}`;function q(e,t,o,i,a={}){const r=o.map(e=>n(e.point,e.z,i)),s=i.rotDeg*Math.PI/180,l=i.tiltDeg*Math.PI/180,c=o.reduce((e,t)=>e+(t.point[0]*Math.sin(s)+t.point[1]*Math.cos(s))*Math.sin(l)+t.z*Math.cos(l),0)/o.length;return Object.freeze({kind:e,material:t,d:`M ${r.map(E).join(" L ")} Z`,cameraDepth:c,depth:Math.max(...r.map(e=>e[1])),...a})}function _(e,t,n,o,i,a,r,s={}){return q(e,t,[{point:n,z:i},{point:o,z:i},{point:o,z:a},{point:n,z:a}],r,s)}function U(t,o,i=e){const a=Math.max(0,Math.min(1,Number.isFinite(o)?o:0));return t.leaves.map(e=>{const o=function(e,t){const n=e.turnDeg*t*Math.PI/180;return[e.hinge[0]+e.closedVector[0]*Math.cos(n)+e.quarterVector[0]*Math.sin(n),e.hinge[1]+e.closedVector[1]*Math.cos(n)+e.quarterVector[1]*Math.sin(n)]}(e,a),r=n(e.hinge,e.bottom,i),s=n(o,e.bottom,i),l=n(o,e.top,i),c=n(e.hinge,e.top,i),d="window"===t.type?"light-window":"matte-leaf",f="window"===t.type?function(e,t,n,o){const i=e.windowProfile;if(!i)throw new Error("missing isometric window profile");const a=L(n,t.hinge),r=Math.hypot(a[0],a[1]);if(!(r>1e-9))return Object.freeze([]);const s=F(a[0]/r,a[1]/r),l=Math.min(i.member,r/4,(i.sashTop-i.sashBottom)/4),c=V(t.hinge,G(s,l)),d=L(n,G(s,l)),f=Math.min(.35*e.frameThickness,.02*r),u=F(-s[1]*f/2,s[0]*f/2),h=V(c,u),p=V(d,u),m=L(c,u),g=L(d,u),w=[_("window-sash-side","light-frame",t.hinge,c,i.sashBottom,i.sashTop,o,{edge:"hinge"}),_("window-sash-side","light-frame",d,n,i.sashBottom,i.sashTop,o,{edge:"tip"}),_("window-sash-bottom","light-frame",t.hinge,n,i.sashBottom,i.sashBottom+l,o),_("window-sash-top","light-frame",t.hinge,n,i.sashTop-l,i.sashTop,o),_("window-glass","glass-side",h,p,i.glassBottom,i.glassTop,o),_("window-glass","glass-side",g,m,i.glassBottom,i.glassTop,o),q("window-glass-top","glass-top",[{point:h,z:i.glassTop},{point:p,z:i.glassTop},{point:g,z:i.glassTop},{point:m,z:i.glassTop}],o)];return Object.freeze(w.sort((e,t)=>e.depth-t.depth||e.kind.localeCompare(t.kind)||String(e.edge||"").localeCompare(String(t.edge||""))))}(t,e,o,i):function(e,t,n,o){const i=L(t,e.hinge),a=Math.hypot(i[0],i[1]);if(!(a>1e-9&&n>0))return Object.freeze([]);const r=F(-i[1]*n/(2*a),i[0]*n/(2*a)),s=V(e.hinge,r),l=V(t,r),c=L(e.hinge,r),d=L(t,r),f=[_("leaf-back","matte-leaf",d,c,e.bottom,e.top,o),_("leaf-front","matte-leaf",s,l,e.bottom,e.top,o),_("leaf-edge","matte-leaf",c,s,e.bottom,e.top,o,{edge:"hinge"}),_("leaf-edge","matte-leaf",l,d,e.bottom,e.top,o,{edge:"tip"}),q("leaf-top","matte-leaf",[{point:s,z:e.top},{point:c,z:e.top},{point:d,z:e.top},{point:l,z:e.top}],o)];return Object.freeze(f.sort((e,t)=>e.depth-t.depth||e.kind.localeCompare(t.kind)||String(e.edge||"").localeCompare(String(t.edge||""))))}(e,o,t.leafThickness,i);return Object.freeze({id:t.id,sourceIndex:t.sourceIndex,type:t.type,leaf:e.leaf,d:`M ${E(r)} L ${E(s)} L ${E(l)} L ${E(c)} Z`,shadowD:`M ${E(n(e.hinge,0,i))} L ${E(n(o,0,i))}`,depth:Math.max(r[1],s[1]),material:d,thickness:"window"===t.type?0:t.leafThickness,surfaces:f})})}const K=1e-9,Z=(e,t)=>`${e}\0${t}`,J=e=>e.length>=2&&Number.isFinite(e[0])&&Number.isFinite(e[1]);function Q(e){let t=0;for(let n=0;n=3&&e.every(J)&&Math.abs(Q(e))>K}function Y(e,t,n){const o=n[0]-t[0],i=n[1]-t[1],a=o*o+i*i,r=a?Math.max(0,Math.min(1,((e[0]-t[0])*o+(e[1]-t[1])*i)/a)):0;return Math.hypot(e[0]-t[0]-r*o,e[1]-t[1]-r*i)}function ee(e,t,n=1e-7){for(let o=0;oe[1]!=r[1]>e[1]&&e[0]<(r[0]-a[0])*(e[1]-a[1])/(r[1]-a[1])+a[0]&&(n=!n)}return n}function ne(e){return Math.max(0,Math.abs(Q(e.outer))-(e.holes||[]).reduce((e,t)=>e+Math.abs(Q(t)),0))}function oe(e){return!!e.id&&X(e.outer)&&(e.holes||[]).every(X)&&ne(e)>K}function ie(e,t){if(!oe(t)||ee(e,t.outer)||!te(e,t.outer))return!1;for(const n of t.holes||[])if(ee(e,n)||te(e,n))return!1;return!0}function ae(e){if(!oe(e))return null;if(e.safePoint&&ie(e.safePoint,e))return[e.safePoint[0],e.safePoint[1]];const t=e.outer.map(e=>e[0]),n=e.outer.map(e=>e[1]),o=Math.min(...t),i=Math.max(...t),a=Math.min(...n),r=Math.max(...n),s=[[(o+i)/2,(a+r)/2],[t.reduce((e,t)=>e+t,0)/t.length,n.reduce((e,t)=>e+t,0)/n.length]];for(let t=0;t{if(!ie(t,e))return;const n=function(e,t){let n=1/0;for(const o of[t.outer,...t.holes||[]])for(let t=0;tc+K&&(l=t,c=n)};s.forEach(d);for(let e=1;e<16;e++)for(let t=1;t<16;t++)d([o+(i-o)*e/16,a+(r-a)*t/16]);return l}function re(e){if(!J(e.floorAnchor))return null;const t=e.roomsValidated?e.rooms:e.rooms.filter(oe),n=e.preferredRoomId&&t.find(t=>t.id===e.preferredRoomId)||null;let o=null;return"device"===e.kind?(n&&ie(e.floorAnchor,n)&&(o=n),o||(o=t.filter(t=>ie(e.floorAnchor,t)).sort((e,t)=>ne(e)-ne(t)||((e,t)=>et?1:0)(e.id,t.id))[0]||null)):o=n,o?{id:o.id,area:ne(o),safePoint:e.roomsValidated&&o.safePoint?[o.safePoint[0],o.safePoint[1]]:ae(o)}:null}function se(t,o,i,a=e,r=[0,0]){if(!J(t)||!J(o)||o[0]<0||o[1]<0||!Number.isFinite(i)||!J(r))throw new Error("invalid isometric overlay footprint");return[[t[0]-o[0],t[1]-o[1]],[t[0]+o[0],t[1]-o[1]],[t[0]+o[0],t[1]+o[1]],[t[0]-o[0],t[1]+o[1]]].map(e=>{const t=n(e,i,a);return[t[0]+r[0],t[1]+r[1]]})}function le(e,t,n){return(t[0]-e[0])*(n[1]-e[1])-(t[1]-e[1])*(n[0]-e[0])}function ce(e,t,n,o){const i=le(e,t,n),a=le(e,t,o),r=le(n,o,e),s=le(n,o,t);return(i>K&&a<-K||i<-K&&a>K)&&(r>K&&s<-K||r<-K&&s>K)||(Math.abs(i)<=K&&Y(n,e,t)<=K||Math.abs(a)<=K&&Y(o,e,t)<=K||Math.abs(r)<=K&&Y(e,n,o)<=K||Math.abs(s)<=K&&Y(t,n,o)<=K)}function de(e,t,n,o){return ce(e,t,n,o)?0:Math.min(Y(e,n,o),Y(t,n,o),Y(n,e,t),Y(o,e,t))}const fe=new WeakMap;function ue(e){if(!e.length)return null;let t=1/0,n=1/0,o=-1/0,i=-1/0;for(const a of e){if(!J(a))return null;t=Math.min(t,a[0]),n=Math.min(n,a[1]),o=Math.max(o,a[0]),i=Math.max(i,a[1])}return[t,n,o,i]}function he(e,t){if(!t)return ue(e.outer);if(fe.has(e))return fe.get(e)??null;const n=ue(e.outer);return fe.set(e,n),n}function pe(e,t,n){return e[0]<=t[2]+n&&e[2]>=t[0]-n&&e[1]<=t[3]+n&&e[3]>=t[1]-n}function me(e,t,n,o){return Math.min(t[0],n[0])<=e[2]+o&&Math.max(t[0],n[0])>=e[0]-o&&Math.min(t[1],n[1])<=e[3]+o&&Math.max(t[1],n[1])>=e[1]-o}function ge(e,t,n,o,i){const a=he(n,i);if(!a||!pe(t,a,o))return!1;if(e.some(e=>function(e,t){return!!te(e,t.outer)&&!(t.holes||[]).some(t=>te(e,t))}(e,n)))return!0;if(n.outer.some(n=>n[0]>=t[0]&&n[0]<=t[2]&&n[1]>=t[1]&&n[1]<=t[3]&&te(n,e)))return!0;for(const i of[n.outer,...n.holes||[]])for(let n=0;n{const e=[],t=Math.floor(48);for(let n=-t;n<=t;n++)for(let o=-t;o<=t;o++)o*o+n*n>t*t||e.push(Object.freeze([1*o,1*n]));return e.sort((e,t)=>e[0]*e[0]+e[1]*e[1]-(t[0]*t[0]+t[1]*t[1])||e[1]-t[1]||e[0]-t[0]),e})()),xe=Object.freeze(be.map(e=>Object.freeze({offset:e,distance:Math.hypot(e[0],e[1])}))),ve=Object.freeze(xe.filter(e=>e.offset[0]%4==0&&e.offset[1]%4==0));function Se(e){return xe.filter(t=>Math.abs(t.offset[0]-e[0])<=4&&Math.abs(t.offset[1]-e[1])<=4)}function $e(e,t){return[t[0]-e.screenHalfSize[0],t[1]-e.screenHalfSize[1],t[0]+e.screenHalfSize[0],t[1]+e.screenHalfSize[1]]}function ke(e,t){return[e[0]-t,e[1]-t,e[2]+t,e[3]+t]}function ze(e,t,n){const o=Math.min(e[2],t[2])-Math.max(e[0],t[0])+n,i=Math.min(e[3],t[3])-Math.max(e[1],t[1])+n;return o>K&&i>K?o*i:0}function Pe(e,t,n){const o=n.tiltDeg*Math.PI/180;return a([e[0],e[1]+t*n.zScale*Math.sin(o)],n)}function Ce(e,t,n,o){const i=[t[0]*n,t[1]*n];if(!o&&Math.abs(i[0]-e.nudgeScene[0])<=K&&Math.abs(i[1]-e.nudgeScene[1])<=K)return e;const a=[i[0]-e.nudgeScene[0],i[1]-e.nudgeScene[1]],r=[e.raisedScene[0]+i[0],e.raisedScene[1]+i[1]],s=Math.hypot(t[0],t[1]);return{...e,visualScene:r,footprint:e.footprint.map(e=>[e[0]+a[0],e[1]+a[1]]),nudgeScene:i,nudgeCss:t,nudgeDistanceCss:s,nudged:s>K,capped:e.capped||o,status:o?"degraded":e.status,reason:o?"overlay-collision":e.reason,tether:Me(e.floorScene,r,!1)}}const Ie="4da0d706a85c3f1c08ab6de960deb5feb08baaf9055265234e7bd1b554332653",Te=e=>"wall-side"===e.layer?0:"wall-top"===e.layer?1:2,je=e=>{if("wall-side"===e.layer)return`${e.face.polygon}:${e.face.ring}:${e.face.edge}`;if("wall-top"===e.layer)return String(e.face.component);const t=e.surface;return`${t.sourceIndex}:${t.leaf??-1}:${t.kind}:${t.jamb??-1}:${t.edge??""}:${t.id}:${t.material}`};function Oe(e,t){const n=[...e.sides.map(e=>({layer:"wall-side",depth:e.depth,face:e})),...e.topFaces.map(e=>({layer:"wall-top",depth:e.depth,face:e})),...t.map(e=>({layer:"opening",depth:e.depth,surface:e}))];n.sort((e,t)=>e.depth-t.depth||Te(e)-Te(t)||je(e).localeCompare(je(t)));const o=new Map;for(const e of n){if("opening"!==e.layer)continue;const t=`${e.surface.type}\0${e.surface.id}`,n=o.get(t)||[];n.push(e),o.set(t,n)}for(const e of o.values())e.sort((e,t)=>{const n="opening"===e.layer?e.surface:null,o="opening"===t.layer?t.surface:null;return(n?.cameraDepth??n?.depth??0)-(o?.cameraDepth??o?.depth??0)||je(e).localeCompare(je(t))});const i=new Map;return Object.freeze(n.map(e=>{if("opening"!==e.layer)return e;const t=`${e.surface.type}\0${e.surface.id}`,n=i.get(t)||0;return i.set(t,n+1),o.get(t)?.[n]||e}))}const Be=Object.freeze({textLatinAdvance:.72,textWideAsciiAdvance:1,textWideAdvance:1.1,textSpaceAdvance:.4,textWidthSafety:1.08,deviceShellInset:.134375,deviceShellGap:.1,deviceSectionGap:.08,deviceBadgeMinWidth:.7875,deviceBadgeHeight:.7875,deviceBadgeInlinePadding:.28,deviceValueInlinePadding:.32,deviceAuxiliaryExtent:.7,deviceLqiFontSize:.38,deviceLqiTop:.734375,deviceLqiBelowBottomBadgeTop:1.571875,devicePadding:.08,roomNameLineHeight:1.25,roomAreaLinkWidth:1.1,roomMetricsTopGap:.15,roomMetricFontSize:.75,roomMetricLineHeight:1.25,roomMetricIconWidth:1.05,roomMetricInnerGap:.12,roomMetricRowGap:.55,roomMetricMinWidth:11,roomPadding:.4,openingLockHalfSize:.62,roomMetricTextCharacters:Object.freeze({temperature:10,humidity:8,lqi:6,light:24})});function Ne(e){return[...String(e)].reduce((e,t)=>/\s/.test(t)?e+Be.textSpaceAdvance:/[MW@#%&]/.test(t)?e+Be.textWideAsciiAdvance:e+(t.codePointAt(0)>255?Be.textWideAdvance:Be.textLatinAdvance),0)*Be.textWidthSafety}function He(e,t){return Ne(e)*P(t||e)}function Re(e,t){return[Math.max(Math.abs(e.left),Math.abs(e.right))+t,Math.max(Math.abs(e.top),Math.abs(e.bottom))+t]}function Ae(e){if("opening-lock"===e.kind){const t=(Number.isFinite(e.size)&&e.size>0?e.size:0)*Be.openingLockHalfSize;return[t,t]}if("room-label"===e.kind){const t=Number.isFinite(e.font)&&e.font>0?e.font:0,n=b(e.room.settings?.name_scale),o=b(e.room.settings?.label_scale),i=(Ne(e.room.name||"")+(e.room.area?Be.roomAreaLinkWidth:0))*n,a=Be.roomNameLineHeight*n,r=[e.display.labelTemp?Be.roomMetricTextCharacters.temperature:0,e.display.labelHum?Be.roomMetricTextCharacters.humidity:0,e.display.labelLqi&&e.room.area?Be.roomMetricTextCharacters.lqi:0,e.display.labelLight?Be.roomMetricTextCharacters.light:0].filter(e=>e>0),s=Be.roomMetricFontSize*o,l=r.length?Math.max(Be.roomMetricMinWidth,r.reduce((e,t)=>e+Be.roomMetricIconWidth+Be.roomMetricInnerGap+t*Be.textLatinAdvance*Be.textWidthSafety,0)+(r.length-1)*Be.roomMetricRowGap)*s:0,c=r.length?s*Be.roomMetricLineHeight:0,d=Re({left:-Math.max(i,l)/2,right:Math.max(i,l)/2,top:-a/2,bottom:r.length?a/2+Be.roomMetricsTopGap+c:a/2},Be.roomPadding);return[d[0]*t,d[1]*t]}const t=Number.isFinite(e.core)&&e.core>0?e.core:0,n=e.presentation,o=null==n.valueText?1:Math.max(1,He(n.valueText,n.valueFullText||n.valueText)+Be.deviceValueInlinePadding),i=[];n.valueBadge&&i.push(Math.max(Be.deviceBadgeMinWidth,He(n.valueBadge.text,n.valueBadge.fullText||n.valueBadge.text)+Be.deviceBadgeInlinePadding));for(const e of x(n)){const t=e.text+e.suffix;i.push(Math.max(Be.deviceBadgeMinWidth,He(t,t)+Be.deviceBadgeInlinePadding))}const a=n.valueBadge?.position||"right";let r;if(!i.length||"left"!==a&&"right"!==a)if(i.length){const e=i.reduce((e,t)=>e+t,0)+(i.length-1)*Be.deviceSectionGap,t=Math.max(o,e),n=1+Be.deviceShellGap+Be.deviceBadgeHeight;r="bottom"===a?{left:-t/2-Be.deviceShellInset,right:t/2+Be.deviceShellInset,top:-.5-Be.deviceShellInset,bottom:-.5+n+Be.deviceShellInset}:{left:-t/2-Be.deviceShellInset,right:t/2+Be.deviceShellInset,top:.5-n-Be.deviceShellInset,bottom:.5+Be.deviceShellInset}}else r={left:-.5-Be.deviceShellInset,right:-.5+o+Be.deviceShellInset,top:-.5-Be.deviceShellInset,bottom:.5+Be.deviceShellInset};else{const e=Math.max(...i),t=i.length*Be.deviceBadgeHeight+(i.length-1)*Be.deviceSectionGap,n=o+Be.deviceShellGap+e,s=Math.max(1,t);r="right"===a?{left:-.5-Be.deviceShellInset,right:-.5+n+Be.deviceShellInset,top:-s/2-Be.deviceShellInset,bottom:s/2+Be.deviceShellInset}:{left:.5-n-Be.deviceShellInset,right:.5+Be.deviceShellInset,top:-s/2-Be.deviceShellInset,bottom:s/2+Be.deviceShellInset}}const s=Be.deviceAuxiliaryExtent;if(r.left=Math.min(r.left,-s),r.right=Math.max(r.right,s),r.top=Math.min(r.top,-s),r.bottom=Math.max(r.bottom,s),n.pulse.animated){const e=Math.max(1,n.pulse.diameterScale)/2;r.left=Math.min(r.left,-e),r.right=Math.max(r.right,e),r.top=Math.min(r.top,-e),r.bottom=Math.max(r.bottom,e)}if(null!=n.lqiText){const e="bottom"===n.valueBadge?.position?Be.deviceLqiBelowBottomBadgeTop:Be.deviceLqiTop,t=Ne(n.lqiText)*Be.deviceLqiFontSize/2;r.left=Math.min(r.left,-t),r.right=Math.max(r.right,t),r.bottom=Math.max(r.bottom,e+Be.deviceLqiFontSize)}const l=Re(r,Be.devicePadding);return[l[0]*t,l[1]*t]}function Fe(e,t){return e.flatMap((e,n)=>e.orphanReason?[]:[{id:String(e.id||n),sourceIndex:n,type:e.type,x:e.rx,y:e.ry,angle:Number(e.angle)||0,length:e.rlen>0?e.rlen:.9*t,flipH:!!e.flip_h,flipV:!!e.flip_v}])}function Ve(e){return{id:e.id,x:e.x,y:e.y,w:e.w,h:e.h,poly:e.poly,wall_ids:e.wall_ids}}function Le(e,t){const n=e?.partitionHost;if(!n)return null;const o="gate"===t.type?!t.flipV:t.flipV;return{sourceIndex:t.sourceIndex,hostId:n.host.id,t:n.t,depth:n.depth,face:m(n,o)}}function Ge(n,o=R){const i=Fe(n.openings,n.coordinateScale),a=i.map(e=>Le(n.openings[e.sourceIndex],e)),s=r(t,n.cellCm),m=r(l,n.cellCm),g=r(c,n.cellCm);return{key:`${n.space.id}|${function(e){let t=2166136261;const n=e=>{if("number"!=typeof e)if("string"!=typeof e)if("boolean"!=typeof e)if(Array.isArray(e)){t=H(t,e.length);for(const t of e)n(t)}else{if(e&&"object"==typeof e){const t=e;for(const e of Object.keys(t).sort())n(e),n(t[e]);return}t=H(t,-1)}else t=H(t,e?1:0);else for(const n of e)t=H(t,n.codePointAt(0)||0);else t=H(t,e)};return n(e),t.toString(36)}({rooms:n.space.rooms.map(Ve),walls:n.walls,openCuts:n.openCuts,openings:i,openingHosts:a,openingGeometryPolicy:o,partitions:n.space.partitions,columns:n.space.wall_columns,cellCm:n.cellCm,gridPitch:n.gridPitch,wallKeyPitch:n.wallKeyPitch,camera:e,wallHeight:s,raisedHeight:g,floorEdgeHeight:m,algorithm:5})}`,build:()=>{n.onBuild();const r=d(n.space,n.cellCm,n.gridPitch,2e-4*n.gridPitch,n.partitionCuts()).all,l=n.roomOpenings(),c=n.walls.length||r.length?f(n.space.rooms,n.walls,n.openCuts,l,n.wallKeyPitch,n.cellCm,n.gridPitch,n.coordinateScale,r):null;if(c&&("failed-core"===c.status||"not-applicable"===c.status))throw new Error("wall boolean geometry failed");const m=c?.paperGeom??u(n.space.rooms,n.walls,n.openCuts,n.wallKeyPitch,n.cellCm,n.gridPitch,n.coordinateScale);if(!m)throw new Error("floor boolean geometry failed");const g=c?.openingIndex||h(n.space.rooms,n.walls,n.openCuts,n.wallKeyPitch,n.cellCm,n.gridPitch,n.coordinateScale),w=i.map((e,i)=>{const r=a[i],l="gate"===e.type?!e.flipV:e.flipV,c=r?r.face:n.walls.length||"gate"===e.type?p(g,{x:e.x,y:e.y,angle:e.angle,length:e.length,flip_v:l}):{ox:0,oy:0,cm:0,side:-1};return function(e,n=t,o=R){const i=e.face.cm??0;if(!A([e.x,e.y,e.angle,e.length,e.face.ox,e.face.oy,i,n])||!(e.length>0)||!(n>0)||-1!==e.face.side&&1!==e.face.side||i<0)throw new Error("invalid isometric opening input");const a=e.length/2,r=e.angle*Math.PI/180,s=F(Math.cos(r),Math.sin(r)),l=F(-Math.sin(r),Math.cos(r)),c=F(e.x,e.y),d=F(e.x-s[0]*a,e.y-s[1]*a),f=F(e.x+s[0]*a,e.y+s[1]*a),u=F(e.face.ox,e.face.oy),h=F(d[0]+u[0],d[1]+u[1]),p=F(f[0]+u[0],f[1]+u[1]),m=F(d[0]-u[0],d[1]-u[1]),g=F(f[0]-u[0],f[1]-u[1]),w=Object.freeze({center:c,tangent:s,normal:l,start:d,end:f}),y=Object.freeze({side:e.face.side,cm:i,depth:2*Math.hypot(e.face.ox,e.face.oy),offset:u,selectedStart:h,selectedEnd:p,oppositeStart:m,oppositeEnd:g}),M="passage"===e.type?[]:[Object.freeze({jamb:0,center:d,selected:h,opposite:m}),Object.freeze({jamb:1,center:f,selected:p,opposite:g})];let b;if("passage"===e.type)b=[];else if("gate"===e.type){const t=e.face.side*o.gateTurnDeg;b=[W(e,0,[-a,0],[a,0],t,0,n*o.gateTopRatio),W(e,1,[a,0],[-a,0],-t,0,n*o.gateTopRatio)]}else b="window"===e.type?[W(e,0,[-a,0],[a,0],-o.windowTurnDeg,n*o.windowSashBottomRatio,n*o.windowSashTopRatio),W(e,1,[a,0],[-a,0],o.windowTurnDeg,n*o.windowSashBottomRatio,n*o.windowSashTopRatio)]:[W(e,0,[-a,0],[e.length,0],-o.doorTurnDeg,0,n*o.doorTopRatio)];const x="window"===e.type?Object.freeze({frameBottom:n*o.windowFrameBottomRatio,frameTop:n*o.windowFrameTopRatio,sashBottom:n*o.windowSashBottomRatio,sashTop:n*o.windowSashTopRatio,glassBottom:n*o.windowGlassBottomRatio,glassTop:n*o.windowGlassTopRatio,member:n*o.frameThicknessRatio}):null;return Object.freeze({id:e.id,sourceIndex:e.sourceIndex,type:e.type,wallHeight:n,leafThickness:n*o.leafThicknessRatio,frameThickness:n*o.frameThicknessRatio,windowProfile:x,axis:w,face:y,reveals:Object.freeze(M),leaves:Object.freeze(b.map(e=>Object.freeze({...e,hinge:F(e.hinge[0],e.hinge[1]),closedVector:F(e.closedVector[0],e.closedVector[1]),quarterVector:F(e.quarterVector[0],e.quarterVector[1])})))})}({...e,face:c},s,o)}),y=Object.freeze(w);return{walls:c?.components.flatMap(e=>e.geom)||[],floor:m,openings:y,openingSurfaces:Object.freeze(y.flatMap(t=>function(t,n=e){if("passage"===t.type)return Object.freeze([]);const o=[];if(t.face.depth>1e-9)for(const e of t.reveals)o.push(_("jamb-reveal","reveal",e.selected,e.opposite,0,t.wallHeight,n,{jamb:e.jamb}));if("window"!==t.type||!t.leaves.length)return Object.freeze(o.sort((e,t)=>e.depth-t.depth||e.kind.localeCompare(t.kind)||(e.jamb??0)-(t.jamb??0)));const i=t.windowProfile;if(!i)throw new Error("missing isometric window profile");const a=i.frameBottom,r=i.frameTop,s=Math.min(t.frameThickness,Math.hypot(t.axis.end[0]-t.axis.start[0],t.axis.end[1]-t.axis.start[1])/4,(r-a)/4),l=V(t.axis.start,G(t.axis.tangent,s)),c=L(t.axis.end,G(t.axis.tangent,s)),d=t.face.depth>1e-9?[t.face.offset,F(-t.face.offset[0],-t.face.offset[1])]:[t.face.offset];for(const e of d){const i=V(t.axis.start,e),d=V(t.axis.end,e),f=V(l,e),u=V(c,e);o.push(_("window-frame-side","light-frame",i,f,a,r,n,{jamb:0}),_("window-frame-side","light-frame",u,d,a,r,n,{jamb:1}),_("window-frame-top","light-frame",f,u,Math.max(a,r-s),r,n))}return t.face.depth>1e-9&&o.push(q("window-sill","light-sill",[{point:t.face.selectedStart,z:a},{point:t.face.selectedEnd,z:a},{point:t.face.oppositeEnd,z:a},{point:t.face.oppositeStart,z:a}],n)),Object.freeze(o.sort((e,t)=>e.depth-t.depth||e.kind.localeCompare(t.kind)||(e.jamb??0)-(t.jamb??0)))}(t).map(e=>Object.freeze({...e,id:t.id,sourceIndex:t.sourceIndex,type:t.type}))))}}}}const De=e=>Array.isArray(e)?e:[];function We(e,t){const o=e=>De(e).flatMap(e=>Array.isArray(e)&&Number.isFinite(e[0])&&Number.isFinite(e[1])?[n([Number(e[0]),Number(e[1])],t)]:[]);return De(e).flatMap(e=>{const t=De(e);if(!t.length)return[];const n=o(t[0]);if(n.length<3)return[];return[{outer:n,holes:t.slice(1).map(o).filter(e=>e.length>=3)}]})}function Ee(o){const i=r(t,o.cellCm),a=r(l,o.cellCm),s=r(c,o.cellCm),d=$(o.cache,o.source.key);let f=d.hit?d.value:void 0;if(!f){const r=o.source.build(),s=function(o,i=e,a=t){if(!Number.isFinite(a)||a<0)throw new Error("invalid wall height");const r=[],s=[],l=[],c=[];let d=0;for(let e=0;e<(o||[]).length;e++){const t=o[e],f=[];let u=-1/0;for(let o=0;o<(t||[]).length;o++){const s=j(t[o],o>0);if(s.length<3||Math.abs(T(s))<1e-9)continue;const h=O(s,i,a);r.push(h),f.push(h),u=Math.max(u,...s.map(e=>n(e,a,i)[1])),d+=s.length;for(let t=0;te.depth-t.depth||e.polygon-t.polygon||e.ring-t.ring||e.edge-t.edge),s.sort((e,t)=>e.depth-t.depth||e.component-t.component),{topPath:r.join(" "),topFaces:s,sides:l,contactPath:c.join(" "),edgeCount:d}}(r.walls,e,i),l=We(r.walls,i);f={geometry:s,floor:N(r.floor,a),wallSilhouettes:Object.freeze([...l,...s.sides.map(e=>({outer:e.points}))]),openings:r.openings,openingSurfaces:r.openingSurfaces},k(o.cache,o.source.key,f,8)}const u=function(e){let t=1/0,n=1/0,o=-1/0,i=-1/0;const a=(e,a=0)=>{t=Math.min(t,e[0]-a),n=Math.min(n,e[1]-a),o=Math.max(o,e[0]+a),i=Math.max(i,e[1]+a)};for(const t of e)if("passage"!==t.type){a(t.axis.start),a(t.axis.end),a(t.face.selectedStart),a(t.face.selectedEnd),a(t.face.oppositeStart),a(t.face.oppositeEnd);for(const e of t.leaves){const n=Math.hypot(e.closedVector[0],e.closedVector[1])+t.leafThickness/2;a(e.hinge,n)}}return A([t,n,o,i])?{x:t,y:n,w:o-t,h:i-n}:null}(f.openings),h=u?qe(o.liveFrame,u):o.liveFrame,p=z({rect:h,wallHeight:i,openingHeight:i,floorDepth:a,raisedHeight:s});return{key:o.source.key,...f,frame:p}}const qe=(e,t)=>{const n=Math.min(e.x,t.x),o=Math.min(e.y,t.y);return{x:n,y:o,w:Math.max(e.x+e.w,t.x+t.w)-n,h:Math.max(e.y+e.h,t.y+t.h)-o}},_e=e=>{if(!e.length||!e.every(e=>Number.isFinite(e[0])&&Number.isFinite(e[1])))return null;const t=e.map(e=>e[0]),n=e.map(e=>e[1]),o=Math.min(...t),i=Math.min(...n);return{x:o,y:i,w:Math.max(...t)-o,h:Math.max(...n)-i}},Ue=(e,t)=>{const n=e.placement,o=t?n.visualScene:n.raisedScene,[i,a]=e.screenHalfSize,r=t?n.footprint:n.footprint.map(e=>[e[0]-n.nudgeScene[0],e[1]-n.nudgeScene[1]]);return[n.floorScene,...r,[o[0]-i,o[1]-a],[o[0]+i,o[1]-a],[o[0]+i,o[1]+a],[o[0]-i,o[1]+a]]},Ke=(e,t)=>void 0===t?e:e.filter(e=>e.placement.owner?.id===t);function Ze(e,t){return e?_e(Ke(e.entries,t).flatMap(e=>Ue(e,!0))):null}function Je(e){const t=Ke(e.entries,e.ownerId),n=_e(t.flatMap(e=>Ue(e,!1))),o=n?qe(e.baseBounds,n):e.baseBounds,i=e.targetView(o);if(!(i&&i.w>0&&i.h>0&&[i.x,i.y,i.w,i.h].every(Number.isFinite)))return null;const a=e.stageSize;if(!(n&&a&&a.width>0&&a.height>0))return{bounds:o,view:i};const r=e=>Math.max(e.w/a.width,e.h/a.height),s=t=>{const o=48*t,i={x:n.x-o,y:n.y-o,w:n.w+2*o,h:n.h+2*o},a=qe(e.baseBounds,i),r=e.targetView(a);return r&&[r.x,r.y,r.w,r.h].every(Number.isFinite)&&r.w>0&&r.h>0?{bounds:a,view:r}:null};let l=0,c=Math.max(r(i),Number.EPSILON),d=s(c);for(let e=0;d&&r(d.view)>c*(1+1e-10)&&e<24;e++)l=c,c*=2,d=s(c);if(!d)return null;for(let e=0;e<40;e++){const e=(l+c)/2,t=s(e);if(!t)return null;r(t.view)<=e?(c=e,d=t):l=e}return d}const Qe=new WeakMap,Xe=2048,Ye=new WeakMap,et=new WeakMap,tt=new WeakMap;function nt(e,t){if(e.size!==t.size)return!1;for(const[n,o]of t)if(e.get(n)!==o)return!1;return!0}function ot(e){const t=Qe.get(e.rooms);if(t)return t;const n=e.rooms.flatMap((e,t)=>{const n=y(e);return n&&n.length>=3?[{room:e,index:t,poly:n}]:[]}),o=Object.freeze(n.map(({room:e,index:t,poly:o})=>{const i=M(o,n.filter(e=>e.index!==t).map(e=>e.poly)),a={id:e.id||`room-index-${t}`,outer:o.map(e=>[e[0],e[1]]),holes:i.map(e=>e.map(e=>[e[0],e[1]]))};return{room:e,overlayRoom:{...a,safePoint:ae(a)||void 0}}}));return Qe.set(e.rooms,o),o}function it(o){const a=o.stageSize&&o.stageSize.width>0&&o.stageSize.height>0?Math.max(o.view.w/o.stageSize.width,o.view.h/o.stageSize.height):Math.max(o.view.w,o.view.h)/1e3,l=ot(o.space),c=l.map(e=>e.overlayRoom),d=r(t,o.cellCm),f=r(i,o.cellCm),u=new Map,h=new Map,p=new Map,m=[];let g=Ye.get(o.wallSilhouettes);g||(g=new Map,Ye.set(o.wallSilhouettes,g));let w=et.get(l);w||(w=new Map,et.set(l,w));const y=o.iconPct*s(o.space)*o.kioskIconScale/100,M=o.deviceBasePct*s(o.space)*o.kioskIconScale/100,b=(r,s,l,u,h)=>{const p=`${!1===o.resolveCollisions?"fit":"live"}\0${r}\0${s}`,m=[l[0],l[1],u[0],u[1],h||"",d,f].join("|"),y=`${m}|${a}`,M=$(g,p);if(M.hit&&M.value.signature===y)return M.value.placement;if(M.hit&&M.value.shapeSignature===m&&a<=M.value.unitsPerPixel){const e=M.value.placement,t=e.nudgeDistanceCss*M.value.unitsPerPixel/a;if(!e.nearWallBefore||e.cleared&&t<=48)return e}const b=`${r}\0${s}`,x=[l[0],l[1],h||""].join("|"),v=$(w,b),S=v.hit&&v.value.signature===x?v.value.owner:re({kind:r,floorAnchor:l,rooms:c,roomsValidated:!0,preferredRoomId:h});v.hit&&v.value.signature===x||k(w,b,{signature:x,owner:S},Xe);const z=function(o){const a=o.camera||e,r=o.wallHeight??t,s=o.visualOffset??i,l=o.sceneUnitsPerCssPixel??1,c=o.safetyGapCssPx??4,d=o.maxNudgeCssPx??48;if(!J(o.floorAnchor)||!J(o.footprintHalfSize)||o.footprintHalfSize[0]<0||o.footprintHalfSize[1]<0||!Number.isFinite(r)||r<0||!Number.isFinite(s)||s<0||!Number.isFinite(l)||l<=0||!Number.isFinite(c)||c<0||!Number.isFinite(d)||d<0)throw new Error("invalid isometric overlay input");const f=[o.floorAnchor[0],o.floorAnchor[1]],u=n(f,0,a),h=(p=o.kind,!o.showBorders||"device"!==p&&"room-label"!==p&&"opening-lock"!==p?"floor":"raised");var p;if("floor"===h)return{plane:h,owner:null,floorAnchor:f,floorScene:u,raisedScene:u,visualScene:u,footprint:[],nudgeScene:[0,0],nudgeCss:[0,0],nudgeDistanceCss:0,nudged:!1,nearWallBefore:!1,nearWallAfter:!1,cleared:!0,capped:!1,grounding:{center:u,visible:!1},tether:Me(u,u,!1),status:"ok",reason:null};const m=s,g=n(f,m,a),w=o.ownerAlreadyResolved?o.resolvedOwner??null:re(o),y=o.wallGeometryValidated??o.wallSilhouettes.every(we),M=c*l,b=se(f,o.footprintHalfSize,m,a),x=e=>{const t=ue(e);return!!t&&o.wallSilhouettes.some(n=>ge(e,t,n,M,!0===o.wallGeometryValidated))},v=!y||x(b);let S=0,$=[0,0],k=null,z=!1,P=y?"ok":"degraded",C=y?null:"invalid-wall-geometry";if(y&&v)if(w)if(w.safePoint){const e=o.rooms.find(e=>e.id===w.id)||null,t=n(w.safePoint,m,a),i=t[0]-g[0],r=t[1]-g[1],s=Math.hypot(i,r);if(s<=K)P="degraded",C="invalid-safe-point";else{const t=i/s,n=r/s,a=Math.min(d,s/l),c=a*l/s,u=[f[0]+(w.safePoint[0]-f[0])*c,f[1]+(w.safePoint[1]-f[1])*c],h=[t*a*l,n*a*l],p=ue([...b,...b.map(e=>[e[0]+h[0],e[1]+h[1]])]),m=p?o.wallSilhouettes.filter(e=>{const t=he(e,!0===o.wallGeometryValidated);return!!t&&pe(p,t,M)}):o.wallSilhouettes,g=!!e&&ye(f,u,e),y=e=>{const i=[t*e*l,n*e*l],a=b.map(e=>[e[0]+i[0],e[1]+i[1]]),r=ue(a);return!!r&&m.some(e=>ge(a,r,e,M,!0===o.wallGeometryValidated))},x=o.nudgeHintCss;if(Number.isFinite(x)&&x>=0&&x<=a){const t=x*l/s,n=[f[0]+(w.safePoint[0]-f[0])*t,f[1]+(w.safePoint[1]-f[1])*t];(g||e&&ye(f,n,e))&&!y(x)&&(S=x,k=!1)}if(null===k){let t=null,n=0,o=!1;const i=Math.ceil(a);for(let r=1;r<=i;r++){const i=Math.min(a,r),c=i*l/s,d=[f[0]+(w.safePoint[0]-f[0])*c,f[1]+(w.safePoint[1]-f[1])*c];if(!(g||e&&ye(f,d,e))){o=!0;break}if(!y(i)){t=i;break}n=i}if(null!==t){let e=n,o=t;for(let t=0;t<14;t++){const t=(e+o)/2;y(t)?e=t:o=t}S=o}else S=n,z=!0,P="degraded",C=o?"owner-boundary":"nudge-cap"}$=[t*S*l,n*S*l]}}else P="degraded",C="invalid-safe-point";else P="degraded",C="missing-owner";const I=[g[0]+$[0],g[1]+$[1]],T=se(f,o.footprintHalfSize,m,a,$),j=!y||(k??x(T)),O=S>K;return{plane:h,owner:w,floorAnchor:f,floorScene:u,raisedScene:g,visualScene:I,footprint:T,nudgeScene:$,nudgeCss:[$[0]/l,$[1]/l],nudgeDistanceCss:S,nudged:O,nearWallBefore:v,nearWallAfter:j,cleared:!j,capped:z,grounding:{center:u,visible:!1},tether:Me(u,I,!1),status:P,reason:C}}({kind:r,floorAnchor:l,rooms:c,roomsValidated:!0,preferredRoomId:h,ownerAlreadyResolved:!0,resolvedOwner:S,nudgeHintCss:M.hit&&M.value.shapeSignature===m?M.value.placement.nudgeDistanceCss*M.value.unitsPerPixel/a:void 0,showBorders:!0,wallSilhouettes:!1===o.resolveCollisions?[]:o.wallSilhouettes,wallGeometryValidated:!0,footprintHalfSize:u,wallHeight:d,visualOffset:f,sceneUnitsPerCssPixel:a});return k(g,p,{signature:y,shapeSignature:m,unitsPerPixel:a,placement:z},Xe),z};for(const e of o.devices){const t=o.positionOf(e),n=o.presentationOf(e,o.showLqi),i=M*n.scale,a=Ae({kind:"device",core:i,presentation:n}),r=e.marker?.room_id||l.find(t=>!!e.area&&t.room.area===e.area)?.overlayRoom.id||null,s=b("device",e.id,[t.x,t.y],a,r);u.set(e.id,s),m.push({id:e.id,kind:"device",placement:s,groundRadius:Math.max(.32*i,2),screenHalfSize:a})}for(const{room:e,overlayRoom:t}of l){if(!o.display.showNames||!e.name)continue;const n=o.labelPositionOf(e,o.space.id),i=.5*y*(o.labelScaleOf(e)*o.kioskFontScale*o.display.cardFontScale),a=Ae({kind:"room-label",font:i,room:e,display:o.display}),r=b("room-label",t.id,[n.x,n.y],a,t.id);h.set(e,r),m.push({id:t.id,kind:"room-label",placement:r,groundRadius:Math.max(.75*i,2),screenHalfSize:a})}const x=o.openings.filter(e=>!e.orphanReason&&("door"===e.type||"gate"===e.type)&&"string"==typeof e.lock&&!!e.lock&&o.openingEntityAvailable(e.lock));if(x.length){const e=o.openingWallIndex();for(const t of x){const n=rt(t,e,o.cellCm),i=n.floorAnchor,a=.62*y,r=Ae({kind:"opening-lock",size:a}),s=b("opening-lock",String(t.id),i,r,n.preferredRoomId);p.set(String(t.id),s),m.push({id:String(t.id),kind:"opening-lock",placement:s,groundRadius:Math.max(.28*a,2),screenHalfSize:r})}}const v=!1===o.resolveCollisions?"fit":"live";let S=tt.get(o.wallSilhouettes);S||(S=new Map,tt.set(o.wallSilhouettes,S));const z=S.get(v),P=m.map(e=>{const t=e.placement;return[e.kind,e.id,t.floorAnchor[0],t.floorAnchor[1],t.raisedScene[0],t.raisedScene[1],t.nudgeScene[0],t.nudgeScene[1],t.owner?.id||"",t.status,t.reason||"",e.screenHalfSize[0],e.screenHalfSize[1],a].join("|")}).sort().join("");if(z?.collisionSignature===P&&nt(z.rooms,h))return z;const C="live"===v?function(t){const n=t.sceneUnitsPerCssPixel,o=t.maxNudgeCssPx??48,a=t.safetyGapCssPx??4,r=t.visualOffset??i,s=t.camera||e;if(!(n>0&&Number.isFinite(n)&&o>=0&&Number.isFinite(o)&&a>=0&&Number.isFinite(a)))throw new Error("invalid isometric overlay collision input");const l=a*n,c=64*n,d=new Map(t.rooms.filter(oe).map(e=>[e.id,e])),f=t.wallSilhouettes.every(we),u=[],h=new Map,p=new Map,m=[],g=[...t.items].sort((e,t)=>e.placement.nudgeDistanceCss-t.placement.nudgeDistanceCss||Z(e.kind,e.id).localeCompare(Z(t.kind,t.id))),w=e=>[Math.floor(e[0]/c),Math.floor(e[1]/c),Math.floor(e[2]/c),Math.floor(e[3]/c)],y=e=>{const[t,n,o,i]=w(ke(e,l)),a=new Set;for(let e=n;e<=i;e++)for(let n=t;n<=o;n++)for(const t of h.get(`${n}:${e}`)||[])a.add(t);return[...a].sort((e,t)=>e-t)},M=e=>{const t=u.push(e)-1,[n,o,i,a]=w(e.bounds);for(let e=o;e<=a;e++)for(let o=n;o<=i;o++){const n=`${o}:${e}`,i=h.get(n)||[];i.push(t),h.set(n,i)}};for(const e of g){const i=Z(e.kind,e.id),a=e.placement,c=[a.nudgeScene[0]/n,a.nudgeScene[1]/n],h=a.footprint.map(e=>[e[0]-a.nudgeScene[0],e[1]-a.nudgeScene[1]]),g=a.owner&&d.get(a.owner.id)||null,b=Pe(a.visualScene,r,s),x=f&&h.length?t.wallSilhouettes.filter(e=>{const t=he(e,!0);if(!t)return!1;const i=o*n,a=ue(h);return!!a&&pe(ke(a,i),t,l)}):t.wallSilhouettes,v=y(ke($e(e,a.raisedScene),o*n)),S=e=>{const t=[];let n=0;for(const o of v){const i=ze(e,u[o].bounds,l);i>K&&(t.push(o),n+=i)}return{conflicts:t,penalty:n}},$=t=>{if(Math.hypot(t[0],t[1])>o+K)return null;const i=[t[0]*n,t[1]*n],r=Math.abs(i[0]-a.nudgeScene[0])<=K&&Math.abs(i[1]-a.nudgeScene[1])<=K,s=[a.raisedScene[0]+i[0],a.raisedScene[1]+i[1]],l=$e(e,s),{conflicts:c,penalty:d}=S(l);return{offsetScene:i,sameAsBase:r,visualScene:s,bounds:l,conflicts:c,penalty:d}},k=g?ue(g.outer):null,z=new Map;for(let e=0;e{const[t,n,o,i]=w(ke(e,l)),a=[];C+=1;for(let e=n;e<=i;e++)for(let n=t;n<=o;n++)for(const t of z.get(`${n}:${e}`)||[])P[t]!==C&&(P[t]=C,a.push(x[t]));return a},T=e=>{if(e.sameAsBase)return!0;if(!f||!g)return!1;const t=Pe(e.visualScene,r,s);if(k&&(t[0]k[2]||t[1]k[3]))return!1;if(!ie(t,g))return!1;if(ie(b,g)&&!ye(b,t,g))return!1;const n=h.map(t=>[t[0]+e.offsetScene[0],t[1]+e.offsetScene[1]]),o=ue(n);return!!o&&!I(o).some(e=>ge(n,o,e,l,!0))};let j=(e=>{const t=$(e);return t&&T(t)?{placement:Ce(a,e,n,!1),bounds:t.bounds,conflicts:t.conflicts,penalty:t.penalty}:null})(c);const O=e=>{let t=e;for(const o of Se(e.placement.nudgeCss)){if(o.distance>=t.placement.nudgeDistanceCss-K)continue;const e=$(o.offset);e&&!e.conflicts.length&&T(e)&&(t={placement:Ce(a,o.offset,n,!1),bounds:e.bounds,conflicts:e.conflicts,penalty:e.penalty})}return t};if(!j||j.conflicts.length){for(const e of ve){if(e.distance>o+K)break;const t=e.offset;if(Math.abs(t[0]-c[0])<=K&&Math.abs(t[1]-c[1])<=K)continue;const i=$(t);if(!i)continue;if(j&&i.conflicts.length&&!(i.penaltyK&&m.push(Object.freeze([u[e].key,i]));p.set(i,j.placement),M({key:i,bounds:j.bounds})}return{placements:p,residualPairs:Object.freeze(m)}}({items:m.flatMap(e=>"room-label"===e.kind?[]:[{id:e.id,kind:e.kind,placement:e.placement,screenHalfSize:e.screenHalfSize}]),rooms:c,wallSilhouettes:o.wallSilhouettes,sceneUnitsPerCssPixel:a,visualOffset:f}):{placements:new Map,residualPairs:[]},I=Object.freeze(m.map(e=>{if("room-label"===e.kind)return e;const t=C.placements.get(Z(e.kind,e.id))||e.placement;return t===e.placement?e:{...e,placement:t}})),T=new Map,j=new Map;for(const e of I)"device"===e.kind?T.set(e.id,e.placement):"opening-lock"===e.kind&&j.set(e.id,e.placement);const O={devices:T,rooms:h,locks:j,entries:I,collisionSignature:P,residualPairs:Object.freeze([...C.residualPairs])};return z&&function(e,t){return e.length===t.length&&t.every((t,n)=>{const o=e[n];return o.id===t.id&&o.kind===t.kind&&o.placement===t.placement&&o.groundRadius===t.groundRadius&&o.screenHalfSize[0]===t.screenHalfSize[0]&&o.screenHalfSize[1]===t.screenHalfSize[1]})}(z.entries,O.entries)&&nt(z.devices,O.devices)&&nt(z.rooms,O.rooms)&&nt(z.locks,O.locks)?z:(S.set(v,O),O)}function at(e,t,n){return rt(e,t,n).floorAnchor}function rt(e,t,n){const o=!e.flip_v,i="gate"===e.type?e.partitionHost?m(e.partitionHost,o):p(t,{x:e.rx,y:e.ry,angle:e.angle,length:e.rlen,flip_v:o}):null,[a,r]=g({x:e.rx,y:e.ry,angle:e.angle,flipV:!!e.flip_v,gateFace:i},n);if(e.partitionHost)return{floorAnchor:a,preferredRoomId:null};const s=w(t,{x:e.rx,y:e.ry,angle:e.angle,length:e.rlen},!0),l=r?"negative":"positive";return{floorAnchor:a,preferredRoomId:s[l]?.roomId||null}}function st(e){let t=!1;try{t="undefined"!=typeof CSS&&"function"==typeof CSS.supports&&CSS.supports("filter","blur(1px)")}catch{t=!1}let n=!1;try{n="function"==typeof matchMedia&&matchMedia("(forced-colors: active)").matches}catch{n=!0}return function(e){const t=!!e.showBorders;return{structural:t,panels:t&&!e.hideOpenings,shadows:t&&e.filtersSupported&&!e.forcedColors,materialNuance:t&&e.filtersSupported&&!e.forcedColors,floorSymbols:!e.hideOpenings&&!t}}({showBorders:e.showBorders,hideOpenings:e.hideOpenings,filtersSupported:t,forcedColors:n})}function lt(e,t,n,o){if(!e.panels||!t)return[];return t.openings.flatMap(e=>{const t=n[e.sourceIndex];return t?U(e,o(t)):[]}).sort((e,t)=>e.depth-t.depth||e.sourceIndex-t.sourceIndex||e.leaf-t.leaf)}function ct(e){const t=st(e.display),n=t.panels?lt(t,e.scene,e.openings,e.amountOf):[],o=e.overlays(t),i=t=>({layers:t,panels:n,overlays:o,underlay:mt(t,e.scene?.floor,e.cellCm),shadows:gt(t,n,e.scene?.geometry,e.cellCm),walls:wt(e.projection,t,e.scene,n,e.cellCm),grounds:ht(o,t,e.cellCm),raised:pt()});try{return i(t)}catch(e){if(!t.shadows&&!t.materialNuance)throw e;return i({...t,shadows:!1,materialNuance:!1})}}const dt=()=>S``;function ft(e){return`translate(${r(4,e)} ${r(8,e)})`}function ut(e,t,n){const o=C(n);return S`
${"walls"===t&&e.materialNuance?S`
@@ -39,4 +39,4 @@ globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="34d1dbfc181acaf58842dfced0e6aa3a899a
d=${n.d} data-id=${n.id} data-kind=${n.type}
data-surface=${n.kind} data-leaf=${n.leaf??v}>${t.materialNuance?S``:v}`})}
- `}export{Je as ISO_OVERLAY_PLACEMENT_CACHE_LIMIT,Be as ISO_RAISED_FOOTPRINT,Ie as ISO_SCENE_RUNTIME_FINGERPRINT,it as buildIsoOverlayRenderScene,Oe as buildIsoWallDepthQueue,Ge as createIsoStructuralSource,ft as isoFixedLightTransform,at as isoOpeningLockAnchor,rt as isoOpeningLockPlacement,ot as isoOverlayRooms,Ze as isoOverlaySceneBounds,Ae as isoRaisedOverlayHalfSize,Fe as isoSourceOpenings,Le as isoStructuralOpeningHost,Ve as isoStructuralRoomGeometry,We as isoWallSilhouettesOf,ht as renderIsoOverlayGrounds,pt as renderIsoRaisedOverlays,gt as renderIsoShadows,mt as renderIsoUnderlay,wt as renderIsoWalls,st as resolveIsoDecorationLayers,ct as resolveIsoFramePresentation,lt as resolveIsoOpeningPanels,Xe as resolveIsoOverlayFitEnvelope,Ee as resolveIsoScene};
+ `}export{Xe as ISO_OVERLAY_PLACEMENT_CACHE_LIMIT,Be as ISO_RAISED_FOOTPRINT,Ie as ISO_SCENE_RUNTIME_FINGERPRINT,it as buildIsoOverlayRenderScene,Oe as buildIsoWallDepthQueue,Ge as createIsoStructuralSource,ft as isoFixedLightTransform,at as isoOpeningLockAnchor,rt as isoOpeningLockPlacement,ot as isoOverlayRooms,Ze as isoOverlaySceneBounds,Ae as isoRaisedOverlayHalfSize,Fe as isoSourceOpenings,Le as isoStructuralOpeningHost,Ve as isoStructuralRoomGeometry,We as isoWallSilhouettesOf,ht as renderIsoOverlayGrounds,pt as renderIsoRaisedOverlays,gt as renderIsoShadows,mt as renderIsoUnderlay,wt as renderIsoWalls,st as resolveIsoDecorationLayers,ct as resolveIsoFramePresentation,lt as resolveIsoOpeningPanels,Je as resolveIsoOverlayFitEnvelope,Ee as resolveIsoScene};
diff --git a/custom_components/houseplan/frontend/houseplan-assets/live-interaction-runtime-Ba7Bs1o7.js b/custom_components/houseplan/frontend/houseplan-assets/live-interaction-runtime-Cwn9InHh.js
similarity index 96%
rename from custom_components/houseplan/frontend/houseplan-assets/live-interaction-runtime-Ba7Bs1o7.js
rename to custom_components/houseplan/frontend/houseplan-assets/live-interaction-runtime-Cwn9InHh.js
index 60a14ec7..f67c978f 100644
--- a/custom_components/houseplan/frontend/houseplan-assets/live-interaction-runtime-Ba7Bs1o7.js
+++ b/custom_components/houseplan/frontend/houseplan-assets/live-interaction-runtime-Cwn9InHh.js
@@ -1 +1 @@
-globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="34d1dbfc181acaf58842dfced0e6aa3a899aef6b8d1eeba53732ef729a63137e";import{eb as e}from"./houseplan-card-BKJrmMEj.js";const t=new WeakMap,o=e=>{let o=t.get(e);return o||(o={painted:null,pending:null,raf:0,anchor:null},t.set(e,o)),o},n=e=>`${e.x} ${e.y} ${e.w} ${e.h}`;function r(e,t){return{translateXPercent:(e.x-t.x)/t.w*100,translateYPercent:(e.y-t.y)/t.h*100,scaleX:e.w/t.w,scaleY:e.h/t.h}}const a=e=>0===e.translateXPercent&&0===e.translateYPercent&&1===e.scaleX&&1===e.scaleY,i=.15;const s=e=>[e.x,e.y,e.w,e.h].every(Number.isFinite)&&e.w>0&&e.h>0,l=(e,t,o={})=>{const n=e.style;if(!t)return o.exposeSceneOverflow&&"visible"===n.overflow&&n.removeProperty("overflow"),void(n.transform&&(n.removeProperty("transform"),n.removeProperty("transform-origin"),n.removeProperty("will-change")));o.exposeSceneOverflow&&"visible"!==n.overflow&&(n.overflow="visible");const r=(e=>`translate(${e.translateXPercent}%,${e.translateYPercent}%) scale(${e.scaleX},${e.scaleY})`)(t);"0 0"!==n.transformOrigin&&"0px 0px"!==n.transformOrigin&&(n.transformOrigin="0 0"),"transform"!==n.willChange&&(n.willChange="transform"),n.transform!==r&&(n.transform=r)},c=(e,t)=>{e.getAttribute("viewBox")!==t&&e.setAttribute("viewBox",t)};function f(e,t,o,f,d={}){const u=d.now??("undefined"!=typeof performance?performance.now():Date.now()),h=f??{frame:t,at:-1/0};if(!s(t.view)||!s(o.view)||!s(o.floor))return h;const m=!0===d.force||!s(h.frame.view)||!s(h.frame.floor)||function(e,t,o){if(o-e.at>=100)return!0;const n=e.frame.view,r=t.view;if(Math.abs(r.x-n.x)>=r.w*i)return!0;if(Math.abs(r.y-n.y)>=r.h*i)return!0;const a=n.w/r.w;return Math.abs(1-a)>=i}(h,o,u),p=m?{frame:o,at:u}:h;if(m){const t=n(o.view),r=n(o.floor);for(const o of e.querySelectorAll('[data-hp-live-viewbox="camera"]'))c(o,t);for(const t of e.querySelectorAll('[data-hp-live-viewbox="floor"]'))c(t,r)}const v=r(p.frame.view,o.view),_=r(p.frame.floor,o.floor),g=!0===d.keepSceneLayer;for(const t of e.querySelectorAll('[data-hp-live-viewbox="camera"]'))l(t,a(v)&&!g?null:v,{exposeSceneOverflow:!0});for(const t of e.querySelectorAll('[data-hp-live-viewbox="floor"]'))l(t,a(_)&&!g?null:_,{exposeSceneOverflow:!0});const w=r(t.view,o.view);for(const t of e.querySelectorAll('[data-hp-live-layer="camera"]'))l(t,a(w)?null:w);const y=e.querySelector("[data-hp-live-zoom]");if(y){const e=o.zoom<=1;y.hidden!==e&&(y.hidden=e);const t=y.querySelector("[data-hp-live-zoom-value]"),n=`${Math.round(100*o.zoom)}%`;t&&t.textContent!==n&&(t.textContent=n)}return p}const d=e=>{const t=e._viewOr(e._baseVb());return{view:{...t},floor:{...e._floorView(t)},zoom:e._zoom}};const u=new WeakMap,h=new WeakMap,m=(e,t)=>{const o=e._spaceDisplayForRender().showLqi??e._config?.show_signal??!0,n=e._devicePresentation(t,o),r=n.haDisabled?e._t(`marker.ha_disabled_${n.disabledReason}`):t.userHidden?e._t("marker.hidden_ghost"):t.name,a=[t.model,n.valueBadge?.fullText||"",null!=n.lqiText?`LQI ${n.lqiText}`:""].filter(Boolean).join(" · ");return{title:t.name,meta:n.haDisabled?r:a}};const p=e=>{h.delete(e)},v=(e,t,o,n)=>{if(!o)return;const r=document.createElement("span");if(r.className="m",t){r.append(`${t} `);const e=document.createElement("b");e.textContent=o,n&&(e.style.color=n),r.append(e)}else r.textContent=o;e.append(r)},_=(t,o)=>{const n=o.querySelector("[data-hp-live-tip]");if(!n)return;const r=t._tip;if(!r)return n.hidden=!0,void n.replaceChildren();n.style.left=`${r.x+12}px`,n.style.top=`${r.y+12}px`,n.replaceChildren();const a=document.createElement("b");a.textContent=r.title,n.append(a),v(n,"",r.meta),v(n,t._t("tip.temp_avg"),null==r.temp?"":`${r.temp}°`),v(n,t._t("tip.hum_avg"),null==r.hum?"":`${r.hum}%`),v(n,t._t("tip.lqi"),null==r.lqi?"":String(r.lqi),null==r.lqi?void 0:e(r.lqi)),n.hidden=!1;const i=n.getBoundingClientRect(),s=Math.max(8,window.innerWidth-i.width-8),l=Math.max(8,window.innerHeight-i.height-8);n.style.left=`${Math.min(s,Math.max(8,r.x+12))}px`,n.style.top=`${Math.min(l,Math.max(8,r.y+12))}px`},g=(e,t,o)=>{const n=e.querySelector(t);n&&(n.setAttribute("d",o),n.toggleAttribute("hidden",!o))};function w(e){const t=e,o=t.renderRoot;if(!o)return;_(t,o);const n=t._hoverRoom,r=u.get(e),a=n?.space||"",i=n?.room||null;if(r?.room===i&&r?.space===a)return;u.set(e,{room:i,space:a});const s=n&&t._spaceModel(),l=s?t._roomHoverPaths(s):null;g(o,'[data-hp-live-room-hover="fill"]',l?.fillD||""),g(o,'[data-hp-live-room-hover="halo"]',l?.outlineD||""),g(o,'[data-hp-live-room-hover="outline"]',l?.outlineD||"")}function y(e){u.delete(e)}class x{constructor(e){this.host=e,this.deferredHass=!1}hass(e,t,o,n){const r=function(e,t,o){if(e===t)return"none";if(!e||!t||!o)return"structural";if(e.connection!==t.connection||e.entities!==t.entities||e.devices!==t.devices||e.areas!==t.areas||e.themes!==t.themes||e.user!==t.user||e.config!==t.config||e.floors!==t.floors||e.services!==t.services||e.panels!==t.panels||e.language!==t.language||e.locale?.language!==t.locale?.language||e.locale?.number_format!==t.locale?.number_format||e.locale?.time_format!==t.locale?.time_format||e.locale?.date_format!==t.locale?.date_format)return"structural";const n=new Set(["states","connection","entities","devices","areas","themes","user","config","floors","services","panels","language","locale"]);for(const o of new Set([...Object.keys(e),...Object.keys(t)]))if(!n.has(o)&&e[o]!==t[o])return"structural";for(const n of o.entityIds)if(e.states?.[n]!==t.states?.[n])return"state";return"none"}(e,t,o),a="state"===r&&this.active();a&&(this.deferredHass=!0);const i="none"!==r&&!a;return i||this.host._renderLife.observe(e,t,o,n),i}clear(){this.deferredHass=!1}take(){const e=this.deferredHass;return this.deferredHass=!1,e}viewport(e=!1){!function(e,t=!1){const n=e,r=o(e),a=d(n);if(t)return r.raf&&"function"==typeof cancelAnimationFrame&&cancelAnimationFrame(r.raf),r.raf=0,r.pending=null,r.painted||(r.painted=a),void(r.anchor=f(n.renderRoot,r.painted,a,r.anchor,{keepSceneLayer:!0}));r.pending=a,r.raf||"function"!=typeof requestAnimationFrame||(r.raf=requestAnimationFrame(()=>{r.raf=0;const e=r.pending;r.pending=null;const t=n.renderRoot;e&&t&&(r.painted||(r.painted=e),r.anchor=f(t,r.painted,e,r.anchor,{keepSceneLayer:!0}))}))}(this.host,e)}hover(){w(this.host)}devicePointerTip(e,t){!function(e,t,o){const n=e;if(n._notePointer(t),!n._pointerModality.hoverEnabled||n._drag||n._deviceDrag)return void n._deviceHits.hover(n.renderRoot,null);const r=m(n,o);n._deviceHits.hover(n.renderRoot,o.id),n._showTip(t,r.title,r.meta)}(this.host,e,t)}deviceFocusTip(e,t){!function(e,t,o){const n=e;if("view"!==n._mode||n._drag||n._deviceDrag||!t?.matches(":focus-visible"))return;const r=t.getBoundingClientRect(),a={x:r.right,y:r.top,...m(n,o),source:"focus",deviceId:o.id};h.set(e,a),n._tip=a,w(n)}(this.host,e,t)}deviceBlur(e){!function(e,t){const o=e;h.get(e)?.deviceId===t&&(h.delete(e),"focus"===o._tip?.source&&(o._tip=null),w(o))}(this.host,e)}pointerLeave(){!function(e){const t=e;t._deviceHits.hover(t.renderRoot,null),t._tip=h.get(e)||null,t._hoverRoom=null,w(t)}(this.host)}deviceFocusActive(){return e=this.host,h.has(e);var e}clearDeviceFocus(){p(this.host)}active(){const e=this.host;return e._pointers.size>0||e._cameraTransition.active||!!e._deviceDrag||!!e._physicalDrag||!!e._physicalRotate||!!e._decorMove||!!e._decorDraft||!!e._dtDrag||!!e._bdDrag||!!e._opDrag||!!e._resize?.dragging}commit(){!function(e,t=!1){const n=e,r=o(e);r.raf&&"function"==typeof cancelAnimationFrame&&cancelAnimationFrame(r.raf),r.raf=0,r.pending=null,r.painted=d(n);const a=n.renderRoot;if(a){for(const e of a.querySelectorAll('[data-hp-live-layer="camera"]'))l(e,null);r.anchor=f(a,r.painted,r.painted,r.anchor,{force:!0,keepSceneLayer:t})}}(this.host,this.active()),function(e){const t=e,o=h.get(e);if(!o)return;const n=[...t.renderRoot.querySelectorAll('[data-hp="device"]')].find(e=>e.dataset.id===o.deviceId);n?.matches(":focus-visible")||(h.delete(e),"focus"===t._tip?.source&&(t._tip=null))}(this.host),y(this.host),w(this.host)}dispose(){!function(e){const o=t.get(e);o?.raf&&"function"==typeof cancelAnimationFrame&&cancelAnimationFrame(o.raf),t.delete(e)}(this.host),p(this.host),y(this.host)}}export{x as LiveRuntime};
+globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="4da0d706a85c3f1c08ab6de960deb5feb08baaf9055265234e7bd1b554332653";import{eb as e}from"./houseplan-card-CAm75-22.js";const t=new WeakMap,o=e=>{let o=t.get(e);return o||(o={painted:null,pending:null,raf:0,anchor:null},t.set(e,o)),o},n=e=>`${e.x} ${e.y} ${e.w} ${e.h}`;function r(e,t){return{translateXPercent:(e.x-t.x)/t.w*100,translateYPercent:(e.y-t.y)/t.h*100,scaleX:e.w/t.w,scaleY:e.h/t.h}}const a=e=>0===e.translateXPercent&&0===e.translateYPercent&&1===e.scaleX&&1===e.scaleY,i=.15;const s=e=>[e.x,e.y,e.w,e.h].every(Number.isFinite)&&e.w>0&&e.h>0,l=(e,t,o={})=>{const n=e.style;if(!t)return o.exposeSceneOverflow&&"visible"===n.overflow&&n.removeProperty("overflow"),void(n.transform&&(n.removeProperty("transform"),n.removeProperty("transform-origin"),n.removeProperty("will-change")));o.exposeSceneOverflow&&"visible"!==n.overflow&&(n.overflow="visible");const r=(e=>`translate(${e.translateXPercent}%,${e.translateYPercent}%) scale(${e.scaleX},${e.scaleY})`)(t);"0 0"!==n.transformOrigin&&"0px 0px"!==n.transformOrigin&&(n.transformOrigin="0 0"),"transform"!==n.willChange&&(n.willChange="transform"),n.transform!==r&&(n.transform=r)},c=(e,t)=>{e.getAttribute("viewBox")!==t&&e.setAttribute("viewBox",t)};function f(e,t,o,f,d={}){const u=d.now??("undefined"!=typeof performance?performance.now():Date.now()),h=f??{frame:t,at:-1/0};if(!s(t.view)||!s(o.view)||!s(o.floor))return h;const m=!0===d.force||!s(h.frame.view)||!s(h.frame.floor)||function(e,t,o){if(o-e.at>=100)return!0;const n=e.frame.view,r=t.view;if(Math.abs(r.x-n.x)>=r.w*i)return!0;if(Math.abs(r.y-n.y)>=r.h*i)return!0;const a=n.w/r.w;return Math.abs(1-a)>=i}(h,o,u),p=m?{frame:o,at:u}:h;if(m){const t=n(o.view),r=n(o.floor);for(const o of e.querySelectorAll('[data-hp-live-viewbox="camera"]'))c(o,t);for(const t of e.querySelectorAll('[data-hp-live-viewbox="floor"]'))c(t,r)}const v=r(p.frame.view,o.view),_=r(p.frame.floor,o.floor),g=!0===d.keepSceneLayer;for(const t of e.querySelectorAll('[data-hp-live-viewbox="camera"]'))l(t,a(v)&&!g?null:v,{exposeSceneOverflow:!0});for(const t of e.querySelectorAll('[data-hp-live-viewbox="floor"]'))l(t,a(_)&&!g?null:_,{exposeSceneOverflow:!0});const w=r(t.view,o.view);for(const t of e.querySelectorAll('[data-hp-live-layer="camera"]'))l(t,a(w)?null:w);const y=e.querySelector("[data-hp-live-zoom]");if(y){const e=o.zoom<=1;y.hidden!==e&&(y.hidden=e);const t=y.querySelector("[data-hp-live-zoom-value]"),n=`${Math.round(100*o.zoom)}%`;t&&t.textContent!==n&&(t.textContent=n)}return p}const d=e=>{const t=e._viewOr(e._baseVb());return{view:{...t},floor:{...e._floorView(t)},zoom:e._zoom}};const u=new WeakMap,h=new WeakMap,m=(e,t)=>{const o=e._spaceDisplayForRender().showLqi??e._config?.show_signal??!0,n=e._devicePresentation(t,o),r=n.haDisabled?e._t(`marker.ha_disabled_${n.disabledReason}`):t.userHidden?e._t("marker.hidden_ghost"):t.name,a=[t.model,n.valueBadge?.fullText||"",null!=n.lqiText?`LQI ${n.lqiText}`:""].filter(Boolean).join(" · ");return{title:t.name,meta:n.haDisabled?r:a}};const p=e=>{h.delete(e)},v=(e,t,o,n)=>{if(!o)return;const r=document.createElement("span");if(r.className="m",t){r.append(`${t} `);const e=document.createElement("b");e.textContent=o,n&&(e.style.color=n),r.append(e)}else r.textContent=o;e.append(r)},_=(t,o)=>{const n=o.querySelector("[data-hp-live-tip]");if(!n)return;const r=t._tip;if(!r)return n.hidden=!0,void n.replaceChildren();n.style.left=`${r.x+12}px`,n.style.top=`${r.y+12}px`,n.replaceChildren();const a=document.createElement("b");a.textContent=r.title,n.append(a),v(n,"",r.meta),v(n,t._t("tip.temp_avg"),null==r.temp?"":`${r.temp}°`),v(n,t._t("tip.hum_avg"),null==r.hum?"":`${r.hum}%`),v(n,t._t("tip.lqi"),null==r.lqi?"":String(r.lqi),null==r.lqi?void 0:e(r.lqi)),n.hidden=!1;const i=n.getBoundingClientRect(),s=Math.max(8,window.innerWidth-i.width-8),l=Math.max(8,window.innerHeight-i.height-8);n.style.left=`${Math.min(s,Math.max(8,r.x+12))}px`,n.style.top=`${Math.min(l,Math.max(8,r.y+12))}px`},g=(e,t,o)=>{const n=e.querySelector(t);n&&(n.setAttribute("d",o),n.toggleAttribute("hidden",!o))};function w(e){const t=e,o=t.renderRoot;if(!o)return;_(t,o);const n=t._hoverRoom,r=u.get(e),a=n?.space||"",i=n?.room||null;if(r?.room===i&&r?.space===a)return;u.set(e,{room:i,space:a});const s=n&&t._spaceModel(),l=s?t._roomHoverPaths(s):null;g(o,'[data-hp-live-room-hover="fill"]',l?.fillD||""),g(o,'[data-hp-live-room-hover="halo"]',l?.outlineD||""),g(o,'[data-hp-live-room-hover="outline"]',l?.outlineD||"")}function y(e){u.delete(e)}class b{constructor(e){this.host=e,this.deferredHass=!1}hass(e,t,o,n){const r=function(e,t,o){if(e===t)return"none";if(!e||!t||!o)return"structural";if(e.connection!==t.connection||e.entities!==t.entities||e.devices!==t.devices||e.areas!==t.areas||e.themes!==t.themes||e.user!==t.user||e.config!==t.config||e.floors!==t.floors||e.services!==t.services||e.panels!==t.panels||e.language!==t.language||e.locale?.language!==t.locale?.language||e.locale?.number_format!==t.locale?.number_format||e.locale?.time_format!==t.locale?.time_format||e.locale?.date_format!==t.locale?.date_format)return"structural";const n=new Set(["states","connection","entities","devices","areas","themes","user","config","floors","services","panels","language","locale"]);for(const o of new Set([...Object.keys(e),...Object.keys(t)]))if(!n.has(o)&&e[o]!==t[o])return"structural";for(const n of o.entityIds)if(e.states?.[n]!==t.states?.[n])return"state";return"none"}(e,t,o),a="state"===r&&this.active();a&&(this.deferredHass=!0);const i="none"!==r&&!a;return i||this.host._renderLife.observe(e,t,o,n),i}clear(){this.deferredHass=!1}take(){const e=this.deferredHass;return this.deferredHass=!1,e}viewport(e=!1){!function(e,t=!1){const n=e,r=o(e),a=d(n);if(t)return r.raf&&"function"==typeof cancelAnimationFrame&&cancelAnimationFrame(r.raf),r.raf=0,r.pending=null,r.painted||(r.painted=a),void(r.anchor=f(n.renderRoot,r.painted,a,r.anchor,{keepSceneLayer:!0}));r.pending=a,r.raf||"function"!=typeof requestAnimationFrame||(r.raf=requestAnimationFrame(()=>{r.raf=0;const e=r.pending;r.pending=null;const t=n.renderRoot;e&&t&&(r.painted||(r.painted=e),r.anchor=f(t,r.painted,e,r.anchor,{keepSceneLayer:!0}))}))}(this.host,e)}hover(){w(this.host)}devicePointerTip(e,t){!function(e,t,o){const n=e;if(n._notePointer(t),!n._pointerModality.hoverEnabled||n._drag||n._deviceDrag)return void n._deviceHits.hover(n.renderRoot,null);const r=m(n,o);n._deviceHits.hover(n.renderRoot,o.id),n._showTip(t,r.title,r.meta)}(this.host,e,t)}deviceFocusTip(e,t){!function(e,t,o){const n=e;if("view"!==n._mode||n._drag||n._deviceDrag||!t?.matches(":focus-visible"))return;const r=t.getBoundingClientRect(),a={x:r.right,y:r.top,...m(n,o),source:"focus",deviceId:o.id};h.set(e,a),n._tip=a,w(n)}(this.host,e,t)}deviceBlur(e){!function(e,t){const o=e;h.get(e)?.deviceId===t&&(h.delete(e),"focus"===o._tip?.source&&(o._tip=null),w(o))}(this.host,e)}pointerLeave(){!function(e){const t=e;t._deviceHits.hover(t.renderRoot,null),t._tip=h.get(e)||null,t._hoverRoom=null,w(t)}(this.host)}deviceFocusActive(){return e=this.host,h.has(e);var e}clearDeviceFocus(){p(this.host)}active(){const e=this.host;return e._pointers.size>0||e._cameraTransition.active||!!e._deviceDrag||!!e._physicalDrag||!!e._physicalRotate||!!e._decorMove||!!e._decorDraft||!!e._dtDrag||!!e._bdDrag||!!e._opDrag||!!e._resize?.dragging}commit(){!function(e,t=!1){const n=e,r=o(e);r.raf&&"function"==typeof cancelAnimationFrame&&cancelAnimationFrame(r.raf),r.raf=0,r.pending=null,r.painted=d(n);const a=n.renderRoot;if(a){for(const e of a.querySelectorAll('[data-hp-live-layer="camera"]'))l(e,null);r.anchor=f(a,r.painted,r.painted,r.anchor,{force:!0,keepSceneLayer:t})}}(this.host,this.active()),function(e){const t=e,o=h.get(e);if(!o)return;const n=[...t.renderRoot.querySelectorAll('[data-hp="device"]')].find(e=>e.dataset.id===o.deviceId);n?.matches(":focus-visible")||(h.delete(e),"focus"===t._tip?.source&&(t._tip=null))}(this.host),y(this.host),w(this.host)}dispose(){!function(e){const o=t.get(e);o?.raf&&"function"==typeof cancelAnimationFrame&&cancelAnimationFrame(o.raf),t.delete(e)}(this.host),p(this.host),y(this.host)}}export{b as LiveRuntime};
diff --git a/custom_components/houseplan/frontend/houseplan-assets/pdf-export-BbdvUxVO.js b/custom_components/houseplan/frontend/houseplan-assets/pdf-export-_NFtYoOA.js
similarity index 99%
rename from custom_components/houseplan/frontend/houseplan-assets/pdf-export-BbdvUxVO.js
rename to custom_components/houseplan/frontend/houseplan-assets/pdf-export-_NFtYoOA.js
index ec84dc95..4072c0b7 100644
--- a/custom_components/houseplan/frontend/houseplan-assets/pdf-export-BbdvUxVO.js
+++ b/custom_components/houseplan/frontend/houseplan-assets/pdf-export-_NFtYoOA.js
@@ -1,4 +1,4 @@
-globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="34d1dbfc181acaf58842dfced0e6aa3a899aef6b8d1eeba53732ef729a63137e";import{p as A,q as B,A as E,c as s,aD as w,dZ as Q,P as C,a5 as g,N as I,aq as Y,M as R,bs as M,br as F,d_ as i,d$ as x,e0 as b,e1 as L,e2 as D,e3 as G,bu as o,b1 as t,bd as c,by as W,bz as m,dP as n,e4 as e,a4 as h,e5 as S,e6 as j}from"./houseplan-card-BKJrmMEj.js";import{GENERATED_FURNITURE_ART as r}from"./furniture-plan-art.generated-BfO1XOcD.js";const H="hp.pdf.options";class v extends B{constructor(){super(...arguments),this.options=null,this.busy=!1}willUpdate(){!this.options&&this.context?.space&&(this.options=function(){const A={dimensions:!0,roomNames:!0,decor:!1,backdrop:!0};try{const B=JSON.parse(localStorage.getItem(H)||"null");return 1===B?.v?{dimensions:!1!==B.dimensions,roomNames:!1!==B.roomNames,decor:!0===B.decor,backdrop:!1!==B.backdrop}:A}catch{return A}}())}setOption(A,B){this.options={...this.options||{dimensions:!0,roomNames:!0,decor:!1,backdrop:!0},[A]:B},this.requestUpdate()}async save(){if(!this.busy&&this.options){this.busy=!0,this.requestUpdate();try{try{localStorage.setItem(H,JSON.stringify({v:1,...this.options}))}catch{}await this.context.save(this.options),this.context.close()}catch(A){const B=A instanceof Error?A.message:"pdf.failed",E="pdf.too_large"===B||"pdf.asset_failed"===B?B:"pdf.failed";this.context.toast(this.context.t(E))}finally{this.busy=!1,this.requestUpdate()}}}render(){if(!this.context?.space)return E;const A=this.options||{dimensions:!0,roomNames:!0,decor:!1,backdrop:!0},B=(B,E)=>s`
- `}}v.properties={context:{attribute:!1}},v.styles=A`:host{display:contents;}.body{display:grid;gap:12px;width:100%;max-width:100%;min-width:0;padding:16px 20px;box-sizing:border-box;}label{display:flex;min-width:0;min-height:44px;align-items:center;gap:12px;cursor:pointer;}label span{min-width:0;overflow-wrap:anywhere;}input{width:20px;height:20px;flex:none;accent-color:var(--hp-accent,#d89300);}.row{display:flex;align-items:center;gap:8px;width:100%;max-width:100%;min-width:0;padding:12px 16px;box-sizing:border-box;}.spacer{flex:1;}button{min-width:0;min-height:44px;max-width:100%;display:inline-flex;align-items:center;justify-content:center;border:1px solid var(--hp-line,rgb(127 127 127/.3));border-radius:12px;padding:0 18px;box-sizing:border-box;overflow-wrap:anywhere;white-space:normal;background:transparent;color:inherit;font:inherit;cursor:pointer;}button.primary{background:var(--hp-accent,#d89300);color:var(--hp-on-accent,#111);border-color:transparent;}button:disabled{opacity:.55;cursor:default;}ha-icon{flex:none;margin-right:6px;}@media (max-width:360px){.row{display:grid;grid-template-columns:minmax(0,1fr);}.spacer{display:none;}button{width:100%;}}`,customElements.get("hp-pdf-dialog")||customElements.define("hp-pdf-dialog",v);const V=(A,B,E)=>Math.hypot(A[0]-B[0],A[1]-B[1])<=E,U=A=>Number.isFinite(A)&&A>=0?A:0;function l(A){const B=Number(A);return Number.isFinite(B)&&B>0?.1/B:0}const a=(A,B)=>[...new Set([...A,...B])].sort((A,B)=>A-B),P=(A,B)=>{const E=A.points.length;if(E<=1||!V(A.points[E-1],A.points[0],B))return!1;const s=E-2;return A.edgeSources[s]=a(A.edgeSources[s],A.edgeSources[E-1]),A.points.splice(E-1,1),A.edgeSources.splice(E-1,1),!0},y=(A,B)=>{for(let E=0;E+1{let E=!1;for(;A.points.length>1;)if(P(A,B))E=!0;else{if(!y(A,B))break;E=!0}return E},N=(A,B,E)=>{const s=B[0]-A[0],w=B[1]-A[1],C=E[0]-B[0],g=E[1]-B[1],I=Math.hypot(s,w),Y=Math.hypot(C,g);if(!(I>0&&Y>0))return!1;const R=s*C+w*g;if(!(R>0))return!1;const M=s*g-w*C;return Math.abs(M)<=R*Q},K=A=>{const B=A.points.length;if(B<3)return!1;for(let E=0;E{const E=U(B),s=[],w=[];for(let B=0;B[A])};for(;Q.points.length>1;){const A=u(Q,E);if(Q.points.length<3)break;if(!K(Q)&&!A)break}return u(Q,E),Q};function J(A,B){const E=Number(A[0]),s=Number(A[1]),w=Number(B[0]),C=Number(B[1]);if(![E,s,w,C].every(Number.isFinite))return null;const g=w-E,I=C-s,Y=Math.abs(g),R=Math.abs(I),M=Math.max(Y,R),F=Math.min(Y,R);if(!(M>0)||F/M>Q)return null;const i=[(E+w)/2,(s+C)/2];if(Y>=R){return{axis:"horizontal",a:[E,i[1]],b:[w,i[1]],mid:i,projectedLength:Y,tangentInterval:[Math.min(E,w),Math.max(E,w)],normalCoordinate:i[1]}}return{axis:"vertical",a:[i[0],s],b:[i[0],C],mid:i,projectedLength:R,tangentInterval:[Math.min(s,C),Math.max(s,C)],normalCoordinate:i[0]}}function Z(A,B){const E=B.map(A=>[Number(A[0]),Number(A[1])]);if(!E.every(A=>A.every(Number.isFinite)))return!1;if(E.length<3||((A,B)=>{const E=1e-12*Math.max(1,Math.abs(A[0]),Math.abs(A[1]),...B.flatMap(A=>[Math.abs(A[0]),Math.abs(A[1])]));for(let s=0;s0))continue;const Y=(A[0]-w[0])*g-(A[1]-w[1])*C;if(Math.abs(Y)>E*I)continue;const R=(A[0]-w[0])*C+(A[1]-w[1])*g;if(R>=-E&&R<=I*I+E)return!0}return!1})(A,E))return!1;let s=!1;for(let B=0,w=E.length-1;BA[1]==C[1]>A[1])continue;const g=(C[0]-Q[0])*(A[1]-Q[1])/(C[1]-Q[1])+Q[0];A[0]Object.is(A,-0)?0:A,I=[g(-Q/C),g(w/C)],Y=[g(-I[0]),g(-I[1])],R=[(B[0]+E[0])/2,(B[1]+E[1])/2],M=Math.max(1,C,Math.abs(R[0]),Math.abs(R[1])),F=Math.max(1e-9*M,.01*U(s));for(const B of[F,4*F,16*F]){const E=Z([R[0]+I[0]*B,R[1]+I[1]*B],A);if(E!==Z([R[0]+Y[0]*B,R[1]+Y[1]*B],A))return E?I:Y}return sA(A)>=0?I:Y}function f(A,B){let E=180*Math.atan2(B[1]-A[1],B[0]-A[0])/Math.PI;return E>90&&(E-=180),E<=-90&&(E+=180),E}function k(A,B,E,s={}){const w=Number(B);if(!(w>0&&Number.isFinite(w)))return[];const Q=void 0===s.epsilon?l(w):U(s.epsilon);return z(d(A,Q),w,E,{...s,epsilon:Q})}const z=(A,B,E,s)=>{if(A.points.length<3)return[];const Q=U(s.epsilon??l(B)),C=Number.isFinite(Number(s.ringIndex))?Number(s.ringIndex):0,g=[];for(let s=0;sQ))continue;const M=[...A.edgeSources[s]||[s]].sort((A,B)=>A-B),F=M[0]??s,i=T(A.points,R.a,R.b,Q),x=("horizontal"===R.axis?i[1]:i[0])<0?-1:1,b=[R.axis,O(R.tangentInterval[0]),String(x),O(C),O(F)].join("|"),L=R.projectedLength*B;g.push({sourceA:[...I],sourceB:[...Y],a:R.a,b:R.b,text:w(L,E),short:L<30,angle:f(R.a,R.b),mid:R.mid,axis:R.axis,projectedLength:R.projectedLength,tangentInterval:R.tangentInterval,normalCoordinate:R.normalCoordinate,inwardNormal:i,normalSign:x,source:{ringIndex:C,edgeIndex:F},sourceEdgeIndices:M,stableKey:b})}return g};function p(A,B,E,s={}){const w=Number(B);if(!(w>0&&Number.isFinite(w)))return[];const Q=void 0===s.epsilon?l(w):U(s.epsilon);let C=d(A,Q);if(sA(C.points)<0&&(C=(A=>{const B=A.points.length;return{points:[...A.points].reverse().map(A=>[...A]),edgeSources:A.points.map((E,s)=>[...A.edgeSources[(B-2-s+B)%B]])}})(C)),C.points.length){let A=0;for(let B=1;B({points:[...A.points.slice(B),...A.points.slice(0,B)],edgeSources:[...A.edgeSources.slice(B),...A.edgeSources.slice(0,B)]}))(C,A)}return z(C,w,E,{...s,epsilon:Q})}function X(A,B){const E=U(B),s=[];for(const B of A){const A=s.find(A=>A.axis===B.axis&&A.normalSign===B.normalSign&&Math.abs(A.normalCoordinate-B.normalCoordinate)<=E);A?A.edges.push(B):s.push({axis:B.axis,normalSign:B.normalSign,normalCoordinate:B.normalCoordinate,edges:[B]})}return s.map(A=>A.edges)}const O=A=>Object.is(A,-0)?"0":String(A),q=A=>"horizontal"===A?0:1;function $(A,B){return q(A.axis)-q(B.axis)||A.tangentInterval[0]-B.tangentInterval[0]||A.normalSign-B.normalSign||A.source.ringIndex-B.source.ringIndex||A.source.edgeIndex-B.source.edgeIndex}function _(A,B,E,s){const w=U(s);if(A.axis!==B.axis)return!1;if(A.source.ringIndex!==B.source.ringIndex)return!1;if(A.inwardNormal[0]*B.inwardNormal[0]+A.inwardNormal[1]*B.inwardNormal[1]>=-.5)return!1;if(!((A,B,E)=>Math.abs(A[0]-B[0])<=E&&Math.abs(A[1]-B[1])<=E)(A.tangentInterval,B.tangentInterval,w))return!1;if(Math.abs(A.projectedLength-B.projectedLength)>w)return!1;return Z([(A.mid[0]+B.mid[0])/2,(A.mid[1]+B.mid[1])/2],E)}const AA=(A,B)=>{const E=B?.(A);return{hardCollisions:Number.isFinite(Number(E?.hardCollisions))?Number(E?.hardCollisions):0,normalClearance:Number.isFinite(Number(E?.normalClearance))?Number(E?.normalClearance):0}},BA=(A,B,E)=>{const s=AA(A,E),w=AA(B,E);return s.hardCollisions-w.hardCollisions||w.normalClearance-s.normalClearance||$(A,B)};function EA(A,B){if(A.length<2)return[...A];const E=U(B.epsilon),s=function(A,B=1e-7){return d(A,B).points.map(A=>[...A])}(B.ring,E),w=[];for(let B=0;B{const E=A.separation-B.separation;if(E)return E;const s=$(A.left,A.right)<=0?A.left:A.right,w=s===A.left?A.right:A.left,Q=$(B.left,B.right)<=0?B.left:B.right,C=Q===B.left?B.right:B.left;return $(s,Q)||$(w,C)});const Q=new Set,C=new Set;for(const A of w){if(Q.has(A.left)||Q.has(A.right))continue;Q.add(A.left),Q.add(A.right);const E=BA(A.left,A.right,B.score)<=0?A.left:A.right;C.add(E===A.left?A.right:A.left)}return A.filter(A=>!C.has(A))}function sA(A){let B=0;for(let E=0;E1){const A=Math.sqrt(G);Y*=A,R*=A}const o=Math.max(0,Y*Y*R*R-Y*Y*D*D-R*R*L*L),t=Y*Y*D*D+R*R*L*L||1,c=(Q===C?-1:1)*Math.sqrt(o/t),W=c*Y*D/R,m=c*-R*L/Y,n=F*W-i*m+(A+g)/2,e=i*W+F*m+(B+I)/2;let h=gA(1,0,(L-W)/Y,(D-m)/R),S=gA((L-W)/Y,(D-m)/R,(-L-W)/Y,(-D-m)/R);!C&&S>0&&(S-=2*Math.PI),C&&S<0&&(S+=2*Math.PI);const j=Math.max(1,Math.ceil(Math.abs(S)/(Math.PI/2))),r=S/j,H=A=>[n+F*Y*Math.cos(A)-i*R*Math.sin(A),e+i*Y*Math.cos(A)+F*R*Math.sin(A)],v=A=>[-F*Y*Math.sin(A)-i*R*Math.cos(A),-i*Y*Math.sin(A)+F*R*Math.cos(A)],V=[];for(let A=0;A[B.a*A+B.c*E+B.e,B.b*A+B.d*E+B.f];return function(A){const B=A.match(/[AaCcHhLlMmQqSsTtVvZz]|[-+]?(?:\d*\.\d+|\d+\.?)(?:e[-+]?\d+)?/gi)||[],E=[];let s=0,w="",Q=0,C=0,g=0,I=0,Y=null,R=null;const M=()=>Number(B[s++]);for(;sB.length||QA.test(B[s]))throw new Error(`Invalid SVG path command ${w}`);const x=Array.from({length:i},M),b=A=>A+(F?Q:0),L=A=>A+(F?C:0);if("M"===A||"L"===A)Q=b(x[0]),C=L(x[1]),E.push({op:"M"===A?"M":"L",x:Q,y:C}),"M"===A&&(g=Q,I=C,w=F?"l":"L"),Y=R=null;else if("H"===A)Q=b(x[0]),E.push({op:"L",x:Q,y:C}),Y=R=null;else if("V"===A)C=L(x[0]),E.push({op:"L",x:Q,y:C}),Y=R=null;else if("C"===A){const A=b(x[0]),B=L(x[1]),s=b(x[2]),w=L(x[3]);Q=b(x[4]),C=L(x[5]),Y=[s,w],R=null,E.push({op:"C",x1:A,y1:B,x2:s,y2:w,x:Q,y:C})}else if("S"===A){const A=Y?2*Q-Y[0]:Q,B=Y?2*C-Y[1]:C,s=b(x[0]),w=L(x[1]);Q=b(x[2]),C=L(x[3]),Y=[s,w],R=null,E.push({op:"C",x1:A,y1:B,x2:s,y2:w,x:Q,y:C})}else if("Q"===A||"T"===A){const B="Q"===A?b(x[0]):R?2*Q-R[0]:Q,s="Q"===A?L(x[1]):R?2*C-R[1]:C,w=b("Q"===A?x[2]:x[0]),g=L("Q"===A?x[3]:x[1]);E.push({op:"C",x1:Q+2/3*(B-Q),y1:C+2/3*(s-C),x2:w+2/3*(B-w),y2:g+2/3*(s-g),x:w,y:g}),Q=w,C=g,R=[B,s],Y=null}else if("A"===A){const A=b(x[5]),B=L(x[6]),s=IA(Q,C,x[0],x[1],x[2],x[3],x[4],A,B);s.length?E.push(...s):E.push({op:"L",x:A,y:B}),Q=A,C=B,Y=R=null}}return E}(A).map(A=>{if("Z"===A.op)return A;if("M"===A.op||"L"===A.op){const[B,s]=E(A.x,A.y);return{op:A.op,x:B,y:s}}if("C"!==A.op)throw new Error("Unsupported PDF vector operation");const[B,s]=E(A.x1,A.y1),[w,Q]=E(A.x2,A.y2),[C,g]=E(A.x,A.y);return{op:"C",x1:B,y1:s,x2:w,y2:Q,x:C,y:g}})}const RA=["M20.82,15.31h0L10.46,9c-.46-.26-1.11.37-.86.84l6.15,10.56,10.56,6.15a.66.66,0,0,0,.84-.86Zm-4,4,3-3,4.55,7.44Z","M18,2A16,16,0,1,0,34,18,16,16,0,0,0,18,2Zm1,29.95V29.53H17v2.42A14,14,0,0,1,4.05,19H6.47V17H4.05A14,14,0,0,1,17,4.05V6.47h2V4.05A14,14,0,0,1,31.95,17H29.53v2h2.42A14,14,0,0,1,19,31.95Z"],MA=A=>Math.abs(A)<1e-12?0:Math.abs(A-1)<1e-12?1:Math.abs(A+1)<1e-12?-1:A;function FA(A){const B=function(A){const{centerX:B,centerY:E,size:s,northDeg:w}=A;if(![B,E,s,w].every(Number.isFinite)||s<=0)throw new RangeError("PDF compass placement must contain finite coordinates and a positive size");const Q=((w%360+360)%360+45)*Math.PI/180,C=s/36,g=MA(Math.cos(Q)),I=MA(Math.sin(Q)),Y=C*g,R=C*I,M=-C*I,F=C*g;return{a:Y,b:R,c:M,d:F,e:B-18*Y-18*M,f:E-18*R-18*F}}(A);return RA.flatMap(A=>YA(A,B))}const iA=1e-8,xA=A=>A.length>=2&&Number.isFinite(A[0])&&Number.isFinite(A[1]),bA=(A,B)=>A[0]>=B.minX-iA&&A[0]<=B.maxX+iA&&A[1]>=B.minY-iA&&A[1]<=B.maxY+iA,LA=A=>[A.minX,A.minY,A.maxX,A.maxY].every(Number.isFinite)&&A.maxX>=A.minX&&A.maxY>=A.minY,DA=A=>[[A.minX,A.minY],[A.maxX,A.minY],[A.maxX,A.maxY],[A.minX,A.maxY]];const GA=(A,B,E)=>(B[0]-A[0])*(E[1]-A[1])-(B[1]-A[1])*(E[0]-A[0]),oA=(A,B,E)=>{const s=E[0]-B[0],w=E[1]-B[1],Q=Math.abs(s)>=Math.abs(w)?s:w;return Math.abs(Q)<=iA?0:(Math.abs(s)>=Math.abs(w)?A[0]-B[0]:A[1]-B[1])/Q},tA=(A,B)=>Math.hypot(B[0]-A[0],B[1]-A[1]);function cA(A,B,E){const s=tA(B,E);if(s<=iA)return tA(A,B)<=iA;if(Math.abs(GA(B,E,A))/s>iA)return!1;const w=oA(A,B,E),Q=iA/s;return w>=-Q&&w<=1+Q}function WA(A,B,E,s){const w=B[0]-A[0],Q=B[1]-A[1],C=s[0]-E[0],g=s[1]-E[1],I=Math.hypot(w,Q),Y=Math.hypot(C,g);if(I<=iA)return cA(A,E,s)?{t:0,endT:0,overlap:!1}:null;if(Y<=iA){if(!cA(E,A,B))return null;const s=Math.max(0,Math.min(1,oA(E,A,B)));return{t:s,endT:s,overlap:!1}}const R=w*g-Q*C,M=E[0]-A[0],F=E[1]-A[1],i=iA*I*Y;if(Math.abs(R)<=i){if(Math.abs(GA(A,B,E))/I>iA||Math.abs(GA(A,B,s))/I>iA)return null;const w=oA(E,A,B),Q=oA(s,A,B),C=Math.max(0,Math.min(w,Q)),g=Math.min(1,Math.max(w,Q));return giA}}const x=(M*g-F*C)/R,b=(M*Q-F*w)/R,L=iA/I,D=iA/Y;if(x<-L||x>1+L||b<-D||b>1+D)return null;const G=Math.max(0,Math.min(1,x));return{t:G,endT:G,overlap:!1}}const mA=A=>A.every(A=>A.length>=2&&A.every(xA));function nA(A,B){for(const E of A){const A=E;for(let E=0;Enull!==WA(A,B,E,s[(w+1)%s.length]))}const hA=2048,SA=2146,jA=[-1825,-555,4188,2163],rA={32:1,33:2,34:3,35:4,36:5,37:6,38:7,39:8,40:9,41:10,42:11,43:12,44:13,45:14,46:15,47:16,48:17,49:18,50:19,51:20,52:21,53:22,54:23,55:24,56:25,57:26,58:27,59:28,60:29,61:30,62:31,63:32,64:33,65:34,66:35,67:36,68:37,69:38,70:39,71:40,72:41,73:42,74:43,75:44,76:45,77:46,78:47,79:48,80:49,81:50,82:51,83:52,84:53,85:54,86:55,87:56,88:57,89:58,90:59,91:60,92:61,93:62,94:63,95:64,96:65,97:66,98:67,99:68,100:69,101:70,102:71,103:72,104:73,105:74,106:75,107:76,108:77,109:78,110:79,111:80,112:81,113:82,114:83,115:84,116:85,117:86,118:87,119:88,120:89,121:90,122:91,123:92,124:93,125:94,126:95,160:596,161:96,162:97,163:98,164:99,165:100,166:101,167:102,168:103,169:104,170:105,171:106,172:107,173:597,174:108,175:109,176:110,177:111,178:112,179:113,180:114,181:115,182:116,183:117,184:118,185:119,186:120,187:121,188:122,189:123,190:124,191:125,192:603,193:604,194:605,195:606,196:607,197:608,198:126,199:609,200:610,201:611,202:612,203:613,204:614,205:615,206:616,207:617,208:599,209:618,210:619,211:620,212:621,213:622,214:623,215:127,216:128,217:624,218:625,219:626,220:627,221:628,222:129,223:130,224:629,225:630,226:631,227:632,228:633,229:634,230:131,231:635,232:636,233:637,234:638,235:639,236:640,237:641,238:642,239:643,240:132,241:644,242:645,243:646,244:647,245:648,246:649,247:133,248:134,249:650,250:651,251:652,252:653,253:654,254:135,255:655,256:656,257:657,258:658,259:659,260:660,261:661,262:662,263:663,264:664,265:665,266:666,267:667,268:668,269:669,270:670,271:671,272:598,273:136,274:672,275:673,276:674,277:675,278:676,279:677,280:678,281:679,282:680,283:681,284:682,285:683,286:684,287:685,288:686,289:687,290:688,291:689,292:690,293:691,294:137,295:600,296:692,297:693,298:694,299:695,300:696,301:697,302:698,303:699,304:700,305:138,306:701,307:702,308:703,309:704,310:705,311:706,312:139,313:707,314:708,315:709,316:710,317:711,318:712,319:713,320:714,321:140,322:141,323:715,324:716,325:717,326:718,327:719,328:720,329:721,330:142,331:143,332:722,333:723,334:724,335:725,336:726,337:727,338:144,339:145,340:728,341:729,342:730,343:731,344:732,345:733,346:734,347:735,348:736,349:737,350:738,351:739,352:742,353:743,354:744,355:745,356:746,357:747,358:601,359:602,360:748,361:749,362:750,363:751,364:752,365:753,366:754,367:755,368:756,369:757,370:758,371:759,372:760,373:761,374:762,375:763,376:764,377:765,378:766,379:767,380:768,381:769,382:770,383:146,1024:897,1025:856,1026:165,1027:857,1028:166,1029:858,1030:859,1031:860,1032:861,1033:167,1034:168,1035:169,1036:863,1037:898,1038:864,1039:170,1040:865,1041:171,1042:866,1043:867,1044:172,1045:868,1046:173,1047:174,1048:175,1049:869,1050:862,1051:176,1052:870,1053:871,1054:872,1055:873,1056:874,1057:875,1058:876,1059:177,1060:178,1061:877,1062:179,1063:180,1064:181,1065:182,1066:183,1067:184,1068:185,1069:186,1070:187,1071:188,1072:878,1073:189,1074:190,1075:191,1076:192,1077:879,1078:193,1079:194,1080:195,1081:880,1082:196,1083:197,1084:198,1085:199,1086:881,1087:200,1088:882,1089:883,1090:201,1091:884,1092:202,1093:885,1094:203,1095:204,1096:205,1097:206,1098:207,1099:208,1100:209,1101:210,1102:211,1103:212,1104:899,1105:886,1106:213,1107:887,1108:214,1109:888,1110:889,1111:890,1112:891,1113:215,1114:216,1115:217,1116:892,1117:900,1118:893,1119:218,1120:219,1121:220,1122:965,1123:221,1124:222,1125:223,1126:224,1127:225,1128:226,1129:227,1130:228,1131:229,1132:230,1133:231,1134:232,1135:233,1136:901,1137:902,1138:234,1139:235,1140:236,1141:237,1142:903,1143:904,1144:906,1145:905,1146:238,1147:239,1148:240,1149:241,1150:242,1151:243,1152:244,1153:245,1154:246,1155:247,1156:248,1157:249,1158:250,1159:251,1160:252,1161:253,1162:254,1163:255,1164:964,1165:256,1166:257,1167:258,1168:259,1169:260,1170:966,1171:967,1172:261,1173:262,1174:263,1175:264,1176:907,1177:908,1178:265,1179:266,1180:267,1181:268,1182:968,1183:969,1184:269,1185:270,1186:271,1187:272,1188:273,1189:274,1190:275,1191:276,1192:277,1193:278,1194:909,1195:910,1196:955,1197:956,1198:911,1199:912,1200:970,1201:971,1202:279,1203:280,1204:281,1205:282,1206:283,1207:284,1208:285,1209:286,1210:287,1211:963,1212:288,1213:289,1214:961,1215:962,1216:913,1217:914,1218:915,1219:290,1220:291,1221:292,1222:293,1223:294,1224:295,1225:296,1226:297,1227:957,1228:958,1229:298,1230:299,1231:916,1232:917,1233:918,1234:919,1235:920,1236:921,1237:922,1238:923,1239:924,1240:300,1241:926,1242:925,1243:927,1244:928,1245:929,1246:930,1247:931,1248:301,1249:302,1250:932,1251:933,1252:934,1253:935,1254:936,1255:937,1256:938,1257:939,1258:940,1259:941,1260:942,1261:943,1262:944,1263:945,1264:946,1265:947,1266:948,1267:949,1268:950,1269:951,1270:959,1271:960,1272:952,1273:953,1274:303,1275:304,1276:305,1277:306,1278:972,1279:973,1280:307,1281:954,1282:308,1283:309,1284:310,1285:311,1286:312,1287:313,1288:314,1289:315,1290:316,1291:317,1292:318,1293:319,1294:320,1295:321,1296:322,1297:974,1298:323,1299:324,1300:325,1301:326,1302:327,1303:328,1304:329,1305:330,1306:982,1307:983,1308:984,1309:985,1310:331,1311:332,1312:333,1313:334,1314:335,1315:336,1316:337,1317:338,1318:339,1319:340,1320:341,1321:342,1322:343,1323:344,1324:345,1325:346,1326:347,1327:348,8192:349,8193:350,8194:351,8195:352,8196:353,8197:354,8198:355,8199:356,8200:357,8201:358,8202:360,8203:361,8204:362,8205:363,8206:364,8207:365,8208:366,8209:367,8210:368,8211:369,8212:370,8213:975,8214:371,8215:372,8216:373,8217:374,8218:375,8219:376,8220:377,8221:378,8222:379,8223:380,8224:381,8225:382,8226:383,8227:384,8228:385,8229:386,8230:387,8231:388,8239:986,8240:389,8241:390,8242:894,8243:895,8244:391,8245:392,8246:393,8247:394,8248:395,8249:396,8250:397,8251:398,8252:896,8253:399,8254:400,8255:401,8256:402,8257:403,8258:404,8259:405,8260:406,8261:407,8262:408,8263:987,8264:988,8265:989,8266:409,8267:410,8268:411,8269:412,8270:413,8271:414,8272:415,8273:416,8274:417,8275:418,8276:419,8277:420,8278:421,8279:422,8280:423,8281:424,8282:425,8283:426,8284:427,8285:428,8286:429,8287:990,8364:430,8381:431,8776:433},HA={1:507,2:527,3:655,4:1261,5:1150,6:1500,7:1273,8:357,9:700,10:712,11:882,12:1161,13:402,14:565,15:539,16:844,17:1150,18:1150,19:1150,20:1150,21:1150,22:1150,23:1150,24:1150,25:1150,26:1150,27:496,28:433,29:1041,30:1124,31:1070,32:967,33:1839,34:1336,35:1275,36:1333,37:1343,38:1164,39:1132,40:1395,41:1460,42:557,43:1130,44:1284,45:1102,46:1788,47:1460,48:1408,49:1292,50:1408,51:1261,52:1215,53:1222,54:1328,55:1303,56:1817,57:1284,58:1230,59:1226,60:543,61:840,62:543,63:856,64:924,65:633,66:1114,67:1149,68:1072,69:1155,70:1085,71:711,72:1149,73:1128,74:497,75:489,76:1038,77:497,78:1795,79:1130,80:1168,81:1149,82:1164,83:693,84:1056,85:669,86:1129,87:992,88:1539,89:1015,90:969,91:1015,92:693,93:499,94:693,95:1393,96:499,97:1120,98:1190,99:1460,100:1075,101:491,102:1256,103:856,104:1609,105:915,106:961,107:1134,108:1610,109:938,110:765,111:1094,112:751,113:751,114:642,115:1160,116:1001,117:534,118:507,119:751,120:931,121:960,122:1500,123:1589,124:1593,125:969,126:1914,127:1092,128:1408,129:1210,130:1218,131:1729,132:1200,133:1169,134:1160,135:1180,136:1223,137:1434,138:506,139:1139,140:1103,141:553,142:1419,143:1160,144:1953,145:1860,146:508,165:1535,166:1380,167:2193,168:2212,169:1666,170:1460,171:1291,172:1540,173:1859,174:1215,175:1460,176:1449,177:1287,178:1580,179:1497,180:1402,181:1927,182:1984,183:1554,184:1771,185:1285,186:1380,187:1831,188:1304,189:1132,190:1170,191:859,192:1236,193:1568,194:1040,195:1182,196:1106,197:1184,198:1519,199:1181,200:1182,201:984,202:1485,203:1213,204:1113,205:1656,206:1694,207:1271,208:1590,209:1112,210:1101,211:1671,212:1124,213:1128,214:1101,215:1737,216:1764,217:1161,218:1182,219:1800,220:1579,221:1110,222:1835,223:1528,224:1234,225:1094,226:1803,227:1547,228:1745,229:1505,230:2308,231:2001,232:1059,233:987,234:1393,235:1163,236:1290,237:1027,238:1393,239:1160,240:1793,241:1572,242:1800,243:1579,244:1330,245:1095,246:1277,247:1024,248:1024,249:1024,250:1024,251:1024,252:1024,253:1024,254:1545,255:1261,256:1110,257:1307,258:1161,259:1123,260:912,261:1243,262:1029,263:1954,264:1633,265:1434,266:1208,267:1289,268:1150,269:1676,270:1411,271:1535,272:1241,273:1999,274:1460,275:2097,276:1780,277:1518,278:1235,279:1304,280:1066,281:1836,282:1372,283:1468,284:1174,285:1391,286:1130,287:1391,288:1583,289:1213,290:1289,291:1114,292:1534,293:1263,294:1458,295:1160,296:1554,297:1260,298:1871,299:1598,300:1415,301:1192,302:1192,303:1207,304:939,305:1326,306:1088,307:1270,308:1684,309:1764,310:1622,311:1323,312:1097,313:1031,314:1985,315:1653,316:2043,317:1697,318:1270,319:1053,320:1453,321:1312,322:1380,323:1538,324:1266,325:1920,326:1549,327:1857,328:1547,329:1926,330:1774,331:1316,332:1106,333:2274,334:1832,335:2300,336:1829,337:1526,338:1242,339:1468,340:1208,341:1539,342:1273,343:2710,344:2238,345:1568,346:1240,347:1515,348:1243,349:1044,350:2089,351:1044,352:2089,353:697,354:522,355:348,356:1151,357:560,358:418,360:209,361:1024,362:1024,363:1024,364:1024,365:1024,366:564,367:564,368:1171,369:1344,370:1599,371:778,372:933,373:409,374:409,375:407,376:409,377:724,378:731,379:705,380:764,381:1129,382:1167,383:690,384:1100,385:511,386:964,387:1370,388:382,389:1962,390:2360,391:1045,392:463,393:757,394:1045,395:803,396:614,397:614,398:1241,399:919,400:952,401:1540,402:1540,403:874,404:1370,405:870,406:931,407:640,408:641,409:907,410:1001,411:1237,412:1237,413:985,414:511,415:1541,416:985,417:931,418:1366,419:1540,420:1172,421:932,422:1333,423:1215,424:1125,425:379,426:1071,427:1162,428:379,429:379,430:1150,431:1359,433:1154,596:507,597:565,598:1373,599:1373,600:1158,601:1222,602:669,603:1336,604:1336,605:1336,606:1336,607:1336,608:1336,609:1333,610:1164,611:1164,612:1164,613:1164,614:557,615:557,616:557,617:557,618:1460,619:1408,620:1408,621:1408,622:1408,623:1408,624:1328,625:1328,626:1328,627:1328,628:1230,629:1114,630:1114,631:1114,632:1114,633:1114,634:1114,635:1072,636:1085,637:1085,638:1085,639:1085,640:506,641:506,642:506,643:506,644:1130,645:1168,646:1168,647:1168,648:1168,649:1168,650:1129,651:1129,652:1129,653:1129,654:969,655:969,656:1336,657:1114,658:1336,659:1114,660:1336,661:1114,662:1333,663:1072,664:1333,665:1072,666:1333,667:1072,668:1333,669:1072,670:1343,671:1305,672:1164,673:1085,674:1164,675:1085,676:1164,677:1085,678:1164,679:1085,680:1164,681:1085,682:1395,683:1149,684:1395,685:1149,686:1395,687:1149,688:1395,689:1149,690:1460,691:1128,692:557,693:506,694:557,695:506,696:557,697:506,698:557,699:497,700:557,701:1687,702:986,703:1130,704:515,705:1284,706:1038,707:1102,708:497,709:1102,710:497,711:1102,712:647,713:1102,714:717,715:1460,716:1130,717:1460,718:1130,719:1460,720:1130,721:1130,722:1408,723:1168,724:1408,725:1168,726:1408,727:1168,728:1261,729:693,730:1261,731:693,732:1261,733:693,734:1215,735:1056,736:1215,737:1056,738:1215,739:1056,742:1215,743:1056,744:1222,745:669,746:1222,747:709,748:1328,749:1129,750:1328,751:1129,752:1328,753:1129,754:1328,755:1129,756:1328,757:1129,758:1328,759:1129,760:1817,761:1539,762:1230,763:969,764:1230,765:1226,766:1015,767:1226,768:1015,769:1226,770:1015,856:1164,857:1139,858:1215,859:557,860:557,861:1130,862:1316,863:1284,864:1287,865:1336,866:1275,867:1139,868:1164,869:1460,870:1788,871:1460,872:1408,873:1461,874:1292,875:1333,876:1222,877:1284,878:1114,879:1085,880:1182,881:1168,882:1149,883:1072,884:969,885:1015,886:1085,887:859,888:1056,889:497,890:506,891:489,892:1106,893:969,894:357,895:655,896:1054,897:1164,898:1460,899:1085,900:1182,901:1417,902:1434,903:1290,904:1027,905:2137,906:2377,907:1215,908:1040,909:1333,910:1072,911:1230,912:1026,913:557,914:1859,915:1568,916:557,917:1336,918:1114,919:1336,920:1114,921:1914,922:1729,923:1164,924:1085,925:1415,926:1079,927:1079,928:1859,929:1568,930:1215,931:1040,932:1460,933:1182,934:1460,935:1182,936:1408,937:1168,938:1393,939:1163,940:1393,941:1163,942:1380,943:1101,944:1287,945:969,946:1287,947:969,948:1287,949:969,950:1402,951:1113,952:1771,953:1590,954:1155,955:1222,956:984,957:1402,958:1113,959:1139,960:859,961:1583,962:1213,963:1128,964:1285,965:1285,966:1139,967:859,968:1336,969:1063,970:1230,971:1026,972:1284,973:1015,974:1104,975:1599,982:1408,983:1164,984:1817,985:1539,986:507,987:1934,988:1494,989:1494,990:507},vA=new TextEncoder,VA=A=>{const B=Math.round(100*A)/100;return Number.isInteger(B)?String(B):B.toFixed(2).replace(/0+$/,"")},UA=A=>{const B=Math.round(1e6*A)/1e6;return Number.isInteger(B)?String(B):B.toFixed(6).replace(/0+$/,"")},lA=A=>A.map(UA).join(" ");function aA(A){let B="",E=0;const s=new Map;for(const w of A){const A=w.codePointAt(0)||0,Q=rA[A]||rA[63];B+=Q.toString(16).padStart(4,"0"),E+=HA[Q]||1024,s.has(Q)||s.set(Q,A||63)}return{hex:B,width:E,unicode:s}}function PA(A,B){return aA(A).width*B/hA}function yA(A,B=PA(A.text,A.size)){const E=A.align||"left",s="center"===E?B/2:"right"===E?B:0,w=(A.angle||0)*Math.PI/180,Q=Math.cos(w),C=Math.sin(w);return{width:B,baselineX:A.x-Q*s,baselineY:A.y+C*s,cos:Q,sin:C}}function uA(A){const B=yA(A),E=-555*A.size/hA,s=SA*A.size/hA,w=[0,B.width].flatMap(A=>[E,s].map(E=>({x:B.baselineX+B.cos*A-B.sin*E,y:B.baselineY-B.sin*A-B.cos*E})));return{minX:Math.min(...w.map(A=>A.x)),minY:Math.min(...w.map(A=>A.y)),maxX:Math.max(...w.map(A=>A.x)),maxY:Math.max(...w.map(A=>A.y))}}function NA(A){const B=A.reduce((A,B)=>A+B.length,0),E=new Uint8Array(B);let s=0;for(const B of A)E.set(B,s),s+=B.length;return E}const KA=A=>vA.encode(A),dA=(A,B)=>NA([KA(`<< ${A} /Length ${B.length} >>\nstream\n`),B,KA("\nendstream")]);function JA(A){const B=function(A){const B=atob(A),E=new Uint8Array(B.length);for(let A=0;A"image"===A.kind&&null!=A.opacity&&A.opacity<1?[Math.max(0,Math.min(1,A.opacity))]:[]))].sort((A,B)=>A-B),s=new Map(E.map((A,B)=>[A,`GS${B+1}`])),w=function(A,B){const E=[],s=new Map,w=B=>A.height-B,Q=(A,...B)=>`${B.map(VA).join(" ")} ${A}`,C=A=>{for(const B of A)if(B.length){E.push(Q("m",B[0][0],w(B[0][1])));for(let A=1;A{let B=!1;for(const s of A)if(!(s.length<2)){B=!0,E.push(Q("m",s[0][0],w(s[0][1])));for(let A=1;A Tj`,"ET")}else{const A=(I.angle||0)*Math.PI/180,s=Math.cos(A),C=Math.sin(A),g=I.x+I.width/2,Y=w(I.y+I.height/2);E.push("q");const R=null==I.opacity?1:Math.max(0,Math.min(1,I.opacity)),M=B.get(R);M&&E.push(`/${M} gs`),E.push(Q("cm",s*I.width,C*I.width,C*I.height,-s*I.height,g-s*I.width/2-C*I.height/2,Y-C*I.width/2+s*I.height/2),`/Im${I.imageId} Do`,"Q")}return{stream:E.join("\n"),unicode:s}}(A,s),Q=Math.max(0,...Object.keys(HA).map(Number)),C=Array.from({length:Q+1},(A,B)=>Math.round(1e3*(HA[B]||1024)/hA)),g=[],I=A=>(g.push("string"==typeof A?KA(A):A),g.length),Y=I(""),R=I(""),M=I(""),F=I(dA(`/Length1 ${B.length}`,B)),i=I(`<< /Type /FontDescriptor /FontName /Roboto /Flags 32 /FontBBox [${jA.join(" ")}] /ItalicAngle 0 /Ascent 2146 /Descent -555 /CapHeight 2146 /StemV 80 /FontFile2 ${F} 0 R >>`),x=I(`<< /Type /Font /Subtype /CIDFontType2 /BaseFont /Roboto /CIDSystemInfo << /Registry (Adobe) /Ordering (Identity) /Supplement 0 >> /FontDescriptor ${i} 0 R /W [0 [${C.join(" ")}]] /CIDToGIDMap /Identity >>`),b=KA(function(A){const B=[...A].sort((A,B)=>A[0]-B[0]),E=B.map(([A,B])=>`<${A.toString(16).padStart(4,"0")}> <${B<=65535?B.toString(16).padStart(4,"0"):(()=>{const A=B-65536;return(55296+(A>>10)).toString(16).padStart(4,"0")+(56320+(1023&A)).toString(16).padStart(4,"0")})()}>`);return`/CIDInit /ProcSet findresource begin\n12 dict begin\nbegincmap\n/CIDSystemInfo << /Registry (Adobe) /Ordering (UCS) /Supplement 0 >> def\n/CMapName /HousePlanUnicode def\n/CMapType 2 def\n1 begincodespacerange\n<0000> \nendcodespacerange\n${B.length} beginbfchar\n${E.join("\n")}\nendbfchar\nendcmap\nCMapName currentdict /CMap defineresource pop\nend\nend`}(w.unicode)),L=I(dA("",b)),D=I(`<< /Type /Font /Subtype /Type0 /BaseFont /Roboto /Encoding /Identity-H /DescendantFonts [${x} 0 R] /ToUnicode ${L} 0 R >>`),G=I(dA("",KA(w.stream))),o=[];for(const B of A.images||[]){const A=I(dA(`/Type /XObject /Subtype /Image /Width ${B.width} /Height ${B.height} /ColorSpace /DeviceRGB /BitsPerComponent 8 /Filter /DCTDecode`,B.bytes));o.push(`/Im${B.id} ${A} 0 R`)}const t=A.now.toISOString().replace(/[-:T]/g,"").slice(0,14),c=I(`<< /CreationDate (D:${t}Z) /ModDate (D:${t}Z) >>`),W=`<< /Font << /F1 ${D} 0 R >>`+(o.length?` /XObject << ${o.join(" ")} >>`:"")+(E.length?` /ExtGState << ${E.map(A=>`/${s.get(A)} << /ca ${VA(A)} /CA ${VA(A)} >>`).join(" ")} >>`:"")+" >>";g[Y-1]=KA(`<< /Type /Catalog /Pages ${R} 0 R >>`),g[R-1]=KA(`<< /Type /Pages /Kids [${M} 0 R] /Count 1 >>`),g[M-1]=KA(`<< /Type /Page /Parent ${R} 0 R /MediaBox [0 0 ${VA(A.width)} ${VA(A.height)}] /Resources ${W} /Contents ${G} 0 R >>`);const m=KA("%PDF-1.4\n%âãÏÓ\n"),n=[m],e=[0];let h=m.length;g.forEach((A,B)=>{const E=KA(`${B+1} 0 obj\n`),s=KA("\nendobj\n");e.push(h),n.push(E,A,s),h+=E.length+A.length+s.length});const S=h,j=["xref",`0 ${g.length+1}`,"0000000000 65535 f "];for(let A=1;A<=g.length;A++)j.push(`${String(e[A]).padStart(10,"0")} 00000 n `);return j.push(`trailer\n<< /Size ${g.length+1} /Root ${Y} 0 R /Info ${c} 0 R >>`,`startxref\n${S}\n%%EOF\n`),n.push(KA(j.join("\n"))),NA(n)}const ZA=A=>[A.minX,A.minY,A.maxX,A.maxY].every(Number.isFinite)&&A.maxX>=A.minX&&A.maxY>=A.minY,TA=A=>A.maxX-A.minX,fA=A=>A.maxY-A.minY;function kA(A,B,E,s=0){Number.isFinite(B)&&Number.isFinite(E)&&(A.minX=Math.min(A.minX,B-s),A.minY=Math.min(A.minY,E-s),A.maxX=Math.max(A.maxX,B+s),A.maxY=Math.max(A.maxY,E+s))}function zA(A,B,E,s,w,Q){const C=Q*Math.PI/180,g=Math.cos(C),I=Math.sin(C),Y=B+s/2,R=E+w/2;for(const[B,E]of[[-s/2,-w/2],[s/2,-w/2],[s/2,w/2],[-s/2,w/2]])kA(A,Y+g*B-I*E,R+I*B+g*E)}function pA(A,B,E){for(const s of B)"M"===s.op||"L"===s.op?kA(A,s.x,s.y,E):"C"===s.op&&(kA(A,s.x1,s.y1,E),kA(A,s.x2,s.y2,E),kA(A,s.x,s.y,E))}function XA(A){const B={minX:1/0,minY:1/0,maxX:-1/0,maxY:-1/0};for(const E of A)if("path"===E.kind){const A=E.stroke?(E.width||.5)/2:0;for(const s of E.rings)for(const[E,w]of s)kA(B,E,w,A)}else if("line"===E.kind)for(const[A,s]of E.points)kA(B,A,s,E.width/2);else if("vector"===E.kind)pA(B,E.ops,E.width/2);else if("text"===E.kind){const A=uA(E);kA(B,A.minX,A.minY),kA(B,A.maxX,A.maxY)}else zA(B,E.x,E.y,E.width,E.height,E.angle||0);return B}function OA(A,B,E){return!!ZA(A)&&(TA(A)<=TA(B)+E&&fA(A)<=fA(B)+E)}function qA(A){return`${A.getFullYear()}-${String(A.getMonth()+1).padStart(2,"0")}-${String(A.getDate()).padStart(2,"0")}`}const $A=72/25.4,_A=5.25,AB=[.08,.08,.08],BB=[127/255,127/255,127/255],EB=[.72,.72,.72],sB=(A,B)=>A.minXB.minX&&A.minYB.minY;function wB(A,B,E,s,w=0,Q="left"){return uA({x:A,y:B,text:E,size:s,angle:w,align:Q})}function QB(A,B,E,s,w){const Q=Math.min(...[[A.minX,A.minY],[A.maxX,A.minY],[A.maxX,A.maxY],[A.minX,A.maxY]].map(([A,w])=>(A-B)*s[0]+(w-E)*s[1]));return Math.max(0,w-Q)}const CB=(A,B)=>`${A.axis}:${B[0]<-.5||B[1]<-.5?-1:1}`,gB=(A,B)=>{A.minX=Math.min(A.minX,B[0]),A.minY=Math.min(A.minY,B[1]),A.maxX=Math.max(A.maxX,B[0]),A.maxY=Math.max(A.maxY,B[1])},IB=A=>{const B={minX:1/0,minY:1/0,maxX:-1/0,maxY:-1/0};for(const E of A)for(const A of E)gB(B,A);return B};function YB(A,B,E,s,w=0){const Q=w*Math.PI/180,C=Math.cos(Q),g=Math.sin(Q),I=A+E/2,Y=B+s/2;return Array.from({length:48},(A,B)=>{const w=B/48*Math.PI*2,Q=Math.cos(w)*E/2,R=Math.sin(w)*s/2;return[I+C*Q-g*R,Y+g*Q+C*R]})}function RB(A,B,E,s,w=0){const Q=w*Math.PI/180,C=Math.cos(Q),g=Math.sin(Q),I=A+E/2,Y=B+s/2;return[[-E/2,-s/2],[E/2,-s/2],[E/2,s/2],[-E/2,s/2]].map(([A,B])=>[I+C*A-g*B,Y+g*A+C*B])}function MB(A,B,E){if("passage"===A.type)return[];const s=A.rlen/2,w=B>0?B/E*Y/2:2,Q=[];if("window"===A.type)Q.push([[-s,-w],[s,-w]],[[-s,w],[s,w]],[[-s,-w],[-s,w]],[[s,-w],[s,w]]);else if("gate"===A.type){const B=10*(A.flip_v?-1:1)*Math.PI/180,E=[[[-s,0],[-s+Math.cos(B)*s,Math.sin(B)*s]],[[s,0],[s-Math.cos(B)*s,Math.sin(-B)*s]]];Q.push(...E);for(const A of E){const B=A[1][0]-A[0][0],E=A[1][1]-A[0][1],s=Math.hypot(B,E)||1,C=-E/s,g=B/s,I=Math.min(.08*s,Math.max(1,.7*w));for(const s of[.3,.5,.7]){const w=A[0][0]+B*s,Y=A[0][1]+E*s;Q.push([[w-C*I,Y-g*I],[w+C*I,Y+g*I]])}}}else{const B=A.flip_v?1:-1,E=A.flip_h?s:-s,w=[E,B*A.rlen];Q.push([[E,0],w]);const C=[];for(let s=0;s<=16;s++){const w=B*s/16*Math.PI/2,Q=A.flip_h?-1:1;C.push([E+Q*Math.cos(w)*A.rlen,Math.sin(w)*A.rlen])}Q.push(C)}const C=A.angle*Math.PI/180,g=Math.cos(C),I=Math.sin(C);return Q.map(B=>B.map(([B,E])=>[A.rx+B*g-E*I,A.ry+B*I+E*g]))}function FB(A,B){const E=IB([A]);return B.filter(A=>{const B=IB([A]);return B.maxX>=E.minX&&B.minX<=E.maxX&&B.maxY>=E.minY&&B.minY<=E.maxY})}function iB(A){const B=function(A){const{rawSpace:B,space:E}=A,s=Number(B.cell_cm)>0?Number(B.cell_cm):5,w=Array.isArray(B.walls)?B.walls:[],Q=c(B,E,I,.02*Y),C=W(B,E,s,Y,I),g=m(C),M=n(E,s,Y,2e-4*Y,g).all,F=e(C,E,w,Q.contour,R,s,Y,I);return{cellCm:s,walls:w,zero:Q,openings:C,extras:M,geometry:A.sharedWallGeometry||h(E.rooms,w,Q.contour,F,R,s,Y,I,M)}}(A),E=new Map;if(A.options.dimensions)for(const s of A.space.rooms){const w=C(s);if(!w)continue;const Q=s.id?A.resolveInnerContour?.(s.id):void 0;E.set(s,s.id&&(void 0===Q?g(A.space.rooms,s.id,B.walls,B.zero.contour,R,B.cellCm,Y,I,B.geometry.roomGeom,B.geometry.multiWallNodes):Q)||w)}const s=new Map;if(A.options.dimensions)for(const w of A.space.rooms){const Q=C(w);if(!Q)continue;const g=E.get(w)||Q,I=w.id?A.resolveRoomArea?.(w.id,g):void 0,Y=Number.isFinite(I)?[]:FB(g,B.extras),R=Y.length?M(g,Y):null,i=Number.isFinite(I)&&I>=0?I:R?F(R):Math.abs(g.reduce((A,B,E)=>{const s=g[(E+1)%g.length];return A+B[0]*s[1]-s[0]*B[1]},0)/2);s.set(w,i)}const w=[..."failed-core"===B.geometry.status?A.space.rooms.map(A=>C(A)||[]).filter(A=>A.length):B.geometry.components.flatMap(A=>i(A.geom)),...B.zero.lines.map(A=>[[A[0],A[1]],[A[2],A[3]]])];A.options.decor&&w.push(...function(A){const B=[];for(const E of A.decor||[])"line"===E.kind?B.push([[E.x1*I,E.y1*I],[E.x2*I,E.y2*I]]):"text"!==E.kind?B.push(L(E).map(([A,B])=>[A*I,B*I])):B.push([[E.x*I,E.y*I]]);return B}(A.rawSpace));for(const B of A.rasters||[])w.push(RB(B.x,B.y,B.drawWidth,B.drawHeight,B.angle));let Q=IB(w);var x;[(x=Q).minX,x.minY,x.maxX,x.maxY].every(Number.isFinite)&&x.maxX>x.minX&&x.maxY>x.minY||(Q={minX:0,minY:0,maxX:I,maxY:I});return{built:B,dimensionContours:E,roomAreas:s,bounds:Q,cmPerUnit:B.cellCm/Y}}function xB(A,B,E,s){const{built:w,dimensionContours:Q,roomAreas:g,bounds:M,cmPerUnit:F}=B,c=(s?297:210)*$A,W=(s?210:297)*$A,m=12*$A,n=18*$A,e=24*$A,h=F*(10*$A)/E,j=(M.maxX-M.minX)*h,H=(M.maxY-M.minY)*h,v=m+n,V=W-v-m-e,U=c-2*m,a=A=>[0+(A[0]-M.minX)*h,0+(A[1]-M.minY)*h],P=(A,B)=>[M.minX+(A-0)/h,M.minY+(B-0)/h],y=A=>{const B=P(A.minX,A.minY),E=P(A.maxX,A.maxY);return{minX:B[0],minY:B[1],maxX:E[0],maxY:E[1]}},u=w.geometry.components.flatMap(A=>i(A.geom)),N=A=>w.geometry.components.some(B=>S([...A],B.geom)),K=A=>function(A,B,E){if(!LA(A)||!mA(B))return!0;const s=DA(A);return!!s.some(E)||!!B.some(B=>B.some(B=>xA(B)&&bA(B,A)))||nA(B,(A,B)=>s.some((E,w)=>null!==WA(A,B,E,s[(w+1)%s.length])))}(y(function(A,B){const E=Number.isFinite(B)&&B>=0?B:0;return{minX:A.minX-E,minY:A.minY-E,maxX:A.maxX+E,maxY:A.maxY+E}}(A,$A-1e-6)),u,N),d=(A,B)=>function(A,B,E){if(!LA(A)||!mA([B]))return!1;const s=DA(A);return!!s.every(E)&&!nA([B],(A,B)=>s.some((E,w)=>null!==WA(A,B,E,s[(w+1)%s.length])))}(y(A),B,A=>Z([...A],B)),J=(A,B,E={})=>function(A,B,E,s,w={}){if(!xA(A)||!xA(B)||!mA(E))return!0;if(w.allowStartExit){const w=tA(A,B);if(w<=iA)return!0;const Q=nA(E,(B,E)=>cA(A,B,E));if(!Q)return!0;const C=[];nA(E,(E,s)=>{const w=WA(A,B,E,s);return w&&C.push(w),!1});const g=iA/w,I=[0,1,...C.flatMap(A=>[A.t,A.endT])].sort((A,B)=>A-B).filter((A,B,E)=>0===B||A-E[B-1]>g),Y=E=>[A[0]+(B[0]-A[0])*E,A[1]+(B[1]-A[1])*E],R=A=>C.some(B=>B.overlap&&A>B.t+g&&AA.t>M+g||A.endT>M+g)}const Q=[(A[0]+B[0])/2,(A[1]+B[1])/2],C=nA(E,(B,E)=>cA(A,B,E));return!((!s(A)||w.allowStartBoundary&&C)&&!s(Q)&&!s(B))||nA(E,(E,s)=>{const Q=WA(A,B,E,s);return!!Q&&(Q.overlap||!w.allowStartBoundary||!C||Q.t*tA(A,B)>iA)})}(P(A[0],A[1]),P(B[0],B[1]),u,N,E),T=(A,B,E)=>{const s=A.x*I,w=A.y*I,Q=A.w*I,C=A.h*I,g=s+Q/2,Y=w+C/2,R=s+(A.flip_h?Q:0),F=w+(A.flip_v?C:0),i=(A.flip_h?-1:1)*Q/B,x=(A.flip_v?-1:1)*C/E,b=(Number(A.angle)||0)*Math.PI/180,L=Math.cos(b),D=Math.sin(b),G=Y+D*(R-g)+L*(F-Y);return{a:h*L*i,b:h*D*i,c:-h*D*x,d:h*L*x,e:0+(g+L*(R-g)-D*(F-Y)-M.minX)*h,f:0+(G-M.minY)*h}};let f=[];const z=[],O=function(A,B){const E=3*$A*Math.SQRT2,s=[];for(let w=-B;w<=A+E;w+=E)s.push([[w,0],[w+B,B]]);return s}(c,W);for(const B of A.rasters||[])f.push({kind:"image",imageId:B.id,...a([B.x,B.y]).reduce((A,B,E)=>({...A,[E?"y":"x"]:B}),{}),width:B.drawWidth*h,height:B.drawHeight*h,angle:B.angle,opacity:B.opacity});for(const A of w.geometry.components)f.push({kind:"path",rings:i(A.geom).map(A=>A.map(a)),fill:BB,stroke:AB,width:.25*$A,hatch:{lines:O,stroke:AB,width:.18*$A}});if("failed-core"===w.geometry.status)for(const B of A.space.rooms){const A=C(B);A&&f.push({kind:"path",rings:[A.map(a)],stroke:AB,width:.25*$A})}for(const A of w.zero.lines)f.push({kind:"line",points:[a([A[0],A[1]]),a([A[2],A[3]])],stroke:AB,width:.35*$A,dash:[3*$A,2*$A]});const q=w.geometry.openingIndex;for(const B of w.openings){const E=B.partitionHost?{cm:B.partitionHost.partition.cm}:q?x(A.space.rooms,B,w.walls,R,w.cellCm,Y,I,w.zero.contour):{cm:0};for(const A of MB(B,E.cm,w.cellCm))f.push({kind:"line",points:A.map(a),stroke:AB,width:.3*$A})}if(A.options.decor)for(const B of A.rawSpace.decor||[])if("image"!==B.kind)if("line"===B.kind)f.push({kind:"line",points:[a([B.x1*I,B.y1*I]),a([B.x2*I,B.y2*I])],stroke:AB,width:Math.max(.2*$A,10*Number(B.width_cm||1)*$A/E),dash:"dashed"===B.line_style?[3*$A,2*$A]:void 0});else if("text"===B.kind)f.push({kind:"text",...(()=>{const[A,E]=a([B.x*I,B.y*I]);return{x:A,y:E}})(),text:B.text,size:Math.max(6,10*Number(B.size_cm||20)*$A/E),angle:Number(B.angle)||0});else if("furniture"===B.kind){const A=r[B.symbol];A?f.push({kind:"vector",ops:YA(A.d,T(B,A.viewW,A.viewH)),stroke:AB,width:Math.max(.2*$A,10*b(B,w.cellCm,Y)*$A/E)}):f.push({kind:"path",rings:[L(B).map(([A,B])=>a([A*I,B*I]))],stroke:AB,width:.25*$A})}else{const A="ellipse"===B.kind?YB(B.x*I,B.y*I,B.w*I,B.h*I,Number(B.angle)||0):L(B).map(([A,B])=>[A*I,B*I]);f.push({kind:"path",rings:[A.map(a)],stroke:AB,width:.25*$A})}if(A.options.dimensions&&w.geometry.roomGeom)for(const[B,E]of D(w.geometry.roomGeom).entries()){const s=l(F),w=(A,B,E)=>{const s=a(A.sourceA),w=a(A.sourceB),Q=a(A.a),C=a(A.b),g=(6+E)*$A,I=[Q[0]+B[0]*g,Q[1]+B[1]*g],Y=[C[0]+B[0]*g,C[1]+B[1]*g],R=[(I[0]+Y[0])/2,(I[1]+Y[1])/2],M=PA(A.text,7)+2*$A>Math.hypot(Y[0]-I[0],Y[1]-I[1]),F=QB(wB(R[0],R[1],A.text,7,A.angle,"center"),R[0],R[1],B,$A),i=[R[0]+B[0]*F,R[1]+B[1]*F];return{edge:A,a:s,b:w,oa:I,ob:Y,middle:R,label:i,box:wB(i[0],i[1],A.text,7,A.angle,"center"),needsShelf:M}},Q=A=>{const B=[{start:A.oa,end:A.ob},{start:A.a,end:A.oa,allowStartExit:!0},{start:A.b,end:A.ob,allowStartExit:!0}];return A.needsShelf&&B.push({start:A.middle,end:A.label,mayEnterOwnLabel:!0}),B},C=A=>K(A.box)||Q(A).some(A=>J(A.start,A.end,{allowStartBoundary:A.allowStartBoundary,allowStartExit:A.allowStartExit})),g=EA(k(E,F,A.imperial,{ringIndex:B,epsilon:s}),{ring:E,epsilon:s,score:A=>{const B=[-A.inwardNormal[0],-A.inwardNormal[1]],E=a(A.mid),s=Array.from({length:21},(A,B)=>4*B).find(E=>!C(w(A,B,E))),Q=E[0]+(U-j)/2,g=E[1]+(V-H)/2;return{hardCollisions:void 0===s?21:s/4,normalClearance:Math.abs(B[0])>.5?B[0]>0?U-Q:Q:B[1]>0?V-g:g}}});for(const A of X(g,s)){const B=A.map(A=>({edge:A,outward:[-A.inwardNormal[0],-A.inwardNormal[1]]})),E=A=>B.map(({edge:B,outward:E})=>w(B,E,A));let s=null;for(let A=0;A<=80&&!s;A+=4){const B=E(A),w=B.some((A,E)=>B.slice(0,E).some(B=>sB(A.box,B.box))),g=B.some(A=>C(A)||z.some(B=>sB(A.box,B))),I=B.some((A,E)=>Q(A).some(A=>z.some(B=>eA(A.start,A.end,B))||B.some((B,s)=>(!A.mayEnterOwnLabel||s!==E)&&eA(A.start,A.end,B.box))));w||g||I||(s=B)}if(s)for(const A of s)f.push({kind:"line",points:[A.oa,A.ob],stroke:AB,width:.2*$A},{kind:"line",points:[A.a,A.oa],stroke:AB,width:.15*$A},{kind:"line",points:[A.b,A.ob],stroke:AB,width:.15*$A}),A.needsShelf&&f.push({kind:"line",points:[A.middle,A.label],stroke:AB,width:.15*$A}),f.push({kind:"text",x:A.label[0],y:A.label[1],text:A.edge.text,size:_A,angle:A.edge.angle,align:"center"}),z.push(A.box)}}const $=[...A.space.rooms].sort((A,B)=>String(A.id||"").localeCompare(String(B.id||"")));for(const[B,E]of $.entries()){const s=C(E);if(!s)continue;const w=Q.get(E)||s,I=g.get(E)||0,Y=G(E,A.space.id,A.layout,A.config),[R,M]=a([Y.x,Y.y]),i=w.map(a),x=IB([i]);let b=!1;if(A.options.roomNames&&E.name){const A=Math.max(0,x.maxX-x.minX-4*$A),B=PA(E.name,6.75)<=A?6.75:PA(E.name,5.25)<=A?5.25:0;B&&(f.push({kind:"text",x:R,y:M-2,text:E.name,size:B,align:"center"}),z.push(wB(R,M-2,E.name,B,0,"center")),b=!0)}if(A.options.dimensions){const B=o(I*F*F/1e4,A.imperial),E=M+(b?8:0);f.push({kind:"text",x:R,y:E,text:B,size:6,align:"center"}),z.push(wB(R,E,B,8,0,"center"))}if(A.options.dimensions){const E=l(F),s=EA(p(w,F,A.imperial,{ringIndex:B,epsilon:E}),{ring:w,epsilon:E,score:A=>{const B=a(A.mid),E=QB(wB(B[0],B[1],A.text,_A,A.angle,"center"),B[0],B[1],A.inwardNormal,$A),s=wB(B[0]+A.inwardNormal[0]*E,B[1]+A.inwardNormal[1]*E,A.text,7,A.angle,"center"),w="horizontal"===A.axis?A.inwardNormal[1]>0?x.maxY-B[1]:B[1]-x.minY:A.inwardNormal[0]>0?x.maxX-B[0]:B[0]-x.minX;return{hardCollisions:Number(K(s))+z.reduce((A,B)=>A+Number(sB(s,B)),0),normalClearance:w}}});for(const A of s.filter(A=>A.short)){const B=A.inwardNormal,E=a(A.a),s=a(A.b),w=(E[0]+s[0])/2,Q=(E[1]+s[1])/2;f.push({kind:"line",points:[[w-1.5*B[0]*$A,Q-1.5*B[1]*$A],[w+1.5*B[0]*$A,Q+1.5*B[1]*$A]],stroke:AB,width:.2*$A})}const Q=new Map;for(const A of s.filter(A=>!A.short)){const B=CB(A,A.inwardNormal),E=Q.get(B)||[];E.push(A),Q.set(B,E)}for(const A of Q.values()){let B=null;for(let E=0;E<=30&&!B;E+=3){const s=A.map(A=>{const B=a(A.mid),s=QB(wB(B[0],B[1],A.text,_A,A.angle,"center"),B[0],B[1],A.inwardNormal,(1+E)*$A),w=B[0]+A.inwardNormal[0]*s,Q=B[1]+A.inwardNormal[1]*s;return{edge:A,x:w,y:Q,box:wB(w,Q,A.text,_A,A.angle,"center")}}),Q=s.some((A,B)=>s.slice(0,B).some(B=>sB(A.box,B.box))),C=s.some(A=>K(A.box)||z.some(B=>sB(A.box,B))),g=s.every(A=>d(A.box,w));Q||C||!g||(B=s)}if(B)for(const A of B)f.push({kind:"text",x:A.x,y:A.y,text:A.edge.text,size:_A,angle:A.edge.angle,align:"center"}),z.push(A.box)}}}const _={minX:m,minY:v,maxX:c-m,maxY:v+V},AA=XA(f),BA=OA(AA,{minX:0,minY:0,maxX:U,maxY:V},.5*$A),sA=function(A,B){const E=XA(A);if(!ZA(E))return{commands:[...A],bounds:E,dx:0,dy:0};const s=(B.minX+B.maxX-E.minX-E.maxX)/2,w=(B.minY+B.maxY-E.minY-E.maxY)/2,Q=function(A,B,E){return A.map(A=>"path"===A.kind?{...A,rings:A.rings.map(A=>A.map(([A,s])=>[A+B,s+E]))}:"line"===A.kind?{...A,points:A.points.map(([A,s])=>[A+B,s+E])}:"vector"===A.kind?{...A,ops:A.ops.map(A=>((A,B,E)=>"M"===A.op||"L"===A.op?{...A,x:A.x+B,y:A.y+E}:"C"===A.op?{...A,x1:A.x1+B,y1:A.y1+E,x2:A.x2+B,y2:A.y2+E,x:A.x+B,y:A.y+E}:A)(A,B,E))}:{...A,x:A.x+B,y:A.y+E})}(A,s,w);return{commands:Q,bounds:{minX:E.minX+s,minY:E.minY+w,maxX:E.maxX+s,maxY:E.maxY+w},dx:s,dy:w}}(f,_);f=sA.commands,f.push({kind:"text",x:m,y:m+10,text:A.space.title,size:14}),A.cardTitle&&f.push({kind:"text",x:c-m,y:m+10,text:A.cardTitle,size:10,align:"right"});const wA=W-m-13*$A;f.push({kind:"line",points:[[m,wA-4*$A],[c-m,wA-4*$A]],stroke:EB,width:.2*$A}),f.push({kind:"text",x:m,y:wA,text:A.t("pdf.scale",{n:E}),size:8});const QA=10*(A.imperial?152.4:100)*$A/E,CA=wA+8;f.push({kind:"line",points:[[m,CA],[m+QA,CA]],stroke:AB,width:.4*$A});for(let A=0;A<=4;A++){const B=m+QA*A/4;f.push({kind:"line",points:[[B,CA-2],[B,CA+2]],stroke:AB,width:.25*$A})}f.push({kind:"text",x:m+QA/2,y:wA+17,text:A.imperial?"5 ft":"1 m",size:7,align:"center"});const gA=t(A.config.settings,A.rawSpace.settings||{});if(null!==gA){const B=c/2,E=wA+5.5*$A;f.push({kind:"vector",ops:FA({centerX:B,centerY:E,size:11*$A,northDeg:gA}),fill:AB,width:0,fillRule:"evenodd"}),f.push({kind:"text",x:B,y:wA,text:A.t("pdf.north"),size:7,align:"center"})}f.push({kind:"text",x:c-m,y:wA+12,text:`${qA(A.now)} · House Plan v${A.version}`,size:7,align:"right"});const IA={width:c,height:W,commands:f,images:(A.rasters||[]).map(({id:A,bytes:B,width:E,height:s})=>({id:A,bytes:B,width:E,height:s})),now:A.now,scale:E,sceneBounds:sA.bounds,planField:_},RA=Math.max(0,TA(AA))*Math.max(0,fA(AA)),MA=U*V;return{page:IA,sceneBounds:sA.bounds,field:_,fits:BA,fillRatio:MA>0?RA/MA:0,landscape:s}}function bB(A,B){return A.fillRatio!==B.fillRatio?A.fillRatio>B.fillRatio?A:B:A.landscape?B:A}function LB(A,B,E){const s=12*$A,w=(E?297:210)*$A-2*s,Q=(E?210:297)*$A-2*s-18*$A-24*$A,C=A.cmPerUnit*(10*$A)/B;return(A.bounds.maxX-A.bounds.minX)*C<=w+.5*$A&&(A.bounds.maxY-A.bounds.minY)*C<=Q+.5*$A}function DB(A){let B=0;for(const E of A)if(B+=Math.max(0,Number(E)||0),B>26214400)throw new Error("pdf.too_large")}const GB="34d1dbfc181acaf58842dfced0e6aa3a899aef6b8d1eeba53732ef729a63137e";async function oB(A,B){if(!A)throw new Error("pdf.asset_failed");const E=await fetch(A,{credentials:"same-origin"});if(!E.ok)throw new Error("pdf.asset_failed");const s=await E.blob();let w;try{w=await createImageBitmap(s)}catch{throw new Error("pdf.asset_failed")}try{if("image/jpeg"===s.type)return{id:B,bytes:new Uint8Array(await s.arrayBuffer()),width:w.width,height:w.height};const A=document.createElement("canvas");A.width=w.width,A.height=w.height;const E=A.getContext("2d");if(!E)throw new Error("pdf.asset_failed");E.fillStyle="#fff",E.fillRect(0,0,A.width,A.height),E.drawImage(w,0,0);const Q=await new Promise(B=>A.toBlob(B,"image/jpeg",.85));if(!Q)throw new Error("pdf.asset_failed");return{id:B,bytes:new Uint8Array(await Q.arrayBuffer()),width:w.width,height:w.height}}finally{w.close()}}async function tB(A,B,E){const s=await async function(A,B){const E=[];if(B.backdrop&&A.space.bg){const B=await oB(A.backdropUrl,"backdrop");E.push({...B,x:A.space.bg.x,y:A.space.bg.y,drawWidth:A.space.bg.w,drawHeight:A.space.bg.h,angle:A.space.bg.angle,opacity:.6})}if(B.decor){let B=0;for(const s of A.rawSpace.decor||[]){if("image"!==s.kind)continue;const w=A.decorAssets.get(s.asset_id),Q=j(s,I,I);if(!w||!Q)throw new Error("pdf.asset_failed");const C=await oB(w.url,"decor"+B++);E.push({...C,x:Q[0],y:Q[1],drawWidth:Q[2],drawHeight:Q[3],opacity:Q[4],angle:Number(s.angle)||0})}}return DB(E.map(A=>A.bytes.byteLength)),E}(A,B),w=JA(function(A){const B=iB(A);let E=[];for(const s of wA){const w=[!1,!0].filter(A=>LB(B,s,A)).map(E=>xB(A,B,s,E));if(!w.length)continue;const Q=w.filter(A=>A.fits);if(Q.length)return Q.reduce(bB).page;E=w}E.length||(E=[!1,!0].map(E=>xB(A,B,500,E)));const s=E.filter(A=>A.fits);if(s.length)return s.reduce(bB).page;const w=Math.min(...E.map(A=>Math.max(TA(A.sceneBounds)/TA(A.field),fA(A.sceneBounds)/fA(A.field)))),Q=50,C=1e6,g=Number.isFinite(w)?Math.ceil(Math.min(C,500*Math.max(1,w))/Q)*Q:C;let I=500,Y=0,R=[],M=Math.max(550,g);for(;M<=C;){const E=[!1,!0].map(E=>xB(A,B,M,E)).filter(A=>A.fits);if(E.length){Y=M,R=E;break}if(I=M,M===C)break;M=Math.min(C,Math.ceil(2*M/Q)*Q)}if(!Y)throw new Error("pdf.failed");let F=Math.floor(I/Q),i=Math.floor(Y/Q);for(;i-F>1;){const E=Math.floor((F+i)/2),s=[!1,!0].map(s=>xB(A,B,E*Q,s)).filter(A=>A.fits);s.length?(i=E,R=s):F=E}const x=R.reduce(bB).page;if(!OA(x.sceneBounds,x.planField,.5*$A))throw new Error("pdf.failed");return x}({...A,options:B,now:E,rasters:s,t:A.t})),Q=new Blob([w],{type:"application/pdf"}),C=URL.createObjectURL(Q);try{const B=document.createElement("a");B.href=C,B.download=`houseplan-${g=A.space.title,g.normalize("NFKD").replace(/[^\p{L}\p{N}]+/gu,"-").replace(/^-|-$/g,"").toLowerCase()||"space"}-${qA(E)}.pdf`,B.style.display="none",document.body.append(B),B.click(),B.remove()}finally{setTimeout(()=>URL.revokeObjectURL(C),0)}var g;return w}class cB{assertRasterBudget(A){DB(A)}render(A){let B;return B={...A,save:async E=>{await tB(A,E,B.now||new Date)}},s``}}export{GB as PDF_EXPORT_FINGERPRINT,cB as PdfExportRuntime,tB as exportSpacePdf};
+ `}}v.properties={context:{attribute:!1}},v.styles=A`:host{display:contents;}.body{display:grid;gap:12px;width:100%;max-width:100%;min-width:0;padding:16px 20px;box-sizing:border-box;}label{display:flex;min-width:0;min-height:44px;align-items:center;gap:12px;cursor:pointer;}label span{min-width:0;overflow-wrap:anywhere;}input{width:20px;height:20px;flex:none;accent-color:var(--hp-accent,#d89300);}.row{display:flex;align-items:center;gap:8px;width:100%;max-width:100%;min-width:0;padding:12px 16px;box-sizing:border-box;}.spacer{flex:1;}button{min-width:0;min-height:44px;max-width:100%;display:inline-flex;align-items:center;justify-content:center;border:1px solid var(--hp-line,rgb(127 127 127/.3));border-radius:12px;padding:0 18px;box-sizing:border-box;overflow-wrap:anywhere;white-space:normal;background:transparent;color:inherit;font:inherit;cursor:pointer;}button.primary{background:var(--hp-accent,#d89300);color:var(--hp-on-accent,#111);border-color:transparent;}button:disabled{opacity:.55;cursor:default;}ha-icon{flex:none;margin-right:6px;}@media (max-width:360px){.row{display:grid;grid-template-columns:minmax(0,1fr);}.spacer{display:none;}button{width:100%;}}`,customElements.get("hp-pdf-dialog")||customElements.define("hp-pdf-dialog",v);const V=(A,B,E)=>Math.hypot(A[0]-B[0],A[1]-B[1])<=E,U=A=>Number.isFinite(A)&&A>=0?A:0;function l(A){const B=Number(A);return Number.isFinite(B)&&B>0?.1/B:0}const a=(A,B)=>[...new Set([...A,...B])].sort((A,B)=>A-B),P=(A,B)=>{const E=A.points.length;if(E<=1||!V(A.points[E-1],A.points[0],B))return!1;const s=E-2;return A.edgeSources[s]=a(A.edgeSources[s],A.edgeSources[E-1]),A.points.splice(E-1,1),A.edgeSources.splice(E-1,1),!0},y=(A,B)=>{for(let E=0;E+1{let E=!1;for(;A.points.length>1;)if(P(A,B))E=!0;else{if(!y(A,B))break;E=!0}return E},N=(A,B,E)=>{const s=B[0]-A[0],w=B[1]-A[1],C=E[0]-B[0],g=E[1]-B[1],I=Math.hypot(s,w),Y=Math.hypot(C,g);if(!(I>0&&Y>0))return!1;const R=s*C+w*g;if(!(R>0))return!1;const M=s*g-w*C;return Math.abs(M)<=R*Q},K=A=>{const B=A.points.length;if(B<3)return!1;for(let E=0;E{const E=U(B),s=[],w=[];for(let B=0;B[A])};for(;Q.points.length>1;){const A=u(Q,E);if(Q.points.length<3)break;if(!K(Q)&&!A)break}return u(Q,E),Q};function J(A,B){const E=Number(A[0]),s=Number(A[1]),w=Number(B[0]),C=Number(B[1]);if(![E,s,w,C].every(Number.isFinite))return null;const g=w-E,I=C-s,Y=Math.abs(g),R=Math.abs(I),M=Math.max(Y,R),F=Math.min(Y,R);if(!(M>0)||F/M>Q)return null;const i=[(E+w)/2,(s+C)/2];if(Y>=R){return{axis:"horizontal",a:[E,i[1]],b:[w,i[1]],mid:i,projectedLength:Y,tangentInterval:[Math.min(E,w),Math.max(E,w)],normalCoordinate:i[1]}}return{axis:"vertical",a:[i[0],s],b:[i[0],C],mid:i,projectedLength:R,tangentInterval:[Math.min(s,C),Math.max(s,C)],normalCoordinate:i[0]}}function Z(A,B){const E=B.map(A=>[Number(A[0]),Number(A[1])]);if(!E.every(A=>A.every(Number.isFinite)))return!1;if(E.length<3||((A,B)=>{const E=1e-12*Math.max(1,Math.abs(A[0]),Math.abs(A[1]),...B.flatMap(A=>[Math.abs(A[0]),Math.abs(A[1])]));for(let s=0;s0))continue;const Y=(A[0]-w[0])*g-(A[1]-w[1])*C;if(Math.abs(Y)>E*I)continue;const R=(A[0]-w[0])*C+(A[1]-w[1])*g;if(R>=-E&&R<=I*I+E)return!0}return!1})(A,E))return!1;let s=!1;for(let B=0,w=E.length-1;BA[1]==C[1]>A[1])continue;const g=(C[0]-Q[0])*(A[1]-Q[1])/(C[1]-Q[1])+Q[0];A[0]Object.is(A,-0)?0:A,I=[g(-Q/C),g(w/C)],Y=[g(-I[0]),g(-I[1])],R=[(B[0]+E[0])/2,(B[1]+E[1])/2],M=Math.max(1,C,Math.abs(R[0]),Math.abs(R[1])),F=Math.max(1e-9*M,.01*U(s));for(const B of[F,4*F,16*F]){const E=Z([R[0]+I[0]*B,R[1]+I[1]*B],A);if(E!==Z([R[0]+Y[0]*B,R[1]+Y[1]*B],A))return E?I:Y}return sA(A)>=0?I:Y}function f(A,B){let E=180*Math.atan2(B[1]-A[1],B[0]-A[0])/Math.PI;return E>90&&(E-=180),E<=-90&&(E+=180),E}function k(A,B,E,s={}){const w=Number(B);if(!(w>0&&Number.isFinite(w)))return[];const Q=void 0===s.epsilon?l(w):U(s.epsilon);return z(d(A,Q),w,E,{...s,epsilon:Q})}const z=(A,B,E,s)=>{if(A.points.length<3)return[];const Q=U(s.epsilon??l(B)),C=Number.isFinite(Number(s.ringIndex))?Number(s.ringIndex):0,g=[];for(let s=0;sQ))continue;const M=[...A.edgeSources[s]||[s]].sort((A,B)=>A-B),F=M[0]??s,i=T(A.points,R.a,R.b,Q),x=("horizontal"===R.axis?i[1]:i[0])<0?-1:1,b=[R.axis,O(R.tangentInterval[0]),String(x),O(C),O(F)].join("|"),L=R.projectedLength*B;g.push({sourceA:[...I],sourceB:[...Y],a:R.a,b:R.b,text:w(L,E),short:L<30,angle:f(R.a,R.b),mid:R.mid,axis:R.axis,projectedLength:R.projectedLength,tangentInterval:R.tangentInterval,normalCoordinate:R.normalCoordinate,inwardNormal:i,normalSign:x,source:{ringIndex:C,edgeIndex:F},sourceEdgeIndices:M,stableKey:b})}return g};function p(A,B,E,s={}){const w=Number(B);if(!(w>0&&Number.isFinite(w)))return[];const Q=void 0===s.epsilon?l(w):U(s.epsilon);let C=d(A,Q);if(sA(C.points)<0&&(C=(A=>{const B=A.points.length;return{points:[...A.points].reverse().map(A=>[...A]),edgeSources:A.points.map((E,s)=>[...A.edgeSources[(B-2-s+B)%B]])}})(C)),C.points.length){let A=0;for(let B=1;B({points:[...A.points.slice(B),...A.points.slice(0,B)],edgeSources:[...A.edgeSources.slice(B),...A.edgeSources.slice(0,B)]}))(C,A)}return z(C,w,E,{...s,epsilon:Q})}function X(A,B){const E=U(B),s=[];for(const B of A){const A=s.find(A=>A.axis===B.axis&&A.normalSign===B.normalSign&&Math.abs(A.normalCoordinate-B.normalCoordinate)<=E);A?A.edges.push(B):s.push({axis:B.axis,normalSign:B.normalSign,normalCoordinate:B.normalCoordinate,edges:[B]})}return s.map(A=>A.edges)}const O=A=>Object.is(A,-0)?"0":String(A),q=A=>"horizontal"===A?0:1;function $(A,B){return q(A.axis)-q(B.axis)||A.tangentInterval[0]-B.tangentInterval[0]||A.normalSign-B.normalSign||A.source.ringIndex-B.source.ringIndex||A.source.edgeIndex-B.source.edgeIndex}function _(A,B,E,s){const w=U(s);if(A.axis!==B.axis)return!1;if(A.source.ringIndex!==B.source.ringIndex)return!1;if(A.inwardNormal[0]*B.inwardNormal[0]+A.inwardNormal[1]*B.inwardNormal[1]>=-.5)return!1;if(!((A,B,E)=>Math.abs(A[0]-B[0])<=E&&Math.abs(A[1]-B[1])<=E)(A.tangentInterval,B.tangentInterval,w))return!1;if(Math.abs(A.projectedLength-B.projectedLength)>w)return!1;return Z([(A.mid[0]+B.mid[0])/2,(A.mid[1]+B.mid[1])/2],E)}const AA=(A,B)=>{const E=B?.(A);return{hardCollisions:Number.isFinite(Number(E?.hardCollisions))?Number(E?.hardCollisions):0,normalClearance:Number.isFinite(Number(E?.normalClearance))?Number(E?.normalClearance):0}},BA=(A,B,E)=>{const s=AA(A,E),w=AA(B,E);return s.hardCollisions-w.hardCollisions||w.normalClearance-s.normalClearance||$(A,B)};function EA(A,B){if(A.length<2)return[...A];const E=U(B.epsilon),s=function(A,B=1e-7){return d(A,B).points.map(A=>[...A])}(B.ring,E),w=[];for(let B=0;B{const E=A.separation-B.separation;if(E)return E;const s=$(A.left,A.right)<=0?A.left:A.right,w=s===A.left?A.right:A.left,Q=$(B.left,B.right)<=0?B.left:B.right,C=Q===B.left?B.right:B.left;return $(s,Q)||$(w,C)});const Q=new Set,C=new Set;for(const A of w){if(Q.has(A.left)||Q.has(A.right))continue;Q.add(A.left),Q.add(A.right);const E=BA(A.left,A.right,B.score)<=0?A.left:A.right;C.add(E===A.left?A.right:A.left)}return A.filter(A=>!C.has(A))}function sA(A){let B=0;for(let E=0;E1){const A=Math.sqrt(G);Y*=A,R*=A}const o=Math.max(0,Y*Y*R*R-Y*Y*D*D-R*R*L*L),t=Y*Y*D*D+R*R*L*L||1,c=(Q===C?-1:1)*Math.sqrt(o/t),W=c*Y*D/R,m=c*-R*L/Y,n=F*W-i*m+(A+g)/2,e=i*W+F*m+(B+I)/2;let h=gA(1,0,(L-W)/Y,(D-m)/R),S=gA((L-W)/Y,(D-m)/R,(-L-W)/Y,(-D-m)/R);!C&&S>0&&(S-=2*Math.PI),C&&S<0&&(S+=2*Math.PI);const j=Math.max(1,Math.ceil(Math.abs(S)/(Math.PI/2))),r=S/j,H=A=>[n+F*Y*Math.cos(A)-i*R*Math.sin(A),e+i*Y*Math.cos(A)+F*R*Math.sin(A)],v=A=>[-F*Y*Math.sin(A)-i*R*Math.cos(A),-i*Y*Math.sin(A)+F*R*Math.cos(A)],V=[];for(let A=0;A[B.a*A+B.c*E+B.e,B.b*A+B.d*E+B.f];return function(A){const B=A.match(/[AaCcHhLlMmQqSsTtVvZz]|[-+]?(?:\d*\.\d+|\d+\.?)(?:e[-+]?\d+)?/gi)||[],E=[];let s=0,w="",Q=0,C=0,g=0,I=0,Y=null,R=null;const M=()=>Number(B[s++]);for(;sB.length||QA.test(B[s]))throw new Error(`Invalid SVG path command ${w}`);const x=Array.from({length:i},M),b=A=>A+(F?Q:0),L=A=>A+(F?C:0);if("M"===A||"L"===A)Q=b(x[0]),C=L(x[1]),E.push({op:"M"===A?"M":"L",x:Q,y:C}),"M"===A&&(g=Q,I=C,w=F?"l":"L"),Y=R=null;else if("H"===A)Q=b(x[0]),E.push({op:"L",x:Q,y:C}),Y=R=null;else if("V"===A)C=L(x[0]),E.push({op:"L",x:Q,y:C}),Y=R=null;else if("C"===A){const A=b(x[0]),B=L(x[1]),s=b(x[2]),w=L(x[3]);Q=b(x[4]),C=L(x[5]),Y=[s,w],R=null,E.push({op:"C",x1:A,y1:B,x2:s,y2:w,x:Q,y:C})}else if("S"===A){const A=Y?2*Q-Y[0]:Q,B=Y?2*C-Y[1]:C,s=b(x[0]),w=L(x[1]);Q=b(x[2]),C=L(x[3]),Y=[s,w],R=null,E.push({op:"C",x1:A,y1:B,x2:s,y2:w,x:Q,y:C})}else if("Q"===A||"T"===A){const B="Q"===A?b(x[0]):R?2*Q-R[0]:Q,s="Q"===A?L(x[1]):R?2*C-R[1]:C,w=b("Q"===A?x[2]:x[0]),g=L("Q"===A?x[3]:x[1]);E.push({op:"C",x1:Q+2/3*(B-Q),y1:C+2/3*(s-C),x2:w+2/3*(B-w),y2:g+2/3*(s-g),x:w,y:g}),Q=w,C=g,R=[B,s],Y=null}else if("A"===A){const A=b(x[5]),B=L(x[6]),s=IA(Q,C,x[0],x[1],x[2],x[3],x[4],A,B);s.length?E.push(...s):E.push({op:"L",x:A,y:B}),Q=A,C=B,Y=R=null}}return E}(A).map(A=>{if("Z"===A.op)return A;if("M"===A.op||"L"===A.op){const[B,s]=E(A.x,A.y);return{op:A.op,x:B,y:s}}if("C"!==A.op)throw new Error("Unsupported PDF vector operation");const[B,s]=E(A.x1,A.y1),[w,Q]=E(A.x2,A.y2),[C,g]=E(A.x,A.y);return{op:"C",x1:B,y1:s,x2:w,y2:Q,x:C,y:g}})}const RA=["M20.82,15.31h0L10.46,9c-.46-.26-1.11.37-.86.84l6.15,10.56,10.56,6.15a.66.66,0,0,0,.84-.86Zm-4,4,3-3,4.55,7.44Z","M18,2A16,16,0,1,0,34,18,16,16,0,0,0,18,2Zm1,29.95V29.53H17v2.42A14,14,0,0,1,4.05,19H6.47V17H4.05A14,14,0,0,1,17,4.05V6.47h2V4.05A14,14,0,0,1,31.95,17H29.53v2h2.42A14,14,0,0,1,19,31.95Z"],MA=A=>Math.abs(A)<1e-12?0:Math.abs(A-1)<1e-12?1:Math.abs(A+1)<1e-12?-1:A;function FA(A){const B=function(A){const{centerX:B,centerY:E,size:s,northDeg:w}=A;if(![B,E,s,w].every(Number.isFinite)||s<=0)throw new RangeError("PDF compass placement must contain finite coordinates and a positive size");const Q=((w%360+360)%360+45)*Math.PI/180,C=s/36,g=MA(Math.cos(Q)),I=MA(Math.sin(Q)),Y=C*g,R=C*I,M=-C*I,F=C*g;return{a:Y,b:R,c:M,d:F,e:B-18*Y-18*M,f:E-18*R-18*F}}(A);return RA.flatMap(A=>YA(A,B))}const iA=1e-8,xA=A=>A.length>=2&&Number.isFinite(A[0])&&Number.isFinite(A[1]),bA=(A,B)=>A[0]>=B.minX-iA&&A[0]<=B.maxX+iA&&A[1]>=B.minY-iA&&A[1]<=B.maxY+iA,LA=A=>[A.minX,A.minY,A.maxX,A.maxY].every(Number.isFinite)&&A.maxX>=A.minX&&A.maxY>=A.minY,DA=A=>[[A.minX,A.minY],[A.maxX,A.minY],[A.maxX,A.maxY],[A.minX,A.maxY]];const GA=(A,B,E)=>(B[0]-A[0])*(E[1]-A[1])-(B[1]-A[1])*(E[0]-A[0]),oA=(A,B,E)=>{const s=E[0]-B[0],w=E[1]-B[1],Q=Math.abs(s)>=Math.abs(w)?s:w;return Math.abs(Q)<=iA?0:(Math.abs(s)>=Math.abs(w)?A[0]-B[0]:A[1]-B[1])/Q},tA=(A,B)=>Math.hypot(B[0]-A[0],B[1]-A[1]);function cA(A,B,E){const s=tA(B,E);if(s<=iA)return tA(A,B)<=iA;if(Math.abs(GA(B,E,A))/s>iA)return!1;const w=oA(A,B,E),Q=iA/s;return w>=-Q&&w<=1+Q}function WA(A,B,E,s){const w=B[0]-A[0],Q=B[1]-A[1],C=s[0]-E[0],g=s[1]-E[1],I=Math.hypot(w,Q),Y=Math.hypot(C,g);if(I<=iA)return cA(A,E,s)?{t:0,endT:0,overlap:!1}:null;if(Y<=iA){if(!cA(E,A,B))return null;const s=Math.max(0,Math.min(1,oA(E,A,B)));return{t:s,endT:s,overlap:!1}}const R=w*g-Q*C,M=E[0]-A[0],F=E[1]-A[1],i=iA*I*Y;if(Math.abs(R)<=i){if(Math.abs(GA(A,B,E))/I>iA||Math.abs(GA(A,B,s))/I>iA)return null;const w=oA(E,A,B),Q=oA(s,A,B),C=Math.max(0,Math.min(w,Q)),g=Math.min(1,Math.max(w,Q));return giA}}const x=(M*g-F*C)/R,b=(M*Q-F*w)/R,L=iA/I,D=iA/Y;if(x<-L||x>1+L||b<-D||b>1+D)return null;const G=Math.max(0,Math.min(1,x));return{t:G,endT:G,overlap:!1}}const mA=A=>A.every(A=>A.length>=2&&A.every(xA));function nA(A,B){for(const E of A){const A=E;for(let E=0;Enull!==WA(A,B,E,s[(w+1)%s.length]))}const hA=2048,SA=2146,jA=[-1825,-555,4188,2163],rA={32:1,33:2,34:3,35:4,36:5,37:6,38:7,39:8,40:9,41:10,42:11,43:12,44:13,45:14,46:15,47:16,48:17,49:18,50:19,51:20,52:21,53:22,54:23,55:24,56:25,57:26,58:27,59:28,60:29,61:30,62:31,63:32,64:33,65:34,66:35,67:36,68:37,69:38,70:39,71:40,72:41,73:42,74:43,75:44,76:45,77:46,78:47,79:48,80:49,81:50,82:51,83:52,84:53,85:54,86:55,87:56,88:57,89:58,90:59,91:60,92:61,93:62,94:63,95:64,96:65,97:66,98:67,99:68,100:69,101:70,102:71,103:72,104:73,105:74,106:75,107:76,108:77,109:78,110:79,111:80,112:81,113:82,114:83,115:84,116:85,117:86,118:87,119:88,120:89,121:90,122:91,123:92,124:93,125:94,126:95,160:596,161:96,162:97,163:98,164:99,165:100,166:101,167:102,168:103,169:104,170:105,171:106,172:107,173:597,174:108,175:109,176:110,177:111,178:112,179:113,180:114,181:115,182:116,183:117,184:118,185:119,186:120,187:121,188:122,189:123,190:124,191:125,192:603,193:604,194:605,195:606,196:607,197:608,198:126,199:609,200:610,201:611,202:612,203:613,204:614,205:615,206:616,207:617,208:599,209:618,210:619,211:620,212:621,213:622,214:623,215:127,216:128,217:624,218:625,219:626,220:627,221:628,222:129,223:130,224:629,225:630,226:631,227:632,228:633,229:634,230:131,231:635,232:636,233:637,234:638,235:639,236:640,237:641,238:642,239:643,240:132,241:644,242:645,243:646,244:647,245:648,246:649,247:133,248:134,249:650,250:651,251:652,252:653,253:654,254:135,255:655,256:656,257:657,258:658,259:659,260:660,261:661,262:662,263:663,264:664,265:665,266:666,267:667,268:668,269:669,270:670,271:671,272:598,273:136,274:672,275:673,276:674,277:675,278:676,279:677,280:678,281:679,282:680,283:681,284:682,285:683,286:684,287:685,288:686,289:687,290:688,291:689,292:690,293:691,294:137,295:600,296:692,297:693,298:694,299:695,300:696,301:697,302:698,303:699,304:700,305:138,306:701,307:702,308:703,309:704,310:705,311:706,312:139,313:707,314:708,315:709,316:710,317:711,318:712,319:713,320:714,321:140,322:141,323:715,324:716,325:717,326:718,327:719,328:720,329:721,330:142,331:143,332:722,333:723,334:724,335:725,336:726,337:727,338:144,339:145,340:728,341:729,342:730,343:731,344:732,345:733,346:734,347:735,348:736,349:737,350:738,351:739,352:742,353:743,354:744,355:745,356:746,357:747,358:601,359:602,360:748,361:749,362:750,363:751,364:752,365:753,366:754,367:755,368:756,369:757,370:758,371:759,372:760,373:761,374:762,375:763,376:764,377:765,378:766,379:767,380:768,381:769,382:770,383:146,1024:897,1025:856,1026:165,1027:857,1028:166,1029:858,1030:859,1031:860,1032:861,1033:167,1034:168,1035:169,1036:863,1037:898,1038:864,1039:170,1040:865,1041:171,1042:866,1043:867,1044:172,1045:868,1046:173,1047:174,1048:175,1049:869,1050:862,1051:176,1052:870,1053:871,1054:872,1055:873,1056:874,1057:875,1058:876,1059:177,1060:178,1061:877,1062:179,1063:180,1064:181,1065:182,1066:183,1067:184,1068:185,1069:186,1070:187,1071:188,1072:878,1073:189,1074:190,1075:191,1076:192,1077:879,1078:193,1079:194,1080:195,1081:880,1082:196,1083:197,1084:198,1085:199,1086:881,1087:200,1088:882,1089:883,1090:201,1091:884,1092:202,1093:885,1094:203,1095:204,1096:205,1097:206,1098:207,1099:208,1100:209,1101:210,1102:211,1103:212,1104:899,1105:886,1106:213,1107:887,1108:214,1109:888,1110:889,1111:890,1112:891,1113:215,1114:216,1115:217,1116:892,1117:900,1118:893,1119:218,1120:219,1121:220,1122:965,1123:221,1124:222,1125:223,1126:224,1127:225,1128:226,1129:227,1130:228,1131:229,1132:230,1133:231,1134:232,1135:233,1136:901,1137:902,1138:234,1139:235,1140:236,1141:237,1142:903,1143:904,1144:906,1145:905,1146:238,1147:239,1148:240,1149:241,1150:242,1151:243,1152:244,1153:245,1154:246,1155:247,1156:248,1157:249,1158:250,1159:251,1160:252,1161:253,1162:254,1163:255,1164:964,1165:256,1166:257,1167:258,1168:259,1169:260,1170:966,1171:967,1172:261,1173:262,1174:263,1175:264,1176:907,1177:908,1178:265,1179:266,1180:267,1181:268,1182:968,1183:969,1184:269,1185:270,1186:271,1187:272,1188:273,1189:274,1190:275,1191:276,1192:277,1193:278,1194:909,1195:910,1196:955,1197:956,1198:911,1199:912,1200:970,1201:971,1202:279,1203:280,1204:281,1205:282,1206:283,1207:284,1208:285,1209:286,1210:287,1211:963,1212:288,1213:289,1214:961,1215:962,1216:913,1217:914,1218:915,1219:290,1220:291,1221:292,1222:293,1223:294,1224:295,1225:296,1226:297,1227:957,1228:958,1229:298,1230:299,1231:916,1232:917,1233:918,1234:919,1235:920,1236:921,1237:922,1238:923,1239:924,1240:300,1241:926,1242:925,1243:927,1244:928,1245:929,1246:930,1247:931,1248:301,1249:302,1250:932,1251:933,1252:934,1253:935,1254:936,1255:937,1256:938,1257:939,1258:940,1259:941,1260:942,1261:943,1262:944,1263:945,1264:946,1265:947,1266:948,1267:949,1268:950,1269:951,1270:959,1271:960,1272:952,1273:953,1274:303,1275:304,1276:305,1277:306,1278:972,1279:973,1280:307,1281:954,1282:308,1283:309,1284:310,1285:311,1286:312,1287:313,1288:314,1289:315,1290:316,1291:317,1292:318,1293:319,1294:320,1295:321,1296:322,1297:974,1298:323,1299:324,1300:325,1301:326,1302:327,1303:328,1304:329,1305:330,1306:982,1307:983,1308:984,1309:985,1310:331,1311:332,1312:333,1313:334,1314:335,1315:336,1316:337,1317:338,1318:339,1319:340,1320:341,1321:342,1322:343,1323:344,1324:345,1325:346,1326:347,1327:348,8192:349,8193:350,8194:351,8195:352,8196:353,8197:354,8198:355,8199:356,8200:357,8201:358,8202:360,8203:361,8204:362,8205:363,8206:364,8207:365,8208:366,8209:367,8210:368,8211:369,8212:370,8213:975,8214:371,8215:372,8216:373,8217:374,8218:375,8219:376,8220:377,8221:378,8222:379,8223:380,8224:381,8225:382,8226:383,8227:384,8228:385,8229:386,8230:387,8231:388,8239:986,8240:389,8241:390,8242:894,8243:895,8244:391,8245:392,8246:393,8247:394,8248:395,8249:396,8250:397,8251:398,8252:896,8253:399,8254:400,8255:401,8256:402,8257:403,8258:404,8259:405,8260:406,8261:407,8262:408,8263:987,8264:988,8265:989,8266:409,8267:410,8268:411,8269:412,8270:413,8271:414,8272:415,8273:416,8274:417,8275:418,8276:419,8277:420,8278:421,8279:422,8280:423,8281:424,8282:425,8283:426,8284:427,8285:428,8286:429,8287:990,8364:430,8381:431,8776:433},HA={1:507,2:527,3:655,4:1261,5:1150,6:1500,7:1273,8:357,9:700,10:712,11:882,12:1161,13:402,14:565,15:539,16:844,17:1150,18:1150,19:1150,20:1150,21:1150,22:1150,23:1150,24:1150,25:1150,26:1150,27:496,28:433,29:1041,30:1124,31:1070,32:967,33:1839,34:1336,35:1275,36:1333,37:1343,38:1164,39:1132,40:1395,41:1460,42:557,43:1130,44:1284,45:1102,46:1788,47:1460,48:1408,49:1292,50:1408,51:1261,52:1215,53:1222,54:1328,55:1303,56:1817,57:1284,58:1230,59:1226,60:543,61:840,62:543,63:856,64:924,65:633,66:1114,67:1149,68:1072,69:1155,70:1085,71:711,72:1149,73:1128,74:497,75:489,76:1038,77:497,78:1795,79:1130,80:1168,81:1149,82:1164,83:693,84:1056,85:669,86:1129,87:992,88:1539,89:1015,90:969,91:1015,92:693,93:499,94:693,95:1393,96:499,97:1120,98:1190,99:1460,100:1075,101:491,102:1256,103:856,104:1609,105:915,106:961,107:1134,108:1610,109:938,110:765,111:1094,112:751,113:751,114:642,115:1160,116:1001,117:534,118:507,119:751,120:931,121:960,122:1500,123:1589,124:1593,125:969,126:1914,127:1092,128:1408,129:1210,130:1218,131:1729,132:1200,133:1169,134:1160,135:1180,136:1223,137:1434,138:506,139:1139,140:1103,141:553,142:1419,143:1160,144:1953,145:1860,146:508,165:1535,166:1380,167:2193,168:2212,169:1666,170:1460,171:1291,172:1540,173:1859,174:1215,175:1460,176:1449,177:1287,178:1580,179:1497,180:1402,181:1927,182:1984,183:1554,184:1771,185:1285,186:1380,187:1831,188:1304,189:1132,190:1170,191:859,192:1236,193:1568,194:1040,195:1182,196:1106,197:1184,198:1519,199:1181,200:1182,201:984,202:1485,203:1213,204:1113,205:1656,206:1694,207:1271,208:1590,209:1112,210:1101,211:1671,212:1124,213:1128,214:1101,215:1737,216:1764,217:1161,218:1182,219:1800,220:1579,221:1110,222:1835,223:1528,224:1234,225:1094,226:1803,227:1547,228:1745,229:1505,230:2308,231:2001,232:1059,233:987,234:1393,235:1163,236:1290,237:1027,238:1393,239:1160,240:1793,241:1572,242:1800,243:1579,244:1330,245:1095,246:1277,247:1024,248:1024,249:1024,250:1024,251:1024,252:1024,253:1024,254:1545,255:1261,256:1110,257:1307,258:1161,259:1123,260:912,261:1243,262:1029,263:1954,264:1633,265:1434,266:1208,267:1289,268:1150,269:1676,270:1411,271:1535,272:1241,273:1999,274:1460,275:2097,276:1780,277:1518,278:1235,279:1304,280:1066,281:1836,282:1372,283:1468,284:1174,285:1391,286:1130,287:1391,288:1583,289:1213,290:1289,291:1114,292:1534,293:1263,294:1458,295:1160,296:1554,297:1260,298:1871,299:1598,300:1415,301:1192,302:1192,303:1207,304:939,305:1326,306:1088,307:1270,308:1684,309:1764,310:1622,311:1323,312:1097,313:1031,314:1985,315:1653,316:2043,317:1697,318:1270,319:1053,320:1453,321:1312,322:1380,323:1538,324:1266,325:1920,326:1549,327:1857,328:1547,329:1926,330:1774,331:1316,332:1106,333:2274,334:1832,335:2300,336:1829,337:1526,338:1242,339:1468,340:1208,341:1539,342:1273,343:2710,344:2238,345:1568,346:1240,347:1515,348:1243,349:1044,350:2089,351:1044,352:2089,353:697,354:522,355:348,356:1151,357:560,358:418,360:209,361:1024,362:1024,363:1024,364:1024,365:1024,366:564,367:564,368:1171,369:1344,370:1599,371:778,372:933,373:409,374:409,375:407,376:409,377:724,378:731,379:705,380:764,381:1129,382:1167,383:690,384:1100,385:511,386:964,387:1370,388:382,389:1962,390:2360,391:1045,392:463,393:757,394:1045,395:803,396:614,397:614,398:1241,399:919,400:952,401:1540,402:1540,403:874,404:1370,405:870,406:931,407:640,408:641,409:907,410:1001,411:1237,412:1237,413:985,414:511,415:1541,416:985,417:931,418:1366,419:1540,420:1172,421:932,422:1333,423:1215,424:1125,425:379,426:1071,427:1162,428:379,429:379,430:1150,431:1359,433:1154,596:507,597:565,598:1373,599:1373,600:1158,601:1222,602:669,603:1336,604:1336,605:1336,606:1336,607:1336,608:1336,609:1333,610:1164,611:1164,612:1164,613:1164,614:557,615:557,616:557,617:557,618:1460,619:1408,620:1408,621:1408,622:1408,623:1408,624:1328,625:1328,626:1328,627:1328,628:1230,629:1114,630:1114,631:1114,632:1114,633:1114,634:1114,635:1072,636:1085,637:1085,638:1085,639:1085,640:506,641:506,642:506,643:506,644:1130,645:1168,646:1168,647:1168,648:1168,649:1168,650:1129,651:1129,652:1129,653:1129,654:969,655:969,656:1336,657:1114,658:1336,659:1114,660:1336,661:1114,662:1333,663:1072,664:1333,665:1072,666:1333,667:1072,668:1333,669:1072,670:1343,671:1305,672:1164,673:1085,674:1164,675:1085,676:1164,677:1085,678:1164,679:1085,680:1164,681:1085,682:1395,683:1149,684:1395,685:1149,686:1395,687:1149,688:1395,689:1149,690:1460,691:1128,692:557,693:506,694:557,695:506,696:557,697:506,698:557,699:497,700:557,701:1687,702:986,703:1130,704:515,705:1284,706:1038,707:1102,708:497,709:1102,710:497,711:1102,712:647,713:1102,714:717,715:1460,716:1130,717:1460,718:1130,719:1460,720:1130,721:1130,722:1408,723:1168,724:1408,725:1168,726:1408,727:1168,728:1261,729:693,730:1261,731:693,732:1261,733:693,734:1215,735:1056,736:1215,737:1056,738:1215,739:1056,742:1215,743:1056,744:1222,745:669,746:1222,747:709,748:1328,749:1129,750:1328,751:1129,752:1328,753:1129,754:1328,755:1129,756:1328,757:1129,758:1328,759:1129,760:1817,761:1539,762:1230,763:969,764:1230,765:1226,766:1015,767:1226,768:1015,769:1226,770:1015,856:1164,857:1139,858:1215,859:557,860:557,861:1130,862:1316,863:1284,864:1287,865:1336,866:1275,867:1139,868:1164,869:1460,870:1788,871:1460,872:1408,873:1461,874:1292,875:1333,876:1222,877:1284,878:1114,879:1085,880:1182,881:1168,882:1149,883:1072,884:969,885:1015,886:1085,887:859,888:1056,889:497,890:506,891:489,892:1106,893:969,894:357,895:655,896:1054,897:1164,898:1460,899:1085,900:1182,901:1417,902:1434,903:1290,904:1027,905:2137,906:2377,907:1215,908:1040,909:1333,910:1072,911:1230,912:1026,913:557,914:1859,915:1568,916:557,917:1336,918:1114,919:1336,920:1114,921:1914,922:1729,923:1164,924:1085,925:1415,926:1079,927:1079,928:1859,929:1568,930:1215,931:1040,932:1460,933:1182,934:1460,935:1182,936:1408,937:1168,938:1393,939:1163,940:1393,941:1163,942:1380,943:1101,944:1287,945:969,946:1287,947:969,948:1287,949:969,950:1402,951:1113,952:1771,953:1590,954:1155,955:1222,956:984,957:1402,958:1113,959:1139,960:859,961:1583,962:1213,963:1128,964:1285,965:1285,966:1139,967:859,968:1336,969:1063,970:1230,971:1026,972:1284,973:1015,974:1104,975:1599,982:1408,983:1164,984:1817,985:1539,986:507,987:1934,988:1494,989:1494,990:507},vA=new TextEncoder,VA=A=>{const B=Math.round(100*A)/100;return Number.isInteger(B)?String(B):B.toFixed(2).replace(/0+$/,"")},UA=A=>{const B=Math.round(1e6*A)/1e6;return Number.isInteger(B)?String(B):B.toFixed(6).replace(/0+$/,"")},lA=A=>A.map(UA).join(" ");function aA(A){let B="",E=0;const s=new Map;for(const w of A){const A=w.codePointAt(0)||0,Q=rA[A]||rA[63];B+=Q.toString(16).padStart(4,"0"),E+=HA[Q]||1024,s.has(Q)||s.set(Q,A||63)}return{hex:B,width:E,unicode:s}}function PA(A,B){return aA(A).width*B/hA}function yA(A,B=PA(A.text,A.size)){const E=A.align||"left",s="center"===E?B/2:"right"===E?B:0,w=(A.angle||0)*Math.PI/180,Q=Math.cos(w),C=Math.sin(w);return{width:B,baselineX:A.x-Q*s,baselineY:A.y+C*s,cos:Q,sin:C}}function uA(A){const B=yA(A),E=-555*A.size/hA,s=SA*A.size/hA,w=[0,B.width].flatMap(A=>[E,s].map(E=>({x:B.baselineX+B.cos*A-B.sin*E,y:B.baselineY-B.sin*A-B.cos*E})));return{minX:Math.min(...w.map(A=>A.x)),minY:Math.min(...w.map(A=>A.y)),maxX:Math.max(...w.map(A=>A.x)),maxY:Math.max(...w.map(A=>A.y))}}function NA(A){const B=A.reduce((A,B)=>A+B.length,0),E=new Uint8Array(B);let s=0;for(const B of A)E.set(B,s),s+=B.length;return E}const KA=A=>vA.encode(A),dA=(A,B)=>NA([KA(`<< ${A} /Length ${B.length} >>\nstream\n`),B,KA("\nendstream")]);function JA(A){const B=function(A){const B=atob(A),E=new Uint8Array(B.length);for(let A=0;A"image"===A.kind&&null!=A.opacity&&A.opacity<1?[Math.max(0,Math.min(1,A.opacity))]:[]))].sort((A,B)=>A-B),s=new Map(E.map((A,B)=>[A,`GS${B+1}`])),w=function(A,B){const E=[],s=new Map,w=B=>A.height-B,Q=(A,...B)=>`${B.map(VA).join(" ")} ${A}`,C=A=>{for(const B of A)if(B.length){E.push(Q("m",B[0][0],w(B[0][1])));for(let A=1;A{let B=!1;for(const s of A)if(!(s.length<2)){B=!0,E.push(Q("m",s[0][0],w(s[0][1])));for(let A=1;A Tj`,"ET")}else{const A=(I.angle||0)*Math.PI/180,s=Math.cos(A),C=Math.sin(A),g=I.x+I.width/2,Y=w(I.y+I.height/2);E.push("q");const R=null==I.opacity?1:Math.max(0,Math.min(1,I.opacity)),M=B.get(R);M&&E.push(`/${M} gs`),E.push(Q("cm",s*I.width,C*I.width,C*I.height,-s*I.height,g-s*I.width/2-C*I.height/2,Y-C*I.width/2+s*I.height/2),`/Im${I.imageId} Do`,"Q")}return{stream:E.join("\n"),unicode:s}}(A,s),Q=Math.max(0,...Object.keys(HA).map(Number)),C=Array.from({length:Q+1},(A,B)=>Math.round(1e3*(HA[B]||1024)/hA)),g=[],I=A=>(g.push("string"==typeof A?KA(A):A),g.length),Y=I(""),R=I(""),M=I(""),F=I(dA(`/Length1 ${B.length}`,B)),i=I(`<< /Type /FontDescriptor /FontName /Roboto /Flags 32 /FontBBox [${jA.join(" ")}] /ItalicAngle 0 /Ascent 2146 /Descent -555 /CapHeight 2146 /StemV 80 /FontFile2 ${F} 0 R >>`),x=I(`<< /Type /Font /Subtype /CIDFontType2 /BaseFont /Roboto /CIDSystemInfo << /Registry (Adobe) /Ordering (Identity) /Supplement 0 >> /FontDescriptor ${i} 0 R /W [0 [${C.join(" ")}]] /CIDToGIDMap /Identity >>`),b=KA(function(A){const B=[...A].sort((A,B)=>A[0]-B[0]),E=B.map(([A,B])=>`<${A.toString(16).padStart(4,"0")}> <${B<=65535?B.toString(16).padStart(4,"0"):(()=>{const A=B-65536;return(55296+(A>>10)).toString(16).padStart(4,"0")+(56320+(1023&A)).toString(16).padStart(4,"0")})()}>`);return`/CIDInit /ProcSet findresource begin\n12 dict begin\nbegincmap\n/CIDSystemInfo << /Registry (Adobe) /Ordering (UCS) /Supplement 0 >> def\n/CMapName /HousePlanUnicode def\n/CMapType 2 def\n1 begincodespacerange\n<0000> \nendcodespacerange\n${B.length} beginbfchar\n${E.join("\n")}\nendbfchar\nendcmap\nCMapName currentdict /CMap defineresource pop\nend\nend`}(w.unicode)),L=I(dA("",b)),D=I(`<< /Type /Font /Subtype /Type0 /BaseFont /Roboto /Encoding /Identity-H /DescendantFonts [${x} 0 R] /ToUnicode ${L} 0 R >>`),G=I(dA("",KA(w.stream))),o=[];for(const B of A.images||[]){const A=I(dA(`/Type /XObject /Subtype /Image /Width ${B.width} /Height ${B.height} /ColorSpace /DeviceRGB /BitsPerComponent 8 /Filter /DCTDecode`,B.bytes));o.push(`/Im${B.id} ${A} 0 R`)}const t=A.now.toISOString().replace(/[-:T]/g,"").slice(0,14),c=I(`<< /CreationDate (D:${t}Z) /ModDate (D:${t}Z) >>`),W=`<< /Font << /F1 ${D} 0 R >>`+(o.length?` /XObject << ${o.join(" ")} >>`:"")+(E.length?` /ExtGState << ${E.map(A=>`/${s.get(A)} << /ca ${VA(A)} /CA ${VA(A)} >>`).join(" ")} >>`:"")+" >>";g[Y-1]=KA(`<< /Type /Catalog /Pages ${R} 0 R >>`),g[R-1]=KA(`<< /Type /Pages /Kids [${M} 0 R] /Count 1 >>`),g[M-1]=KA(`<< /Type /Page /Parent ${R} 0 R /MediaBox [0 0 ${VA(A.width)} ${VA(A.height)}] /Resources ${W} /Contents ${G} 0 R >>`);const m=KA("%PDF-1.4\n%âãÏÓ\n"),n=[m],e=[0];let h=m.length;g.forEach((A,B)=>{const E=KA(`${B+1} 0 obj\n`),s=KA("\nendobj\n");e.push(h),n.push(E,A,s),h+=E.length+A.length+s.length});const S=h,j=["xref",`0 ${g.length+1}`,"0000000000 65535 f "];for(let A=1;A<=g.length;A++)j.push(`${String(e[A]).padStart(10,"0")} 00000 n `);return j.push(`trailer\n<< /Size ${g.length+1} /Root ${Y} 0 R /Info ${c} 0 R >>`,`startxref\n${S}\n%%EOF\n`),n.push(KA(j.join("\n"))),NA(n)}const ZA=A=>[A.minX,A.minY,A.maxX,A.maxY].every(Number.isFinite)&&A.maxX>=A.minX&&A.maxY>=A.minY,TA=A=>A.maxX-A.minX,fA=A=>A.maxY-A.minY;function kA(A,B,E,s=0){Number.isFinite(B)&&Number.isFinite(E)&&(A.minX=Math.min(A.minX,B-s),A.minY=Math.min(A.minY,E-s),A.maxX=Math.max(A.maxX,B+s),A.maxY=Math.max(A.maxY,E+s))}function zA(A,B,E,s,w,Q){const C=Q*Math.PI/180,g=Math.cos(C),I=Math.sin(C),Y=B+s/2,R=E+w/2;for(const[B,E]of[[-s/2,-w/2],[s/2,-w/2],[s/2,w/2],[-s/2,w/2]])kA(A,Y+g*B-I*E,R+I*B+g*E)}function pA(A,B,E){for(const s of B)"M"===s.op||"L"===s.op?kA(A,s.x,s.y,E):"C"===s.op&&(kA(A,s.x1,s.y1,E),kA(A,s.x2,s.y2,E),kA(A,s.x,s.y,E))}function XA(A){const B={minX:1/0,minY:1/0,maxX:-1/0,maxY:-1/0};for(const E of A)if("path"===E.kind){const A=E.stroke?(E.width||.5)/2:0;for(const s of E.rings)for(const[E,w]of s)kA(B,E,w,A)}else if("line"===E.kind)for(const[A,s]of E.points)kA(B,A,s,E.width/2);else if("vector"===E.kind)pA(B,E.ops,E.width/2);else if("text"===E.kind){const A=uA(E);kA(B,A.minX,A.minY),kA(B,A.maxX,A.maxY)}else zA(B,E.x,E.y,E.width,E.height,E.angle||0);return B}function OA(A,B,E){return!!ZA(A)&&(TA(A)<=TA(B)+E&&fA(A)<=fA(B)+E)}function qA(A){return`${A.getFullYear()}-${String(A.getMonth()+1).padStart(2,"0")}-${String(A.getDate()).padStart(2,"0")}`}const $A=72/25.4,_A=5.25,AB=[.08,.08,.08],BB=[127/255,127/255,127/255],EB=[.72,.72,.72],sB=(A,B)=>A.minXB.minX&&A.minYB.minY;function wB(A,B,E,s,w=0,Q="left"){return uA({x:A,y:B,text:E,size:s,angle:w,align:Q})}function QB(A,B,E,s,w){const Q=Math.min(...[[A.minX,A.minY],[A.maxX,A.minY],[A.maxX,A.maxY],[A.minX,A.maxY]].map(([A,w])=>(A-B)*s[0]+(w-E)*s[1]));return Math.max(0,w-Q)}const CB=(A,B)=>`${A.axis}:${B[0]<-.5||B[1]<-.5?-1:1}`,gB=(A,B)=>{A.minX=Math.min(A.minX,B[0]),A.minY=Math.min(A.minY,B[1]),A.maxX=Math.max(A.maxX,B[0]),A.maxY=Math.max(A.maxY,B[1])},IB=A=>{const B={minX:1/0,minY:1/0,maxX:-1/0,maxY:-1/0};for(const E of A)for(const A of E)gB(B,A);return B};function YB(A,B,E,s,w=0){const Q=w*Math.PI/180,C=Math.cos(Q),g=Math.sin(Q),I=A+E/2,Y=B+s/2;return Array.from({length:48},(A,B)=>{const w=B/48*Math.PI*2,Q=Math.cos(w)*E/2,R=Math.sin(w)*s/2;return[I+C*Q-g*R,Y+g*Q+C*R]})}function RB(A,B,E,s,w=0){const Q=w*Math.PI/180,C=Math.cos(Q),g=Math.sin(Q),I=A+E/2,Y=B+s/2;return[[-E/2,-s/2],[E/2,-s/2],[E/2,s/2],[-E/2,s/2]].map(([A,B])=>[I+C*A-g*B,Y+g*A+C*B])}function MB(A,B,E){if("passage"===A.type)return[];const s=A.rlen/2,w=B>0?B/E*Y/2:2,Q=[];if("window"===A.type)Q.push([[-s,-w],[s,-w]],[[-s,w],[s,w]],[[-s,-w],[-s,w]],[[s,-w],[s,w]]);else if("gate"===A.type){const B=10*(A.flip_v?-1:1)*Math.PI/180,E=[[[-s,0],[-s+Math.cos(B)*s,Math.sin(B)*s]],[[s,0],[s-Math.cos(B)*s,Math.sin(-B)*s]]];Q.push(...E);for(const A of E){const B=A[1][0]-A[0][0],E=A[1][1]-A[0][1],s=Math.hypot(B,E)||1,C=-E/s,g=B/s,I=Math.min(.08*s,Math.max(1,.7*w));for(const s of[.3,.5,.7]){const w=A[0][0]+B*s,Y=A[0][1]+E*s;Q.push([[w-C*I,Y-g*I],[w+C*I,Y+g*I]])}}}else{const B=A.flip_v?1:-1,E=A.flip_h?s:-s,w=[E,B*A.rlen];Q.push([[E,0],w]);const C=[];for(let s=0;s<=16;s++){const w=B*s/16*Math.PI/2,Q=A.flip_h?-1:1;C.push([E+Q*Math.cos(w)*A.rlen,Math.sin(w)*A.rlen])}Q.push(C)}const C=A.angle*Math.PI/180,g=Math.cos(C),I=Math.sin(C);return Q.map(B=>B.map(([B,E])=>[A.rx+B*g-E*I,A.ry+B*I+E*g]))}function FB(A,B){const E=IB([A]);return B.filter(A=>{const B=IB([A]);return B.maxX>=E.minX&&B.minX<=E.maxX&&B.maxY>=E.minY&&B.minY<=E.maxY})}function iB(A){const B=function(A){const{rawSpace:B,space:E}=A,s=Number(B.cell_cm)>0?Number(B.cell_cm):5,w=Array.isArray(B.walls)?B.walls:[],Q=c(B,E,I,.02*Y),C=W(B,E,s,Y,I),g=m(C),M=n(E,s,Y,2e-4*Y,g).all,F=e(C,E,w,Q.contour,R,s,Y,I);return{cellCm:s,walls:w,zero:Q,openings:C,extras:M,geometry:A.sharedWallGeometry||h(E.rooms,w,Q.contour,F,R,s,Y,I,M)}}(A),E=new Map;if(A.options.dimensions)for(const s of A.space.rooms){const w=C(s);if(!w)continue;const Q=s.id?A.resolveInnerContour?.(s.id):void 0;E.set(s,s.id&&(void 0===Q?g(A.space.rooms,s.id,B.walls,B.zero.contour,R,B.cellCm,Y,I,B.geometry.roomGeom,B.geometry.multiWallNodes):Q)||w)}const s=new Map;if(A.options.dimensions)for(const w of A.space.rooms){const Q=C(w);if(!Q)continue;const g=E.get(w)||Q,I=w.id?A.resolveRoomArea?.(w.id,g):void 0,Y=Number.isFinite(I)?[]:FB(g,B.extras),R=Y.length?M(g,Y):null,i=Number.isFinite(I)&&I>=0?I:R?F(R):Math.abs(g.reduce((A,B,E)=>{const s=g[(E+1)%g.length];return A+B[0]*s[1]-s[0]*B[1]},0)/2);s.set(w,i)}const w=[..."failed-core"===B.geometry.status?A.space.rooms.map(A=>C(A)||[]).filter(A=>A.length):B.geometry.components.flatMap(A=>i(A.geom)),...B.zero.lines.map(A=>[[A[0],A[1]],[A[2],A[3]]])];A.options.decor&&w.push(...function(A){const B=[];for(const E of A.decor||[])"line"===E.kind?B.push([[E.x1*I,E.y1*I],[E.x2*I,E.y2*I]]):"text"!==E.kind?B.push(L(E).map(([A,B])=>[A*I,B*I])):B.push([[E.x*I,E.y*I]]);return B}(A.rawSpace));for(const B of A.rasters||[])w.push(RB(B.x,B.y,B.drawWidth,B.drawHeight,B.angle));let Q=IB(w);var x;[(x=Q).minX,x.minY,x.maxX,x.maxY].every(Number.isFinite)&&x.maxX>x.minX&&x.maxY>x.minY||(Q={minX:0,minY:0,maxX:I,maxY:I});return{built:B,dimensionContours:E,roomAreas:s,bounds:Q,cmPerUnit:B.cellCm/Y}}function xB(A,B,E,s){const{built:w,dimensionContours:Q,roomAreas:g,bounds:M,cmPerUnit:F}=B,c=(s?297:210)*$A,W=(s?210:297)*$A,m=12*$A,n=18*$A,e=24*$A,h=F*(10*$A)/E,j=(M.maxX-M.minX)*h,H=(M.maxY-M.minY)*h,v=m+n,V=W-v-m-e,U=c-2*m,a=A=>[0+(A[0]-M.minX)*h,0+(A[1]-M.minY)*h],P=(A,B)=>[M.minX+(A-0)/h,M.minY+(B-0)/h],y=A=>{const B=P(A.minX,A.minY),E=P(A.maxX,A.maxY);return{minX:B[0],minY:B[1],maxX:E[0],maxY:E[1]}},u=w.geometry.components.flatMap(A=>i(A.geom)),N=A=>w.geometry.components.some(B=>S([...A],B.geom)),K=A=>function(A,B,E){if(!LA(A)||!mA(B))return!0;const s=DA(A);return!!s.some(E)||!!B.some(B=>B.some(B=>xA(B)&&bA(B,A)))||nA(B,(A,B)=>s.some((E,w)=>null!==WA(A,B,E,s[(w+1)%s.length])))}(y(function(A,B){const E=Number.isFinite(B)&&B>=0?B:0;return{minX:A.minX-E,minY:A.minY-E,maxX:A.maxX+E,maxY:A.maxY+E}}(A,$A-1e-6)),u,N),d=(A,B)=>function(A,B,E){if(!LA(A)||!mA([B]))return!1;const s=DA(A);return!!s.every(E)&&!nA([B],(A,B)=>s.some((E,w)=>null!==WA(A,B,E,s[(w+1)%s.length])))}(y(A),B,A=>Z([...A],B)),J=(A,B,E={})=>function(A,B,E,s,w={}){if(!xA(A)||!xA(B)||!mA(E))return!0;if(w.allowStartExit){const w=tA(A,B);if(w<=iA)return!0;const Q=nA(E,(B,E)=>cA(A,B,E));if(!Q)return!0;const C=[];nA(E,(E,s)=>{const w=WA(A,B,E,s);return w&&C.push(w),!1});const g=iA/w,I=[0,1,...C.flatMap(A=>[A.t,A.endT])].sort((A,B)=>A-B).filter((A,B,E)=>0===B||A-E[B-1]>g),Y=E=>[A[0]+(B[0]-A[0])*E,A[1]+(B[1]-A[1])*E],R=A=>C.some(B=>B.overlap&&A>B.t+g&&AA.t>M+g||A.endT>M+g)}const Q=[(A[0]+B[0])/2,(A[1]+B[1])/2],C=nA(E,(B,E)=>cA(A,B,E));return!((!s(A)||w.allowStartBoundary&&C)&&!s(Q)&&!s(B))||nA(E,(E,s)=>{const Q=WA(A,B,E,s);return!!Q&&(Q.overlap||!w.allowStartBoundary||!C||Q.t*tA(A,B)>iA)})}(P(A[0],A[1]),P(B[0],B[1]),u,N,E),T=(A,B,E)=>{const s=A.x*I,w=A.y*I,Q=A.w*I,C=A.h*I,g=s+Q/2,Y=w+C/2,R=s+(A.flip_h?Q:0),F=w+(A.flip_v?C:0),i=(A.flip_h?-1:1)*Q/B,x=(A.flip_v?-1:1)*C/E,b=(Number(A.angle)||0)*Math.PI/180,L=Math.cos(b),D=Math.sin(b),G=Y+D*(R-g)+L*(F-Y);return{a:h*L*i,b:h*D*i,c:-h*D*x,d:h*L*x,e:0+(g+L*(R-g)-D*(F-Y)-M.minX)*h,f:0+(G-M.minY)*h}};let f=[];const z=[],O=function(A,B){const E=3*$A*Math.SQRT2,s=[];for(let w=-B;w<=A+E;w+=E)s.push([[w,0],[w+B,B]]);return s}(c,W);for(const B of A.rasters||[])f.push({kind:"image",imageId:B.id,...a([B.x,B.y]).reduce((A,B,E)=>({...A,[E?"y":"x"]:B}),{}),width:B.drawWidth*h,height:B.drawHeight*h,angle:B.angle,opacity:B.opacity});for(const A of w.geometry.components)f.push({kind:"path",rings:i(A.geom).map(A=>A.map(a)),fill:BB,stroke:AB,width:.25*$A,hatch:{lines:O,stroke:AB,width:.18*$A}});if("failed-core"===w.geometry.status)for(const B of A.space.rooms){const A=C(B);A&&f.push({kind:"path",rings:[A.map(a)],stroke:AB,width:.25*$A})}for(const A of w.zero.lines)f.push({kind:"line",points:[a([A[0],A[1]]),a([A[2],A[3]])],stroke:AB,width:.35*$A,dash:[3*$A,2*$A]});const q=w.geometry.openingIndex;for(const B of w.openings){const E=B.partitionHost?{cm:B.partitionHost.partition.cm}:q?x(A.space.rooms,B,w.walls,R,w.cellCm,Y,I,w.zero.contour):{cm:0};for(const A of MB(B,E.cm,w.cellCm))f.push({kind:"line",points:A.map(a),stroke:AB,width:.3*$A})}if(A.options.decor)for(const B of A.rawSpace.decor||[])if("image"!==B.kind)if("line"===B.kind)f.push({kind:"line",points:[a([B.x1*I,B.y1*I]),a([B.x2*I,B.y2*I])],stroke:AB,width:Math.max(.2*$A,10*Number(B.width_cm||1)*$A/E),dash:"dashed"===B.line_style?[3*$A,2*$A]:void 0});else if("text"===B.kind)f.push({kind:"text",...(()=>{const[A,E]=a([B.x*I,B.y*I]);return{x:A,y:E}})(),text:B.text,size:Math.max(6,10*Number(B.size_cm||20)*$A/E),angle:Number(B.angle)||0});else if("furniture"===B.kind){const A=r[B.symbol];A?f.push({kind:"vector",ops:YA(A.d,T(B,A.viewW,A.viewH)),stroke:AB,width:Math.max(.2*$A,10*b(B,w.cellCm,Y)*$A/E)}):f.push({kind:"path",rings:[L(B).map(([A,B])=>a([A*I,B*I]))],stroke:AB,width:.25*$A})}else{const A="ellipse"===B.kind?YB(B.x*I,B.y*I,B.w*I,B.h*I,Number(B.angle)||0):L(B).map(([A,B])=>[A*I,B*I]);f.push({kind:"path",rings:[A.map(a)],stroke:AB,width:.25*$A})}if(A.options.dimensions&&w.geometry.roomGeom)for(const[B,E]of D(w.geometry.roomGeom).entries()){const s=l(F),w=(A,B,E)=>{const s=a(A.sourceA),w=a(A.sourceB),Q=a(A.a),C=a(A.b),g=(6+E)*$A,I=[Q[0]+B[0]*g,Q[1]+B[1]*g],Y=[C[0]+B[0]*g,C[1]+B[1]*g],R=[(I[0]+Y[0])/2,(I[1]+Y[1])/2],M=PA(A.text,7)+2*$A>Math.hypot(Y[0]-I[0],Y[1]-I[1]),F=QB(wB(R[0],R[1],A.text,7,A.angle,"center"),R[0],R[1],B,$A),i=[R[0]+B[0]*F,R[1]+B[1]*F];return{edge:A,a:s,b:w,oa:I,ob:Y,middle:R,label:i,box:wB(i[0],i[1],A.text,7,A.angle,"center"),needsShelf:M}},Q=A=>{const B=[{start:A.oa,end:A.ob},{start:A.a,end:A.oa,allowStartExit:!0},{start:A.b,end:A.ob,allowStartExit:!0}];return A.needsShelf&&B.push({start:A.middle,end:A.label,mayEnterOwnLabel:!0}),B},C=A=>K(A.box)||Q(A).some(A=>J(A.start,A.end,{allowStartBoundary:A.allowStartBoundary,allowStartExit:A.allowStartExit})),g=EA(k(E,F,A.imperial,{ringIndex:B,epsilon:s}),{ring:E,epsilon:s,score:A=>{const B=[-A.inwardNormal[0],-A.inwardNormal[1]],E=a(A.mid),s=Array.from({length:21},(A,B)=>4*B).find(E=>!C(w(A,B,E))),Q=E[0]+(U-j)/2,g=E[1]+(V-H)/2;return{hardCollisions:void 0===s?21:s/4,normalClearance:Math.abs(B[0])>.5?B[0]>0?U-Q:Q:B[1]>0?V-g:g}}});for(const A of X(g,s)){const B=A.map(A=>({edge:A,outward:[-A.inwardNormal[0],-A.inwardNormal[1]]})),E=A=>B.map(({edge:B,outward:E})=>w(B,E,A));let s=null;for(let A=0;A<=80&&!s;A+=4){const B=E(A),w=B.some((A,E)=>B.slice(0,E).some(B=>sB(A.box,B.box))),g=B.some(A=>C(A)||z.some(B=>sB(A.box,B))),I=B.some((A,E)=>Q(A).some(A=>z.some(B=>eA(A.start,A.end,B))||B.some((B,s)=>(!A.mayEnterOwnLabel||s!==E)&&eA(A.start,A.end,B.box))));w||g||I||(s=B)}if(s)for(const A of s)f.push({kind:"line",points:[A.oa,A.ob],stroke:AB,width:.2*$A},{kind:"line",points:[A.a,A.oa],stroke:AB,width:.15*$A},{kind:"line",points:[A.b,A.ob],stroke:AB,width:.15*$A}),A.needsShelf&&f.push({kind:"line",points:[A.middle,A.label],stroke:AB,width:.15*$A}),f.push({kind:"text",x:A.label[0],y:A.label[1],text:A.edge.text,size:_A,angle:A.edge.angle,align:"center"}),z.push(A.box)}}const $=[...A.space.rooms].sort((A,B)=>String(A.id||"").localeCompare(String(B.id||"")));for(const[B,E]of $.entries()){const s=C(E);if(!s)continue;const w=Q.get(E)||s,I=g.get(E)||0,Y=G(E,A.space.id,A.layout,A.config),[R,M]=a([Y.x,Y.y]),i=w.map(a),x=IB([i]);let b=!1;if(A.options.roomNames&&E.name){const A=Math.max(0,x.maxX-x.minX-4*$A),B=PA(E.name,6.75)<=A?6.75:PA(E.name,5.25)<=A?5.25:0;B&&(f.push({kind:"text",x:R,y:M-2,text:E.name,size:B,align:"center"}),z.push(wB(R,M-2,E.name,B,0,"center")),b=!0)}if(A.options.dimensions){const B=o(I*F*F/1e4,A.imperial),E=M+(b?8:0);f.push({kind:"text",x:R,y:E,text:B,size:6,align:"center"}),z.push(wB(R,E,B,8,0,"center"))}if(A.options.dimensions){const E=l(F),s=EA(p(w,F,A.imperial,{ringIndex:B,epsilon:E}),{ring:w,epsilon:E,score:A=>{const B=a(A.mid),E=QB(wB(B[0],B[1],A.text,_A,A.angle,"center"),B[0],B[1],A.inwardNormal,$A),s=wB(B[0]+A.inwardNormal[0]*E,B[1]+A.inwardNormal[1]*E,A.text,7,A.angle,"center"),w="horizontal"===A.axis?A.inwardNormal[1]>0?x.maxY-B[1]:B[1]-x.minY:A.inwardNormal[0]>0?x.maxX-B[0]:B[0]-x.minX;return{hardCollisions:Number(K(s))+z.reduce((A,B)=>A+Number(sB(s,B)),0),normalClearance:w}}});for(const A of s.filter(A=>A.short)){const B=A.inwardNormal,E=a(A.a),s=a(A.b),w=(E[0]+s[0])/2,Q=(E[1]+s[1])/2;f.push({kind:"line",points:[[w-1.5*B[0]*$A,Q-1.5*B[1]*$A],[w+1.5*B[0]*$A,Q+1.5*B[1]*$A]],stroke:AB,width:.2*$A})}const Q=new Map;for(const A of s.filter(A=>!A.short)){const B=CB(A,A.inwardNormal),E=Q.get(B)||[];E.push(A),Q.set(B,E)}for(const A of Q.values()){let B=null;for(let E=0;E<=30&&!B;E+=3){const s=A.map(A=>{const B=a(A.mid),s=QB(wB(B[0],B[1],A.text,_A,A.angle,"center"),B[0],B[1],A.inwardNormal,(1+E)*$A),w=B[0]+A.inwardNormal[0]*s,Q=B[1]+A.inwardNormal[1]*s;return{edge:A,x:w,y:Q,box:wB(w,Q,A.text,_A,A.angle,"center")}}),Q=s.some((A,B)=>s.slice(0,B).some(B=>sB(A.box,B.box))),C=s.some(A=>K(A.box)||z.some(B=>sB(A.box,B))),g=s.every(A=>d(A.box,w));Q||C||!g||(B=s)}if(B)for(const A of B)f.push({kind:"text",x:A.x,y:A.y,text:A.edge.text,size:_A,angle:A.edge.angle,align:"center"}),z.push(A.box)}}}const _={minX:m,minY:v,maxX:c-m,maxY:v+V},AA=XA(f),BA=OA(AA,{minX:0,minY:0,maxX:U,maxY:V},.5*$A),sA=function(A,B){const E=XA(A);if(!ZA(E))return{commands:[...A],bounds:E,dx:0,dy:0};const s=(B.minX+B.maxX-E.minX-E.maxX)/2,w=(B.minY+B.maxY-E.minY-E.maxY)/2,Q=function(A,B,E){return A.map(A=>"path"===A.kind?{...A,rings:A.rings.map(A=>A.map(([A,s])=>[A+B,s+E]))}:"line"===A.kind?{...A,points:A.points.map(([A,s])=>[A+B,s+E])}:"vector"===A.kind?{...A,ops:A.ops.map(A=>((A,B,E)=>"M"===A.op||"L"===A.op?{...A,x:A.x+B,y:A.y+E}:"C"===A.op?{...A,x1:A.x1+B,y1:A.y1+E,x2:A.x2+B,y2:A.y2+E,x:A.x+B,y:A.y+E}:A)(A,B,E))}:{...A,x:A.x+B,y:A.y+E})}(A,s,w);return{commands:Q,bounds:{minX:E.minX+s,minY:E.minY+w,maxX:E.maxX+s,maxY:E.maxY+w},dx:s,dy:w}}(f,_);f=sA.commands,f.push({kind:"text",x:m,y:m+10,text:A.space.title,size:14}),A.cardTitle&&f.push({kind:"text",x:c-m,y:m+10,text:A.cardTitle,size:10,align:"right"});const wA=W-m-13*$A;f.push({kind:"line",points:[[m,wA-4*$A],[c-m,wA-4*$A]],stroke:EB,width:.2*$A}),f.push({kind:"text",x:m,y:wA,text:A.t("pdf.scale",{n:E}),size:8});const QA=10*(A.imperial?152.4:100)*$A/E,CA=wA+8;f.push({kind:"line",points:[[m,CA],[m+QA,CA]],stroke:AB,width:.4*$A});for(let A=0;A<=4;A++){const B=m+QA*A/4;f.push({kind:"line",points:[[B,CA-2],[B,CA+2]],stroke:AB,width:.25*$A})}f.push({kind:"text",x:m+QA/2,y:wA+17,text:A.imperial?"5 ft":"1 m",size:7,align:"center"});const gA=t(A.config.settings,A.rawSpace.settings||{});if(null!==gA){const B=c/2,E=wA+5.5*$A;f.push({kind:"vector",ops:FA({centerX:B,centerY:E,size:11*$A,northDeg:gA}),fill:AB,width:0,fillRule:"evenodd"}),f.push({kind:"text",x:B,y:wA,text:A.t("pdf.north"),size:7,align:"center"})}f.push({kind:"text",x:c-m,y:wA+12,text:`${qA(A.now)} · House Plan v${A.version}`,size:7,align:"right"});const IA={width:c,height:W,commands:f,images:(A.rasters||[]).map(({id:A,bytes:B,width:E,height:s})=>({id:A,bytes:B,width:E,height:s})),now:A.now,scale:E,sceneBounds:sA.bounds,planField:_},RA=Math.max(0,TA(AA))*Math.max(0,fA(AA)),MA=U*V;return{page:IA,sceneBounds:sA.bounds,field:_,fits:BA,fillRatio:MA>0?RA/MA:0,landscape:s}}function bB(A,B){return A.fillRatio!==B.fillRatio?A.fillRatio>B.fillRatio?A:B:A.landscape?B:A}function LB(A,B,E){const s=12*$A,w=(E?297:210)*$A-2*s,Q=(E?210:297)*$A-2*s-18*$A-24*$A,C=A.cmPerUnit*(10*$A)/B;return(A.bounds.maxX-A.bounds.minX)*C<=w+.5*$A&&(A.bounds.maxY-A.bounds.minY)*C<=Q+.5*$A}function DB(A){let B=0;for(const E of A)if(B+=Math.max(0,Number(E)||0),B>26214400)throw new Error("pdf.too_large")}const GB="4da0d706a85c3f1c08ab6de960deb5feb08baaf9055265234e7bd1b554332653";async function oB(A,B){if(!A)throw new Error("pdf.asset_failed");const E=await fetch(A,{credentials:"same-origin"});if(!E.ok)throw new Error("pdf.asset_failed");const s=await E.blob();let w;try{w=await createImageBitmap(s)}catch{throw new Error("pdf.asset_failed")}try{if("image/jpeg"===s.type)return{id:B,bytes:new Uint8Array(await s.arrayBuffer()),width:w.width,height:w.height};const A=document.createElement("canvas");A.width=w.width,A.height=w.height;const E=A.getContext("2d");if(!E)throw new Error("pdf.asset_failed");E.fillStyle="#fff",E.fillRect(0,0,A.width,A.height),E.drawImage(w,0,0);const Q=await new Promise(B=>A.toBlob(B,"image/jpeg",.85));if(!Q)throw new Error("pdf.asset_failed");return{id:B,bytes:new Uint8Array(await Q.arrayBuffer()),width:w.width,height:w.height}}finally{w.close()}}async function tB(A,B,E){const s=await async function(A,B){const E=[];if(B.backdrop&&A.space.bg){const B=await oB(A.backdropUrl,"backdrop");E.push({...B,x:A.space.bg.x,y:A.space.bg.y,drawWidth:A.space.bg.w,drawHeight:A.space.bg.h,angle:A.space.bg.angle,opacity:.6})}if(B.decor){let B=0;for(const s of A.rawSpace.decor||[]){if("image"!==s.kind)continue;const w=A.decorAssets.get(s.asset_id),Q=j(s,I,I);if(!w||!Q)throw new Error("pdf.asset_failed");const C=await oB(w.url,"decor"+B++);E.push({...C,x:Q[0],y:Q[1],drawWidth:Q[2],drawHeight:Q[3],opacity:Q[4],angle:Number(s.angle)||0})}}return DB(E.map(A=>A.bytes.byteLength)),E}(A,B),w=JA(function(A){const B=iB(A);let E=[];for(const s of wA){const w=[!1,!0].filter(A=>LB(B,s,A)).map(E=>xB(A,B,s,E));if(!w.length)continue;const Q=w.filter(A=>A.fits);if(Q.length)return Q.reduce(bB).page;E=w}E.length||(E=[!1,!0].map(E=>xB(A,B,500,E)));const s=E.filter(A=>A.fits);if(s.length)return s.reduce(bB).page;const w=Math.min(...E.map(A=>Math.max(TA(A.sceneBounds)/TA(A.field),fA(A.sceneBounds)/fA(A.field)))),Q=50,C=1e6,g=Number.isFinite(w)?Math.ceil(Math.min(C,500*Math.max(1,w))/Q)*Q:C;let I=500,Y=0,R=[],M=Math.max(550,g);for(;M<=C;){const E=[!1,!0].map(E=>xB(A,B,M,E)).filter(A=>A.fits);if(E.length){Y=M,R=E;break}if(I=M,M===C)break;M=Math.min(C,Math.ceil(2*M/Q)*Q)}if(!Y)throw new Error("pdf.failed");let F=Math.floor(I/Q),i=Math.floor(Y/Q);for(;i-F>1;){const E=Math.floor((F+i)/2),s=[!1,!0].map(s=>xB(A,B,E*Q,s)).filter(A=>A.fits);s.length?(i=E,R=s):F=E}const x=R.reduce(bB).page;if(!OA(x.sceneBounds,x.planField,.5*$A))throw new Error("pdf.failed");return x}({...A,options:B,now:E,rasters:s,t:A.t})),Q=new Blob([w],{type:"application/pdf"}),C=URL.createObjectURL(Q);try{const B=document.createElement("a");B.href=C,B.download=`houseplan-${g=A.space.title,g.normalize("NFKD").replace(/[^\p{L}\p{N}]+/gu,"-").replace(/^-|-$/g,"").toLowerCase()||"space"}-${qA(E)}.pdf`,B.style.display="none",document.body.append(B),B.click(),B.remove()}finally{setTimeout(()=>URL.revokeObjectURL(C),0)}var g;return w}class cB{assertRasterBudget(A){DB(A)}render(A){let B;return B={...A,save:async E=>{await tB(A,E,B.now||new Date)}},s``}}export{GB as PDF_EXPORT_FINGERPRINT,cB as PdfExportRuntime,tB as exportSpacePdf};
diff --git a/dist/houseplan-assets/summary-panel-editor-AdqXisOL.js b/custom_components/houseplan/frontend/houseplan-assets/summary-panel-editor-DqzNDRFv.js
similarity index 97%
rename from dist/houseplan-assets/summary-panel-editor-AdqXisOL.js
rename to custom_components/houseplan/frontend/houseplan-assets/summary-panel-editor-DqzNDRFv.js
index 216cedc2..2584c448 100644
--- a/dist/houseplan-assets/summary-panel-editor-AdqXisOL.js
+++ b/custom_components/houseplan/frontend/houseplan-assets/summary-panel-editor-DqzNDRFv.js
@@ -1,4 +1,4 @@
-globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="34d1dbfc181acaf58842dfced0e6aa3a899aef6b8d1eeba53732ef729a63137e";import{c as a,A as e}from"./houseplan-card-BKJrmMEj.js";import{s,n as t,a as l,m as r,b as o,c as i,d as u}from"./summary-panel-runtime-loaded-B6QGWMyY.js";const m=m=>{const{host:c,dialog:d,problems:n,t:b}=m,y=n.find(a=>"error"===a.kind),$=d.localShow!==d.baseLocalShow||!d.localOnly&&!s(t(d.draft),d.base),p=$&&!d.busy&&!y,v=a=>n.find(e=>e.path===a),h=a=>a?b(`summary.problem.${a.code}`):"",k=()=>m.close(),g=a`
+globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="4da0d706a85c3f1c08ab6de960deb5feb08baaf9055265234e7bd1b554332653";import{c as a,A as e}from"./houseplan-card-CAm75-22.js";import{s,n as t,a as l,m as r,b as o,c as i,d as u}from"./summary-panel-runtime-loaded-DU9JvYSv.js";const m=m=>{const{host:c,dialog:d,problems:n,t:b}=m,y=n.find(a=>"error"===a.kind),$=d.localShow!==d.baseLocalShow||!d.localOnly&&!s(t(d.draft),d.base),p=$&&!d.busy&&!y,v=a=>n.find(e=>e.path===a),h=a=>a?b(`summary.problem.${a.code}`):"",k=()=>m.close(),g=a`${b("summary.show_local")}
${b("summary.show_local_hint")}
0&&null===i.area?"":i.area||d||"",f=u&&e.areaToSpace[u]||i.space||e.firstSpaceId;c&&e.registry.devices?.[c]&&e.spaceIds.has(f)&&(!n.devices.has(c)||"entity"===r&&n.liveEntities.has(s))&&t.add(c)}return t}function y(e,t){return e?.length?t?.length?g(e,t):e:t}function _(e,t){const n=l(e.rooms,t.walls,t.openCuts,[],i,t.cellCm,o,r);return{roomGeom:"ok"===n.status||"degraded-extra"===n.status?n.roomGeom:void 0,multiWallNodes:c(e.rooms,t.walls,t.openCuts,i,t.cellCm,o,r)}}function*b(l,c,d=_){try{let u=0;for(const f of c){const c=l.spaces.find(e=>String(e?.id)===f.id);if(!c)continue;const m=e(c,f),g=d(f,m);let v=null;for(const e of f.rooms){if(!e.id)continue;const a=t(e);if(!a)continue;const l=n(f.rooms,e.id,m.walls,m.openCuts,i,m.cellCm,o,r,g.roomGeom,g.multiWallNodes)||a;v=y(v,s(l,m.physicalBodies)),yield}const _=m.cellCm/o;u+=a(v)*_*_/1e4}return u}catch{return null}}function h(e,t,n=_){const i=b(e,t,n);let o=i.next();for(;!o.done;)o=i.next();return o.value}function p(e,t,n,i){if("system"!==e.type)return null;if("device_count"===e.key)return null===t.deviceCount?null:String(t.deviceCount);if("total_area"===e.key)return null===t.areaM2?null:m(t.areaM2,"mi"===n?.config?.unit_system?.length);try{return new Intl.DateTimeFormat(i||void 0,{dateStyle:"short",timeStyle:"short",timeZone:n?.config?.time_zone||void 0}).format(t.now)}catch{return t.now.toLocaleString()}}function S(e,t){const n=e?.states?.[t];if(!n)return null;const i=u(e,t);return i?f(i,String(n.attributes?.unit_of_measurement||"")):null}export{b as cleanFloorAreaSteps,v as representedHaDeviceIds,_ as spaceWallGeometry,S as summaryEntityValue,p as summarySystemValue,h as totalCleanFloorAreaM2};
diff --git a/custom_components/houseplan/frontend/houseplan-assets/summary-panel-metrics-Opp08Jxc.js b/custom_components/houseplan/frontend/houseplan-assets/summary-panel-metrics-Opp08Jxc.js
deleted file mode 100644
index 10b912b6..00000000
--- a/custom_components/houseplan/frontend/houseplan-assets/summary-panel-metrics-Opp08Jxc.js
+++ /dev/null
@@ -1 +0,0 @@
-globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="34d1dbfc181acaf58842dfced0e6aa3a899aef6b8d1eeba53732ef729a63137e";import{ed as e,P as t,a5 as n,M as i,aq as r,N as o,bs as a,br as s,a4 as l,a3 as c,aA as d,ee as u,ef as f,bu as m,eg as g}from"./houseplan-card-BKJrmMEj.js";function v(e){if(!e.registry.authoritative)return null;const t=new Set,n=d(e.markers);for(const i of Object.values(e.registry.devices||{}))i?.id&&"service"!==i.entry_type&&!n.devices.has(i.id)&&i.area_id&&e.areaToSpace[i.area_id]&&t.add(i.id);for(const i of e.markers||[]){if(i.removed||"virtual"===i.binding)continue;const r=String(i.binding||"").indexOf(":");if(r<1)continue;const o=i.binding.slice(0,r),a=i.binding.slice(r+1),s="device"===o?e.registry.devices?.[a]:null,l="entity"===o?e.registry.entities?.[a]:null,c="device"===o?a:l?.device_id,d="device"===o?s?.area_id:l?.area_id||c&&e.registry.devices?.[c]?.area_id,u="string"==typeof i.room_id&&i.room_id.length>0&&null===i.area?"":i.area||d||"",f=u&&e.areaToSpace[u]||i.space||e.firstSpaceId;c&&e.registry.devices?.[c]&&e.spaceIds.has(f)&&(!n.devices.has(c)||"entity"===o&&n.liveEntities.has(a))&&t.add(c)}return t}function y(e,t){return e?.length?t?.length?g(e,t):e:t}function _(e,t){const n=l(e.rooms,t.walls,t.openCuts,[],i,t.cellCm,r,o);return{roomGeom:"ok"===n.status||"degraded-extra"===n.status?n.roomGeom:void 0,multiWallNodes:c(e.rooms,t.walls,t.openCuts,i,t.cellCm,r,o)}}function*h(l,c,d=_){try{let u=0;for(const f of c){const c=l.spaces.find(e=>String(e?.id)===f.id);if(!c)continue;const m=e(c,f),g=d(f,m);let v=null;for(const e of f.rooms){if(!e.id)continue;const s=t(e);if(!s)continue;const l=n(f.rooms,e.id,m.walls,m.openCuts,i,m.cellCm,r,o,g.roomGeom,g.multiWallNodes)||s;v=y(v,a(l,m.physicalBodies)),yield}const _=m.cellCm/r;u+=s(v)*_*_/1e4}return u}catch{return null}}function p(e,t,n=_){const i=h(e,t,n);let r=i.next();for(;!r.done;)r=i.next();return r.value}function b(e,t,n,i){if("system"!==e.type)return null;if("device_count"===e.key)return null===t.deviceCount?null:String(t.deviceCount);if("total_area"===e.key)return null===t.areaM2?null:m(t.areaM2,"mi"===n?.config?.unit_system?.length);try{return new Intl.DateTimeFormat(i||void 0,{dateStyle:"short",timeStyle:"short",timeZone:n?.config?.time_zone||void 0}).format(t.now)}catch{return t.now.toLocaleString()}}function S(e,t){const n=e?.states?.[t];if(!n)return null;const i=u(e,t);return i?f(i,String(n.attributes?.unit_of_measurement||"")):null}export{h as cleanFloorAreaSteps,v as representedHaDeviceIds,_ as spaceWallGeometry,S as summaryEntityValue,b as summarySystemValue,p as totalCleanFloorAreaM2};
diff --git a/dist/houseplan-assets/summary-panel-runtime-loaded-B6QGWMyY.js b/custom_components/houseplan/frontend/houseplan-assets/summary-panel-runtime-loaded-DU9JvYSv.js
similarity index 93%
rename from dist/houseplan-assets/summary-panel-runtime-loaded-B6QGWMyY.js
rename to custom_components/houseplan/frontend/houseplan-assets/summary-panel-runtime-loaded-DU9JvYSv.js
index 2f97f266..aef16324 100644
--- a/dist/houseplan-assets/summary-panel-runtime-loaded-B6QGWMyY.js
+++ b/custom_components/houseplan/frontend/houseplan-assets/summary-panel-runtime-loaded-DU9JvYSv.js
@@ -1,4 +1,4 @@
-globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="34d1dbfc181acaf58842dfced0e6aa3a899aef6b8d1eeba53732ef729a63137e";import{w as e,A as t,c as s,l as r,ec as i,bf as a,be as o}from"./houseplan-card-BKJrmMEj.js";const n=Object.freeze({blocks:10,values:20,title:48,label:64}),l=e=>"string"==typeof e?e.trim():"",m=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),c=e=>!!e&&"object"==typeof e;function u(e){return`${e}-${globalThis.crypto?.randomUUID?.()||`${Date.now().toString(36)}-${Math.random().toString(36).slice(2)}`}`}function d(e){return{version:1,title:e("summary.default_title"),show_on_mobile:!0,blocks:[{id:"summary-default",title:e("summary.default_block"),visible:!0,scope:{type:"all"},values:[{id:"summary-device-count",label:e("summary.system.device_count"),source:{type:"system",key:"device_count"}},{id:"summary-total-area",label:e("summary.system.total_area"),source:{type:"system",key:"total_area"}},{id:"summary-datetime",label:e("summary.system.datetime"),source:{type:"system",key:"datetime"}}]}]}}function h(e){if(!c(e))return!1;const t=e;return!(1!==t.version||"string"!=typeof t.title||"boolean"!=typeof t.show_on_mobile||!Array.isArray(t.blocks))&&t.blocks.every(e=>{if(!c(e)||"string"!=typeof e.id||"string"!=typeof e.title||"boolean"!=typeof e.visible||!c(e.scope)||!Array.isArray(e.values))return!1;const t=e.scope;return("all"===t.type||"space"===t.type&&"string"==typeof t.space_id)&&e.values.every(e=>{if(!c(e)||"string"!=typeof e.id||"string"!=typeof e.label||!c(e.source))return!1;const t=e.source;return"entity"===t.type&&"string"==typeof t.entity_id||"system"===t.type&&"string"==typeof t.key&&["device_count","total_area","datetime"].includes(t.key)})})}function y(e){return structuredClone(e)}function p(e,t){return e.blocks.filter(e=>e.visible&&("all"===e.scope.type||"space"===e.scope.type&&e.scope.space_id===t))}function g(e,t,s,r){const i=[],a=function(e){const t=new Map,s=new Map;for(const r of e?.blocks||[]){"space"===r.scope.type&&t.set(r.id,r.scope.space_id);for(const e of r.values)"entity"===e.source.type&&s.set(e.id,e.source.entity_id)}return{scopes:t,sources:s}}(t),o=new Set,m=new Set,c=(e,t,s)=>{const r=l(e);r?(e=>[...e].length)(r)>t&&i.push({path:s,kind:"error",code:"limit"}):i.push({path:s,kind:"error",code:"required"})};return c(e.title,n.title,"title"),e.blocks.length>n.blocks&&i.push({path:"blocks",kind:"error",code:"limit"}),e.blocks.forEach((e,t)=>{const u=`blocks.${t}`;if(c(e.id,n.label,`${u}.id`),c(e.title,n.title,`${u}.title`),o.has(e.id)&&i.push({path:`${u}.id`,kind:"error",code:"duplicate_id"}),o.add(e.id),"space"===e.scope.type){const t=l(e.scope.space_id);t?s.has(t)||i.push({path:`${u}.scope`,kind:a.scopes.get(e.id)===t?"warning":"error",code:"missing_space"}):i.push({path:`${u}.scope`,kind:"error",code:"required"})}else"all"!==e.scope.type&&i.push({path:`${u}.scope`,kind:"error",code:"required"});e.values.length>n.values&&i.push({path:`${u}.values`,kind:"error",code:"limit"}),e.values.forEach((e,t)=>{const s=`${u}.values.${t}`;if(c(e.id,n.label,`${s}.id`),c(e.label,n.label,`${s}.label`),m.has(e.id)&&i.push({path:`${s}.id`,kind:"error",code:"duplicate_id"}),m.add(e.id),"entity"===e.source.type){const t=l(e.source.entity_id);t?r.has(t)||i.push({path:`${s}.source`,kind:a.sources.get(e.id)===t?"warning":"error",code:"missing_entity"}):i.push({path:`${s}.source`,kind:"error",code:"required"})}else"system"===e.source.type&&["device_count","total_area","datetime"].includes(e.source.key)||i.push({path:`${s}.source`,kind:"error",code:"invalid_source"})})}),i}function f(e){return{...e,version:1,title:l(e.title),show_on_mobile:!1!==e.show_on_mobile,blocks:e.blocks.map(e=>({...e,id:l(e.id),title:l(e.title),visible:!1!==e.visible,scope:"space"===e.scope.type?{...e.scope,type:"space",space_id:l(e.scope.space_id)}:{...e.scope,type:"all"},values:e.values.map(e=>({...e,id:l(e.id),label:l(e.label),source:"entity"===e.source.type?{...e.source,type:"entity",entity_id:l(e.source.entity_id)}:{...e.source,type:"system",key:e.source.key}}))}))}}function b(e){const t=e.showOnMobile||!1===e.narrow;return e.view&&e.localShow&&t&&e.fits}function v(e){const t=Number(e);return Number.isFinite(t)?Math.max(.5,Math.min(3,Math.round(20*t)/20)):1}function _(e,t){return JSON.stringify(e)===JSON.stringify(t)}function w(e,t,s){if(t<0||t>=e.length||s<0||s>=e.length||t===s)return[...e];const r=[...e],[i]=r.splice(t,1);return r.splice(s,0,i),r}function x(e){return{id:u("b"),title:e("summary.new_block"),visible:!0,scope:{type:"all"},values:[]}}function k(e){return{id:u("v"),label:"",source:{type:"entity",entity_id:""}}}const S=String.raw`
+globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="4da0d706a85c3f1c08ab6de960deb5feb08baaf9055265234e7bd1b554332653";import{aB as e,A as t,c as s,l as r,ec as i,bH as a,bG as o}from"./houseplan-card-CAm75-22.js";const n=Object.freeze({blocks:10,values:20,title:48,label:64}),l=e=>"string"==typeof e?e.trim():"",m=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),c=e=>!!e&&"object"==typeof e;function u(e){return`${e}-${globalThis.crypto?.randomUUID?.()||`${Date.now().toString(36)}-${Math.random().toString(36).slice(2)}`}`}function d(e){return{version:1,title:e("summary.default_title"),show_on_mobile:!0,blocks:[{id:"summary-default",title:e("summary.default_block"),visible:!0,scope:{type:"all"},values:[{id:"summary-device-count",label:e("summary.system.device_count"),source:{type:"system",key:"device_count"}},{id:"summary-total-area",label:e("summary.system.total_area"),source:{type:"system",key:"total_area"}},{id:"summary-datetime",label:e("summary.system.datetime"),source:{type:"system",key:"datetime"}}]}]}}function h(e){if(!c(e))return!1;const t=e;return!(1!==t.version||"string"!=typeof t.title||"boolean"!=typeof t.show_on_mobile||!Array.isArray(t.blocks))&&t.blocks.every(e=>{if(!c(e)||"string"!=typeof e.id||"string"!=typeof e.title||"boolean"!=typeof e.visible||!c(e.scope)||!Array.isArray(e.values))return!1;const t=e.scope;return("all"===t.type||"space"===t.type&&"string"==typeof t.space_id)&&e.values.every(e=>{if(!c(e)||"string"!=typeof e.id||"string"!=typeof e.label||!c(e.source))return!1;const t=e.source;return"entity"===t.type&&"string"==typeof t.entity_id||"system"===t.type&&"string"==typeof t.key&&["device_count","total_area","datetime"].includes(t.key)})})}function y(e){return structuredClone(e)}function p(e,t){return e.blocks.filter(e=>e.visible&&("all"===e.scope.type||"space"===e.scope.type&&e.scope.space_id===t))}function g(e,t,s,r){const i=[],a=function(e){const t=new Map,s=new Map;for(const r of e?.blocks||[]){"space"===r.scope.type&&t.set(r.id,r.scope.space_id);for(const e of r.values)"entity"===e.source.type&&s.set(e.id,e.source.entity_id)}return{scopes:t,sources:s}}(t),o=new Set,m=new Set,c=(e,t,s)=>{const r=l(e);r?(e=>[...e].length)(r)>t&&i.push({path:s,kind:"error",code:"limit"}):i.push({path:s,kind:"error",code:"required"})};return c(e.title,n.title,"title"),e.blocks.length>n.blocks&&i.push({path:"blocks",kind:"error",code:"limit"}),e.blocks.forEach((e,t)=>{const u=`blocks.${t}`;if(c(e.id,n.label,`${u}.id`),c(e.title,n.title,`${u}.title`),o.has(e.id)&&i.push({path:`${u}.id`,kind:"error",code:"duplicate_id"}),o.add(e.id),"space"===e.scope.type){const t=l(e.scope.space_id);t?s.has(t)||i.push({path:`${u}.scope`,kind:a.scopes.get(e.id)===t?"warning":"error",code:"missing_space"}):i.push({path:`${u}.scope`,kind:"error",code:"required"})}else"all"!==e.scope.type&&i.push({path:`${u}.scope`,kind:"error",code:"required"});e.values.length>n.values&&i.push({path:`${u}.values`,kind:"error",code:"limit"}),e.values.forEach((e,t)=>{const s=`${u}.values.${t}`;if(c(e.id,n.label,`${s}.id`),c(e.label,n.label,`${s}.label`),m.has(e.id)&&i.push({path:`${s}.id`,kind:"error",code:"duplicate_id"}),m.add(e.id),"entity"===e.source.type){const t=l(e.source.entity_id);t?r.has(t)||i.push({path:`${s}.source`,kind:a.sources.get(e.id)===t?"warning":"error",code:"missing_entity"}):i.push({path:`${s}.source`,kind:"error",code:"required"})}else"system"===e.source.type&&["device_count","total_area","datetime"].includes(e.source.key)||i.push({path:`${s}.source`,kind:"error",code:"invalid_source"})})}),i}function f(e){return{...e,version:1,title:l(e.title),show_on_mobile:!1!==e.show_on_mobile,blocks:e.blocks.map(e=>({...e,id:l(e.id),title:l(e.title),visible:!1!==e.visible,scope:"space"===e.scope.type?{...e.scope,type:"space",space_id:l(e.scope.space_id)}:{...e.scope,type:"all"},values:e.values.map(e=>({...e,id:l(e.id),label:l(e.label),source:"entity"===e.source.type?{...e.source,type:"entity",entity_id:l(e.source.entity_id)}:{...e.source,type:"system",key:e.source.key}}))}))}}function b(e){const t=e.showOnMobile||!1===e.narrow;return e.view&&e.localShow&&t&&e.fits}function v(e){const t=Number(e);return Number.isFinite(t)?Math.max(.5,Math.min(3,Math.round(20*t)/20)):1}function _(e,t){return JSON.stringify(e)===JSON.stringify(t)}function w(e,t,s){if(t<0||t>=e.length||s<0||s>=e.length||t===s)return[...e];const r=[...e],[i]=r.splice(t,1);return r.splice(s,0,i),r}function x(e){return{id:u("b"),title:e("summary.new_block"),visible:!0,scope:{type:"all"},values:[]}}function k(e){return{id:u("v"),label:"",source:{type:"entity",entity_id:""}}}const S=String.raw`
hp-dialog[data-kind='summary'] {
--hp-dialog-wide-width: 920px;
--ha-dialog-width-md: 920px;
@@ -677,4 +677,4 @@ globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="34d1dbfc181acaf58842dfced0e6aa3a899a
@click=${()=>this.saveLocal({show:!this.local.show})}>
${C("sidebar")}
-
`}renderDialog(){return this.dialog&&this.editorRenderer?(this.dialog.localOnly||this.refreshEntityIndex(),this.editorRenderer({host:this.host,dialog:this.dialog,local:this.local,storageUnavailable:this.storageUnavailable,problems:this.problems(this.dialog),entityIndex:this.entityIndex||O({},null),setDialog:e=>{this.dialog=e,this.host.requestUpdate()},saveLocal:e=>this.saveLocal(e),mutate:e=>this.mutate(e),deleteBlock:e=>{this.deleteBlock(e)},dragStart:(e,t)=>this.dragStart(e,t),drop:(e,t)=>this.drop(e,t),sourceToken:e=>this.sourceToken(e),openSource:(e,t)=>this.openSource(e,t),closeSource:e=>this.closeSource(e),setSource:(e,t,s)=>this.setSource(e,t,s),save:()=>{this.saveDialog()},reload:()=>{this.reloadDialog()},close:()=>this.closeDialogIfIdle(),t:e=>this.t(e)})):t}t(e){return e.startsWith("summary.")?function(e,t){const s=e.toLowerCase().split("-")[0];return(T[s]||T.en)[t]||T.en[t]||t}(r(this.host.hass,this.host._config?.language),e):this.host._t(e)}ensureStyle(){const e=this.host.renderRoot;if(this.styleSheet&&e.adoptedStyleSheets.includes(this.styleSheet))return;const t=this.host.ownerDocument.defaultView?.CSSStyleSheet;if(t&&"adoptedStyleSheets"in e){const s=new t;return s.replaceSync(M),this.styleSheet=s,void(e.adoptedStyleSheets=[...e.adoptedStyleSheets,s])}if(e.querySelector("style[data-hp-summary]"))return;const s=this.host.ownerDocument.createElement("style");s.dataset.hpSummary="true",s.textContent=M,e.insertBefore(s,e.firstChild)}ensureDialogStyle(){const e=this.host.renderRoot.querySelector('hp-dialog[data-kind="summary"]')?.shadowRoot;if(!e||this.styledDialogRoots.has(e))return;const t=this.host.ownerDocument.defaultView?.CSSStyleSheet;if(t&&"adoptedStyleSheets"in e)this.dialogStyleSheet||(this.dialogStyleSheet=new t,this.dialogStyleSheet.replaceSync($)),e.adoptedStyleSheets=[...e.adoptedStyleSheets,this.dialogStyleSheet];else{const t=this.host.ownerDocument.createElement("style");t.dataset.hpSummaryShell="true",t.textContent=$,e.appendChild(t)}this.styledDialogRoots.add(e)}placementSlot(){return N(this.host)}preferenceKey(){return function(e){const t=l(e.userId),s=l(e.slot);return t&&s?`houseplan.summary-panel.v1:${[t,l(e.path)||"/",l(e.host)||"card",s].map(e=>encodeURIComponent(e)).join(":")}`:null}({userId:this.host.hass?.user?.id||this.host.hass?.user?.name,path:location.pathname,host:this.host.panelHost?"panel":"lovelace",slot:this.placementSlot()})}identity(){return JSON.stringify({key:this.preferenceKey(),user:this.host.hass?.user?.id||this.host.hass?.user?.name||"",route:location.pathname,host:this.host.panelHost?"panel":"lovelace",slot:this.placementSlot(),kiosk:this.host._kiosk,canManage:this.host._canManageConfiguration})}syncLifecycle(){const e=this.identity();this.lifecycleIdentity&&e!==this.lifecycleIdentity&&this.resetLifecycle(),this.lifecycleIdentity=e}resetLifecycle(){this.presentation.reset(),this.lifecycleGeneration++,this.dialog=null,this.entityIndex=null,this.deviceMemo=null,this.areaMemo=null,this.clockContext="",this.storageKey=null,this.storageUnavailable=!1,this.local={version:1,show:!1,icon_scale:1,font_scale:1},this.clockTimer&&clearTimeout(this.clockTimer),this.clockTimer=0,this.lifecycleIdentity=this.connected?this.identity():"",this.host.requestUpdate()}current(e){return this.connected&&e===this.lifecycleGeneration&&this.lifecycleIdentity===this.identity()}refreshEntityIndex(){this.entityIndex=O(this.host.hass?.states,this.entityIndex)}syncNativeNarrow(){if(this.host.panelHost)return;let e=this.host;for(let t=0;e&&t<12;t++){const t=e.getRootNode();if(e=e.parentNode||(t instanceof ShadowRoot?t.host:null),!e||e===this.host)continue;const s=e.narrow;if("boolean"==typeof s)return void(this.host.narrow!==s&&(this.host.narrow=s))}}loadLocal(){const e=this.preferenceKey();if(!e||e===this.storageKey)return;let t=null,s=null,r=!0;try{t=JSON.parse(localStorage.getItem(e)||"null")}catch{r=!1}try{s=JSON.parse(localStorage.getItem("houseplan_card_kiosk_v1")||"null")}catch{r=!1}this.storageKey=e,this.storageUnavailable=!r,this.local=function(e,t){const s=e&&"object"==typeof e?e:{},r=t&&"object"==typeof t?t:{};return{version:1,show:!0===s.show,icon_scale:v(m(s,"icon_scale")?s.icon_scale:r.icon),font_scale:v(m(s,"font_scale")?s.font_scale:r.font)}}(t,s),this.host._kioskScale={icon:this.local.icon_scale,font:this.local.font_scale}}saveLocal(e){this.local={...this.local,...e,version:1,icon_scale:v(e.icon_scale??this.local.icon_scale),font_scale:v(e.font_scale??this.local.font_scale)},this.host._kioskScale={icon:this.local.icon_scale,font:this.local.font_scale},this.storageKey||=this.preferenceKey();let t=!1;try{this.storageKey&&(localStorage.setItem(this.storageKey,JSON.stringify(this.local)),t=!0)}catch{}this.storageUnavailable=!t,t||this.host._showToast?.(this.t("summary.storage_unavailable")),this.host.requestUpdate()}config(){return function(e,t){const s=e?.summary_panel;return void 0===s?{config:d(t),derived:!0,unsupported:!1}:h(s)?{config:s,derived:!1,unsupported:!1}:{config:null,derived:!1,unsupported:!0}}(this.host._settings,this.translate)}async openDialog(){const e=this.lifecycleGeneration;this.loadLocal();try{this.editorLoad||=import("./summary-panel-editor-AdqXisOL.js").then(e=>e.renderSummaryPanelEditor),this.editorRenderer=await this.editorLoad}catch(t){if(this.editorLoad=null,!this.current(e))return;return void this.host._showToast?.(`${this.t("summary.load_failed")} ${this.host._errText(t)}`)}if(!this.current(e))return;const t=this.config(),s=t.config||d(this.translate),r=this.host._haSummaryPanelApi!==i,a=t.unsupported?"summary.unsupported_schema":r&&this.host._canManageConfiguration?"summary.backend_required":"summary.local_only";this.dialog={draft:y(s),base:y(s),baseRevision:this.host._cfgRev,localShow:this.local.show,baseLocalShow:this.local.show,localOnly:this.host._kiosk||!this.host._canManageConfiguration||r||t.unsupported,localOnlyHint:a,busy:!1,attempted:!1,entityFilter:"",activeSource:null,error:"",conflict:!1},this.dialog.localOnly||this.refreshEntityIndex(),this.host.requestUpdate()}problems(e=this.dialog){return!e||e.localOnly?[]:g(f(e.draft),e.base,new Set(this.host._model.map(e=>e.id)),new Set(Object.keys(this.host.hass?.states||{})))}mutate(e){if(!this.dialog||this.dialog.busy||this.dialog.localOnly)return;const t=y(this.dialog.draft);e(t);const s=this.dialog.activeSource,r=!s||t.blocks.some(e=>e.id===s.blockId&&e.values.some(e=>e.id===s.valueId));this.dialog={...this.dialog,draft:t,error:"",conflict:!1,activeSource:r?s:null,entityFilter:r?this.dialog.entityFilter:""},this.host.requestUpdate()}async deleteBlock(e){const t=this.dialog?.draft.blocks[e];if(!t)return;const s=this.lifecycleGeneration;if(t.values.length){if(!await this.host._confirmDanger({key:"summary-block",kind:"warning",title:this.t("summary.delete_block_title"),message:this.t("summary.delete_block_body"),objectName:t.title,confirmLabel:this.t("btn.delete"),cancelLabel:this.t("btn.cancel")})||!this.current(s))return}this.mutate(e=>{const s=e.blocks.findIndex(e=>e.id===t.id);s>=0&&e.blocks.splice(s,1)})}sourceToken(e){return"system"===e.type?`system:${e.key}`:`entity:${e.entity_id}`}openSource(e,t){!this.dialog||this.dialog.busy||this.dialog.localOnly||(this.refreshEntityIndex(),this.dialog={...this.dialog,activeSource:{blockId:e,valueId:t},entityFilter:""},this.host.requestUpdate(),this.host.updateComplete.then(()=>{this.dialog?.activeSource?.blockId===e&&this.dialog.activeSource.valueId===t&&this.host.renderRoot.querySelector("[data-summary-picker-search]")?.focus()}))}closeSource(e=!1){const t=this.dialog?.activeSource;this.dialog&&t&&(this.dialog={...this.dialog,activeSource:null,entityFilter:""},this.host.requestUpdate(),e&&this.focusSource(t.blockId,t.valueId))}async focusSource(e,t){await this.host.updateComplete;const s=`${e}\n${t}`,r=this.host.renderRoot.querySelectorAll("[data-summary-source-owner]");[...r].find(e=>e.dataset.summarySourceOwner===s)?.focus()}setSource(e,t,s){this.mutate(r=>{const i=r.blocks.find(t=>t.id===e)?.values.find(e=>e.id===t);if(i)if(s.startsWith("system:")){const e=s.slice(7);(e=>"device_count"===e||"total_area"===e||"datetime"===e)(e)&&(i.source={type:"system",key:e})}else i.source={type:"entity",entity_id:s.startsWith("entity:")?s.slice(7):s}}),this.dialog&&(this.dialog={...this.dialog,activeSource:null,entityFilter:""}),this.host.requestUpdate(),this.focusSource(e,t)}dragStart(e,t){e.dataTransfer?.setData("text/x-houseplan-summary",t),e.dataTransfer&&(e.dataTransfer.effectAllowed="move")}drop(e,t){e.preventDefault(),e.stopPropagation();const s=e.dataTransfer?.getData("text/x-houseplan-summary")||"",r=s.split(":").map(Number),i=t.split(":").map(Number);s.startsWith("block:")&&t.startsWith("block:")?this.mutate(e=>{e.blocks=w(e.blocks,r[1],i[1])}):s.startsWith("value:")&&t.startsWith("value:")&&r[1]===i[1]&&this.mutate(e=>{e.blocks[r[1]].values=w(e.blocks[r[1]].values,r[2],i[2])})}async saveDialog(){const e=this.dialog;if(!e||e.busy)return;const t=this.lifecycleGeneration,s=f(e.draft);if((e.localOnly?[]:g(s,e.base,new Set(this.host._model.map(e=>e.id)),new Set(Object.keys(this.host.hass?.states||{})))).some(e=>"error"===e.kind))return this.dialog={...e,draft:s,attempted:!0},this.host.requestUpdate(),await this.host.updateComplete,void this.host.renderRoot.querySelector('[data-summary-error="true"]')?.focus?.();this.dialog={...e,draft:s,busy:!0,attempted:!1,error:"",conflict:!1},this.host.requestUpdate();try{if(!e.localOnly&&!_(s,e.base)){this.host._writesPending++;const r=a(this.host._writeChain,async()=>{if(!this.current(t))return;if(!this.host._serverCfg)throw new Error(this.t("summary.save_failed"));if(this.host._cfgRev!==e.baseRevision)throw new Error(this.t("summary.conflict"));const r=o({...this.host._serverCfg,settings:{...this.host._serverCfg.settings||{},summary_panel:s}});let i=!1;try{if(await this.host._sendConfigCandidate(r),!this.current(t))return}catch(e){if(!this.current(t))throw e;try{const r=await this.host._getAuthoritativeConfig();if(!this.current(t))throw e;const a=function(e,t){if(!c(e))return null;const s=e.config,r=e.rev;if(!c(s)||!Array.isArray(s.spaces)||"number"!=typeof r||!Number.isSafeInteger(r)||r<0)return null;const i=c(s.settings)?s.settings:null,a=i?.summary_panel;return h(a)&&_(a,t)?{config:s,rev:r}:null}(r,s);if(!a)throw e;const o=await this.host._adoptAuthoritative({cfgResp:r,reason:"summary-recovery",profile:"reload"});if("adopted"!==o.status)throw e;o.spaceChanged&&this.host._restoreZoom(),this.host._regSignature="",this.host._maybeRebuildDevices(),i=!0}catch{throw e}}if(!i){if(!this.current(t))return;this.host._adoption.stageConfigCandidate(r),this.host._cacheSnapshot()}});this.host._writeChain=r,await r.finally(()=>{this.host._writesPending--})}if(!this.current(t))return;this.saveLocal({show:e.localShow}),this.dialog=null}catch(s){if(!this.current(t))return;const r="conflict"===s?.code||this.host._cfgRev!==e.baseRevision;this.dialog={...this.dialog||e,busy:!1,conflict:r,error:r?this.t("summary.conflict"):this.host._errText(s)}}this.current(t)&&this.host.requestUpdate()}async reloadDialog(){const e=this.dialog;if(!e||e.busy)return;const t=this.lifecycleGeneration;this.dialog={...e,busy:!0,error:"",conflict:!1},this.host.requestUpdate();try{if(await this.host._reloadConfigOnly(!0),!this.current(t))return;if(e.conflict&&this.host._cfgRev===e.baseRevision)throw new Error(this.t("summary.load_failed"));const s=this.config().config||d(this.translate);this.dialog={...e,draft:y(s),base:y(s),baseRevision:this.host._cfgRev,busy:!1,attempted:!1,error:"",conflict:!1}}catch(s){if(!this.current(t))return;this.dialog={...e,busy:!1,error:this.host._errText(s),conflict:!0}}this.current(t)&&this.host.requestUpdate()}metricsFresh(){return!!this.deviceMemo&&!!this.areaMemo&&this.deviceMemo.cfgEpoch===this.host._cfgEpoch&&this.deviceMemo.layoutRev===this.host._layoutRev&&this.deviceMemo.registryRev===this.host._haRegistry.revision&&this.areaMemo.cfgEpoch===this.host._cfgEpoch}scheduleMetrics(){if(this.metricsRefresh||!this.metricsModule||this.metricsFresh())return;const e=this.lifecycleGeneration,t="undefined"==typeof window?void 0:window,s=()=>{if(this.metricsRefresh=0,!this.current(e))return;const t=this.advanceMetrics(8);this.host.requestUpdate(),t||this.scheduleMetrics()};this.metricsRefresh=t?.setTimeout(()=>{"function"==typeof t.requestAnimationFrame?t.requestAnimationFrame(()=>t.setTimeout(s,0)):s()},0)||0}advanceMetrics(e=8){const t=this.metricsModule;if(!t)return!0;if(this.computeDeviceCount(),!this.host._serverCfg)return this.areaMemo={cfgEpoch:this.host._cfgEpoch,value:null},!0;if(this.areaMemo&&this.areaMemo.cfgEpoch===this.host._cfgEpoch)return!0;this.areaSteps&&this.areaStepsEpoch===this.host._cfgEpoch||(this.areaSteps=t.cleanFloorAreaSteps(this.host._serverCfg,this.host._model),this.areaStepsEpoch=this.host._cfgEpoch);const s=Date.now();let r=this.areaSteps.next();for(;!r.done&&Date.now()-s[e,t.space])),spaceIds:new Set(this.host._model.map(e=>e.id)),firstSpaceId:this.host._model[0]?.id||"",markers:this.host._markers});this.deviceMemo={cfgEpoch:this.host._cfgEpoch,layoutRev:this.host._layoutRev,registryRev:this.host._haRegistry.revision,value:t?.size??null}}}computeMetrics(){for(;!this.advanceMetrics(Number.POSITIVE_INFINITY););}metrics(){return{deviceCount:this.deviceMemo?this.deviceMemo.value:null,areaM2:this.areaMemo?this.areaMemo.value:null,now:this.clock}}valueState(e){const t=this.metricsModule;if(!t)return{kind:"pending"};if("entity"===e.source.type){const s=t.summaryEntityValue(this.host.hass,e.source.entity_id);return null===s?{kind:"unavailable"}:{kind:"ready",text:s}}const s="device_count"===e.source.key||"total_area"===e.source.key,i="device_count"===e.source.key?this.deviceMemo:this.areaMemo;if(s&&!i)return this.scheduleMetrics(),{kind:"pending"};s&&this.scheduleMetrics();const a=t.summarySystemValue(e.source,this.metrics(),this.host.hass,r(this.host.hass,this.host._config?.language));return null===a?{kind:"unavailable"}:{kind:"ready",text:a}}value(e){const t=this.valueState(e);return"ready"===t.kind?t.text:this.t("summary.unavailable")}ensureMetrics(){if(this.metricsModule||this.metricsLoad)return;const e=this.lifecycleGeneration;this.metricsLoad=import("./summary-panel-metrics-Opp08Jxc.js"),this.metricsLoad.then(t=>{this.metricsModule=t,this.current(e)&&this.host.requestUpdate()}).catch(()=>{}).finally(()=>{this.metricsLoad=null})}layout(){return function(e){const t=Math.max(0,Number(e.width)||0),s=Math.max(0,Number(e.height)||0),r=t>=s?"right":"bottom",i=Math.max(0,e.safeLeft||0)+12,a=Math.max(0,e.safeRight||0)+12,o=Math.max(Math.max(0,e.safeTop||0)+12,e.controlTop||0),n=Math.max(Math.max(0,e.safeBottom||0)+12,e.controlBottom||0),l=Math.max(0,t-i-a),m=Math.max(0,s-o-n),c="bottom"===r?Math.min(.6*s,m):m;return{side:r,fits:t>0&&s>0&&l>=280&&c>=Math.max(0,e.minimumHeight),availableWidth:l,heightCap:c,top:o,bottom:n}}({width:this.stage.width,height:this.stage.height,...this.safeInsets(),controlTop:this.host._kiosk?this.stage.controlTop:0,minimumHeight:this.stage.minimumHeight})}syncPresentation(e=!1){const t=this.config().config,s=this.layout(),r=!!t&&"view"===this.host._mode&&s.fits&&b({view:!0,localShow:!0,showOnMobile:t.show_on_mobile,narrow:this.host.narrow,fits:!0});this.presentation.sync(r&&this.local.show,s.side,e||!r||"hidden"===this.host.ownerDocument.visibilityState)}measureLayout(){const e=this.host._stageEl;if(!e)return;const t=this.host.renderRoot.querySelector(".summary-measure"),s=this.host.renderRoot.querySelector(".summary-control.kiosk"),r=e.getBoundingClientRect(),i=s?.getBoundingClientRect(),a={width:Math.round(e.clientWidth),height:Math.round(e.clientHeight),minimumHeight:Math.max(162,Math.ceil(t?.getBoundingClientRect().height||0)),controlTop:i?Math.max(0,Math.ceil(i.bottom-r.top+12)):0};a.width===this.stage.width&&a.height===this.stage.height&&a.minimumHeight===this.stage.minimumHeight&&a.controlTop===this.stage.controlTop||(this.stage=a,this.host.requestUpdate())}safeInsets(){const e=this.host.renderRoot.querySelector(".summary-safe-probe");if(!e)return{safeLeft:0,safeRight:0,safeTop:0,safeBottom:0};const t=this.host.ownerDocument.defaultView?.getComputedStyle(e);if(!t)return{safeLeft:0,safeRight:0,safeTop:0,safeBottom:0};const s=e=>Number.parseFloat(e)||0;return{safeLeft:s(t.paddingLeft),safeRight:s(t.paddingRight),safeTop:s(t.paddingTop),safeBottom:s(t.paddingBottom)}}hasVisibleClock(){const e=this.config().config;return!("hidden"===this.host.ownerDocument.visibilityState||!e)&&(!!b({view:"view"===this.host._mode,localShow:this.local.show,showOnMobile:e.show_on_mobile,narrow:this.host.narrow,fits:this.layout().fits})&&p(e,this.host._space).some(e=>e.values.some(e=>"system"===e.source.type&&"datetime"===e.source.key)))}syncClock(){const e=`${r(this.host.hass,this.host._config?.language)}\n${this.host.hass?.config?.time_zone||""}`;e!==this.clockContext&&(this.clockContext=e,this.clock=new Date);const t=this.hasVisibleClock();if(t&&!this.clockTimer){this.clock=new Date;const e=()=>{this.clock=new Date,this.clockTimer=0,this.host.requestUpdate(),this.syncClock()};this.clockTimer=window.setTimeout(e,6e4-Date.now()%6e4+25)}else!t&&this.clockTimer&&(clearTimeout(this.clockTimer),this.clockTimer=0)}}});export{C as a,U as b,k as c,x as d,j as e,w as m,f as n,_ as s};
+ `}renderDialog(){return this.dialog&&this.editorRenderer?(this.dialog.localOnly||this.refreshEntityIndex(),this.editorRenderer({host:this.host,dialog:this.dialog,local:this.local,storageUnavailable:this.storageUnavailable,problems:this.problems(this.dialog),entityIndex:this.entityIndex||O({},null),setDialog:e=>{this.dialog=e,this.host.requestUpdate()},saveLocal:e=>this.saveLocal(e),mutate:e=>this.mutate(e),deleteBlock:e=>{this.deleteBlock(e)},dragStart:(e,t)=>this.dragStart(e,t),drop:(e,t)=>this.drop(e,t),sourceToken:e=>this.sourceToken(e),openSource:(e,t)=>this.openSource(e,t),closeSource:e=>this.closeSource(e),setSource:(e,t,s)=>this.setSource(e,t,s),save:()=>{this.saveDialog()},reload:()=>{this.reloadDialog()},close:()=>this.closeDialogIfIdle(),t:e=>this.t(e)})):t}t(e){return e.startsWith("summary.")?function(e,t){const s=e.toLowerCase().split("-")[0];return(T[s]||T.en)[t]||T.en[t]||t}(r(this.host.hass,this.host._config?.language),e):this.host._t(e)}ensureStyle(){const e=this.host.renderRoot;if(this.styleSheet&&e.adoptedStyleSheets.includes(this.styleSheet))return;const t=this.host.ownerDocument.defaultView?.CSSStyleSheet;if(t&&"adoptedStyleSheets"in e){const s=new t;return s.replaceSync(M),this.styleSheet=s,void(e.adoptedStyleSheets=[...e.adoptedStyleSheets,s])}if(e.querySelector("style[data-hp-summary]"))return;const s=this.host.ownerDocument.createElement("style");s.dataset.hpSummary="true",s.textContent=M,e.insertBefore(s,e.firstChild)}ensureDialogStyle(){const e=this.host.renderRoot.querySelector('hp-dialog[data-kind="summary"]')?.shadowRoot;if(!e||this.styledDialogRoots.has(e))return;const t=this.host.ownerDocument.defaultView?.CSSStyleSheet;if(t&&"adoptedStyleSheets"in e)this.dialogStyleSheet||(this.dialogStyleSheet=new t,this.dialogStyleSheet.replaceSync($)),e.adoptedStyleSheets=[...e.adoptedStyleSheets,this.dialogStyleSheet];else{const t=this.host.ownerDocument.createElement("style");t.dataset.hpSummaryShell="true",t.textContent=$,e.appendChild(t)}this.styledDialogRoots.add(e)}placementSlot(){return N(this.host)}preferenceKey(){return function(e){const t=l(e.userId),s=l(e.slot);return t&&s?`houseplan.summary-panel.v1:${[t,l(e.path)||"/",l(e.host)||"card",s].map(e=>encodeURIComponent(e)).join(":")}`:null}({userId:this.host.hass?.user?.id||this.host.hass?.user?.name,path:location.pathname,host:this.host.panelHost?"panel":"lovelace",slot:this.placementSlot()})}identity(){return JSON.stringify({key:this.preferenceKey(),user:this.host.hass?.user?.id||this.host.hass?.user?.name||"",route:location.pathname,host:this.host.panelHost?"panel":"lovelace",slot:this.placementSlot(),kiosk:this.host._kiosk,canManage:this.host._canManageConfiguration})}syncLifecycle(){const e=this.identity();this.lifecycleIdentity&&e!==this.lifecycleIdentity&&this.resetLifecycle(),this.lifecycleIdentity=e}resetLifecycle(){this.presentation.reset(),this.lifecycleGeneration++,this.dialog=null,this.entityIndex=null,this.deviceMemo=null,this.areaMemo=null,this.clockContext="",this.storageKey=null,this.storageUnavailable=!1,this.local={version:1,show:!1,icon_scale:1,font_scale:1},this.clockTimer&&clearTimeout(this.clockTimer),this.clockTimer=0,this.lifecycleIdentity=this.connected?this.identity():"",this.host.requestUpdate()}current(e){return this.connected&&e===this.lifecycleGeneration&&this.lifecycleIdentity===this.identity()}refreshEntityIndex(){this.entityIndex=O(this.host.hass?.states,this.entityIndex)}syncNativeNarrow(){if(this.host.panelHost)return;let e=this.host;for(let t=0;e&&t<12;t++){const t=e.getRootNode();if(e=e.parentNode||(t instanceof ShadowRoot?t.host:null),!e||e===this.host)continue;const s=e.narrow;if("boolean"==typeof s)return void(this.host.narrow!==s&&(this.host.narrow=s))}}loadLocal(){const e=this.preferenceKey();if(!e||e===this.storageKey)return;let t=null,s=null,r=!0;try{t=JSON.parse(localStorage.getItem(e)||"null")}catch{r=!1}try{s=JSON.parse(localStorage.getItem("houseplan_card_kiosk_v1")||"null")}catch{r=!1}this.storageKey=e,this.storageUnavailable=!r,this.local=function(e,t){const s=e&&"object"==typeof e?e:{},r=t&&"object"==typeof t?t:{};return{version:1,show:!0===s.show,icon_scale:v(m(s,"icon_scale")?s.icon_scale:r.icon),font_scale:v(m(s,"font_scale")?s.font_scale:r.font)}}(t,s),this.host._kioskScale={icon:this.local.icon_scale,font:this.local.font_scale}}saveLocal(e){this.local={...this.local,...e,version:1,icon_scale:v(e.icon_scale??this.local.icon_scale),font_scale:v(e.font_scale??this.local.font_scale)},this.host._kioskScale={icon:this.local.icon_scale,font:this.local.font_scale},this.storageKey||=this.preferenceKey();let t=!1;try{this.storageKey&&(localStorage.setItem(this.storageKey,JSON.stringify(this.local)),t=!0)}catch{}this.storageUnavailable=!t,t||this.host._showToast?.(this.t("summary.storage_unavailable")),this.host.requestUpdate()}config(){return function(e,t){const s=e?.summary_panel;return void 0===s?{config:d(t),derived:!0,unsupported:!1}:h(s)?{config:s,derived:!1,unsupported:!1}:{config:null,derived:!1,unsupported:!0}}(this.host._settings,this.translate)}async openDialog(){const e=this.lifecycleGeneration;this.loadLocal();try{this.editorLoad||=import("./summary-panel-editor-DqzNDRFv.js").then(e=>e.renderSummaryPanelEditor),this.editorRenderer=await this.editorLoad}catch(t){if(this.editorLoad=null,!this.current(e))return;return void this.host._showToast?.(`${this.t("summary.load_failed")} ${this.host._errText(t)}`)}if(!this.current(e))return;const t=this.config(),s=t.config||d(this.translate),r=this.host._haSummaryPanelApi!==i,a=t.unsupported?"summary.unsupported_schema":r&&this.host._canManageConfiguration?"summary.backend_required":"summary.local_only";this.dialog={draft:y(s),base:y(s),baseRevision:this.host._cfgRev,localShow:this.local.show,baseLocalShow:this.local.show,localOnly:this.host._kiosk||!this.host._canManageConfiguration||r||t.unsupported,localOnlyHint:a,busy:!1,attempted:!1,entityFilter:"",activeSource:null,error:"",conflict:!1},this.dialog.localOnly||this.refreshEntityIndex(),this.host.requestUpdate()}problems(e=this.dialog){return!e||e.localOnly?[]:g(f(e.draft),e.base,new Set(this.host._model.map(e=>e.id)),new Set(Object.keys(this.host.hass?.states||{})))}mutate(e){if(!this.dialog||this.dialog.busy||this.dialog.localOnly)return;const t=y(this.dialog.draft);e(t);const s=this.dialog.activeSource,r=!s||t.blocks.some(e=>e.id===s.blockId&&e.values.some(e=>e.id===s.valueId));this.dialog={...this.dialog,draft:t,error:"",conflict:!1,activeSource:r?s:null,entityFilter:r?this.dialog.entityFilter:""},this.host.requestUpdate()}async deleteBlock(e){const t=this.dialog?.draft.blocks[e];if(!t)return;const s=this.lifecycleGeneration;if(t.values.length){if(!await this.host._confirmDanger({key:"summary-block",kind:"warning",title:this.t("summary.delete_block_title"),message:this.t("summary.delete_block_body"),objectName:t.title,confirmLabel:this.t("btn.delete"),cancelLabel:this.t("btn.cancel")})||!this.current(s))return}this.mutate(e=>{const s=e.blocks.findIndex(e=>e.id===t.id);s>=0&&e.blocks.splice(s,1)})}sourceToken(e){return"system"===e.type?`system:${e.key}`:`entity:${e.entity_id}`}openSource(e,t){!this.dialog||this.dialog.busy||this.dialog.localOnly||(this.refreshEntityIndex(),this.dialog={...this.dialog,activeSource:{blockId:e,valueId:t},entityFilter:""},this.host.requestUpdate(),this.host.updateComplete.then(()=>{this.dialog?.activeSource?.blockId===e&&this.dialog.activeSource.valueId===t&&this.host.renderRoot.querySelector("[data-summary-picker-search]")?.focus()}))}closeSource(e=!1){const t=this.dialog?.activeSource;this.dialog&&t&&(this.dialog={...this.dialog,activeSource:null,entityFilter:""},this.host.requestUpdate(),e&&this.focusSource(t.blockId,t.valueId))}async focusSource(e,t){await this.host.updateComplete;const s=`${e}\n${t}`,r=this.host.renderRoot.querySelectorAll("[data-summary-source-owner]");[...r].find(e=>e.dataset.summarySourceOwner===s)?.focus()}setSource(e,t,s){this.mutate(r=>{const i=r.blocks.find(t=>t.id===e)?.values.find(e=>e.id===t);if(i)if(s.startsWith("system:")){const e=s.slice(7);(e=>"device_count"===e||"total_area"===e||"datetime"===e)(e)&&(i.source={type:"system",key:e})}else i.source={type:"entity",entity_id:s.startsWith("entity:")?s.slice(7):s}}),this.dialog&&(this.dialog={...this.dialog,activeSource:null,entityFilter:""}),this.host.requestUpdate(),this.focusSource(e,t)}dragStart(e,t){e.dataTransfer?.setData("text/x-houseplan-summary",t),e.dataTransfer&&(e.dataTransfer.effectAllowed="move")}drop(e,t){e.preventDefault(),e.stopPropagation();const s=e.dataTransfer?.getData("text/x-houseplan-summary")||"",r=s.split(":").map(Number),i=t.split(":").map(Number);s.startsWith("block:")&&t.startsWith("block:")?this.mutate(e=>{e.blocks=w(e.blocks,r[1],i[1])}):s.startsWith("value:")&&t.startsWith("value:")&&r[1]===i[1]&&this.mutate(e=>{e.blocks[r[1]].values=w(e.blocks[r[1]].values,r[2],i[2])})}async saveDialog(){const e=this.dialog;if(!e||e.busy)return;const t=this.lifecycleGeneration,s=f(e.draft);if((e.localOnly?[]:g(s,e.base,new Set(this.host._model.map(e=>e.id)),new Set(Object.keys(this.host.hass?.states||{})))).some(e=>"error"===e.kind))return this.dialog={...e,draft:s,attempted:!0},this.host.requestUpdate(),await this.host.updateComplete,void this.host.renderRoot.querySelector('[data-summary-error="true"]')?.focus?.();this.dialog={...e,draft:s,busy:!0,attempted:!1,error:"",conflict:!1},this.host.requestUpdate();try{if(!e.localOnly&&!_(s,e.base)){this.host._writesPending++;const r=a(this.host._writeChain,async()=>{if(!this.current(t))return;if(!this.host._serverCfg)throw new Error(this.t("summary.save_failed"));if(this.host._cfgRev!==e.baseRevision)throw new Error(this.t("summary.conflict"));const r=o({...this.host._serverCfg,settings:{...this.host._serverCfg.settings||{},summary_panel:s}});let i=!1;try{if(await this.host._sendConfigCandidate(r),!this.current(t))return}catch(e){if(!this.current(t))throw e;try{const r=await this.host._getAuthoritativeConfig();if(!this.current(t))throw e;const a=function(e,t){if(!c(e))return null;const s=e.config,r=e.rev;if(!c(s)||!Array.isArray(s.spaces)||"number"!=typeof r||!Number.isSafeInteger(r)||r<0)return null;const i=c(s.settings)?s.settings:null,a=i?.summary_panel;return h(a)&&_(a,t)?{config:s,rev:r}:null}(r,s);if(!a)throw e;const o=await this.host._adoptAuthoritative({cfgResp:r,reason:"summary-recovery",profile:"reload"});if("adopted"!==o.status)throw e;o.spaceChanged&&this.host._restoreZoom(),this.host._regSignature="",this.host._maybeRebuildDevices(),i=!0}catch{throw e}}if(!i){if(!this.current(t))return;this.host._adoption.stageConfigCandidate(r),this.host._cacheSnapshot()}});this.host._writeChain=r,await r.finally(()=>{this.host._writesPending--})}if(!this.current(t))return;this.saveLocal({show:e.localShow}),this.dialog=null}catch(s){if(!this.current(t))return;const r="conflict"===s?.code||this.host._cfgRev!==e.baseRevision;this.dialog={...this.dialog||e,busy:!1,conflict:r,error:r?this.t("summary.conflict"):this.host._errText(s)}}this.current(t)&&this.host.requestUpdate()}async reloadDialog(){const e=this.dialog;if(!e||e.busy)return;const t=this.lifecycleGeneration;this.dialog={...e,busy:!0,error:"",conflict:!1},this.host.requestUpdate();try{if(await this.host._reloadConfigOnly(!0),!this.current(t))return;if(e.conflict&&this.host._cfgRev===e.baseRevision)throw new Error(this.t("summary.load_failed"));const s=this.config().config||d(this.translate);this.dialog={...e,draft:y(s),base:y(s),baseRevision:this.host._cfgRev,busy:!1,attempted:!1,error:"",conflict:!1}}catch(s){if(!this.current(t))return;this.dialog={...e,busy:!1,error:this.host._errText(s),conflict:!0}}this.current(t)&&this.host.requestUpdate()}metricsFresh(){return!!this.deviceMemo&&!!this.areaMemo&&this.deviceMemo.cfgEpoch===this.host._cfgEpoch&&this.deviceMemo.layoutRev===this.host._layoutRev&&this.deviceMemo.registryRev===this.host._haRegistry.revision&&this.areaMemo.cfgEpoch===this.host._cfgEpoch}scheduleMetrics(){if(this.metricsRefresh||!this.metricsModule||this.metricsFresh())return;const e=this.lifecycleGeneration,t="undefined"==typeof window?void 0:window,s=()=>{if(this.metricsRefresh=0,!this.current(e))return;const t=this.advanceMetrics(8);this.host.requestUpdate(),t||this.scheduleMetrics()};this.metricsRefresh=t?.setTimeout(()=>{"function"==typeof t.requestAnimationFrame?t.requestAnimationFrame(()=>t.setTimeout(s,0)):s()},0)||0}advanceMetrics(e=8){const t=this.metricsModule;if(!t)return!0;if(this.computeDeviceCount(),!this.host._serverCfg)return this.areaMemo={cfgEpoch:this.host._cfgEpoch,value:null},!0;if(this.areaMemo&&this.areaMemo.cfgEpoch===this.host._cfgEpoch)return!0;this.areaSteps&&this.areaStepsEpoch===this.host._cfgEpoch||(this.areaSteps=t.cleanFloorAreaSteps(this.host._serverCfg,this.host._model),this.areaStepsEpoch=this.host._cfgEpoch);const s=Date.now();let r=this.areaSteps.next();for(;!r.done&&Date.now()-s[e,t.space])),spaceIds:new Set(this.host._model.map(e=>e.id)),firstSpaceId:this.host._model[0]?.id||"",markers:this.host._markers});this.deviceMemo={cfgEpoch:this.host._cfgEpoch,layoutRev:this.host._layoutRev,registryRev:this.host._haRegistry.revision,value:t?.size??null}}}computeMetrics(){for(;!this.advanceMetrics(Number.POSITIVE_INFINITY););}metrics(){return{deviceCount:this.deviceMemo?this.deviceMemo.value:null,areaM2:this.areaMemo?this.areaMemo.value:null,now:this.clock}}valueState(e){const t=this.metricsModule;if(!t)return{kind:"pending"};if("entity"===e.source.type){const s=t.summaryEntityValue(this.host.hass,e.source.entity_id);return null===s?{kind:"unavailable"}:{kind:"ready",text:s}}const s="device_count"===e.source.key||"total_area"===e.source.key,i="device_count"===e.source.key?this.deviceMemo:this.areaMemo;if(s&&!i)return this.scheduleMetrics(),{kind:"pending"};s&&this.scheduleMetrics();const a=t.summarySystemValue(e.source,this.metrics(),this.host.hass,r(this.host.hass,this.host._config?.language));return null===a?{kind:"unavailable"}:{kind:"ready",text:a}}value(e){const t=this.valueState(e);return"ready"===t.kind?t.text:this.t("summary.unavailable")}ensureMetrics(){if(this.metricsModule||this.metricsLoad)return;const e=this.lifecycleGeneration;this.metricsLoad=import("./summary-panel-metrics-CmOL1oNs.js"),this.metricsLoad.then(t=>{this.metricsModule=t,this.current(e)&&this.host.requestUpdate()}).catch(()=>{}).finally(()=>{this.metricsLoad=null})}layout(){return function(e){const t=Math.max(0,Number(e.width)||0),s=Math.max(0,Number(e.height)||0),r=t>=s?"right":"bottom",i=Math.max(0,e.safeLeft||0)+12,a=Math.max(0,e.safeRight||0)+12,o=Math.max(Math.max(0,e.safeTop||0)+12,e.controlTop||0),n=Math.max(Math.max(0,e.safeBottom||0)+12,e.controlBottom||0),l=Math.max(0,t-i-a),m=Math.max(0,s-o-n),c="bottom"===r?Math.min(.6*s,m):m;return{side:r,fits:t>0&&s>0&&l>=280&&c>=Math.max(0,e.minimumHeight),availableWidth:l,heightCap:c,top:o,bottom:n}}({width:this.stage.width,height:this.stage.height,...this.safeInsets(),controlTop:this.host._kiosk?this.stage.controlTop:0,minimumHeight:this.stage.minimumHeight})}syncPresentation(e=!1){const t=this.config().config,s=this.layout(),r=!!t&&"view"===this.host._mode&&s.fits&&b({view:!0,localShow:!0,showOnMobile:t.show_on_mobile,narrow:this.host.narrow,fits:!0});this.presentation.sync(r&&this.local.show,s.side,e||!r||"hidden"===this.host.ownerDocument.visibilityState)}measureLayout(){const e=this.host._stageEl;if(!e)return;const t=this.host.renderRoot.querySelector(".summary-measure"),s=this.host.renderRoot.querySelector(".summary-control.kiosk"),r=e.getBoundingClientRect(),i=s?.getBoundingClientRect(),a={width:Math.round(e.clientWidth),height:Math.round(e.clientHeight),minimumHeight:Math.max(162,Math.ceil(t?.getBoundingClientRect().height||0)),controlTop:i?Math.max(0,Math.ceil(i.bottom-r.top+12)):0};a.width===this.stage.width&&a.height===this.stage.height&&a.minimumHeight===this.stage.minimumHeight&&a.controlTop===this.stage.controlTop||(this.stage=a,this.host.requestUpdate())}safeInsets(){const e=this.host.renderRoot.querySelector(".summary-safe-probe");if(!e)return{safeLeft:0,safeRight:0,safeTop:0,safeBottom:0};const t=this.host.ownerDocument.defaultView?.getComputedStyle(e);if(!t)return{safeLeft:0,safeRight:0,safeTop:0,safeBottom:0};const s=e=>Number.parseFloat(e)||0;return{safeLeft:s(t.paddingLeft),safeRight:s(t.paddingRight),safeTop:s(t.paddingTop),safeBottom:s(t.paddingBottom)}}hasVisibleClock(){const e=this.config().config;return!("hidden"===this.host.ownerDocument.visibilityState||!e)&&(!!b({view:"view"===this.host._mode,localShow:this.local.show,showOnMobile:e.show_on_mobile,narrow:this.host.narrow,fits:this.layout().fits})&&p(e,this.host._space).some(e=>e.values.some(e=>"system"===e.source.type&&"datetime"===e.source.key)))}syncClock(){const e=`${r(this.host.hass,this.host._config?.language)}\n${this.host.hass?.config?.time_zone||""}`;e!==this.clockContext&&(this.clockContext=e,this.clock=new Date);const t=this.hasVisibleClock();if(t&&!this.clockTimer){this.clock=new Date;const e=()=>{this.clock=new Date,this.clockTimer=0,this.host.requestUpdate(),this.syncClock()};this.clockTimer=window.setTimeout(e,6e4-Date.now()%6e4+25)}else!t&&this.clockTimer&&(clearTimeout(this.clockTimer),this.clockTimer=0)}}});export{C as a,U as b,k as c,x as d,j as e,w as m,f as n,_ as s};
diff --git a/custom_components/houseplan/frontend/houseplan-assets/zigbee-topology-CW_HKDoT.js b/custom_components/houseplan/frontend/houseplan-assets/zigbee-topology-CW_HKDoT.js
deleted file mode 100644
index 8cd3d12d..00000000
--- a/custom_components/houseplan/frontend/houseplan-assets/zigbee-topology-CW_HKDoT.js
+++ /dev/null
@@ -1 +0,0 @@
-globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="34d1dbfc181acaf58842dfced0e6aa3a899aef6b8d1eeba53732ef729a63137e";import{s as e,F as n}from"./houseplan-card-BKJrmMEj.js";var t={title:"Zigbee links",toggle:"Show Zigbee links when hovering over a device",hint:"Shows observed direct neighbours only. Nothing is fetched while you hover.",help:"Shows which Zigbee devices each device talks to directly. Line colour is link quality (LQI) on the same scale as the device's LQI reading: red at 40 and below, green at 180 and above. A dashed line means quality was not reported. An arrow points to the next device on the way to the coordinator: one arrow leads out, incoming arrows are the devices that route through this one. A line without an arrow is a spare neighbour. This is the route tree House Plan builds, not the path a packet takes right now: a label at the end of an arrow means its target is not on this plan, and no arrow at all means the route is unknown. Data comes from the last load and goes stale; links are shown with a mouse only.",help_aria:"Help: Zigbee links",admin_only:"Topology data is available to Home Assistant administrators only.",save_first:"Save this setting before loading topology data.",zha:"ZHA",zha_read:"Read ZHA data",zha_hint:"Reads ZHA's cached topology; it does not start a radio scan.",z2m:"Zigbee2MQTT",z2m_topics:"Base topics (one per line)",z2m_update:"Update map",z2m_warning:"A network-map scan can take 10 seconds to 2 minutes and may temporarily reduce Zigbee responsiveness.",status_idle:"Data not loaded",status_loading:"Loading…",status_ready:"Received {time}",status_stale:"Received {time} · stale",status_partial:"Received {time} · some nodes were omitted",status_no_links:"Received {time} · no observed links found",error_permission:"Administrator permission is required.",error_unsupported:"This provider or Home Assistant API is unavailable.",error_timeout:"The provider did not respond in time.",error_invalid_topic:"Check the Zigbee2MQTT base topic.",error_invalid_payload:"The provider returned unsupported topology data.",error_provider:"Topology data could not be loaded.",remote_count:"+{n} in other spaces",route_device_not_on_plan:"device is not on the plan",route_coordinator_not_on_plan:"coordinator is not on the plan",route_other_space:"another space"};const i={en:t,ru:{title:"Связи Zigbee",toggle:"Показывать связи Zigbee при наведении на устройство",hint:"Показываются только наблюдаемые прямые соседи. Наведение ничего не запрашивает.",help:"Показывает, с какими устройствами Zigbee каждое связано напрямую. Цвет линии — качество связи (LQI) по той же шкале, что у показателя LQI устройства: красный при 40 и ниже, зелёный при 180 и выше. Пунктир — качество не сообщено. Стрелка ведёт к следующему устройству по пути к координатору: исходящая одна, входящие — те, кто ходит через это устройство. Линия без стрелки — запасной сосед. Это дерево маршрутов, которое строит House Plan, а не путь пакета в эту секунду: подпись на конце стрелки значит, что цель не на этом плане, а отсутствие стрелки — что путь неизвестен. Данные из последней загрузки и устаревают, связи видны только при работе мышью.",help_aria:"Справка: связи Zigbee",admin_only:"Данные топологии доступны только администраторам Home Assistant.",save_first:"Сохраните настройку перед загрузкой данных топологии.",zha:"ZHA",zha_read:"Прочитать данные ZHA",zha_hint:"Читает сохранённую топологию ZHA и не запускает радио-сканирование.",z2m:"Zigbee2MQTT",z2m_topics:"Базовые топики (по одному в строке)",z2m_update:"Обновить карту",z2m_warning:"Сканирование карты сети занимает от 10 секунд до 2 минут и временно может снизить отзывчивость Zigbee.",status_idle:"Данные не загружены",status_loading:"Загрузка…",status_ready:"Получено: {time}",status_stale:"Получено: {time} · данные устарели",status_partial:"Получено: {time} · часть узлов не показана",status_no_links:"Получено: {time} · наблюдаемые связи не найдены",error_permission:"Нужны права администратора.",error_unsupported:"Провайдер или API Home Assistant недоступен.",error_timeout:"Провайдер не ответил вовремя.",error_invalid_topic:"Проверьте базовый топик Zigbee2MQTT.",error_invalid_payload:"Провайдер вернул неподдерживаемые данные топологии.",error_provider:"Не удалось загрузить данные топологии.",remote_count:"+{n} в других пространствах",route_device_not_on_plan:"устройства нет на плане",route_coordinator_not_on_plan:"координатора нет на плане",route_other_space:"другое пространство"},de:{title:"Zigbee-Verbindungen",toggle:"Zigbee-Verbindungen beim Darüberfahren über ein Gerät anzeigen",hint:"Es werden nur beobachtete direkte Nachbarn angezeigt. Beim Darüberfahren werden keine Daten abgerufen.",help:"Zeigt, mit welchen Zigbee-Geräten jedes Gerät direkt verbunden ist. Die Linienfarbe ist die Verbindungsqualität (LQI) auf derselben Skala wie der LQI-Wert des Geräts: rot bei 40 und darunter, grün bei 180 und darüber. Eine gestrichelte Linie bedeutet, dass die Qualität nicht gemeldet wurde. Ein Pfeil zeigt auf das nächste Gerät auf dem Weg zum Koordinator: ein Pfeil führt hinaus, eingehende Pfeile sind die Geräte, die über dieses Gerät routen. Eine Linie ohne Pfeil ist ein Ersatznachbar. Das ist der Routenbaum, den House Plan bildet, nicht der Weg eines Pakets in diesem Moment: eine Beschriftung am Pfeilende bedeutet, dass das Ziel nicht auf diesem Plan liegt, und ein fehlender Pfeil, dass die Route unbekannt ist. Die Daten stammen aus dem letzten Laden und veralten; Verbindungen sind nur mit der Maus sichtbar.",help_aria:"Hilfe: Zigbee-Verbindungen",admin_only:"Topologiedaten sind nur für Home-Assistant-Administratoren verfügbar.",save_first:"Speichere diese Einstellung, bevor Topologiedaten geladen werden.",zha:"ZHA",zha_read:"ZHA-Daten lesen",zha_hint:"Liest den ZHA-Topologiecache; es wird kein Funkscan gestartet.",z2m:"Zigbee2MQTT",z2m_topics:"Basistopics (eines pro Zeile)",z2m_update:"Karte aktualisieren",z2m_warning:"Ein Netzwerkscan kann 10 Sekunden bis 2 Minuten dauern und Zigbee vorübergehend verlangsamen.",status_idle:"Daten nicht geladen",status_loading:"Wird geladen…",status_ready:"Empfangen: {time}",status_stale:"Empfangen: {time} · veraltet",status_partial:"Empfangen: {time} · einige Knoten fehlen",status_no_links:"Empfangen: {time} · keine beobachteten Verbindungen gefunden",error_permission:"Administratorrechte sind erforderlich.",error_unsupported:"Dieser Anbieter oder die Home-Assistant-API ist nicht verfügbar.",error_timeout:"Der Anbieter hat nicht rechtzeitig geantwortet.",error_invalid_topic:"Prüfe das Zigbee2MQTT-Basistopic.",error_invalid_payload:"Der Anbieter hat nicht unterstützte Topologiedaten geliefert.",error_provider:"Topologiedaten konnten nicht geladen werden.",remote_count:"+{n} in anderen Bereichen",route_device_not_on_plan:"Gerät ist nicht im Plan",route_coordinator_not_on_plan:"Koordinator ist nicht im Plan",route_other_space:"anderer Bereich"},fr:{title:"Liens Zigbee",toggle:"Afficher les liens Zigbee au survol d’un appareil",hint:"Seuls les voisins directs observés sont affichés. Le survol ne lance aucune requête.",help:"Montre avec quels appareils Zigbee chaque appareil communique directement. La couleur de la ligne est la qualité du lien (LQI) sur la même échelle que l'indicateur LQI de l'appareil : rouge à 40 et en dessous, vert à 180 et au-dessus. Une ligne pointillée signifie que la qualité n'a pas été communiquée. Une flèche pointe vers l'appareil suivant sur le chemin du coordinateur : une flèche part, les flèches entrantes sont les appareils qui passent par celui-ci. Une ligne sans flèche est un voisin de secours. C'est l'arbre de routes que construit House Plan, pas le trajet d'un paquet à cet instant : une étiquette au bout d'une flèche signifie que sa cible n'est pas sur ce plan, et l'absence de flèche que la route est inconnue. Les données proviennent du dernier chargement et vieillissent ; les liens ne sont visibles qu'à la souris.",help_aria:"Aide : liens Zigbee",admin_only:"Les données de topologie sont réservées aux administrateurs Home Assistant.",save_first:"Enregistrez ce réglage avant de charger les données de topologie.",zha:"ZHA",zha_read:"Lire les données ZHA",zha_hint:"Lit la topologie en cache de ZHA sans lancer d’analyse radio.",z2m:"Zigbee2MQTT",z2m_topics:"Topics de base (un par ligne)",z2m_update:"Actualiser la carte",z2m_warning:"L’analyse de la carte réseau peut durer de 10 secondes à 2 minutes et réduire temporairement la réactivité de Zigbee.",status_idle:"Données non chargées",status_loading:"Chargement…",status_ready:"Reçu : {time}",status_stale:"Reçu : {time} · obsolète",status_partial:"Reçu : {time} · certains nœuds sont omis",status_no_links:"Reçu : {time} · aucun lien observé trouvé",error_permission:"Les droits administrateur sont requis.",error_unsupported:"Ce fournisseur ou l’API Home Assistant n’est pas disponible.",error_timeout:"Le fournisseur n’a pas répondu à temps.",error_invalid_topic:"Vérifiez le topic de base Zigbee2MQTT.",error_invalid_payload:"Le fournisseur a renvoyé des données de topologie non prises en charge.",error_provider:"Impossible de charger les données de topologie.",remote_count:"+{n} dans d’autres espaces",route_device_not_on_plan:"appareil absent du plan",route_coordinator_not_on_plan:"coordinateur absent du plan",route_other_space:"autre espace"}};function r(e,n){const r=i[e]?.[n]??t[n];return"string"==typeof r&&r.trim().length>0}function o(n,r,o){return e(i[n]?.[r]??t[r]??r,o)}const s=3e5,a=2097152,d=6e3;function l(e){return null!==e&&"object"==typeof e?e:null}function u(e){if("string"!=typeof e&&"number"!=typeof e)return null;let n=String(e).trim().toLowerCase();return n=/^0x[0-9a-f]{16}$/.test(n)?n.slice(2):n.replace(/[:-]/g,""),/^[0-9a-f]{16}$/.test(n)?n:null}function c(e,n,t){return`${e}:${n}:${t}`}function p(e){const n=String(e||"").toLowerCase().replace(/[ _-]/g,"");return n.includes("coordinator")?"coordinator":n.includes("router")?"router":n.includes("enddevice")||"end"===n?"end":"unknown"}const h=["parent","child","sibling","none","previous_child"];function g(e){const n=l(e),t=function(e){const n=Number(e);return Number.isFinite(n)&&n>=0&&n<=255?Math.round(n):void 0}(n?.lqi??n?.linkquality??n?.link_quality),i=function(e){if("number"==typeof e)return h[e];if("string"!=typeof e)return;const n=e.trim().toLowerCase().replace(/[\s_-]+/g,"");return"previouschild"===n?"previous_child":n.slice(0,40)||void 0}(n?.relationship);return{...void 0===t?{}:{lqi:t},...i?{relationship:i}:{}}}function f(e,n){return Array.isArray(e)&&e.length<=n?e:null}function _(e){if("string"==typeof e)return e.length<=a;try{return JSON.stringify(e).length<=a}catch{return!1}}function m(e,n,t,i,r){if(t===i)return void n.push({code:"self_link",nodeKey:t});const o=t=d){t.push({code:"invalid_payload"});break}const n=l(e),i=u(n?.ieee??n?.ieee_address);if(!i){t.push({code:"invalid_payload",nodeKey:s});continue}const a=c("zha","zha",i);r.has(a)||r.set(a,{key:a,ieee:i,role:p(n?.device_type)}),m(o,t,s,a,e)}else null!=n?.neighbors&&t.push({code:"invalid_payload",nodeKey:s})}return{provider:"zha",instanceId:"zha",obtainedAt:n,freshness:"provider-cache",nodes:[...r.values()],links:[...o.values()],warnings:t}}function v(e,n){const t=l(e),i=u(t?.ieeeAddr??t?.ieee_address??t?.ieee??e);if(i)return i;for(const i of[t?.id,t?.networkAddress,t?.network_address,e])if(null!=i){const e=n.get(String(i));if(e)return e}return null}function y(e,t,i=Date.now()){const r=[],o=n(t)||"invalid",s=_(e)?function(e){let n=e;if("string"==typeof n){if(n.length>a)return null;try{n=JSON.parse(n)}catch{return null}}const t=l(n),i=l(t?.data);if(n=i?.value??t?.value??t?.data??n,"string"==typeof n){if(n.length>a)return null;try{n=JSON.parse(n)}catch{return null}}return n}(e):null,h=l(s),g=f(h?.nodes,1e3),b=f(h?.links,d);if(!g||!b)return{provider:"z2m",instanceId:o,obtainedAt:i,freshness:"fresh-scan",nodes:[],links:[],warnings:[{code:"invalid_payload"}]};const y=new Map,k=new Map;for(const e of g){const n=l(e),t=u(n?.ieeeAddr??n?.ieee_address??n?.ieee);if(!t){r.push({code:"invalid_payload"});continue}const i=c("z2m",o,t);y.set(i,{key:i,ieee:t,role:p(n?.type??n?.device_type),..."boolean"==typeof n?.failed?{available:!n.failed}:{}});for(const e of[n?.id,n?.networkAddress,n?.network_address])null!=e&&k.set(String(e),t)}const w=new Map;for(const e of b){const n=l(e),t=u(n?.sourceIeeeAddr)??v(n?.source,k),i=u(n?.targetIeeeAddr)??v(n?.target,k);if(!t||!i){r.push({code:"invalid_payload"});continue}const s=c("z2m",o,t),a=c("z2m",o,i);y.has(s)||y.set(s,{key:s,ieee:t,role:"unknown"}),y.has(a)||y.set(a,{key:a,ieee:i,role:"unknown"}),m(w,r,s,a,e)}return{provider:"z2m",instanceId:o,obtainedAt:i,freshness:"fresh-scan",nodes:[...y.values()],links:[...w.values()],warnings:r}}function k(e){if("string"!=typeof e)return null;const n=u(e);if(n)return n;const t=e.toLowerCase().match(/^zigbee2mqtt(?:_bridge)?_(.+)$/);return t?u(t[1]):null}function w(e,n){if(e.deviceId&&n.devices[e.deviceId])return[e.deviceId];const t=new Set;for(const[i,r]of Object.entries(n.devices)){const n=l(r);(Array.isArray(n?.identifiers)?n.identifiers:[]).some(n=>Array.isArray(n)&&k(n[1])===e.ieee)&&t.add(i)}if(t.size)return[...t];for(const i of Object.values(n.entities)){const n=l(i);"string"==typeof n?.device_id&&"string"==typeof n.unique_id&&(k(n.unique_id)===e.ieee&&t.add(n.device_id))}return[...t]}function z(e){return!e.hidden&&!e.virtual&&"ha_disabled"!==e.bindingStatus?.kind&&"orphaned"!==e.bindingStatus?.kind&&"unverified"!==e.bindingStatus?.kind}function A(e){const n=new Map,t=new Map,i=e.nodes.filter(e=>"coordinator"===e.role).map(e=>e.key).sort();if(1!==i.length)return{distances:n,parents:t};const r=i[0],o=function(e){const n=new Set(e.nodes.map(e=>e.key)),t=new Map;for(const e of[...n].sort())t.set(e,[]);for(const i of[...e.links].sort((e,n)=>`${e.a}\0${e.b}`.localeCompare(`${n.a}\0${n.b}`)))n.has(i.a)&&n.has(i.b)&&(t.get(i.a).push({neighborKey:i.b,observation:i.aToB}),t.get(i.b).push({neighborKey:i.a,observation:i.bToA}));for(const e of t.values())e.sort((e,n)=>e.neighborKey.localeCompare(n.neighborKey));return t}(e);if(!o.has(r))return{distances:n,parents:t};n.set(r,0);const s=[r];for(let e=0;en.get(e)===i-1).sort((e,n)=>{const t="parent"===e.observation?.relationship?1:0,i="parent"===n.observation?.relationship?1:0;if(t!==i)return i-t;const r=e.observation?.lqi??-1;return(n.observation?.lqi??-1)-r||e.neighborKey.localeCompare(n.neighborKey)});r[0]&&t.set(e,r[0].neighborKey)}return{coordinatorKey:r,distances:n,parents:t}}function Z(e,n,t){const i=new Map,r=[];for(const o of e.nodes){if(!1===o.available){r.push({code:"provider_scan_failure",nodeKey:o.key});continue}const e=w(o,t);if(1!==e.length){r.push({code:"unmatched_device",nodeKey:o.key});continue}const s=e[0];let a=n.filter(e=>z(e)&&"device"===e.bindingKind&&e.bindingRef===s);a.length||(a=n.filter(e=>z(e)&&"entity"===e.bindingKind&&!!e.bindingRef&&t.entities[e.bindingRef]?.device_id===s)),1===a.length?i.set(o.key,{markerId:a[0].id,space:a[0].space}):r.push({code:a.length>1?"ambiguous_placement":"unmatched_device",nodeKey:o.key})}return{placements:i,warnings:r}}function T(e,n,t){return e.map(e=>({topology:e,placements:Z(e,n,t).placements,routes:A(e)}))}function q(e,n,t){const i=new Map,r=new Set,o=new Map;let s=0;for(const{topology:a,placements:d,routes:l}of e){const e=new Set([...d].filter(([,e])=>e.markerId===t&&e.space===n).map(([e])=>e));if(e.size){for(const t of e){const e=l.parents.get(t);if(!e)continue;const i=d.get(e);if(i?.space===n)continue;let r;r=i?{kind:"remote-space",spaceId:i.space}:"coordinator"===a.nodes.find(n=>n.key===e)?.role?{kind:"unplaced-coordinator"}:{kind:"unplaced-device"};const s="remote-space"===r.kind?`${r.kind}:${r.spaceId}`:r.kind;o.set(s,r)}for(const o of a.links){const a=e.has(o.a),u=e.has(o.b);if(!a&&!u)continue;const c=a?o.a:o.b,p=a?o.b:o.a,h=d.get(p);if(!h||h.markerId===t){s++;continue}const g=l.parents.get(c)===p;if(h.space!==n){g||r.add(h.markerId);continue}const f=a?o.aToB:o.bToA,_=g?"toward-neighbor":l.parents.get(p)===c?"toward-origin":void 0,m=i.get(h.markerId);m?(void 0===m.line.lqi&&void 0!==f?.lqi&&(m.line.lqi=f.lqi),_&&m.directions.add(_)):i.set(h.markerId,{line:{neighborMarkerId:h.markerId,lqi:f?.lqi},directions:new Set(_?[_]:[])})}}}return{lines:[...i.values()].map(({line:e,directions:n})=>1===n.size?{...e,routeDirection:[...n][0]}:e),remoteCount:r.size,omittedCount:s,parentTargets:[...o.values()]}}export{s as T,T as a,y as b,r as h,Z as m,b as n,q as r,o as t};
diff --git a/custom_components/houseplan/frontend/houseplan-assets/zigbee-topology-CmbCVeQJ.js b/custom_components/houseplan/frontend/houseplan-assets/zigbee-topology-CmbCVeQJ.js
new file mode 100644
index 00000000..0e5bdc1c
--- /dev/null
+++ b/custom_components/houseplan/frontend/houseplan-assets/zigbee-topology-CmbCVeQJ.js
@@ -0,0 +1 @@
+globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="4da0d706a85c3f1c08ab6de960deb5feb08baaf9055265234e7bd1b554332653";import{s as e,aR as n}from"./houseplan-card-CAm75-22.js";var t={title:"Zigbee links",toggle:"Show Zigbee links when hovering over a device",hint:"Shows observed direct neighbours only. Nothing is fetched while you hover.",help:"Shows which Zigbee devices each device talks to directly. Line colour is link quality (LQI) on the same scale as the device's LQI reading: red at 40 and below, green at 180 and above. A dashed line means quality was not reported. An arrow points to the next device on the way to the coordinator: one arrow leads out, incoming arrows are the devices that route through this one. A line without an arrow is a spare neighbour. This is the route tree House Plan builds, not the path a packet takes right now: a label at the end of an arrow means its target is not on this plan, and no arrow at all means the route is unknown. Data comes from the last load and goes stale; links are shown with a mouse only.",help_aria:"Help: Zigbee links",admin_only:"Topology data is available to Home Assistant administrators only.",save_first:"Save this setting before loading topology data.",zha:"ZHA",zha_read:"Read ZHA data",zha_hint:"Reads ZHA's cached topology; it does not start a radio scan.",z2m:"Zigbee2MQTT",z2m_topics:"Base topics (one per line)",z2m_update:"Update map",z2m_warning:"A network-map scan can take 10 seconds to 2 minutes and may temporarily reduce Zigbee responsiveness.",status_idle:"Data not loaded",status_loading:"Loading…",status_ready:"Received {time}",status_stale:"Received {time} · stale",status_partial:"Received {time} · some nodes were omitted",status_no_links:"Received {time} · no observed links found",error_permission:"Administrator permission is required.",error_unsupported:"This provider or Home Assistant API is unavailable.",error_timeout:"The provider did not respond in time.",error_invalid_topic:"Check the Zigbee2MQTT base topic.",error_invalid_payload:"The provider returned unsupported topology data.",error_provider:"Topology data could not be loaded.",remote_count:"+{n} in other spaces",route_device_not_on_plan:"device is not on the plan",route_coordinator_not_on_plan:"coordinator is not on the plan",route_other_space:"another space"};const i={en:t,ru:{title:"Связи Zigbee",toggle:"Показывать связи Zigbee при наведении на устройство",hint:"Показываются только наблюдаемые прямые соседи. Наведение ничего не запрашивает.",help:"Показывает, с какими устройствами Zigbee каждое связано напрямую. Цвет линии — качество связи (LQI) по той же шкале, что у показателя LQI устройства: красный при 40 и ниже, зелёный при 180 и выше. Пунктир — качество не сообщено. Стрелка ведёт к следующему устройству по пути к координатору: исходящая одна, входящие — те, кто ходит через это устройство. Линия без стрелки — запасной сосед. Это дерево маршрутов, которое строит House Plan, а не путь пакета в эту секунду: подпись на конце стрелки значит, что цель не на этом плане, а отсутствие стрелки — что путь неизвестен. Данные из последней загрузки и устаревают, связи видны только при работе мышью.",help_aria:"Справка: связи Zigbee",admin_only:"Данные топологии доступны только администраторам Home Assistant.",save_first:"Сохраните настройку перед загрузкой данных топологии.",zha:"ZHA",zha_read:"Прочитать данные ZHA",zha_hint:"Читает сохранённую топологию ZHA и не запускает радио-сканирование.",z2m:"Zigbee2MQTT",z2m_topics:"Базовые топики (по одному в строке)",z2m_update:"Обновить карту",z2m_warning:"Сканирование карты сети занимает от 10 секунд до 2 минут и временно может снизить отзывчивость Zigbee.",status_idle:"Данные не загружены",status_loading:"Загрузка…",status_ready:"Получено: {time}",status_stale:"Получено: {time} · данные устарели",status_partial:"Получено: {time} · часть узлов не показана",status_no_links:"Получено: {time} · наблюдаемые связи не найдены",error_permission:"Нужны права администратора.",error_unsupported:"Провайдер или API Home Assistant недоступен.",error_timeout:"Провайдер не ответил вовремя.",error_invalid_topic:"Проверьте базовый топик Zigbee2MQTT.",error_invalid_payload:"Провайдер вернул неподдерживаемые данные топологии.",error_provider:"Не удалось загрузить данные топологии.",remote_count:"+{n} в других пространствах",route_device_not_on_plan:"устройства нет на плане",route_coordinator_not_on_plan:"координатора нет на плане",route_other_space:"другое пространство"},de:{title:"Zigbee-Verbindungen",toggle:"Zigbee-Verbindungen beim Darüberfahren über ein Gerät anzeigen",hint:"Es werden nur beobachtete direkte Nachbarn angezeigt. Beim Darüberfahren werden keine Daten abgerufen.",help:"Zeigt, mit welchen Zigbee-Geräten jedes Gerät direkt verbunden ist. Die Linienfarbe ist die Verbindungsqualität (LQI) auf derselben Skala wie der LQI-Wert des Geräts: rot bei 40 und darunter, grün bei 180 und darüber. Eine gestrichelte Linie bedeutet, dass die Qualität nicht gemeldet wurde. Ein Pfeil zeigt auf das nächste Gerät auf dem Weg zum Koordinator: ein Pfeil führt hinaus, eingehende Pfeile sind die Geräte, die über dieses Gerät routen. Eine Linie ohne Pfeil ist ein Ersatznachbar. Das ist der Routenbaum, den House Plan bildet, nicht der Weg eines Pakets in diesem Moment: eine Beschriftung am Pfeilende bedeutet, dass das Ziel nicht auf diesem Plan liegt, und ein fehlender Pfeil, dass die Route unbekannt ist. Die Daten stammen aus dem letzten Laden und veralten; Verbindungen sind nur mit der Maus sichtbar.",help_aria:"Hilfe: Zigbee-Verbindungen",admin_only:"Topologiedaten sind nur für Home-Assistant-Administratoren verfügbar.",save_first:"Speichere diese Einstellung, bevor Topologiedaten geladen werden.",zha:"ZHA",zha_read:"ZHA-Daten lesen",zha_hint:"Liest den ZHA-Topologiecache; es wird kein Funkscan gestartet.",z2m:"Zigbee2MQTT",z2m_topics:"Basistopics (eines pro Zeile)",z2m_update:"Karte aktualisieren",z2m_warning:"Ein Netzwerkscan kann 10 Sekunden bis 2 Minuten dauern und Zigbee vorübergehend verlangsamen.",status_idle:"Daten nicht geladen",status_loading:"Wird geladen…",status_ready:"Empfangen: {time}",status_stale:"Empfangen: {time} · veraltet",status_partial:"Empfangen: {time} · einige Knoten fehlen",status_no_links:"Empfangen: {time} · keine beobachteten Verbindungen gefunden",error_permission:"Administratorrechte sind erforderlich.",error_unsupported:"Dieser Anbieter oder die Home-Assistant-API ist nicht verfügbar.",error_timeout:"Der Anbieter hat nicht rechtzeitig geantwortet.",error_invalid_topic:"Prüfe das Zigbee2MQTT-Basistopic.",error_invalid_payload:"Der Anbieter hat nicht unterstützte Topologiedaten geliefert.",error_provider:"Topologiedaten konnten nicht geladen werden.",remote_count:"+{n} in anderen Bereichen",route_device_not_on_plan:"Gerät ist nicht im Plan",route_coordinator_not_on_plan:"Koordinator ist nicht im Plan",route_other_space:"anderer Bereich"},fr:{title:"Liens Zigbee",toggle:"Afficher les liens Zigbee au survol d’un appareil",hint:"Seuls les voisins directs observés sont affichés. Le survol ne lance aucune requête.",help:"Montre avec quels appareils Zigbee chaque appareil communique directement. La couleur de la ligne est la qualité du lien (LQI) sur la même échelle que l'indicateur LQI de l'appareil : rouge à 40 et en dessous, vert à 180 et au-dessus. Une ligne pointillée signifie que la qualité n'a pas été communiquée. Une flèche pointe vers l'appareil suivant sur le chemin du coordinateur : une flèche part, les flèches entrantes sont les appareils qui passent par celui-ci. Une ligne sans flèche est un voisin de secours. C'est l'arbre de routes que construit House Plan, pas le trajet d'un paquet à cet instant : une étiquette au bout d'une flèche signifie que sa cible n'est pas sur ce plan, et l'absence de flèche que la route est inconnue. Les données proviennent du dernier chargement et vieillissent ; les liens ne sont visibles qu'à la souris.",help_aria:"Aide : liens Zigbee",admin_only:"Les données de topologie sont réservées aux administrateurs Home Assistant.",save_first:"Enregistrez ce réglage avant de charger les données de topologie.",zha:"ZHA",zha_read:"Lire les données ZHA",zha_hint:"Lit la topologie en cache de ZHA sans lancer d’analyse radio.",z2m:"Zigbee2MQTT",z2m_topics:"Topics de base (un par ligne)",z2m_update:"Actualiser la carte",z2m_warning:"L’analyse de la carte réseau peut durer de 10 secondes à 2 minutes et réduire temporairement la réactivité de Zigbee.",status_idle:"Données non chargées",status_loading:"Chargement…",status_ready:"Reçu : {time}",status_stale:"Reçu : {time} · obsolète",status_partial:"Reçu : {time} · certains nœuds sont omis",status_no_links:"Reçu : {time} · aucun lien observé trouvé",error_permission:"Les droits administrateur sont requis.",error_unsupported:"Ce fournisseur ou l’API Home Assistant n’est pas disponible.",error_timeout:"Le fournisseur n’a pas répondu à temps.",error_invalid_topic:"Vérifiez le topic de base Zigbee2MQTT.",error_invalid_payload:"Le fournisseur a renvoyé des données de topologie non prises en charge.",error_provider:"Impossible de charger les données de topologie.",remote_count:"+{n} dans d’autres espaces",route_device_not_on_plan:"appareil absent du plan",route_coordinator_not_on_plan:"coordinateur absent du plan",route_other_space:"autre espace"}};function r(e,n){const r=i[e]?.[n]??t[n];return"string"==typeof r&&r.trim().length>0}function o(n,r,o){return e(i[n]?.[r]??t[r]??r,o)}const s=3e5,a=2097152,d=6e3;function l(e){return null!==e&&"object"==typeof e?e:null}function u(e){if("string"!=typeof e&&"number"!=typeof e)return null;let n=String(e).trim().toLowerCase();return n=/^0x[0-9a-f]{16}$/.test(n)?n.slice(2):n.replace(/[:-]/g,""),/^[0-9a-f]{16}$/.test(n)?n:null}function c(e,n,t){return`${e}:${n}:${t}`}function p(e){const n=String(e||"").toLowerCase().replace(/[ _-]/g,"");return n.includes("coordinator")?"coordinator":n.includes("router")?"router":n.includes("enddevice")||"end"===n?"end":"unknown"}const h=["parent","child","sibling","none","previous_child"];function g(e){const n=l(e),t=function(e){const n=Number(e);return Number.isFinite(n)&&n>=0&&n<=255?Math.round(n):void 0}(n?.lqi??n?.linkquality??n?.link_quality),i=function(e){if("number"==typeof e)return h[e];if("string"!=typeof e)return;const n=e.trim().toLowerCase().replace(/[\s_-]+/g,"");return"previouschild"===n?"previous_child":n.slice(0,40)||void 0}(n?.relationship);return{...void 0===t?{}:{lqi:t},...i?{relationship:i}:{}}}function f(e,n){return Array.isArray(e)&&e.length<=n?e:null}function _(e){if("string"==typeof e)return e.length<=a;try{return JSON.stringify(e).length<=a}catch{return!1}}function b(e,n,t,i,r){if(t===i)return void n.push({code:"self_link",nodeKey:t});const o=t=d){t.push({code:"invalid_payload"});break}const n=l(e),i=u(n?.ieee??n?.ieee_address);if(!i){t.push({code:"invalid_payload",nodeKey:s});continue}const a=c("zha","zha",i);r.has(a)||r.set(a,{key:a,ieee:i,role:p(n?.device_type)}),b(o,t,s,a,e)}else null!=n?.neighbors&&t.push({code:"invalid_payload",nodeKey:s})}return{provider:"zha",instanceId:"zha",obtainedAt:n,freshness:"provider-cache",nodes:[...r.values()],links:[...o.values()],warnings:t}}function v(e,n){const t=l(e),i=u(t?.ieeeAddr??t?.ieee_address??t?.ieee??e);if(i)return i;for(const i of[t?.id,t?.networkAddress,t?.network_address,e])if(null!=i){const e=n.get(String(i));if(e)return e}return null}function y(e,t,i=Date.now()){const r=[],o=n(t)||"invalid",s=_(e)?function(e){let n=e;if("string"==typeof n){if(n.length>a)return null;try{n=JSON.parse(n)}catch{return null}}const t=l(n),i=l(t?.data);if(n=i?.value??t?.value??t?.data??n,"string"==typeof n){if(n.length>a)return null;try{n=JSON.parse(n)}catch{return null}}return n}(e):null,h=l(s),g=f(h?.nodes,1e3),m=f(h?.links,d);if(!g||!m)return{provider:"z2m",instanceId:o,obtainedAt:i,freshness:"fresh-scan",nodes:[],links:[],warnings:[{code:"invalid_payload"}]};const y=new Map,k=new Map;for(const e of g){const n=l(e),t=u(n?.ieeeAddr??n?.ieee_address??n?.ieee);if(!t){r.push({code:"invalid_payload"});continue}const i=c("z2m",o,t);y.set(i,{key:i,ieee:t,role:p(n?.type??n?.device_type),..."boolean"==typeof n?.failed?{available:!n.failed}:{}});for(const e of[n?.id,n?.networkAddress,n?.network_address])null!=e&&k.set(String(e),t)}const w=new Map;for(const e of m){const n=l(e),t=u(n?.sourceIeeeAddr)??v(n?.source,k),i=u(n?.targetIeeeAddr)??v(n?.target,k);if(!t||!i){r.push({code:"invalid_payload"});continue}const s=c("z2m",o,t),a=c("z2m",o,i);y.has(s)||y.set(s,{key:s,ieee:t,role:"unknown"}),y.has(a)||y.set(a,{key:a,ieee:i,role:"unknown"}),b(w,r,s,a,e)}return{provider:"z2m",instanceId:o,obtainedAt:i,freshness:"fresh-scan",nodes:[...y.values()],links:[...w.values()],warnings:r}}function k(e){if("string"!=typeof e)return null;const n=u(e);if(n)return n;const t=e.toLowerCase().match(/^zigbee2mqtt(?:_bridge)?_(.+)$/);return t?u(t[1]):null}function w(e,n){if(e.deviceId&&n.devices[e.deviceId])return[e.deviceId];const t=new Set;for(const[i,r]of Object.entries(n.devices)){const n=l(r);(Array.isArray(n?.identifiers)?n.identifiers:[]).some(n=>Array.isArray(n)&&k(n[1])===e.ieee)&&t.add(i)}if(t.size)return[...t];for(const i of Object.values(n.entities)){const n=l(i);"string"==typeof n?.device_id&&"string"==typeof n.unique_id&&(k(n.unique_id)===e.ieee&&t.add(n.device_id))}return[...t]}function z(e){return!e.hidden&&!e.virtual&&"ha_disabled"!==e.bindingStatus?.kind&&"orphaned"!==e.bindingStatus?.kind&&"unverified"!==e.bindingStatus?.kind}function A(e){const n=new Map,t=new Map,i=e.nodes.filter(e=>"coordinator"===e.role).map(e=>e.key).sort();if(1!==i.length)return{distances:n,parents:t};const r=i[0],o=function(e){const n=new Set(e.nodes.map(e=>e.key)),t=new Map;for(const e of[...n].sort())t.set(e,[]);for(const i of[...e.links].sort((e,n)=>`${e.a}\0${e.b}`.localeCompare(`${n.a}\0${n.b}`)))n.has(i.a)&&n.has(i.b)&&(t.get(i.a).push({neighborKey:i.b,observation:i.aToB}),t.get(i.b).push({neighborKey:i.a,observation:i.bToA}));for(const e of t.values())e.sort((e,n)=>e.neighborKey.localeCompare(n.neighborKey));return t}(e);if(!o.has(r))return{distances:n,parents:t};n.set(r,0);const s=[r];for(let e=0;en.get(e)===i-1).sort((e,n)=>{const t="parent"===e.observation?.relationship?1:0,i="parent"===n.observation?.relationship?1:0;if(t!==i)return i-t;const r=e.observation?.lqi??-1;return(n.observation?.lqi??-1)-r||e.neighborKey.localeCompare(n.neighborKey)});r[0]&&t.set(e,r[0].neighborKey)}return{coordinatorKey:r,distances:n,parents:t}}function Z(e,n,t){const i=new Map,r=[];for(const o of e.nodes){if(!1===o.available){r.push({code:"provider_scan_failure",nodeKey:o.key});continue}const e=w(o,t);if(1!==e.length){r.push({code:"unmatched_device",nodeKey:o.key});continue}const s=e[0];let a=n.filter(e=>z(e)&&"device"===e.bindingKind&&e.bindingRef===s);a.length||(a=n.filter(e=>z(e)&&"entity"===e.bindingKind&&!!e.bindingRef&&t.entities[e.bindingRef]?.device_id===s)),1===a.length?i.set(o.key,{markerId:a[0].id,space:a[0].space}):r.push({code:a.length>1?"ambiguous_placement":"unmatched_device",nodeKey:o.key})}return{placements:i,warnings:r}}function T(e,n,t){return e.map(e=>({topology:e,placements:Z(e,n,t).placements,routes:A(e)}))}function q(e,n,t){const i=new Map,r=new Set,o=new Map;let s=0;for(const{topology:a,placements:d,routes:l}of e){const e=new Set([...d].filter(([,e])=>e.markerId===t&&e.space===n).map(([e])=>e));if(e.size){for(const t of e){const e=l.parents.get(t);if(!e)continue;const i=d.get(e);if(i?.space===n)continue;let r;r=i?{kind:"remote-space",spaceId:i.space}:"coordinator"===a.nodes.find(n=>n.key===e)?.role?{kind:"unplaced-coordinator"}:{kind:"unplaced-device"};const s="remote-space"===r.kind?`${r.kind}:${r.spaceId}`:r.kind;o.set(s,r)}for(const o of a.links){const a=e.has(o.a),u=e.has(o.b);if(!a&&!u)continue;const c=a?o.a:o.b,p=a?o.b:o.a,h=d.get(p);if(!h||h.markerId===t){s++;continue}const g=l.parents.get(c)===p;if(h.space!==n){g||r.add(h.markerId);continue}const f=a?o.aToB:o.bToA,_=g?"toward-neighbor":l.parents.get(p)===c?"toward-origin":void 0,b=i.get(h.markerId);b?(void 0===b.line.lqi&&void 0!==f?.lqi&&(b.line.lqi=f.lqi),_&&b.directions.add(_)):i.set(h.markerId,{line:{neighborMarkerId:h.markerId,lqi:f?.lqi},directions:new Set(_?[_]:[])})}}}return{lines:[...i.values()].map(({line:e,directions:n})=>1===n.size?{...e,routeDirection:[...n][0]}:e),remoteCount:r.size,omittedCount:s,parentTargets:[...o.values()]}}export{s as T,T as a,y as b,r as h,Z as m,m as n,q as r,o as t};
diff --git a/custom_components/houseplan/frontend/houseplan-assets/zigbee-topology-runtime-DU0yDsuI.js b/custom_components/houseplan/frontend/houseplan-assets/zigbee-topology-runtime-DU0yDsuI.js
deleted file mode 100644
index 504ac2af..00000000
--- a/custom_components/houseplan/frontend/houseplan-assets/zigbee-topology-runtime-DU0yDsuI.js
+++ /dev/null
@@ -1 +0,0 @@
-globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="34d1dbfc181acaf58842dfced0e6aa3a899aef6b8d1eeba53732ef729a63137e";import{n as t,b as n}from"./zigbee-topology-CW_HKDoT.js";import{F as e}from"./houseplan-card-BKJrmMEj.js";const o=new WeakMap;function i(t){const n=function(t){const n=t?.connection||t;return!n||"object"!=typeof n&&"function"!=typeof n?null:n}(t);if(!n)return null;let e=o.get(n);return e||(e={revision:0,topologies:[],states:{},listeners:new Set,inflight:new Map},o.set(n,e)),e}function r(t,n,e){t.states={...t.states,[n]:e},function(t){t.revision++;for(const n of t.listeners)n()}(t)}function s(t){const n=t?.code;if("permission"===n||"unsupported"===n||"timeout"===n||"invalid_topic"===n||"invalid_payload"===n)return n;const e=String(t?.message||"").toLowerCase();return e.includes("unauthor")||e.includes("permission")?"permission":e.includes("unknown_command")||e.includes("not found")?"unsupported":"provider"}function a(t){return Object.assign(new Error(t),{code:t})}function c(t,n,e){const o=t.inflight.get(n);if(o)return o;r(t,n,{phase:"loading"});const i=e().then(n=>{if(!n.nodes.length&&n.warnings.some(t=>"invalid_payload"===t.code))throw a("invalid_payload");!function(t,n){t.topologies=[...t.topologies.filter(t=>!(t.provider===n.provider&&t.instanceId===n.instanceId)),n],r(t,"zha"===n.provider?"zha":`z2m:${n.instanceId}`,{phase:"ready",obtainedAt:n.obtainedAt,partial:n.warnings.length>0})}(t,n)}).catch(e=>{r(t,n,{phase:"error",error:s(e)})}).finally(()=>t.inflight.delete(n));return t.inflight.set(n,i),i}function l(t){const n=i(t);return n?{revision:n.revision,topologies:n.topologies,states:n.states}:{revision:0,topologies:[],states:{}}}function u(t,n){const e=i(t);return e?(e.listeners.add(n),()=>e.listeners.delete(n)):()=>{}}function f(t){if(!0!==t?.user?.is_admin)throw a("permission")}function p(n){const e=i(n);return e?c(e,"zha",async()=>{if(f(n),"function"!=typeof n?.callWS)throw a("unsupported");return t(await n.callWS({type:"zha/devices"}))}):Promise.resolve()}function d(t){return null!==t&&"object"==typeof t?t:null}function h(t){const n=d(t),e=n?.payload??t;if("string"!=typeof e)return e;try{return JSON.parse(e)}catch{return null}}async function m(t,n){let e;try{return await Promise.race([t,new Promise((t,o)=>{e=globalThis.setTimeout(()=>o(a("timeout")),Math.max(1,n))})])}finally{void 0!==e&&globalThis.clearTimeout(e)}}function g(t,o,r=15e4){const s=i(t);if(!s)return Promise.resolve();const l=e(o);return c(s,`z2m:${l||String(o)}`,async()=>{if(f(t),!l)throw a("invalid_topic");const e=t.connection,o=e?.subscribeMessage;if("function"!=typeof o||"function"!=typeof t?.callService)throw a("unsupported");const i=function(){const t=globalThis.crypto;return"function"==typeof t?.randomUUID?`houseplan-${t.randomUUID()}`:`houseplan-${Date.now().toString(36)}-${Math.random().toString(36).slice(2)}`}(),s=Date.now()+Math.max(1,r);let c=!1,u=null,p=null,g=null;const y=new Promise(t=>{u=t}),w=new Promise((t,n)=>{p=t,g=n}),b=[];try{const r=await o.call(e,t=>{!0===d(t)?.retain&&h(t)&&u?.()},{type:"mqtt/subscribe",topic:`${l}/bridge/info`});"function"==typeof r&&b.push(r);const f=await o.call(e,t=>{if(!0===d(t)?.retain)return;const n=h(t);null!==n?n&&function(t){const n=d(t),e=n?.transaction??d(n?.data)?.transaction;return"string"==typeof e||"number"==typeof e?String(e):null}(n)===i&&p?.(n):c&&g?.(a("invalid_payload"))},{type:"mqtt/subscribe",topic:`${l}/bridge/response/networkmap`});"function"==typeof f&&b.push(f),await m(y,Math.min(4e3,Math.max(1,s-Date.now()))),c=!0,await t.callService("mqtt","publish",{topic:`${l}/bridge/request/networkmap`,payload:JSON.stringify({type:"raw",routes:!1,transaction:i}),qos:0,retain:!1});const v=await m(w,s-Date.now()),_=d(v)?.status;if(_&&"ok"!==_)throw a("provider");return n(v,l)}finally{for(const t of b)try{t()}catch{}}})}export{p as readZhaTopology,g as refreshZ2mTopology,u as subscribeZigbeeTopology,l as zigbeeTopologyRuntimeSnapshot};
diff --git a/custom_components/houseplan/frontend/houseplan-assets/zigbee-topology-runtime-HfConMDX.js b/custom_components/houseplan/frontend/houseplan-assets/zigbee-topology-runtime-HfConMDX.js
new file mode 100644
index 00000000..675ec7f5
--- /dev/null
+++ b/custom_components/houseplan/frontend/houseplan-assets/zigbee-topology-runtime-HfConMDX.js
@@ -0,0 +1 @@
+globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="4da0d706a85c3f1c08ab6de960deb5feb08baaf9055265234e7bd1b554332653";import{n as t,b as n}from"./zigbee-topology-CmbCVeQJ.js";import{aR as e}from"./houseplan-card-CAm75-22.js";const o=new WeakMap;function i(t){const n=function(t){const n=t?.connection||t;return!n||"object"!=typeof n&&"function"!=typeof n?null:n}(t);if(!n)return null;let e=o.get(n);return e||(e={revision:0,topologies:[],states:{},listeners:new Set,inflight:new Map},o.set(n,e)),e}function r(t,n,e){t.states={...t.states,[n]:e},function(t){t.revision++;for(const n of t.listeners)n()}(t)}function s(t){const n=t?.code;if("permission"===n||"unsupported"===n||"timeout"===n||"invalid_topic"===n||"invalid_payload"===n)return n;const e=String(t?.message||"").toLowerCase();return e.includes("unauthor")||e.includes("permission")?"permission":e.includes("unknown_command")||e.includes("not found")?"unsupported":"provider"}function a(t){return Object.assign(new Error(t),{code:t})}function c(t,n,e){const o=t.inflight.get(n);if(o)return o;r(t,n,{phase:"loading"});const i=e().then(n=>{if(!n.nodes.length&&n.warnings.some(t=>"invalid_payload"===t.code))throw a("invalid_payload");!function(t,n){t.topologies=[...t.topologies.filter(t=>!(t.provider===n.provider&&t.instanceId===n.instanceId)),n],r(t,"zha"===n.provider?"zha":`z2m:${n.instanceId}`,{phase:"ready",obtainedAt:n.obtainedAt,partial:n.warnings.length>0})}(t,n)}).catch(e=>{r(t,n,{phase:"error",error:s(e)})}).finally(()=>t.inflight.delete(n));return t.inflight.set(n,i),i}function l(t){const n=i(t);return n?{revision:n.revision,topologies:n.topologies,states:n.states}:{revision:0,topologies:[],states:{}}}function u(t,n){const e=i(t);return e?(e.listeners.add(n),()=>e.listeners.delete(n)):()=>{}}function p(t){if(!0!==t?.user?.is_admin)throw a("permission")}function f(n){const e=i(n);return e?c(e,"zha",async()=>{if(p(n),"function"!=typeof n?.callWS)throw a("unsupported");return t(await n.callWS({type:"zha/devices"}))}):Promise.resolve()}function d(t){return null!==t&&"object"==typeof t?t:null}function h(t){const n=d(t),e=n?.payload??t;if("string"!=typeof e)return e;try{return JSON.parse(e)}catch{return null}}async function m(t,n){let e;try{return await Promise.race([t,new Promise((t,o)=>{e=globalThis.setTimeout(()=>o(a("timeout")),Math.max(1,n))})])}finally{void 0!==e&&globalThis.clearTimeout(e)}}function g(t,o,r=15e4){const s=i(t);if(!s)return Promise.resolve();const l=e(o);return c(s,`z2m:${l||String(o)}`,async()=>{if(p(t),!l)throw a("invalid_topic");const e=t.connection,o=e?.subscribeMessage;if("function"!=typeof o||"function"!=typeof t?.callService)throw a("unsupported");const i=function(){const t=globalThis.crypto;return"function"==typeof t?.randomUUID?`houseplan-${t.randomUUID()}`:`houseplan-${Date.now().toString(36)}-${Math.random().toString(36).slice(2)}`}(),s=Date.now()+Math.max(1,r);let c=!1,u=null,f=null,g=null;const y=new Promise(t=>{u=t}),w=new Promise((t,n)=>{f=t,g=n}),b=[];try{const r=await o.call(e,t=>{!0===d(t)?.retain&&h(t)&&u?.()},{type:"mqtt/subscribe",topic:`${l}/bridge/info`});"function"==typeof r&&b.push(r);const p=await o.call(e,t=>{if(!0===d(t)?.retain)return;const n=h(t);null!==n?n&&function(t){const n=d(t),e=n?.transaction??d(n?.data)?.transaction;return"string"==typeof e||"number"==typeof e?String(e):null}(n)===i&&f?.(n):c&&g?.(a("invalid_payload"))},{type:"mqtt/subscribe",topic:`${l}/bridge/response/networkmap`});"function"==typeof p&&b.push(p),await m(y,Math.min(4e3,Math.max(1,s-Date.now()))),c=!0,await t.callService("mqtt","publish",{topic:`${l}/bridge/request/networkmap`,payload:JSON.stringify({type:"raw",routes:!1,transaction:i}),qos:0,retain:!1});const v=await m(w,s-Date.now()),_=d(v)?.status;if(_&&"ok"!==_)throw a("provider");return n(v,l)}finally{for(const t of b)try{t()}catch{}}})}export{f as readZhaTopology,g as refreshZ2mTopology,u as subscribeZigbeeTopology,l as zigbeeTopologyRuntimeSnapshot};
diff --git a/custom_components/houseplan/frontend/houseplan-card.js b/custom_components/houseplan/frontend/houseplan-card.js
index d160acd4..cf99e6bd 100644
--- a/custom_components/houseplan/frontend/houseplan-card.js
+++ b/custom_components/houseplan/frontend/houseplan-card.js
@@ -1 +1 @@
-globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="34d1dbfc181acaf58842dfced0e6aa3a899aef6b8d1eeba53732ef729a63137e";try{await import("./houseplan-assets/houseplan-card-BKJrmMEj.js")}catch(e){if(!customElements.get("houseplan-card")){const l=String(navigator.language||"en").toLowerCase();const m=l.startsWith("ru")?"House Plan обновился — перезагрузите страницу (Ctrl+F5).":l.startsWith("de")?"House Plan wurde aktualisiert — bitte laden Sie die Seite neu (Strg+F5).":l.startsWith("fr")?"House Plan a été mis à jour — veuillez recharger la page (Ctrl+F5).":"House Plan was updated — please reload the page (Ctrl+F5).";customElements.define("houseplan-card",class extends HTMLElement{setConfig(){}getCardSize(){return 1}connectedCallback(){this.style.cssText="display:block;box-sizing:border-box;padding:16px;border:1px solid var(--divider-color,#e0e0e0);border-radius:var(--ha-card-border-radius,12px);background:var(--card-background-color,#fff);color:var(--primary-text-color,#212121);font:14px/1.4 var(--paper-font-body1_-_font-family,sans-serif)";this.textContent=m}})}console.error("[houseplan] stale houseplan-card.js: the implementation chunk is unavailable",e)}
+globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="4da0d706a85c3f1c08ab6de960deb5feb08baaf9055265234e7bd1b554332653";try{await import("./houseplan-assets/houseplan-card-CAm75-22.js")}catch(e){if(!customElements.get("houseplan-card")){const l=String(navigator.language||"en").toLowerCase();const m=l.startsWith("ru")?"House Plan обновился — перезагрузите страницу (Ctrl+F5).":l.startsWith("de")?"House Plan wurde aktualisiert — bitte laden Sie die Seite neu (Strg+F5).":l.startsWith("fr")?"House Plan a été mis à jour — veuillez recharger la page (Ctrl+F5).":"House Plan was updated — please reload the page (Ctrl+F5).";customElements.define("houseplan-card",class extends HTMLElement{setConfig(){}getCardSize(){return 1}connectedCallback(){this.style.cssText="display:block;box-sizing:border-box;padding:16px;border:1px solid var(--divider-color,#e0e0e0);border-radius:var(--ha-card-border-radius,12px);background:var(--card-background-color,#fff);color:var(--primary-text-color,#212121);font:14px/1.4 var(--paper-font-body1_-_font-family,sans-serif)";this.textContent=m}})}console.error("[houseplan] stale houseplan-card.js: the implementation chunk is unavailable",e)}
diff --git a/custom_components/houseplan/frontend/houseplan-panel.js b/custom_components/houseplan/frontend/houseplan-panel.js
index 326170e3..1ad44d1b 100644
--- a/custom_components/houseplan/frontend/houseplan-panel.js
+++ b/custom_components/houseplan/frontend/houseplan-panel.js
@@ -1 +1 @@
-globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="34d1dbfc181acaf58842dfced0e6aa3a899aef6b8d1eeba53732ef729a63137e";try{await import("./houseplan-assets/houseplan-card-BKJrmMEj.js")}catch(e){if(!customElements.get("houseplan-panel")){const l=String(navigator.language||"en").toLowerCase();const m=l.startsWith("ru")?"House Plan обновился — перезагрузите страницу (Ctrl+F5).":l.startsWith("de")?"House Plan wurde aktualisiert — bitte laden Sie die Seite neu (Strg+F5).":l.startsWith("fr")?"House Plan a été mis à jour — veuillez recharger la page (Ctrl+F5).":"House Plan was updated — please reload the page (Ctrl+F5).";customElements.define("houseplan-panel",class extends HTMLElement{connectedCallback(){this.style.cssText="display:block;box-sizing:border-box;padding:16px;min-height:100%;background:var(--card-background-color,#fff);color:var(--primary-text-color,#212121);font:14px/1.4 var(--paper-font-body1_-_font-family,sans-serif)";this.textContent=m}})}console.error("[houseplan] stale houseplan-panel.js: the card implementation chunk is unavailable",e)}const e=["panel","hass","narrow","route"];class n extends HTMLElement{constructor(){super(),this._narrow=!1,this.attachShadow({mode:"open"}),this._adoptPreUpgradeProperties()}connectedCallback(){this._adoptPreUpgradeProperties(),this._ensureShell()}_adoptPreUpgradeProperties(){for(const n of e){if(!Object.prototype.hasOwnProperty.call(this,n))continue;const e=this[n];delete this[n],this[n]=e}}get hass(){return this._hass}set hass(e){this._hass=e,this._ensureShell(),this._card&&(this._card.hass=e),this._syncMenuLabel()}get narrow(){return this._narrow}set narrow(e){this._narrow=Boolean(e),this.toggleAttribute("narrow",this._narrow),this._card&&(this._card.narrow=this._narrow)}get route(){return this._route}set route(e){this._route=e}get panel(){return this._panel}set panel(e){this._panel=e}_ensureShell(){if(this._card||!this.shadowRoot)return;const e=document.createElement("style");e.textContent="\n :host {\n display: block;\n width: 100%;\n /* HA mounts a custom panel inside , a block with\n * safe-area padding and NO height, so a percentage here resolves to\n * auto and the stage collapses to 0 px (#488). Take the viewport\n * like HA's own iframe panels do, minus the insets HA pads with. */\n height: 100vh;\n height: calc(100dvh - var(--safe-area-inset-top, 0px) - var(--safe-area-inset-bottom, 0px));\n min-width: 0;\n min-height: 0;\n overflow: hidden;\n color: var(--primary-text-color);\n background: var(--primary-background-color);\n }\n .page {\n width: 100%;\n height: 100%;\n min-width: 0;\n min-height: 0;\n display: grid;\n grid-template-rows: auto minmax(0, 1fr);\n overflow: hidden;\n }\n .appbar {\n box-sizing: border-box;\n min-width: 0;\n min-height: var(--header-height, 56px);\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 0 16px;\n background: var(--app-header-background-color, var(--primary-background-color));\n color: var(--app-header-text-color, var(--primary-text-color));\n border-bottom: 1px solid var(--divider-color);\n z-index: 1;\n }\n .toolbar {\n min-width: 0;\n width: 100%;\n display: flex;\n align-items: center;\n gap: 12px;\n }\n .menu {\n box-sizing: border-box;\n width: 44px;\n height: 44px;\n min-width: 44px;\n min-height: 44px;\n margin: 0;\n padding: 0;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n border: 0;\n border-radius: 50%;\n color: inherit;\n background: transparent;\n cursor: pointer;\n }\n .menu:focus-visible {\n outline: 2px solid var(--primary-color);\n outline-offset: 2px;\n }\n @media (hover: hover) {\n .menu:hover { background: var(--secondary-background-color); }\n }\n .menu ha-icon { --mdc-icon-size: 24px; }\n .title {\n min-width: 0;\n display: flex;\n align-items: center;\n gap: 10px;\n font-size: 20px;\n font-weight: 500;\n line-height: 1.2;\n }\n .title ha-icon {\n --mdc-icon-size: 24px;\n color: var(--primary-color);\n }\n .content {\n min-width: 0;\n min-height: 0;\n overflow: hidden;\n }\n houseplan-card {\n width: 100%;\n height: 100%;\n min-width: 0;\n min-height: 0;\n }\n ";const n=document.createElement("div");n.className="page";const t=document.createElement("header");t.className="appbar";const a=document.createElement("div");a.className="toolbar",a.setAttribute("role","toolbar");const o=document.createElement("button");o.className="menu",o.dataset.hp="panel-menu",o.type="button",o.innerHTML='',o.addEventListener("click",()=>{o.dispatchEvent(new CustomEvent("hass-toggle-menu",{bubbles:!0,composed:!0}))}),this._menuButton=o;const i=document.createElement("div");i.className="title",i.dataset.hp="panel-title",i.setAttribute("role","heading"),i.setAttribute("aria-level","1"),i.innerHTML='House Plan',a.append(o,i),t.append(a);const r=document.createElement("main");r.className="content";const s=document.createElement("houseplan-card");s.panelHost=!0,s.narrow=this._narrow,s.setConfig({type:"custom:houseplan-card"}),void 0!==this._hass&&(s.hass=this._hass),r.append(s),n.append(t,r),this.shadowRoot.append(e,n),this._card=s,this._syncMenuLabel()}_syncMenuLabel(){if(!this._menuButton)return;const e=this._hass?.localize?.("ui.common.menu")||this._hass?.localize?.("ui.panel.lovelace.menu")||"Menu";this._menuButton.setAttribute("aria-label",e),this._menuButton.title=e}}customElements.get("houseplan-panel")||customElements.define("houseplan-panel",n);export{n as HouseplanPanel};
+globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="4da0d706a85c3f1c08ab6de960deb5feb08baaf9055265234e7bd1b554332653";try{await import("./houseplan-assets/houseplan-card-CAm75-22.js")}catch(e){if(!customElements.get("houseplan-panel")){const l=String(navigator.language||"en").toLowerCase();const m=l.startsWith("ru")?"House Plan обновился — перезагрузите страницу (Ctrl+F5).":l.startsWith("de")?"House Plan wurde aktualisiert — bitte laden Sie die Seite neu (Strg+F5).":l.startsWith("fr")?"House Plan a été mis à jour — veuillez recharger la page (Ctrl+F5).":"House Plan was updated — please reload the page (Ctrl+F5).";customElements.define("houseplan-panel",class extends HTMLElement{connectedCallback(){this.style.cssText="display:block;box-sizing:border-box;padding:16px;min-height:100%;background:var(--card-background-color,#fff);color:var(--primary-text-color,#212121);font:14px/1.4 var(--paper-font-body1_-_font-family,sans-serif)";this.textContent=m}})}console.error("[houseplan] stale houseplan-panel.js: the card implementation chunk is unavailable",e)}const e=["panel","hass","narrow","route"];class n extends HTMLElement{constructor(){super(),this._narrow=!1,this.attachShadow({mode:"open"}),this._adoptPreUpgradeProperties()}connectedCallback(){this._adoptPreUpgradeProperties(),this._ensureShell()}_adoptPreUpgradeProperties(){for(const n of e){if(!Object.prototype.hasOwnProperty.call(this,n))continue;const e=this[n];delete this[n],this[n]=e}}get hass(){return this._hass}set hass(e){this._hass=e,this._ensureShell(),this._card&&(this._card.hass=e),this._syncMenuLabel()}get narrow(){return this._narrow}set narrow(e){this._narrow=Boolean(e),this.toggleAttribute("narrow",this._narrow),this._card&&(this._card.narrow=this._narrow)}get route(){return this._route}set route(e){this._route=e}get panel(){return this._panel}set panel(e){this._panel=e}_ensureShell(){if(this._card||!this.shadowRoot)return;const e=document.createElement("style");e.textContent="\n :host {\n display: block;\n width: 100%;\n /* HA mounts a custom panel inside , a block with\n * safe-area padding and NO height, so a percentage here resolves to\n * auto and the stage collapses to 0 px (#488). Take the viewport\n * like HA's own iframe panels do, minus the insets HA pads with. */\n height: 100vh;\n height: calc(100dvh - var(--safe-area-inset-top, 0px) - var(--safe-area-inset-bottom, 0px));\n min-width: 0;\n min-height: 0;\n overflow: hidden;\n color: var(--primary-text-color);\n background: var(--primary-background-color);\n }\n .page {\n width: 100%;\n height: 100%;\n min-width: 0;\n min-height: 0;\n display: grid;\n grid-template-rows: auto minmax(0, 1fr);\n overflow: hidden;\n }\n .appbar {\n box-sizing: border-box;\n min-width: 0;\n min-height: var(--header-height, 56px);\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 0 16px;\n background: var(--app-header-background-color, var(--primary-background-color));\n color: var(--app-header-text-color, var(--primary-text-color));\n border-bottom: 1px solid var(--divider-color);\n z-index: 1;\n }\n .toolbar {\n min-width: 0;\n width: 100%;\n display: flex;\n align-items: center;\n gap: 12px;\n }\n .menu {\n box-sizing: border-box;\n width: 44px;\n height: 44px;\n min-width: 44px;\n min-height: 44px;\n margin: 0;\n padding: 0;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n border: 0;\n border-radius: 50%;\n color: inherit;\n background: transparent;\n cursor: pointer;\n }\n .menu:focus-visible {\n outline: 2px solid var(--primary-color);\n outline-offset: 2px;\n }\n @media (hover: hover) {\n .menu:hover { background: var(--secondary-background-color); }\n }\n .menu ha-icon { --mdc-icon-size: 24px; }\n .title {\n min-width: 0;\n display: flex;\n align-items: center;\n gap: 10px;\n font-size: 20px;\n font-weight: 500;\n line-height: 1.2;\n }\n .title ha-icon {\n --mdc-icon-size: 24px;\n color: var(--primary-color);\n }\n .content {\n min-width: 0;\n min-height: 0;\n overflow: hidden;\n }\n houseplan-card {\n width: 100%;\n height: 100%;\n min-width: 0;\n min-height: 0;\n }\n ";const n=document.createElement("div");n.className="page";const t=document.createElement("header");t.className="appbar";const a=document.createElement("div");a.className="toolbar",a.setAttribute("role","toolbar");const o=document.createElement("button");o.className="menu",o.dataset.hp="panel-menu",o.type="button",o.innerHTML='',o.addEventListener("click",()=>{o.dispatchEvent(new CustomEvent("hass-toggle-menu",{bubbles:!0,composed:!0}))}),this._menuButton=o;const i=document.createElement("div");i.className="title",i.dataset.hp="panel-title",i.setAttribute("role","heading"),i.setAttribute("aria-level","1"),i.innerHTML='House Plan',a.append(o,i),t.append(a);const r=document.createElement("main");r.className="content";const s=document.createElement("houseplan-card");s.panelHost=!0,s.narrow=this._narrow,s.setConfig({type:"custom:houseplan-card"}),void 0!==this._hass&&(s.hass=this._hass),r.append(s),n.append(t,r),this.shadowRoot.append(e,n),this._card=s,this._syncMenuLabel()}_syncMenuLabel(){if(!this._menuButton)return;const e=this._hass?.localize?.("ui.common.menu")||this._hass?.localize?.("ui.panel.lovelace.menu")||"Menu";this._menuButton.setAttribute("aria-label",e),this._menuButton.title=e}}customElements.get("houseplan-panel")||customElements.define("houseplan-panel",n);export{n as HouseplanPanel};
diff --git a/dist/houseplan-assets.json b/dist/houseplan-assets.json
index 3db80533..d4685483 100644
--- a/dist/houseplan-assets.json
+++ b/dist/houseplan-assets.json
@@ -1,295 +1,295 @@
{
"schema": 1,
- "fingerprint": "34d1dbfc181acaf58842dfced0e6aa3a899aef6b8d1eeba53732ef729a63137e",
+ "fingerprint": "4da0d706a85c3f1c08ab6de960deb5feb08baaf9055265234e7bd1b554332653",
"entry": "houseplan-card.js",
"panelEntry": "houseplan-panel.js",
"initialViewFiles": [
- "houseplan-assets/houseplan-card-BKJrmMEj.js",
+ "houseplan-assets/houseplan-card-CAm75-22.js",
"houseplan-card.js"
],
- "initialViewGzipBytes": 291346,
+ "initialViewGzipBytes": 291356,
"initialPanelFiles": [
- "houseplan-assets/houseplan-card-BKJrmMEj.js",
+ "houseplan-assets/houseplan-card-CAm75-22.js",
"houseplan-panel.js"
],
- "initialPanelGzipBytes": 292868,
+ "initialPanelGzipBytes": 292878,
"initialPanelOnlyFiles": [
"houseplan-panel.js"
],
- "initialPanelOnlyGzipBytes": 2323,
+ "initialPanelOnlyGzipBytes": 2324,
"lazyFiles": [
- "houseplan-assets/backdrop-pick-eS5vEdSu.js",
- "houseplan-assets/de-JnsB57l8.js",
- "houseplan-assets/editor-CAGtS_SG.js",
- "houseplan-assets/fr-BAV7hmLH.js",
- "houseplan-assets/furniture-plan-art.generated-BfO1XOcD.js",
- "houseplan-assets/houseplan-editor-runtime-BmdEXc9r.js",
- "houseplan-assets/houseplan-onboarding-runtime-DE7rHApS.js",
- "houseplan-assets/hp-zigbee-topology-overlay-Dn1oMTHf.js",
- "houseplan-assets/iso-scene-render-CCE-TeKM.js",
- "houseplan-assets/live-interaction-runtime-Ba7Bs1o7.js",
- "houseplan-assets/pdf-export-BbdvUxVO.js",
- "houseplan-assets/summary-panel-runtime-loaded-B6QGWMyY.js",
- "houseplan-assets/zigbee-topology-CW_HKDoT.js",
- "houseplan-assets/zigbee-topology-runtime-DU0yDsuI.js"
+ "houseplan-assets/backdrop-pick-DhTL8Q8P.js",
+ "houseplan-assets/de-DCJ5g8AN.js",
+ "houseplan-assets/editor-lggZMXRH.js",
+ "houseplan-assets/fr-Y07FWZ2v.js",
+ "houseplan-assets/furniture-plan-art.generated-CDfS5UbT.js",
+ "houseplan-assets/houseplan-editor-runtime-Dun21GNm.js",
+ "houseplan-assets/houseplan-onboarding-runtime-DZtjID7S.js",
+ "houseplan-assets/hp-zigbee-topology-overlay-DU0yXG-C.js",
+ "houseplan-assets/iso-scene-render-Dh7Z_AR9.js",
+ "houseplan-assets/live-interaction-runtime-Cwn9InHh.js",
+ "houseplan-assets/pdf-export-_NFtYoOA.js",
+ "houseplan-assets/summary-panel-runtime-loaded-DU9JvYSv.js",
+ "houseplan-assets/zigbee-topology-CmbCVeQJ.js",
+ "houseplan-assets/zigbee-topology-runtime-HfConMDX.js"
],
- "lazyGzipBytes": 433790,
+ "lazyGzipBytes": 435730,
"lazyEditorFiles": [
- "houseplan-assets/backdrop-pick-eS5vEdSu.js",
- "houseplan-assets/editor-CAGtS_SG.js",
- "houseplan-assets/furniture-plan-art.generated-BfO1XOcD.js",
- "houseplan-assets/houseplan-editor-runtime-BmdEXc9r.js",
- "houseplan-assets/zigbee-topology-CW_HKDoT.js"
+ "houseplan-assets/backdrop-pick-DhTL8Q8P.js",
+ "houseplan-assets/editor-lggZMXRH.js",
+ "houseplan-assets/furniture-plan-art.generated-CDfS5UbT.js",
+ "houseplan-assets/houseplan-editor-runtime-Dun21GNm.js",
+ "houseplan-assets/zigbee-topology-CmbCVeQJ.js"
],
- "lazyEditorGzipBytes": 218093,
+ "lazyEditorGzipBytes": 220004,
"lazyOnboardingFiles": [
- "houseplan-assets/backdrop-pick-eS5vEdSu.js",
- "houseplan-assets/houseplan-onboarding-runtime-DE7rHApS.js"
+ "houseplan-assets/backdrop-pick-DhTL8Q8P.js",
+ "houseplan-assets/houseplan-onboarding-runtime-DZtjID7S.js"
],
- "lazyOnboardingGzipBytes": 13912,
+ "lazyOnboardingGzipBytes": 13919,
"lazyLocaleFiles": [
- "houseplan-assets/de-JnsB57l8.js",
- "houseplan-assets/fr-BAV7hmLH.js"
+ "houseplan-assets/de-DCJ5g8AN.js",
+ "houseplan-assets/fr-Y07FWZ2v.js"
],
- "lazyLocaleGzipBytes": 55046,
+ "lazyLocaleGzipBytes": 55057,
"lazyIsometricFiles": [
- "houseplan-assets/iso-scene-render-CCE-TeKM.js"
+ "houseplan-assets/iso-scene-render-Dh7Z_AR9.js"
],
- "lazyIsometricGzipBytes": 15011,
+ "lazyIsometricGzipBytes": 15014,
"lazyFurnitureArtFiles": [
- "houseplan-assets/furniture-plan-art.generated-BfO1XOcD.js"
+ "houseplan-assets/furniture-plan-art.generated-CDfS5UbT.js"
],
- "lazyFurnitureArtGzipBytes": 23353,
+ "lazyFurnitureArtGzipBytes": 23347,
"lazyPdfFiles": [
- "houseplan-assets/furniture-plan-art.generated-BfO1XOcD.js",
- "houseplan-assets/pdf-export-BbdvUxVO.js"
+ "houseplan-assets/furniture-plan-art.generated-CDfS5UbT.js",
+ "houseplan-assets/pdf-export-_NFtYoOA.js"
],
- "lazyPdfGzipBytes": 133223,
+ "lazyPdfGzipBytes": 133219,
"files": [
{
- "path": "houseplan-assets/backdrop-pick-eS5vEdSu.js",
- "sha256": "7c243ec99dc24ad4ef2151c37bc44635af0f6c06bbd8268b1641ab7db50b1228",
- "rawBytes": 19956,
- "gzipBytes": 6880,
+ "path": "houseplan-assets/backdrop-pick-DhTL8Q8P.js",
+ "sha256": "ae3be953b116684816999a60a5f0f07311902e3599ef17107e9f9a6b7fd2a069",
+ "rawBytes": 19959,
+ "gzipBytes": 6882,
"isEntry": false,
"imports": [
- "houseplan-assets/houseplan-card-BKJrmMEj.js"
+ "houseplan-assets/houseplan-card-CAm75-22.js"
],
"dynamicImports": []
},
{
- "path": "houseplan-assets/de-JnsB57l8.js",
- "sha256": "91f902f727bec6af4a0b8fac380f904eb9f5094f721c0fb402035e395da463da",
+ "path": "houseplan-assets/de-DCJ5g8AN.js",
+ "sha256": "ff505d3c55943f582850f5ac1930af8619c3715cb4c33d13c1897ca35290a572",
"rawBytes": 91971,
- "gzipBytes": 27815,
+ "gzipBytes": 27821,
"isEntry": false,
"imports": [],
"dynamicImports": []
},
{
- "path": "houseplan-assets/editor-CAGtS_SG.js",
- "sha256": "4166246b90475646d572f6d3626f60508c03c6b5db6fd0a89a204634f6129491",
- "rawBytes": 3831,
- "gzipBytes": 1582,
+ "path": "houseplan-assets/editor-lggZMXRH.js",
+ "sha256": "9c5a86d20b87135164c0e15f59767d4d14bd2bf26692004a0d4b18425746ff7d",
+ "rawBytes": 3833,
+ "gzipBytes": 1583,
"isEntry": false,
"imports": [
- "houseplan-assets/houseplan-card-BKJrmMEj.js"
+ "houseplan-assets/houseplan-card-CAm75-22.js"
],
"dynamicImports": []
},
{
- "path": "houseplan-assets/fr-BAV7hmLH.js",
- "sha256": "2360732a1b796fd6f888de25d792f30bfc963d57b28f49cb03b0734647f0e1b9",
+ "path": "houseplan-assets/fr-Y07FWZ2v.js",
+ "sha256": "b8ee190b8e3561ace2fc1447537f8990c4327bfbb23a68fcf383a2d59af54ce3",
"rawBytes": 94305,
- "gzipBytes": 27231,
+ "gzipBytes": 27236,
"isEntry": false,
"imports": [],
"dynamicImports": []
},
{
- "path": "houseplan-assets/furniture-plan-art.generated-BfO1XOcD.js",
- "sha256": "c61b80a3df3afdaa1a1afc1f5329bfec6c34ce964a2d0bc50dd631a1633d6a23",
+ "path": "houseplan-assets/furniture-plan-art.generated-CDfS5UbT.js",
+ "sha256": "2657f7864256a4cb71c5fd3503b5d5f9fc91ccdb5c0ac985d6bb13b79b1c220d",
"rawBytes": 90517,
- "gzipBytes": 23353,
+ "gzipBytes": 23347,
"isEntry": false,
"imports": [],
"dynamicImports": []
},
{
- "path": "houseplan-assets/houseplan-card-BKJrmMEj.js",
- "sha256": "cb5f49f3de3f06b8c88b247f4aa601124f78a48369a7836e229bbc851df458ae",
+ "path": "houseplan-assets/houseplan-card-CAm75-22.js",
+ "sha256": "9e4d4e13c9ee687137858734a5f8c1fd1a621f0492800d60718e1d5941bc132a",
"rawBytes": 1035084,
- "gzipBytes": 290545,
+ "gzipBytes": 290554,
"isEntry": false,
"imports": [],
"dynamicImports": [
- "houseplan-assets/de-JnsB57l8.js",
- "houseplan-assets/editor-CAGtS_SG.js",
- "houseplan-assets/fr-BAV7hmLH.js",
- "houseplan-assets/furniture-plan-art.generated-BfO1XOcD.js",
- "houseplan-assets/houseplan-editor-runtime-BmdEXc9r.js",
- "houseplan-assets/houseplan-onboarding-runtime-DE7rHApS.js",
- "houseplan-assets/hp-zigbee-topology-overlay-Dn1oMTHf.js",
- "houseplan-assets/iso-scene-render-CCE-TeKM.js",
- "houseplan-assets/live-interaction-runtime-Ba7Bs1o7.js",
- "houseplan-assets/pdf-export-BbdvUxVO.js",
- "houseplan-assets/summary-panel-runtime-loaded-B6QGWMyY.js"
+ "houseplan-assets/de-DCJ5g8AN.js",
+ "houseplan-assets/editor-lggZMXRH.js",
+ "houseplan-assets/fr-Y07FWZ2v.js",
+ "houseplan-assets/furniture-plan-art.generated-CDfS5UbT.js",
+ "houseplan-assets/houseplan-editor-runtime-Dun21GNm.js",
+ "houseplan-assets/houseplan-onboarding-runtime-DZtjID7S.js",
+ "houseplan-assets/hp-zigbee-topology-overlay-DU0yXG-C.js",
+ "houseplan-assets/iso-scene-render-Dh7Z_AR9.js",
+ "houseplan-assets/live-interaction-runtime-Cwn9InHh.js",
+ "houseplan-assets/pdf-export-_NFtYoOA.js",
+ "houseplan-assets/summary-panel-runtime-loaded-DU9JvYSv.js"
]
},
{
- "path": "houseplan-assets/houseplan-editor-runtime-BmdEXc9r.js",
- "sha256": "dd6b9eb38ff60c997cd860c27d377c7a1880f10116832188fc6d9b6912ac2056",
- "rawBytes": 670235,
- "gzipBytes": 178853,
+ "path": "houseplan-assets/houseplan-editor-runtime-Dun21GNm.js",
+ "sha256": "632cfe4b9927d45b1c58f3eb6c9bd01cd43c50777b939dc4a8eb47e621f2830a",
+ "rawBytes": 670570,
+ "gzipBytes": 180766,
"isEntry": false,
"imports": [
- "houseplan-assets/backdrop-pick-eS5vEdSu.js",
- "houseplan-assets/furniture-plan-art.generated-BfO1XOcD.js",
- "houseplan-assets/houseplan-card-BKJrmMEj.js",
- "houseplan-assets/zigbee-topology-CW_HKDoT.js"
+ "houseplan-assets/backdrop-pick-DhTL8Q8P.js",
+ "houseplan-assets/furniture-plan-art.generated-CDfS5UbT.js",
+ "houseplan-assets/houseplan-card-CAm75-22.js",
+ "houseplan-assets/zigbee-topology-CmbCVeQJ.js"
],
"dynamicImports": [
- "houseplan-assets/zigbee-topology-runtime-DU0yDsuI.js"
+ "houseplan-assets/zigbee-topology-runtime-HfConMDX.js"
]
},
{
- "path": "houseplan-assets/houseplan-onboarding-runtime-DE7rHApS.js",
- "sha256": "40c1aa5283e0ddaad87a412ce7ada42c2a7ef2b72d0b69611fa17ac8c1cfca84",
+ "path": "houseplan-assets/houseplan-onboarding-runtime-DZtjID7S.js",
+ "sha256": "21953b981a22c1a25829912796947e0076018d29ab4470138c558b774191303f",
"rawBytes": 28287,
- "gzipBytes": 7032,
+ "gzipBytes": 7037,
"isEntry": false,
"imports": [
- "houseplan-assets/backdrop-pick-eS5vEdSu.js",
- "houseplan-assets/houseplan-card-BKJrmMEj.js"
+ "houseplan-assets/backdrop-pick-DhTL8Q8P.js",
+ "houseplan-assets/houseplan-card-CAm75-22.js"
],
"dynamicImports": []
},
{
- "path": "houseplan-assets/hp-zigbee-topology-overlay-Dn1oMTHf.js",
- "sha256": "19cec6f0e9a185acbfaacc56cff85cfe52974b8d152e59009d22aab0096b9bab",
- "rawBytes": 10756,
- "gzipBytes": 3683,
+ "path": "houseplan-assets/hp-zigbee-topology-overlay-DU0yXG-C.js",
+ "sha256": "4bdf96a07fabc347707e7ba848e4c0888d169ce4bf30654947ef8bab5fbe3443",
+ "rawBytes": 10759,
+ "gzipBytes": 3686,
"isEntry": false,
"imports": [
- "houseplan-assets/houseplan-card-BKJrmMEj.js",
- "houseplan-assets/zigbee-topology-CW_HKDoT.js",
- "houseplan-assets/zigbee-topology-runtime-DU0yDsuI.js"
+ "houseplan-assets/houseplan-card-CAm75-22.js",
+ "houseplan-assets/zigbee-topology-CmbCVeQJ.js",
+ "houseplan-assets/zigbee-topology-runtime-HfConMDX.js"
],
"dynamicImports": []
},
{
- "path": "houseplan-assets/iso-scene-render-CCE-TeKM.js",
- "sha256": "d3ffcf53f84db6a8c510a5001af1b2b53aa9b18781c09c56ebf4bd25d6db442c",
+ "path": "houseplan-assets/iso-scene-render-Dh7Z_AR9.js",
+ "sha256": "586959971838ed78f30609da10d17e840d7966b0738d38385ccacd99bc3df0aa",
"rawBytes": 44439,
- "gzipBytes": 15011,
+ "gzipBytes": 15014,
"isEntry": false,
"imports": [
- "houseplan-assets/houseplan-card-BKJrmMEj.js"
+ "houseplan-assets/houseplan-card-CAm75-22.js"
],
"dynamicImports": []
},
{
- "path": "houseplan-assets/live-interaction-runtime-Ba7Bs1o7.js",
- "sha256": "ec5125376ea07c2226e195f680bb96282fc0663254ab1f8b8cf192872243e4e5",
+ "path": "houseplan-assets/live-interaction-runtime-Cwn9InHh.js",
+ "sha256": "afecdddd9772a67ff21826f7c6882af84f5c862336c22f58a5013c44259d9856",
"rawBytes": 8216,
"gzipBytes": 3208,
"isEntry": false,
"imports": [
- "houseplan-assets/houseplan-card-BKJrmMEj.js"
+ "houseplan-assets/houseplan-card-CAm75-22.js"
],
"dynamicImports": []
},
{
- "path": "houseplan-assets/pdf-export-BbdvUxVO.js",
- "sha256": "c72e1b5276c2b14a7af50aa5a61e9f10ddeb42b63e9e6e8b16883193edb7e43c",
- "rawBytes": 236244,
- "gzipBytes": 109870,
+ "path": "houseplan-assets/pdf-export-_NFtYoOA.js",
+ "sha256": "1520ec4cc1340fd3f03f8f7be2a614a4e35a92d6a4f320f63bfe995be651db0e",
+ "rawBytes": 236247,
+ "gzipBytes": 109872,
"isEntry": false,
"imports": [
- "houseplan-assets/furniture-plan-art.generated-BfO1XOcD.js",
- "houseplan-assets/houseplan-card-BKJrmMEj.js"
+ "houseplan-assets/furniture-plan-art.generated-CDfS5UbT.js",
+ "houseplan-assets/houseplan-card-CAm75-22.js"
],
"dynamicImports": []
},
{
- "path": "houseplan-assets/summary-panel-editor-AdqXisOL.js",
- "sha256": "b2b06fd3d05fb9f0e0b968b2db06382a70138d2cc15eab633683ced152087581",
+ "path": "houseplan-assets/summary-panel-editor-DqzNDRFv.js",
+ "sha256": "c8e6ff2e8056506fd6de7ab5d0825a8c24751b8a8b16f2c537b9240856528b28",
"rawBytes": 14824,
- "gzipBytes": 3400,
+ "gzipBytes": 3401,
"isEntry": false,
"imports": [
- "houseplan-assets/houseplan-card-BKJrmMEj.js",
- "houseplan-assets/summary-panel-runtime-loaded-B6QGWMyY.js"
+ "houseplan-assets/houseplan-card-CAm75-22.js",
+ "houseplan-assets/summary-panel-runtime-loaded-DU9JvYSv.js"
],
"dynamicImports": []
},
{
- "path": "houseplan-assets/summary-panel-metrics-Opp08Jxc.js",
- "sha256": "85a3a361187bee8843f3cb0831e361d381ed15846120c5680d5bda85e6858137",
- "rawBytes": 2610,
- "gzipBytes": 1305,
+ "path": "houseplan-assets/summary-panel-metrics-CmOL1oNs.js",
+ "sha256": "a21056a7553bf7d3f88f1fadbf1ba49ecfdf95fa15cdc06e0d9b2e47a1ce4b16",
+ "rawBytes": 2611,
+ "gzipBytes": 1308,
"isEntry": false,
"imports": [
- "houseplan-assets/houseplan-card-BKJrmMEj.js"
+ "houseplan-assets/houseplan-card-CAm75-22.js"
],
"dynamicImports": []
},
{
- "path": "houseplan-assets/summary-panel-runtime-loaded-B6QGWMyY.js",
- "sha256": "3e8a8b3c6632befadb081043fc6afa6685effc4672d05a3747029642f60c6052",
- "rawBytes": 73366,
- "gzipBytes": 20085,
+ "path": "houseplan-assets/summary-panel-runtime-loaded-DU9JvYSv.js",
+ "sha256": "35a175948cb48e495e8fd7c76ffb9b64c71717dc395dd3811ceac7fb017a0b2c",
+ "rawBytes": 73367,
+ "gzipBytes": 20088,
"isEntry": false,
"imports": [
- "houseplan-assets/houseplan-card-BKJrmMEj.js"
+ "houseplan-assets/houseplan-card-CAm75-22.js"
],
"dynamicImports": [
- "houseplan-assets/summary-panel-editor-AdqXisOL.js",
- "houseplan-assets/summary-panel-metrics-Opp08Jxc.js"
+ "houseplan-assets/summary-panel-editor-DqzNDRFv.js",
+ "houseplan-assets/summary-panel-metrics-CmOL1oNs.js"
]
},
{
- "path": "houseplan-assets/zigbee-topology-CW_HKDoT.js",
- "sha256": "0bd4758722344d63391a9f4c45e591a260fc6acf1ab4e8511479edef2c08fce1",
- "rawBytes": 18961,
- "gzipBytes": 7425,
+ "path": "houseplan-assets/zigbee-topology-CmbCVeQJ.js",
+ "sha256": "5df26967bae55372755fd7299256f932761c345625b4f7220527e0a6a1f1ffdf",
+ "rawBytes": 18962,
+ "gzipBytes": 7426,
"isEntry": false,
"imports": [
- "houseplan-assets/houseplan-card-BKJrmMEj.js"
+ "houseplan-assets/houseplan-card-CAm75-22.js"
],
"dynamicImports": []
},
{
- "path": "houseplan-assets/zigbee-topology-runtime-DU0yDsuI.js",
- "sha256": "c1eadf604fa8e2f3129c48da7a37727e8c0a0408c81182403cbcb3aed518f58a",
- "rawBytes": 3941,
- "gzipBytes": 1762,
+ "path": "houseplan-assets/zigbee-topology-runtime-HfConMDX.js",
+ "sha256": "fd384844d230cab49240d57617520b9f209212551237a42c451cc72288d90d62",
+ "rawBytes": 3942,
+ "gzipBytes": 1764,
"isEntry": false,
"imports": [
- "houseplan-assets/houseplan-card-BKJrmMEj.js",
- "houseplan-assets/zigbee-topology-CW_HKDoT.js"
+ "houseplan-assets/houseplan-card-CAm75-22.js",
+ "houseplan-assets/zigbee-topology-CmbCVeQJ.js"
],
"dynamicImports": []
},
{
"path": "houseplan-card.js",
- "sha256": "8f5fbf9f62363032c898284d72e25336c59aaf2c9de126d22e3ce6d43c293103",
+ "sha256": "f3c8e73d38c120cf9fa7f1f1dd91521b42fb4c7e83f7c914347bfb7acba14fc5",
"rawBytes": 1205,
- "gzipBytes": 801,
+ "gzipBytes": 802,
"isEntry": true,
"imports": [
- "houseplan-assets/houseplan-card-BKJrmMEj.js"
+ "houseplan-assets/houseplan-card-CAm75-22.js"
],
"dynamicImports": []
},
{
"path": "houseplan-panel.js",
- "sha256": "a07ab338c2158001a3b8087118b6ee72dfc91ce60cde2b95e56eea2fefff1a6a",
+ "sha256": "39eec623cf8586c02912f4144e8190aab0148100217bf1ad0a22af2f3716549c",
"rawBytes": 6165,
- "gzipBytes": 2323,
+ "gzipBytes": 2324,
"isEntry": true,
"imports": [
- "houseplan-assets/houseplan-card-BKJrmMEj.js"
+ "houseplan-assets/houseplan-card-CAm75-22.js"
],
"dynamicImports": []
}
diff --git a/dist/houseplan-assets/backdrop-pick-eS5vEdSu.js b/dist/houseplan-assets/backdrop-pick-DhTL8Q8P.js
similarity index 56%
rename from dist/houseplan-assets/backdrop-pick-eS5vEdSu.js
rename to dist/houseplan-assets/backdrop-pick-DhTL8Q8P.js
index 3f1db6b0..4f21ef5b 100644
--- a/dist/houseplan-assets/backdrop-pick-eS5vEdSu.js
+++ b/dist/houseplan-assets/backdrop-pick-DhTL8Q8P.js
@@ -1,4 +1,4 @@
-globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="34d1dbfc181acaf58842dfced0e6aa3a899aef6b8d1eeba53732ef729a63137e";import{D as e,c as t,A as i,p as o,q as n,dG as r}from"./houseplan-card-BKJrmMEj.js";function s(e){const t=e.visualViewport;return t&&Number.isFinite(t.width)&&Number.isFinite(t.height)?{left:Number(t.offsetLeft)||0,top:Number(t.offsetTop)||0,width:Math.max(0,Number(t.width)||0),height:Math.max(0,Number(t.height)||0)}:{left:0,top:0,width:e.innerWidth,height:e.innerHeight}}function a(e,t,i,o=7,n=8){const r=i.left+n,s=i.top+n,a=Math.max(r,i.left+i.width-n),l=Math.max(s,i.top+i.height-n),h=Math.max(0,a-r),d=Math.max(0,l-s),c=Math.min(Math.max(0,t.width),h),u=Math.min(Math.max(0,t.height),d);let p=e.left;p+c>a&&(p=e.right-c),p=Math.min(Math.max(r,p),Math.max(r,a-c));const g=e.bottom+o,_=e.top-o-u;let m="bottom",f=g;return g+u>l&&_>=s?(m="top",f=Math.min(Math.max(s,_),Math.max(s,l-u))):f=Math.min(Math.max(s,g),Math.max(s,l-u)),{left:Math.round(p),top:Math.round(f),side:m,maxWidth:Math.round(h),maxHeight:Math.round(d)}}class l{constructor(e,t,i){this.owner=e,this.name=t,this.keydown=i,this.host=null,this.root=null}window(){return this.owner.ownerDocument.defaultView}dialog(){return this.owner.closest("hp-dialog")}usesPopover(e=!1){const t=this.window();return!e&&!!t&&function(e){const t=e.HTMLElement?.prototype;return"function"==typeof t?.showPopover&&"function"==typeof t?.hidePopover}(t)}get hasFallback(){return!!this.host}containsPath(e){return e.includes(this.owner)||!!this.host&&e.includes(this.host)}ownsActiveElement(){let e=this.owner.ownerDocument.activeElement;for(;e?.shadowRoot?.activeElement;)e=e.shadowRoot.activeElement;return!(!e||e!==this.owner&&!this.owner.shadowRoot?.contains(e)&&!this.root?.contains(e))}renderFallback(i,o){const n=this.ensureFallback();return n?(e(t`${i}`,n),n):null}surface(e,t){return t?this.owner.shadowRoot?.querySelector(e)||null:this.root?.querySelector(e)||null}destroy(){this.root&&e(i,this.root),this.host?.remove(),this.host=null,this.root=null}ensureFallback(){if(this.root?.isConnected)return this.root;const e=this.dialog()?.overlayPortal()||this.owner.ownerDocument.body;if(!e)return null;const t=this.owner.ownerDocument.createElement("div");return t.dataset.hpOverlay=this.name,t.style.display="contents",this.keydown&&t.addEventListener("keydown",this.keydown,!0),e.append(t),this.host=t,this.root=t.attachShadow({mode:"open"}),this.root}}let h=0;class d extends n{constructor(){super(...arguments),this.text="",this.ariaLabel="",this.pointerHover=!1,this._open=!1,this._openTimer=0,this._closeTimer=0,this._positionRaf=0,this._forceFallback=!1,this._hoverOwned=!1,this._overlayDispose=null,this._scrollDialog=null,this._descriptionId="hp-help-description-"+ ++h,this._surfacePointerEnter=()=>{const e=this._window();this._closeTimer&&e?.clearTimeout(this._closeTimer),this._closeTimer=0},this._surfacePointerLeave=()=>{this._scheduleClose()},this._outsidePointerDown=e=>{if(!this._open)return;const t=e.composedPath();this._floating.containsPath(t)||this._closeHelp(!1,"outside")},this._dialogScroll=e=>{const t=this._floating.containsPath(e.composedPath()),i=e.target,o=this._dialog(),n=i instanceof Node&&(i===o||i instanceof Element&&i.contains(this));var r;this._open&&(r=n,!t&&r)&&this._closeHelp(!1,"scroll")},this._keyDown=e=>{if(!this._open||e.defaultPrevented)return;if("Escape"===e.key)return e.preventDefault(),e.stopImmediatePropagation(),void this._closeHelp(this._floating.ownsActiveElement(),"escape");const t=this.renderRoot.querySelector(".trigger");if(!t||!e.composedPath().includes(t))return;const i=this._surface();if(!i||i.scrollHeight<=i.clientHeight)return;const o=Math.max(40,.8*i.clientHeight),n={ArrowDown:40,ArrowUp:-40,PageDown:o,PageUp:-o};if("Home"===e.key)i.scrollTop=0;else if("End"===e.key)i.scrollTop=i.scrollHeight;else{if(!(e.key in n))return;i.scrollBy({top:n[e.key],behavior:"auto"})}e.preventDefault(),e.stopImmediatePropagation()},this._floating=new l(this,"help",this._keyDown),this._queuePosition=()=>{if(!this._open||this._positionRaf)return;const e=this._window();e&&(this._positionRaf=e.requestAnimationFrame(()=>{this._positionRaf=0,this._position()||this._closeHelp()}))}}connectedCallback(){super.connectedCallback(),this.addEventListener("keydown",this._keyDown,!0)}willUpdate(){this.toggleAttribute("data-has-content",this._hasContent())}disconnectedCallback(){const e=this.ownerDocument.defaultView;this._unsubscribeOpenListeners(),this.removeEventListener("keydown",this._keyDown,!0),this._clearTimers(),this._positionRaf&&e?.cancelAnimationFrame(this._positionRaf),this._positionRaf=0,this._closeHelp(!1,"disconnect"),super.disconnectedCallback()}updated(e){if(e.has("pointerHover")&&!this.pointerHover){const e=this._window();this._openTimer&&e?.clearTimeout(this._openTimer),this._openTimer=0,this._hoverOwned&&this._closeHelp(!1,"outside")}this._hasContent()||!this._open?this._open&&e.has("text")&&(this._usesPopover()||this._renderFallback(),this._queuePosition()):this._closeHelp()}_window(){return this._floating.window()}_dialog(){return this._floating.dialog()}_usesPopover(){return this._floating.usesPopover(this._forceFallback)}_hasContent(){return e=this.text,t=this.ariaLabel,"string"==typeof e&&e.trim().length>0&&"string"==typeof t&&t.trim().length>0;var e,t}_clearTimers(){const e=this._window();this._openTimer&&e?.clearTimeout(this._openTimer),this._closeTimer&&e?.clearTimeout(this._closeTimer),this._openTimer=0,this._closeTimer=0}_scheduleOpen(){const e=this._window();this.pointerHover&&e&&!this._open&&!this._openTimer&&(this._closeTimer&&e.clearTimeout(this._closeTimer),this._closeTimer=0,this._openTimer=e.setTimeout(()=>{this._openTimer=0,this.isConnected&&(this._hoverOwned=!0,this._openHelp())},300))}_scheduleClose(){const e=this._window(),t=this.renderRoot.querySelector(".trigger");e&&!t?.matches(":focus-visible")&&(this._openTimer&&e.clearTimeout(this._openTimer),this._closeTimer&&e.clearTimeout(this._closeTimer),this._openTimer=0,this._closeTimer=e.setTimeout(()=>{this._closeTimer=0,this.isConnected&&this._closeHelp()},150))}_triggerPointerEnter(e){this.pointerHover&&"mouse"===e.pointerType&&this._scheduleOpen()}_triggerPointerLeave(e){"mouse"===e.pointerType&&this._scheduleClose()}_triggerFocus(){queueMicrotask(()=>{const e=this.renderRoot.querySelector(".trigger");e?.matches(":focus-visible")&&(this._hoverOwned=!1,this._openHelp())})}_triggerBlur(){this._scheduleClose()}_triggerClick(){this._open?this._closeHelp():(this._hoverOwned=!1,this._openHelp())}_subscribeOpenListeners(){this.ownerDocument.addEventListener("pointerdown",this._outsidePointerDown,!0),this.ownerDocument.addEventListener("keydown",this._keyDown,!0);const e=this._window();e?.addEventListener("resize",this._queuePosition),e?.addEventListener("orientationchange",this._queuePosition),e?.visualViewport?.addEventListener("resize",this._queuePosition),e?.visualViewport?.addEventListener("scroll",this._queuePosition),this._scrollDialog=this._dialog(),this._scrollDialog?.addEventListener("scroll",this._dialogScroll,!0)}_unsubscribeOpenListeners(){this.ownerDocument.removeEventListener("pointerdown",this._outsidePointerDown,!0),this.ownerDocument.removeEventListener("keydown",this._keyDown,!0);const e=this._window();e?.removeEventListener("resize",this._queuePosition),e?.removeEventListener("orientationchange",this._queuePosition),e?.visualViewport?.removeEventListener("resize",this._queuePosition),e?.visualViewport?.removeEventListener("scroll",this._queuePosition),this._scrollDialog?.removeEventListener("scroll",this._dialogScroll,!0),this._scrollDialog=null}async _openHelp(){!this._open&&this._hasContent()&&(this._clearTimers(),this._forceFallback=!1,this._open=!0,this._subscribeOpenListeners(),await this.updateComplete,this._open&&(this._usesPopover()||this._renderFallback(),this._position()?this._overlayDispose=this._dialog()?.registerOverlay({owner:this,group:"transient",close:e=>this._closeHelp("escape"===e&&this._floating.ownsActiveElement(),e)})||null:this._closeHelp()))}_closeHelp(e=!1,t="exclusive"){if(!this._open&&!this._floating.hasFallback)return;this._clearTimers();const i=this._overlayDispose;this._overlayDispose=null,i?.();const o=this.renderRoot.querySelector(".tooltip");if(o?.hidePopover)try{o.matches(":popover-open")&&o.hidePopover()}catch{}this._open=!1,this._hoverOwned=!1,this._unsubscribeOpenListeners(),this._floating.destroy(),e&&this.updateComplete.then(()=>this.renderRoot.querySelector(".trigger")?.focus())}_tooltipTemplate(e){return t`
- `}export{l as F,c as a,L as c,$ as e,s as f,a as p,C as r,u as s};
+ `}export{l as F,c as a,L as c,$ as e,s as f,a as p,H as r,u as s};
diff --git a/custom_components/houseplan/frontend/houseplan-assets/de-JnsB57l8.js b/dist/houseplan-assets/de-DCJ5g8AN.js
similarity index 99%
rename from custom_components/houseplan/frontend/houseplan-assets/de-JnsB57l8.js
rename to dist/houseplan-assets/de-DCJ5g8AN.js
index cdd2c110..32b4853a 100644
--- a/custom_components/houseplan/frontend/houseplan-assets/de-JnsB57l8.js
+++ b/dist/houseplan-assets/de-DCJ5g8AN.js
@@ -1 +1 @@
-globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="34d1dbfc181acaf58842dfced0e6aa3a899aef6b8d1eeba53732ef729a63137e";var e={"editor.context_actions":"Aktionen: {object}","editor.tool_options":"Werkzeugoptionen: {tool}","editor.palette":"Palette: {tool}","editor.open_group":"Werkzeuggruppe: {group}","editor.group_active":"{group} — aktiv: {item}","editor.disabled_action":"{action} ist nicht verfügbar: {reason}","editor.loading":"Editor wird geladen…","editor.loading_aria":"Der Plan-Editor wird geladen","editor.load_failed":"Der Editor konnte nicht geladen werden.","editor.refresh_advice":"Seite aktualisieren und erneut versuchen.","editor.retry_advice":"Verbindung prüfen und erneut drücken.","version_mismatch.title":"Die House Plan-Versionen stimmen nicht überein","version_mismatch.body":"Falls Home Assistant noch neu startet, warten Sie den Abschluss ab und laden Sie dann diese Seite neu.","version_mismatch.frontend":"Karte","version_mismatch.backend":"Integration","version_mismatch.reload":"Seite neu laden","color_picker.title":"Farbwähler","color_picker.hue":"Farbton","color_picker.saturation":"Sättigung","color_picker.value":"Helligkeit","color_picker.hex":"Hex-Farbe","color_picker.invalid_hex":"Geben Sie eine 3- oder 6-stellige Hex-Farbe ein","color_picker.confirm":"OK","btn.properties":"Eigenschaften","btn.keep_as_walls":"Als Wände behalten","btn.delete_room_keep_walls":"Raum löschen, Wände behalten","btn.delete_room_with_walls":"Raum und Wände löschen","title.markup_select":"Wände und Säulen auswählen und bearbeiten","title.markup_column":"Säule: Klicken Sie auf einen Rasterpunkt, um eine quadratische Säule zu platzieren","markup.partition":"Trennwand","markup.column":"Säule","markup.hint_column":"Klicken Sie auf einen Rasterpunkt, um eine quadratische Säule zu platzieren","history.wall_segment":"Wandsegment hinzufügen","history.column_add":"Säule hinzufügen","history.physical_edit":"Physisches Objekt ändern","history.physical_delete":"Physisches Objekt löschen","history.physical_move":"Physisches Objekt verschieben","history.wall_face_batch":"Räume aus Wänden erstellen","toast.column_duplicate":"Eine Säule mit demselben Zentrum und äußerer Größe existiert bereits","physical.partition_properties":"Eigenschaften der Trennwand","physical.column_properties":"Eigenschaften der Säule","physical.shape":"Form","physical.square":"Quadrat","physical.circle":"Kreis","physical.diameter":"Durchmesser","physical.side":"Seite","physical.rotation":"Drehwinkel","physical.length":"Länge","physical.allowed_range":"Erlaubt: {min}–{max} {unit}","physical.column_size_title":"Außenmaß der per Klick platzierten quadratischen Säule (1–150 cm).","card.title":"Hausplan","count.devices":"{n} Entwicklung","empty.no_spaces":"Noch keine Bereiche.","nav.spaces":"House-Plan-Bereiche","empty.add_first":"Ersten Bereich hinzufügen und einen Grundriss hochladen.","empty.read_only":"Es sind keine Bereiche eingerichtet. Bitten Sie einen Administrator, einen hinzuzufügen.","empty.install":"Installieren Sie die House Plan-Integration und fügen Sie sie unter „Geräte & Dienste“ hinzu.","btn.add_space":"Bereich hinzufügen","btn.cancel":"Abbrechen","btn.save":"Speichern","btn.close":"Schließen","btn.delete":"Löschen","btn.copy":"Kopieren","btn.edit":"Bearbeiten","btn.open_in_ha":"In HA öffnen","btn.reset":"Zurücksetzen","btn.attach":"Anhängen…","btn.upload":"Hochladen…","btn.replace":"Ersetzen…","title.zoom_in":"Zoomen","title.zoom_out":"Herauszoomen","title.zoom_fit":"Alles anpassen","title.configure_space":"Bereich konfigurieren","title.add_space":"Bereich hinzufügen","title.markup_add":"Wände: eine durchgehende Kette zeichnen; jedes bestätigte Segment wird einzeln gespeichert. Umschalt sperrt auf 45°","title.markup_merge":"Zusammenführen: Klicken Sie auf einen Raum und dann auf den Nachbarraum, mit dem er eine Wand teilt","title.markup_split":"Raum teilen: Klicken Sie auf den Raum und dann auf zwei Punkte an seinen Wänden","title.markup_delroom":"Raum löschen: Klicken Sie in einen Raum und bestätigen Sie","title.need_plan":"Einen Grundriss hochladen","markup.add":"Wände","markup.merge":"Zusammenführen","markup.split":"Teilen","markup.resize":"Größe ändern","title.markup_resize":"Räume vergrößern/verkleinern: Ziehen Sie einen verfügbaren horizontalen oder vertikalen Wandgriff","markup.hint_resize":"Ziehen Sie einen verfügbaren Wandgriff · die Wand stoppt an der ersten unsicheren Position · Esc bricht ab · Strg+Z — rückgängig","resize.disabled.diagonal":"Diese Wand ist geneigt; Größe ändern unterstützt nur horizontale und vertikale Wände","resize.disabled.side-angle":"Eine angrenzende Wand ist geneigt; Größe ändern erfordert, dass beide angrenzenden Wände diese Wand im rechten Winkel treffen","resize.disabled.duplicate-physical-wall":"Eine separate Trennwand oder ein Pfeiler überlappt diese Wand; entfernen oder verschieben Sie sie, bevor Sie die Größe ändern","resize.disabled.partial-shared":"Ein angrenzender Raum nutzt nur einen Teil dieser Wand, daher kann sie nicht sicher als gemeinsame Wand verschoben werden","resize.disabled.unequal-shared":"Der angrenzende Raum nutzt andere Endpunkte oder Wandlängen, daher können die Wände nicht gemeinsam sicher bewegt werden","resize.disabled.multiple-rooms":"Das Verschieben dieser Wand würde mehr als zwei Räume betreffen","resize.disabled.thickness-conflict":"Die Wandstärke kann nicht sicher beibehalten werden","resize.disabled.opening-conflict":"Eine Öffnung an dieser Wand kann nicht sicher verschoben werden","resize.disabled.invalid-geometry":"Diese Wand kann nicht ohne Änderung der Planstruktur geändert werden","resize.limit_stopped":"Wand gestoppt: der nächste Schritt würde ein Anschlusslimit verletzen","resize.commit_failed":"Größenänderung wurde abgebrochen, da der endgültige Plan die Geometrieprüfung nicht bestanden hat","resize.preview_failed":"Größenänderung am letzten sicheren Punkt gestoppt, da die Plan-Geometrie nicht beibehalten werden konnte","markup.opening":"Öffnung","markup.delete_room":"Raum löschen","history.undo":"Rückgängig","history.redo":"Wiederholen","history.undo_named":"Rückgängig: {name} (Strg+Z)","history.redo_named":"Wiederholen: {name} (Strg+Shift+Z / Strg+Y)","history.undo_empty":"Nichts zu widerrufen","history.redo_empty":"Nichts zu wiederholen","history.undone":"Rückgängig gemacht: {name}","history.redone":"Wiederholt: {name}","history.add_room":"Raum erstellen","history.split_room":"Raum teilen","history.merge_rooms":"Räume zusammenführen","history.resize_room":"Raumgröße ändern","history.wall_thickness":"Wandstärke ändern","history.add_opening":"Tür- oder Fensteröffnung hinzufügen","history.edit_opening":"Öffnung bearbeiten","history.move_opening":"Öffnung verschieben","history.delete_opening":"Öffnung löschen","history.delete_room_keep_walls":"Raum löschen, Wände behalten","history.delete_room_with_walls":"Raum und Wände löschen","history.decor_add":"Dekorobjekt hinzufügen","history.decor_edit":"Dekorobjekt bearbeiten","history.decor_move":"Dekorobjekt verschieben","history.decor_transform":"Dekorobjekt transformieren","history.decor_delete":"Dekorobjekt löschen","history.backdrop_transform":"Plan-Hintergrund transformieren","history.device_move":"{name} verschieben","history.device_stale":"Der Positionsverlauf ist nicht mehr anwendbar und wurde gelöscht","opening.new":"Neue Öffnung","opening.edit":"Öffnung","opening.door":"Tür","opening.window":"Fenster","opening.gate":"Tor","opening.passage":"Offener Durchgang","opening.passage_binding_warning":"Das Speichern entfernt den Öffnungs-/Schließsensor und das Schloss.","opening.invalid_passage_fields":"Der offene Durchgang auf dem Plan „{room}“ hat nicht unterstützte Einstellungen: {fields}.","opening.type_label":"Typ","opening.length_label":"Länge, cm","opening.contact_label":"Öffnungs-/Schließsensor","opening.lock_label":"Schloss","opening.none":"— keine —","opening.search_ph":"Suche: Name oder Entitäts-ID…","opening.invert":"Geöffnet/geschlossen invertieren","opening.flip_h":"Scharnier an der anderen Zarge","opening.flip_v":"Öffnet zur anderen Seite","opening.open":"Offen","opening.closed":"Geschlossen","opening.locked":"Verriegelt","opening.unlocked":"Entriegelt","opening.state_unknown":"nicht verfügbar","opening.no_entities":"Keine Sensoren gebunden — ein statisches Symbol auf dem Plan.","toast.opening_no_wall":"Neben eine Raumwand oder eine unabhängige Wand klicken","opening.host_partition":"Unabhängige Wand","opening.partition_orphan":"Die unabhängige Wand für diese Öffnung existiert nicht mehr","opening.partition_jamb_margin":"Mindestens {distance} zwischen der Öffnung und dem Wandende lassen","opening.rebind_partition":"An eine andere unabhängige Wand anfügen","confirm.delete_partition_openings_title":"Wand und Öffnungen löschen?","confirm.delete_partition_openings_body":"Diese Wand enthält {count} Öffnung(en). Sie werden zusammen gelöscht.","confirm.delete_partition_openings_item":"• {type}, {length}","markup.hint_points":"Punkte: {n} · Shift — 45° Schritte · Esc — Kette beenden · Ctrl+Z — Punkt rückgängig machen · Schließen eines Bereichs erstellt einen Raum","markup.hint_start":"Klicken Sie auf einen Rasterpunkt, um eine Wandkette zu starten","tip.lqi":"durchschnittliches Zigbee-Signal:","tip.area":"Bereich: {value}","info.device_header":"Gerät im Plan","info.model":"Modell","info.state":"Status","info.link":"Verbindung","info.manuals":"Handbücher","info.none":"Keine zusätzlichen Informationen","marker.new_device":"Neues Gerät","marker.name_label":"Name (im Plan angezeigt)","marker.name_ph":"Name","marker.binding_label":"An ein HA-Gerät binden","marker.binding_disabled":"in Home Assistant deaktiviert","marker.virtual_option":"Virtuelles Gerät (keine Bindung)","marker.search_ph":"Gerät/Gruppe suchen…","marker.nothing_found":"Nichts gefunden","marker.room_label":"Raum","marker.room_override":" (Platzierung überschreiben)","marker.room_choose":"— Raum auswählen —","marker.room_auto":"— nach Gerätebereich (auto) —","marker.icon_label":"Symbol","marker.icon_ph":"mdi:… (leer = automatisch)","marker.display_label":"Anzeige","display.badge":"Symbol + Zustand","display.icon_ripple":"Symbol + Zustand und Aktivität","display.static_icon":"Immer statisches Symbol","display.value_static_icon":"Wert + statisches Symbol","marker.display_hint_badge":"Das Symbol und die dynamische Platte zeigen den Gerätezustand ohne den üblichen Aktivitätspuls. Rote Alarme bleiben sichtbar.","marker.display_hint_icon_ripple":"Das Symbol, die dynamische Platte und der Puls zeigen einen kurzen Puls für Ereignisse und einen kontinuierlichen Puls für Arbeit, Bewegung oder Anwesenheit. Rote Alarme haben eine separate Priorität.","marker.display_hint_value":"Ein ausgewählter oder automatisch ermittelter Home Assistant-Wert ersetzt das Symbol, während die Platte weiterhin den Zustand anzeigt. Rote Alarme bleiben sichtbar.","marker.display_hint_static_icon":"Die themenabhängige Hülle und das Symbol bleiben immer gleich. Zustand, Aktivität, Nichtverfügbarkeit und Alarme verändern nicht das Erscheinungsbild.","marker.display_hint_value_static_icon":"Der Marker zeigt den gewählten Wert, während die Hülle themenabhängig bleibt. Zustand, Aktivität, Nichtverfügbarkeit und Alarme ändern die Markerfarbe nicht.","marker.static_alarm_warning":"Dieses Gerät kann Alarme melden. Die statische Anzeige verbirgt die visuelle Alarmanzeige des Markers.","marker.preview.title":"Anzeigevorschau","marker.preview.actual":"Jetzt","marker.preview.example":"Beispiel","marker.preview.integration":"Bereitgestellt von","marker.preview.source":"Anzeigquelle","marker.preview.current_state":"Aktueller Zustand","marker.preview.result":"Auf dem Plan","marker.preview.details":"Quelldetails","marker.preview.select_source":"Ein Home-Assistant-Gerät oder eine Entität auswählen, um die tatsächliche Anzeige zu sehen.","marker.preview.unknown_provider":"Unbekannte Integration","marker.preview.virtual_provider":"House Plan · virtuelles Gerät","marker.preview.no_source":"Keine aktive Quelle","marker.preview.no_state":"Kein aktueller Zustand","marker.preview.mixed_states":"Mehrere verschiedene Zustände","marker.preview.multiple_sources":"{n}-Quellen","marker.preview.more_sources":"+{n} mehr","marker.preview.scaled":"Die Vorschau wird auf {n}% skaliert, um zu passen. Die gespeicherte Größe bleibt unverändert.","marker.preview.demo_short":"Kurze Aktivität anzeigen","marker.preview.demo_continuous":"Kontinuierliche Aktivität anzeigen","marker.preview.stop_continuous":"Kontinuierliche Aktivität stoppen","marker.preview.demo_short_notice":"Kurzes Aktivitätsbeispiel; der tatsächliche Gerätezustand bleibt unverändert.","marker.preview.demo_continuous_notice":"Kontinuierliches Aktivitätsbeispiel; der tatsächliche Gerätezustand bleibt unverändert.","marker.preview.demo_already_visible":"Der aktuelle Zustand zeigt bereits eine echte Aktivitäts- oder Alarmeffekt.","marker.preview.reduced_motion":"Systemweit reduzierte Bewegungen sind aktiviert, daher wird gewöhnliche Aktivität als Punkt angezeigt.","marker.preview.reason.neutral":"Neutrale dunkle Platte","marker.preview.reason.working":"Gelbe Platte: Das Gerät arbeitet jetzt","marker.preview.reason.working_activity":"Gelbe Platte und Aktivitätseffekt: das Gerät funktioniert jetzt","marker.preview.reason.open":"Orange Platte: physisch geöffnet oder entriegelt","marker.preview.reason.cover_icon_state":"Neutrale Platte; die Abdeckungseinheit steuert den angezeigten Zustand und das Symbol","marker.preview.reason.presence":"Aktivitätseffekt, während Präsenz erkannt wird","marker.preview.reason.event":"Kurzer Aktivitätseffekt nach einem erkannten Ereignis","marker.preview.reason.transition":"Aktivitätseffekt, während das Gerät sich bewegt oder den Zustand ändert","marker.preview.reason.media_neutral":"Mediengeräte bleiben im verfügbaren Zustand auf einer neutralen dunklen Platte","marker.preview.reason.unavailable":"Gedämpfte neutrale Platte: nicht verfügbar oder ausgeschaltet","marker.preview.reason.alarm":"Rote Alarmplatte; Alarmanzeige wird immer angezeigt","marker.preview.reason.live_states_disabled":"Live-Zustandsstil ist für diese Karte deaktiviert","marker.preview.reason.value_no_state":"Kein nutzbarer Zustandswert; stattdessen wird das Symbol angezeigt","marker.preview.reason.value_ambiguous_sources":"Mehrere mögliche Wertequellen; stattdessen wird das Symbol angezeigt","marker.preview.reason.value_non_scalar":"Die Quelle lieferte keinen einfachen Wert; stattdessen wird das Symbol angezeigt","marker.preview.reason.value_virtual":"Ein virtuelles Gerät hat keinen Home Assistant-Wert; stattdessen wird das Symbol angezeigt","marker.preview.reason.vacuum_live_plan_only":"Echtzeitposition und -spur des Staubsaugers sind nur im vollständigen Plan verfügbar","marker.preview.reason.hidden_design_preview":"Das Gerät ist im Plan ausgeblendet; diese Designvorschau bleibt sichtbar","marker.preview.reason.composite_power_source":"Der Status stammt vom Power-Entity des Geräts; Hilfsschalter werden ignoriert","marker.preview.reason.activity_display_disabled":"Der gewählte Anzeigemodus zeigt gewöhnliche Aktivitätseffekte nicht an","marker.preview.reason.ha_disabled":"Die Home Assistant-Verbindung ist deaktiviert und wird im Plan ausgeblendet","marker.preview.reason.orphaned":"Die gespeicherte Home Assistant-Verbindung konnte nicht mehr gefunden werden","marker.preview.reason.static_icon":"Statischer Modus: Der Gerätestatus ändert das Symbol nicht","marker.preview.reason.value_static_icon":"Statischer Modus mit Wert: Der Gerätestatus ändert die Markerfarbe nicht","marker.activity_color":"Aktivitätspulsfarbe","marker.ripple_size":"Aktivitätspulsgröße","marker.activity_alarm_note":"Farbe und Größe betreffen nur gewöhnliche Aktivität und ändern keine roten Alarme.","marker.pulse_a11y_alarm":"Alarm","marker.pulse_a11y_event":"Kürzliches Ereignis","marker.pulse_a11y_presence":"Anwesenheit erkannt","marker.pulse_a11y_transition":"Statusänderung","marker.pulse_a11y_running":"Arbeitet","marker.state_a11y_neutral":"Standardzustand","marker.state_a11y_working":"Funktionierend","marker.state_a11y_open":"Offen","marker.state_a11y_locked":"Verschlossen","marker.state_a11y_unlocked":"Entriegelt","marker.state_a11y_alarm":"Alarm","marker.state_a11y_unavailable":"Nicht verfügbar","marker.lqi_a11y_low":"LQI {value}, schwaches Signal","marker.lqi_a11y_mid":"LQI {value}, mittleres Signal","marker.lqi_a11y_high":"LQI {value}, starkes Signal","marker.size_label":"Symbolgröße / Drehung","marker.angle_label":"Drehen","marker.model_label":"Modell","marker.model_ph":"z.B. Aqara T&H","marker.link_label":"Link","marker.desc_label":"Beschreibung","marker.desc_ph":"Notizen, Spezifikationen…","marker.manuals_label":"Handbücher (PDF usw.)","marker.sub_device":"Gerät","marker.sub_z2m_group":"· Z2M Gruppe","marker.sub_group":"Gruppe","marker.sub_helper":"Helfer","space.new":"Neuer Bereich","space.copy_title":"Bereich kopieren","space.copy_name":"Name des neuen Bereichs","space.copy_fallback":"Bereich","space.copy_create":"Kopie erstellen","space.copy_optimize_title":"Vor dem Kopieren optimieren?","space.copy_optimize_body":"Vor dem Erstellen von „{name}“ muss House Plan den gesamten Plan einschließlich anderer Bereiche optimieren. Fortfahren?","space.copy_optimize_confirm":"Optimieren und kopieren","space.copy_error_changed":"Der Plan wurde während der Bestätigung geändert. Bitte prüfen und erneut versuchen.","space.copy_error_source_missing":"Der Quellbereich existiert nicht mehr. Öffnen Sie seine Einstellungen erneut.","space.copy_error_source_invalid":"House Plan konnte nicht alle Wände dieses Bereichs prüfen. Korrigieren Sie den Quellbereich.","space.copy_error_spaces_limit":"House Plan enthält bereits die maximale Anzahl an Bereichen.","space.copy_error_partitions_limit":"Dieser Bereich enthält zu viele Wände zum Kopieren.","space.copy_error_openings_limit":"Dieser Bereich enthält zu viele Öffnungen zum Kopieren.","space.copy_error_decor_limit":"Dieser Bereich enthält zu viele Hintergrundobjekte zum Kopieren.","space.copy_error_columns_limit":"Dieser Bereich enthält zu viele Säulen zum Kopieren.","space.copy_error_opening_host":"Eine Öffnung ist keiner Wand mehr zugeordnet. Korrigieren oder löschen Sie sie vor dem Kopieren.","space.copy_error_geometry":"Die Kopie würde eine unsichere Wandgeometrie erzeugen. Korrigieren Sie den Quellbereich.","space.copy_error_optimize_geometry":"Das Kopieren wurde gestoppt, weil die Optimierung des gesamten Plans für einen Bereich unsicher ist.","space.header":"Bereich","space.title_label":"Titel","space.title_ph":"z.B. Garage","space.plan_label":"Grundriss (Hintergrund)","space.no_plan":"Kein Planbild","space.plan_alt":"Grundriss","room.new":"Neuer Raum","room.name_label":"Anzeigename","room.name_ph":"z.B. Terrasse","room.area_label":"Home Assistant Bereich (nicht zugewiesen)","room.no_area_option":"— kein Bereich —","room.default_name":"Raum","device.unnamed":"unbenannt","device.light_group":"Lichtgruppe","device.fallback":"Gerät","device.virtual":"Virtuelles Gerät","confirm.delete_room_title":'Raum "{name}" löschen?',"confirm.delete_room_body":"Festlegen, ob die ausschließlich zu diesem Raum gehörenden physischen Wände erhalten bleiben. Mit einem anderen Raum geteilte Wände bleiben immer erhalten.","confirm.remove_marker_title":"Gerät aus dem Plan löschen?","confirm.remove_marker_body":"Das Gerät verschwindet vollständig und trägt nicht mehr zu den Plandaten bei. Es kann später erneut hinzugefügt werden.","confirm.erase_decor":"Das Objekt „{kind}“ löschen? Diese Aktion kann im Editor rückgängig gemacht werden.","confirm.delete_space_title":"Bereich löschen?","confirm.delete_space_body":"Der Bereich, alle seine Räume und die gesamte Planmarkierung werden gelöscht.","confirm.delete_space_vac_routes":"Zuordnungen von Roboterkarten werden ebenfalls entfernt: {count}.","space.delete_blocked":"Dieser Bereich wird noch von {n} Gerät(en) verwendet. Die Geräte zuerst in einen anderen Bereich verschieben oder löschen.","toast.pos_save_failed":"Position nicht gespeichert: {err}","toast.no_entity":"Das Gerät hat keine geeignete Entität","toast.ha_disabled_action":"Ein deaktiviertes Home Assistant-Objekt kann im Plan nicht verwendet werden.","toast.ha_disabled_show_device":"Ein in Home Assistant deaktiviertes Gerät kann im Plan nicht angezeigt werden. Aktivieren Sie es zuerst in Home Assistant.","toast.ha_disabled_show_entity":"Eine in Home Assistant deaktivierte Entität kann im Plan nicht angezeigt werden. Aktivieren Sie sie zuerst in Home Assistant.","toast.ha_disabled_add":"Ein deaktiviertes Home Assistant-Objekt kann nicht dem Plan hinzugefügt werden. Aktivieren Sie es zuerst in Home Assistant.","toast.ha_binding_unverified":"Der Status des Objekts konnte über das Home Assistant-Register nicht überprüft werden. Anzeige und Aktionen sind vorübergehend nicht verfügbar.","toast.markup_needs_server":"Markup ist verfügbar, nachdem die Konfiguration auf den Server verschoben wurde.","toast.space_order_changed":"Reihenfolge geändert. Wenn eine Karte ihr Stockwerk nach Nummer festlegt, überprüfen Sie diese Paneele.","toast.conflict":"Die Konfiguration wurde in einem anderen Fenster geändert — Daten aktualisiert, wiederholen Sie Ihre letzte Aktion.","toast.cfg_save_failed":"Speichern der Konfiguration fehlgeschlagen: {err}","toast.room_overlap":"Die Umrisse überlappen den Raum „{name}“ — Räume dürfen sich nicht überlappen","toast.contour_cannot_close":"Die Kontur kann nicht geschlossen werden, da sie entartet ist oder sich selbst schneidet","toast.merge_not_adjacent":"Es können nur Räume zusammengeführt werden, die eine Wand teilen","toast.rooms_merged":"Räume zu „{name}“ zusammengeführt","toast.split_pick_wall":"Beginnen Sie den Schnitt an der Wand des Raumes","toast.split_bad_cut":"Der Schnitt muss wand-zu-wand innerhalb des Raumes verlaufen, ohne Wände oder sich selbst zu kreuzen","merge.header":"Räume zusammenführen","merge.hint":"Der zusammengeführte Raum behält einen Namen und eine Fläche. Die andere Fläche wird freigegeben — ihre Geräte verlassen den Plan, bis ein anderer Raum sie beansprucht.","merge.keep":"Behalten","merge.no_area":"keine Fläche","toast.room_saved":"Raum gespeichert ({n}). Hinzugefügte Geräte: {added}. Zeichnen Sie die nächste Kontur oder verlassen Sie die Markierung.","toast.room_saved_no_area":"Raum gespeichert ({n}, keine Fläche). Zeichnen Sie die nächste Kontur oder verlassen Sie die Markierung.","toast.marker_needs_server":"Die Gerätebearbeitung ist verfügbar, nachdem die Konfiguration auf den Server verschoben wurde","toast.virtual_name_required":"Einen Namen für das virtuelle Gerät eingeben","toast.marker_saved":"Gerät gespeichert","toast.marker_removed":"Gerät aus dem Plan gelöscht","toast.integration_missing":"Die House Plan-Integration ist nicht installiert — Verwaltung nicht verfügbar","toast.plan_formats":"Unterstützte Formate: SVG, PNG, JPG, WebP","toast.plan_required":"Grundriss hochladen — erforderlich","toast.space_added_onboard":"Bereich hinzugefügt. Räume einzeichnen: Rasterpunkte anklicken und die Kontur schließen.","toast.space_added":"Bereich hinzugefügt","toast.space_copied":"Bereich „{name}“ erstellt","toast.space_saved":"Bereich gespeichert","toast.space_deleted":"Bereich gelöscht","toast.delete_failed":"Löschen fehlgeschlagen: {err}","toast.error":"Fehler: {err}","toast.toggle_target_unavailable":"Ziel „{name}“ ist nicht verfügbar — keine Aktion durchgeführt","toast.toggle_targets_unavailable":"Ziele nicht verfügbar: {names}. Keine Aktion durchgeführt","toast.file_failed":'Datei "{name}" wurde nicht hochgeladen: {err}',"toast.files_attached":"Dateien angehängt: {n}","err.unknown":"unbekannter Fehler","err.code":"Code {code}","err.too_large":"Datei größer als {mb} MB","err.bad_ext":"nicht unterstützter Typ (PDF/Bild erwartet)","err.unauthorized":"Administratorrechte erforderlich","editor.title":"Titel","editor.default_floor":"Anfangsbereich","editor.default_floor_missing":"Anfangsbereich „{id}“ existiert nicht mehr. Wählen Sie einen anderen Bereich.","editor.floor":"Fester Bereich","editor.floor_none":"— nicht fest —","editor.floor_index":"YAML-Index {index} (beibehalten)","fixed_floor.loading":"Lade den festen Bereich…","fixed_floor.invalid_title":"Der feste Bereich ist nicht verfügbar","fixed_floor.invalid_body":"Überprüfen Sie die Etage in der Kartenkonfiguration. Der konfigurierte Wert ist: {value}","editor.icon_size":"Symbolgröße, % der Planbreite","editor.show_temperature":"Temperatur anzeigen","editor.live_states":"Live-Zustände (ein/aus, offen…)","editor.light_pools":"Lichtkegel und Wandschatten","editor.show_signal":"Zigbee-Signal anzeigen (LQI)","editor.language":"Schnittstellensprache","editor.lang_auto":"Automatisch (HA-Profil)","title.icon_rules":"Symbolregeln: welche MDI-Symbole Geräte nach Namen erhalten","rules.title":"Symbolregeln","rules.hint":'Regeln werden von oben anhand von "Gerätename + Modell" (Großschreibungs-unempfindliches Regex) überprüft; das erste Match gewinnt. Wenn nichts übereinstimmt, entscheidet die Entität-Geräteklasse, dann das generische Chip-Symbol.',"rules.pattern_ph":"regex, z. B. Stecker|Steckdose","rules.icon_ph":"mdi:power-socket-de","rules.add":"Regel hinzufügen","rules.reset":"Zurücksetzen auf Standardeinstellungen","rules.test_ph":"Versuch mal einen Gerätenamen...","rules.invalid":"ungültiges regex","rules.saved":"Icon-Regeln gespeichert","btn.up":"Nach oben","btn.down":"Nach unten","tap.info":"Gerätekarte","tap.more_info":"HA Mehr-Info-Dialog","tap.toggle":"Zustand umschalten","marker.tap_label":"Tap-Aktion für dieses Gerät","tap.toggle_note":"Der aufgelöste Zustand ist unten dargestellt. Sichere Geräte werden niemals aus dem Plan umgeschaltet.","import.title":"Bereiche aus HA-Etagen erstellen","import.hint":"Home Assistant kennt diese Etagen bereits. Die Etagen auswählen, die zu Planbereichen werden sollen; anschließend für jeden Bereich einen Grundriss hochladen. Die Räume werden danach von Hand eingezeichnet.","import.start":"{n} Bereich(e) erstellen","import.manual":"Von Grund auf neu starten","import.progress":"Etage {i} von {n}","import.done":"Bereiche erstellt. Räume einzeichnen: Rasterpunkte anklicken und die Kontur schließen.","btn.skip":"Überspringen","space.scale_label":"Maßstab (Rasterzellen-Größe)","space.cell_cm.help":"Verknüpft das Raster mit realen Abmessungen: Davon hängen Längen und Flächen, Wandstärken, Öffnungsgrößen und der Leuchtradius ab. Eine spätere Änderung verändert die berechneten Abmessungen des gesamten Bereichs, verschiebt aber keine Punkte im Plan.","space.cell_cm.help.aria":"Hilfe: Maßstab des Bereichs","space.scale_unit":"cm pro Zelle","space.scale_unit_imperial":"Zoll pro Zelle","space.display_section":"Anzeige","space.show_borders":"Raumgrenzen immer anzeigen","space.zero_wall_style":"Wände ohne Dicke","space.zero_wall_style.help":"Gestrichelte Wände ohne Dicke lassen Glow und Sonnenstrahlen durch, durchgezogene blockieren sie als Barriere ohne Fläche. Die Auswahl gilt für alle solchen Wände im Bereich, auch wenn ihre Linie in der Ansicht ausgeblendet ist.","space.zero_wall_style.help.aria":"Hilfe: Darstellung der Wände ohne Dicke","space.zero_wall_dashed":"Gestrichelt","space.zero_wall_solid":"Durchgezogen","space.show_names":"Raumnamen anzeigen (zum Verschieben ziehen)","space.room_color":"Farbe der Begrenzung & des Namens","space.opacity":"Deckkraft","space.fill_label":"Raumausfüllung","space.fill_mode.help":"„Eigene Farbe“ gestaltet den Bereich; „Licht“, „Temperatur“ und „LQI“ verwenden aktuelle Daten aus Home Assistant. Glow wird separat aktiviert.","space.fill_mode.help.aria":"Hilfe: Modus der Raumausfüllung","fill.none":"Keine","fill.lqi":"Zigbee-Signal","fill.light":"Lichter","fill.custom":"Benutzerdefinierte Farbe","space.custom_fill":"Füllfarbe","space.source_file":"Ich habe einen Grundriss als Bild","space.source_draw":"Kein Bild – ich werde die Räume von Hand umreißen","fill.temp":"Temperatur","tip.temp_avg":"Durchschnittstemperatur:","tip.hum_avg":"Durchschnittliche Luftfeuchtigkeit:","space_card.button":"Grundriss öffnen","space_card.not_found":"Bereich „{id}“ nicht gefunden","space_card.loading":"Laden…","continuity.restore_plan":"Grundriss wiederherstellen…","continuity.restore_connection":"Geräteverbindung wiederherstellen…","continuity.retry":"Erneut versuchen","editor.space":"Bereich","editor.framing":"Bildausschnitt","editor.fit_content":"Alle sichtbaren Inhalte","editor.fit_house":"Eng an der Hausgeometrie","editor.show_button":"Schaltfläche anzeigen","editor.button_label":"Beschriftung der Schaltfläche","editor.button_target":"Ziel-Dashboard-Pfad","marker.sub_entity":"Entität","title.general_settings":"Allgemeine Einstellungen","title.export_pdf":"Als PDF speichern","pdf.title":"Als PDF speichern","pdf.dimensions":"Maße und Flächen anzeigen","pdf.decor":"Möbel und weitere Dekoration anzeigen","pdf.room_names":"Raumnamen anzeigen","pdf.backdrop":"Hintergrund anzeigen","pdf.save":"Speichern","pdf.saving":"Wird erstellt…","pdf.failed":"Die PDF-Datei konnte nicht erstellt werden.","pdf.too_large":"Die Bilder überschreiten das PDF-Limit von 25 MB.","pdf.asset_failed":"Ein Hintergrund- oder Dekorbild konnte nicht geladen werden.","pdf.scale":"Maßstab 1:{n}","pdf.north":"Nord","gs.title":"Allgemeine Einstellungen","gs.light_group":"Füllung: Licht","gs.light_on":"Lichter an","gs.light_off":"Alle Lichter aus","gs.temp_group":"Füllung: Temperatur","gs.temp_cold":"Kalt","gs.temp_ok":"Angenehm","gs.temp_hot":"Heiß","gs.lqi_group":"Füllung: Zigbee-Signal","gs.lqi_low":"Schwaches Signal","gs.lqi_high":"Starkes Signal","gs.reset":"Auf Standard zurücksetzen","gs.saved":"Allgemeine Einstellungen gespeichert","gs.radar_show_live":"Live-Präsenz auf dem Plan anzeigen","gs.radar_show_live_hint":"Blendet alle Live-Radarziele ein oder aus. Eine Beobachtungsaufzeichnung wird dadurch weder gestartet noch beendet.","radar.title":"Präsenz auf dem Plan","radar.help":"Verbinde diese Markierung mit exakten Home-Assistant-Radarentitäten und wähle Position sowie Koordinatenprofil. Live-Positionen werden auf den ausgewählten Raum begrenzt.","radar.help.aria":"Hilfe: Einstellungen des Präsenzradars","radar.enabled":"Dieses Präsenzradar verwenden","radar.show_live":"Live-Ziele anzeigen","radar.configure":"Radar konfigurieren","radar.configure_on_plan":"Auf dem Plan konfigurieren","radar.change_installation":"Installation ändern","radar.no_contour":"Dieser Raum hat keine Begrenzung. Radarpunkte werden nicht zugeschnitten.","radar.discard_setup_title":"Radareinrichtung verwerfen?","radar.discard_setup":"Die nicht gespeicherte Radareinrichtung geht verloren.","radar.step_place_mount":"Markieren Sie die physische Sensorposition","radar.step_place_heading":"Markieren Sie einen Punkt direkt vor dem Sensor","radar.step_reference":"Markieren Sie Referenzposition {n} und starten Sie die Messung","radar.step_check_reference":"Markieren Sie eine unabhängige Prüfposition","radar.start_measure":"Messung starten","radar.countdown":"Stellen Sie sich in {seconds} s auf die Markierung","radar.capturing":"Bleiben Sie während der Messung allein und ruhig…","radar.fit_ready":"Kalibrierung ist bereit","radar.check_third":"An einer weiteren Position prüfen","radar.check_complete":"Unabhängige Prüfung abgeschlossen","radar.error_distance":"Positionsabweichung: {distance}","radar.ambiguous_target":"Mehr als ein Ziel wurde gemeldet. Wiederholen Sie die Messung allein.","radar.insufficient_samples":"Nicht genügend aktuelle Koordinaten. Wiederholen Sie die Messung oder richten Sie sie manuell ein.","radar.bad_references":"Wählen Sie getrennte Referenzen in verschiedenen Richtungen vom Sensor.","radar.ambiguous_sources":"Die Messungen lassen zwei gleich plausible Richtungen zu. Wählen Sie Referenzpunkte, die links und rechts unterscheiden.","radar.bad_fit":"Die Messungen stimmen nicht überein. Prüfen Sie Einheiten, Sensorposition und Referenzen.","radar.desktop_hint":"Verwenden Sie für eine präzise Einrichtung einen Computer. Die Bearbeitung auf Touch-Geräten ist nur eingeschränkt verfügbar.","radar.detected":"House Plan hat Radarmetadaten erkannt. Prüfe vor dem Speichern die exakten Quellen.","radar.detected_ld2450":"House Plan hat ESPHome-LD2450-Koordinaten erkannt. Prüfe vor dem Speichern die X/Y-Quellen.","radar.additional_actions":"Weitere Aktionen","radar.declare":"Dies ist ein Präsenzradar","radar.profile":"Datenprofil","radar.profile_esphome_ld2450_v1":"ESPHome LD2450 (X/Y-Ziele)","radar.profile_cartesian_v1":"Kartesische Ziele (X/Y)","radar.profile_polar_v1":"Polares Ziel (Entfernung/Winkel)","radar.profile_range_v1":"Nur Entfernung","radar.profile_zones_v1":"Zustände von Zonen","radar.profile_presence_v1":"Nur Präsenz","radar.room":"Radarraum","radar.room_choose":"Raum auswählen","radar.target":"Ziel {n}","radar.axis_x":"Entität für X-Koordinate","radar.axis_y":"Entität für Y-Koordinate","radar.add_target":"Zielplatz hinzufügen","radar.range_channel":"Entfernungskanal {n}","radar.add_range":"Entfernungskanal hinzufügen","radar.presence_gate":"Präsenz-Entität für den Kanal","radar.swap_axes":"X- und Y-Achse vertauschen","radar.axis_x_sign":"X-Richtung","radar.axis_y_sign":"Y-Richtung","radar.distance_source":"Entfernungsentität","radar.angle_source":"Winkelentität","radar.angle_unit":"Winkeleinheit","radar.degrees":"Grad","radar.radians":"Radiant","radar.angle_zero":"Richtung des Nullwinkels","radar.angle_forward":"Vorwärts","radar.angle_right":"Rechts","radar.angle_clockwise":"Winkel wachsen im Uhrzeigersinn","radar.zone_source":"Zonenentität","radar.occupancy_source":"Präsenzentität","radar.count_source":"Entität für Zielanzahl","radar.availability_source":"Verfügbarkeitsentität","radar.source_choose":"Entität auswählen","radar.source_optional":"Optional","radar.source_missing":"derzeit nicht verfügbar","radar.saved_unsupported":"Diese gespeicherte Radar-Konfiguration wird nicht unterstützt oder ist unvollständig. Sie bleibt inaktiv; entfernen Sie sie oder aktualisieren Sie House Plan vor der erneuten Einrichtung.","radar.occupancy":"Präsenz (an/aus)","radar.count":"Anzahl","radar.mount":"Position und Richtung","radar.mount_hint":"Dies ist die physische Sensorposition. Das Verschieben des dekorativen Markers ändert sie nicht.","radar.heading":"Richtung, °","radar.range_cm":"Reichweite, cm","radar.fov_deg":"Sichtfeld, °","radar.unit":"Einheit der Quelle","radar.mirror":"Links-/Rechtsachse spiegeln","radar.remove":"Radareinstellungen entfernen","radar.invalid":"Fülle Raum, Quellen und Position des Radars vor dem Speichern aus.","radar.check_sources":"Live-Daten prüfen","radar.checking":"Wird geprüft…","radar.health":"Verbindungsstatus","radar.live_summary":"Aktuelle Ziele: {targets}; Entfernungsbögen: {ranges}","radar.health_ok":"Aktuelle Daten empfangen","radar.health_off":"Keine Ziele erkannt","radar.health_stale":"Ein Teil der Koordinaten ist veraltet","radar.health_partial":"Einige Quellen sind aktuell, andere veraltet","radar.health_restricted":"Der Zugriff auf eine oder mehrere Quellen ist eingeschränkt","radar.health_incomplete":"Der aktuelle Radarbericht ist unvollständig","radar.health_position_unavailable":"Präsenz gemeldet; aktuelle Position nicht verfügbar","radar.health_unavailable":"Sensordaten nicht verfügbar","radar.health_needs_setup":"Installation muss eingerichtet werden","radar.health_inconsistent":"Die Quellen melden widersprüchliche Daten","radar.health_unknown":"Aktueller Zustand ist unbekannt","radar.health_disabled":"Radar ist deaktiviert","radar.error_invalid_radar":"Prüfe die Radareinstellungen.","radar.error_invalid_selection":"Wähle einen vorhandenen Raum und gültige Quellen.","radar.error_source_restricted":"Du hast nicht auf alle ausgewählten Quellen Zugriff.","radar.error_rate_limited":"Zu viele Anfragen. Versuche es gleich noch einmal.","radar.error_not_ready":"Die Radarverarbeitung ist noch nicht bereit.","radar.error_conflict":"Der Plan wurde geändert. Öffnen Sie die Radareinrichtung erneut und versuchen Sie es noch einmal.","radar.error_source_unavailable":"Mindestens eine ausgewählte Radarquelle ist nicht verfügbar.","radar.error_unsupported_capability":"Diese Radarfunktion wird von der installierten Integration nicht unterstützt.","radar.report_age":"vor {seconds} s","space.show_lqi":"Zigbee-Signal (LQI) neben Geräten anzeigen","space.hide_decor":"Dekorationsschicht ausblenden","space.hide_decor_tip":"Linien, Formen, Beschriftungen und Möbel bleiben an ihrem Platz — im Hintergrundeditor sichtbar, aber nicht auf dem Plan.","space.hide_openings":"Öffnungen ausblenden","space.hide_openings_tip":"Tür-, Fenster- und Tor-Symbole werden nicht gezeichnet, aber die Öffnungen funktionieren weiterhin: Licht fällt hindurch, die Sonne kommt durch ein Fenster herein, Kontaktsensoren öffnen sie weiterhin. Der Planeditor zeigt sie immer an.","gs.light_none":"Keine Lichtquellen","mode.plan":"Planeditor","mode.devices":"Geräteeditor","display.value":"Wert + Zustand","marker.subarea":"kein Bereich, manuell","device.new":"Neues Gerät — Editor öffnen, um zu schließen","opening.unlock_action":"Entsperren","opening.lock_action":"Sperren","opening.lock_pending":"Wird ausgeführt…","title.close_editor":"Editor schließen (zur Ansicht zurück)","title.add_device":"Gerät zum Plan hinzufügen","devbar.add":"Hinzufügen","devbar.rules":"Symbolregeln","device_inbox.button":"Geräte","device_inbox.title":"Geräte auf dem Plan","device_inbox.search":"Geräte, Entitäten und Integrationen suchen…","device_inbox.add_virtual":"Virtuelles Gerät hinzufügen","device_inbox.tab_on_plan":"Auf Plan","device_inbox.tab_available":"Verfügbar","device_inbox.tab_hidden":"Versteckt","device_inbox.tab_readd":"Wieder verfügbar","device_inbox.only_new":"Nur neu","device_inbox.show_entities":"Entitäten anzeigen","device_inbox.show_hidden":"Versteckte auf Plan anzeigen","device_inbox.show_hidden.help":"Zeigt ausgeblendete und deaktivierte Marker vorübergehend als Bearbeitungs-Geister auf dem Plan. Die gespeicherte Sichtbarkeit der Geräte bleibt unverändert.","device_inbox.show_hidden.help.aria":"Hilfe: ausgeblendete Geräte auf dem Plan anzeigen","device_inbox.new":"Neu","device_inbox.find":"Auf dem Plan finden","device_inbox.edit":"Bearbeiten","device_inbox.hide":"Ausblenden","device_inbox.show":"Anzeigen","device_inbox.add":"Hinzufügen","device_inbox.readd":"Wieder hinzufügen","device_inbox.hide_available":"Aus der Liste ausblenden","device_inbox.show_more":"Mehr anzeigen","device_inbox.more_actions":"Weitere Aktionen","device_inbox.find_hidden_hint":"Zuerst „Versteckte auf Plan anzeigen“ aktivieren","device_inbox.show_disabled":"Diese Bindung in Home Assistant aktivieren, bevor sie angezeigt wird","device_inbox.empty_on_plan":"Es befinden sich noch keine passenden Geräte auf dem Plan.","device_inbox.empty_available":"Es sind keine Geräte zum Hinzufügen verfügbar.","device_inbox.empty_hidden":"Es gibt keine versteckten Geräte.","device_inbox.empty_readd":"Es sind keine entfernten Geräte verfügbar, um sie erneut hinzuzufügen.","device_inbox.reason_visible_auto":"Automatisch erkannt","device_inbox.reason_visible_explicit":"Explizit hinzugefügt","device_inbox.reason_manual_hidden":"Vom Benutzer versteckt","device_inbox.reason_automatic_hidden":"Automatisch versteckt","device_inbox.reason_service_entry":"Nur Service-Registry-Eintrag","device_inbox.reason_excluded_integration":"Integration „{integration}“ durch Erkennungsfilter ausgeschlossen","device_inbox.reason_excluded_domain":"Nicht-räumlicher Entitätstyp","device_inbox.reason_grouped_light":"Dargestellt durch eine Raumlichtgruppe","device_inbox.reason_represented_by_parent":"Dargestellt durch sein übergeordnetes Gerät","device_inbox.reason_removed":"Zuvor aus dem Plan entfernt","device_inbox.reason_available":"Zum Hinzufügen zum Plan verfügbar","device_inbox.reason_no_bound_room":"HA-Bereich ist nicht mit einem Planraum verknüpft","device_inbox.status_ha_disabled":"In Home Assistant deaktiviert","device_inbox.status_orphaned":"Bindung ist in Home Assistant nicht mehr vorhanden","device_inbox.status_unverified":"Home Assistant-Register vorübergehend nicht verfügbar","device_inbox.saved":"Geräteliste aktualisiert","device_inbox.filters_excluded":"Ausgeschlossene Integrationen","device_inbox.filters_group_lights":"Raumleuchten zu einem Marker gruppieren","device_inbox.filters_preview_appear":"erscheint: {count}","device_inbox.filters_preview_hide":"verschwindet: {count}","device_inbox.filters_preview_lights":"betroffene Leuchten: {count}","device_inbox.filters_reset":"Empfohlene wiederherstellen","device_inbox.filters_save":"Filter speichern","device_inbox.filters_search_ph":"Integration hinzufügen…","device_inbox.filters_title":"Erkennungsfilter","space.roomcard_section":"Raumkarte zeigt:","space.label_temp":"Temperatur","space.label_hum":"Luftfeuchtigkeit","space.label_lqi":"Durchschnittliches Zigbee-Signal","space.label_light":"Lichter ein/aus","roomcard.light_on":"Ein","roomcard.light_off":"Aus","roomcard.light_partial":"{on} von {total}","toast.split_pick_inside":"Zwischenliegende Schnittpunkte müssen innerhalb des Raumes liegen","mode.decor":"Hintergrundeditor","decor.select":"Auswählen","decor.line":"Linie","decor.rect":"Rechteck","decor.ellipse":"Oval","decor.text":"Text","decor.erase":"Löschen","decor.erase_confirm_title":"Objekt löschen?","decor.color":"Farbe","decor.width":"Linienbreite","decor.line_style":"Linienstil","decor.line_style_solid":"Durchgehend","decor.line_style_dashed":"Gepunktet","decor.fill":"Füllen","decor.fill_color":"Füllfarbe","decor.length":"Länge","decor.size":"Größe","decor.flip_h":"Horizontal spiegeln","decor.flip_v":"Vertikal spiegeln","decor.angle":"Rotationswinkel, °","decor.text_size":"Textgröße","decor.backdrop_properties":"Eigenschaften des Planhintergrunds","decor.text_title":"Textbeschriftung","decor.object_title":"{kind} bearbeiten","decor.text_label":"Text","decor.live_group":"HA-Variable einfügen","decor.live_entity":"Entität","decor.live_entity_ph":"Wählen Sie eine Entität","decor.live_attr":"Wert","decor.live_attr_ph":"Wählen Sie Status oder Attribut","decor.live_state":"Status","decor.backdrop":"Hintergrundbild","decor.backdrop_hint":"Ziehen zum Verschieben; eine Ecke ziehen zum Größenändern; den oberen Griff zum Drehen verwenden. Shift ändert das Verhältnis oder befreit den Winkel.","decor.backdrop_reset":"Bild zurücksetzen","decor.backdrop_reset_done":"Das Bild ist wieder an seinem ursprünglichen Platz und in seiner ursprünglichen Größe","marker.icon_auto":"Auto: {icon} (nach Symbolregeln; wählen Sie eines zur Überschreibung)","marker.icon_pin_auto":"Anheften","mode.plan_tip":"Planungseditor — die Geometrie des Hauses: Räume zeichnen und teilen/zusammenführen, sie mit HA-Bereichen verbinden, Türen, Fenster und Tore platzieren, Raumkarten verschieben, Maßstab festlegen","mode.devices_tip":"Geräteeditor — alles über Symbole: ziehen zum Positionieren, klicken zum Bearbeiten von Bindung/Symbol/Anzeige, virtuelle Geräte hinzufügen, Symbolregeln","mode.decor_tip":"Hintergrundeditor — rein visuelle Dekoration unter dem Plan: Linien, Rechtecke, Ellipsen und Textbeschriftungen, die niemals auf Klicks reagieren","space.glow_enabled":"Lichtquellen-Glühen","gs.glow_group":"Glow von Lichtquellen","gs.glow_base":"Grunddunkelheit des Hauses","gs.glow_light":"Standardlichtfarbe / Intensität","gs.wall_group":"Wände","gs.wall_fill":"Wandfüllung","gs.glow_radius":"Glow-Radius","gs.glow_radius.help":"Legt den allgemeinen Radius des Lichtscheins in Metern oder Fuß fest; ein gerätespezifischer Radius überschreibt diesen Wert.","gs.glow_radius.help.aria":"Hilfe: allgemeiner Glow-Radius","gs.unit_m":"m","gs.unit_ft":"ft","marker.controls_label":"Steuert andere Lichtquellen","marker.controls.help":"Mit der Aktion „Zustand umschalten“ werden die aufgeführten Quellen zusammen mit diesem Marker umgeschaltet. Ihr Glow bleibt an ihren eigenen Markern, und die Verknüpfung allein macht den steuernden Marker nicht zur Lichtquelle.","marker.controls.help.aria":"Hilfe: andere Lichtquellen steuern","marker.controls_filter":"Suchlichter und Schalter…","info.controls":"Steuerungen","marker.glow_radius_label":"Leuchtradius","marker.glow_radius.help":"Legt den Leuchtradius in Metern oder Fuß fest; ein leerer Wert verwendet den Radius aus den allgemeinen Einstellungen.","marker.glow_radius.help.aria":"Hilfe: Leuchtradius","markup.wallthick":"Dicke","markup.select":"Auswählen","title.markup_wallthick":"Dicke — klicken Sie auf eine Wand, um ihre Dicke von 0 bis 100 cm festzulegen.","markup.hint_wallthick":"klicken Sie auf eine Wand · Esc schließt ohne Anwendung","wallthick.field":"Dicke","wallthick.unit_cm":"cm","wallthick.unit_in":"in","wallthick.apply_room":"Auf alle Wände dieses Raums anwenden","markup.draw_wall_title":"Dicke jedes neuen Wandsegments (0–100 cm). Gemeinsame Wände behalten den bestehenden Wert.","room.queue_progress":"Raum {current} von {total}","toast.wall_rooms_saved":"Erstellte Räume: {n}","toast.wall_chain_saved":"Wandkette gespeichert","toast.wallthick_pick":"Eine Wand anklicken","toast.wallthick_set":"Wandstärke eingestellt","toast.wallthick_cleared":"Wandstärke entfernt","toast.physical_range":"Einen Wert von {min} bis {max} {unit} eingeben","toast.zero_wall_opening_conflict":"Entfernen Sie zuerst die Öffnung an diesem Wandsegment.","toast.zero_wall_ambiguous":"Das Wandsegment ist mehrdeutig. Vereinfachen oder passen Sie den Anschluss an.","toast.zero_wall_migration_blocked":"Der Bereich wurde nicht konvertiert: {reason}. Es wurden keine Daten geändert.","toast.physical_angle":"Einen Drehwinkel von 0° bis unter 90° eingeben","toast.physical_limit":"Der Bereich hat das Limit für diesen Geometrietyp erreicht","toast.geometry_unsafe":"Änderung abgebrochen: Wandgeometrie konnte nicht sicher erstellt werden.","junction.limit_angle":"Der Winkel zwischen den Wänden ist zu spitz: {actual}°, mindestens {limit}°.","junction.limit_valence":"Zu viele Wände treffen in einem Knoten aufeinander: {actual}, maximal {limit}.","junction.limit_length":"Das Wandsegment ist zu kurz: {actual} cm, mindestens {limit} cm.","junction.limit_distance":"Wände und Knoten sind zu dicht beieinander: {actual} cm, Minimum {limit} cm.","junction.limit_clearance":"Kein Wohnbereich ist übrig: {actual} cm², Minimum {limit} cm².","junction.limit_check_failed":"Die Überprüfung der Verbindungen konnte nicht durchgeführt werden — die Änderung wurde nicht gespeichert.","toast.wall_model_migration_blocked":"Das Wandmodell konnte nicht aktualisiert werden: {reason}. Der Plan wurde nicht geändert. Führen Sie „Pläne optimieren“ aus; wenn der Fehler erneut auftritt, beheben Sie die widersprüchliche Wandgeometrie.","toast.wall_model_client_outdated":"Aktualisieren Sie die Karte und laden Sie die Seite neu, bevor Sie den Plan bearbeiten.","wall_model.reason.invalid-room":"ungültiger Raumkontur","wall_model.reason.zero-length":"Wandsegment mit null Länge","wall_model.reason.third-owner":"Wand, die von mehr als zwei Räumen geteilt wird","wall_model.reason.duplicate-id":"widersprüchliche Wandkennungen","wall_model.reason.thickness-conflict":"widersprüchliche Wandstärkenwerte","wall_model.reason.opening-host":"Öffnung kann nicht einer Wand zugewiesen werden","toast.delete_room_pick":"Klicken Sie in den Raum, den Sie löschen möchten","toast.plan_snap_ambiguous":"Zoomen Sie hinein, um den Wandknoten auszuwählen","toast.wall_repair_ambiguous":"Der Raumumriss hat mehr als eine mögliche Verbindung. Zoomen Sie hinein und verbinden Sie ihn explizit.","toast.wall_repair_too_large":"Die Lücke ist größer als 2 cm. Verbinden Sie die Wände, bevor Sie den Raum erstellen.","toast.wall_repair_changed":"Die Wandgeometrie hat sich geändert. Versuchen Sie erneut, den Raum zu erstellen.","toast.opening_on_zero_wall":"Öffnungen können nicht auf einer Wand mit null Dicke sitzen.","marker.from_ha_option":"Wählen Sie aus der HA-Liste.","marker.show_entities":"Entitäten anzeigen.","marker.show_entities_tip":"Fügt nicht nur Geräte zur Liste hinzu, sondern auch alle ihre Entitäten.","marker.pick_ph":"Wählen Sie ein Gerät…","room.open_area":"Öffnen Sie den HA-Bereich.","room.fit_action":"Raum {name} einpassen","view.volumetric":"Volumetrische Ansicht.","view.flat":"Flache Ansicht.","kiosk.title":"Die Größen dieses Bildschirms.","kiosk.hint":"Nur auf diesem Gerät gespeichert – jedes Wandtablet oder TV kann seine eigenen komfortablen Größen haben.","kiosk.icon_scale":"Gerätesymbolgröße.","kiosk.font_scale":"Textgröße der Raumkarte.","editor.kiosk":"Wandgeräte- (Kiosk-)Modus.","editor.cycle":"Bereiche automatisch alle N Sekunden wechseln (Kiosk, 0 = aus)","room.settings_title":"Raumeinstellungen.","room.settings_section":"Raumeinstellungen (überschreibt den Bereich)","room.fill_label":"Diesen Raum ausfüllen","fill.inherit":"Als den Bereich","room.custom_fill_space":"Bereichsfarbe","room.custom_fill_own":"Raumfarbe","room.temp_range_label":"Komfortbereich","room.temp_range_min":"Untere Grenze der Komforttemperatur","room.temp_range_max":"Obere Grenze der Komforttemperatur","room.temp_range_reset":"Wie im Bereich","room.temp_range.help":"Dieser Bereich gilt nur für diesen Raum. Leere Felder übernehmen die jeweilige Grenze des Bereichs; sind die Grenzen vertauscht, verwendet House Plan den kleineren Wert als Untergrenze und den größeren als Obergrenze.","room.temp_range.help.aria":"Informationen zum Komfortbereich des Raums","room.temp_src_label":"Temperaturquelle","room.hum_src_label":"Luftfeuchtigkeitsquelle","room.src_average":"Durchschnitt über die Sensoren des Raums (Standard)","room.src_pick":"Ein bestimmtes HA-Gerät oder Entität","room.src_ph":"Quelle wählen…","toast.room_updated":"Raum aktualisiert","space.card_font":"Schriftgröße der Raumkarte (gesamter Bereich)","room.sizes_section":"Schriftgrößen","room.name_scale":"Raumname Größe","room.label_scale":"Metrikgröße","preview.room_name":"Wohnzimmer","toast.cfg_reload_failed":"Der Plan konnte nicht vom Server neu geladen werden: {err}","toast.locale_load_failed":"Das Sprachpaket konnte nicht geladen werden. Bis zum Neuladen der Seite wird Englisch verwendet.","toast.furniture_art_load_failed":"Die Möbelzeichnungen konnten nicht geladen werden. Laden Sie die Seite neu, um sie anzuzeigen.","room.settings_short":"Raumeinstellungen","room.unnamed":"Unbenannter Raum","marker.use_climate_temp":"Geräte-Temperatur im Raum berücksichtigen","marker.use_climate_temp_tip":"Fügt die aktuelle Temperatur einer Klimaanlage oder eines Thermostats zum Raumdurchschnitt hinzu. Das externe Wert-Label unten separat konfigurieren.","marker.value_badge_title":"Wert-Label","marker.value_badge.help":"Zeigt einen ausgewählten Wert neben dem Symbol an. Dies beeinflusst nicht die Raumkennzahlen, Licht, Glanz oder die Tippaktion.","marker.value_badge.help.aria":"Hilfe: Gerätewert-Badge","marker.value_badge_enabled":"Zeige ein Wert-Badge","marker.value_badge_source":"Wert","marker.value_badge_source.help":"Wählen Sie einen bestimmten Zustand, ein unterstütztes Attribut oder einen abgeleiteten Wert dieses Geräts.","marker.value_badge_source.help.aria":"Hilfe: Quelle des Wert-Badges","marker.value_badge_position":"Position","marker.value_badge_position.help":"Die gewählte Seite bleibt fest und dreht sich nicht automatisch an einem Planrand.","marker.value_badge_position.help.aria":"Hilfe: Position des Wert-Badges","marker.value_badge_right":"Rechts","marker.value_badge_bottom":"Unten","marker.value_badge_left":"Links","marker.value_badge_top":"Oben","marker.value_badge_empty":"Für dieses Gerät stehen keine Werte zur Verfügung","marker.value_badge_static":"Ein statisches Symbol zeigt keine Live-Werte an. Die Einstellung wird beibehalten.","marker.value_badge_missing":"Quelle nicht verfügbar","marker.value_badge_missing_hint":"Die gespeicherte Quelle ist derzeit nicht verfügbar. Behalten Sie sie bei, deaktivieren Sie das Badge oder wählen Sie einen anderen Wert.","marker.value_badge_duplicate":"Derselbe Wert wird bereits im Symbol angezeigt.","marker.value_badge_state":"Status · {name}","marker.value_badge_marker_state":"Lichtquellstatus · {name}","marker.value_badge_lqi":"Durchschnittliche Zigbee-Signalqualität","marker.value_badge_attr_current_temperature":"Aktuelle Temperatur · {name}","marker.value_badge_attr_temperature":"Zieltemperatur · {name}","marker.value_badge_attr_current_humidity":"Aktuelle Luftfeuchtigkeit · {name}","marker.value_badge_attr_humidity":"Luftfeuchtigkeit · {name}","marker.value_badge_attr_current_position":"Position · {name}","marker.value_badge_attr_percentage":"Geschwindigkeit · {name}","marker.value_badge_attr_brightness":"Helligkeit · {name}","marker.value_badge_attr_volume_level":"Lautstärke · {name}","marker.value_badge_attr_battery_level":"Batterie · {name}","marker.value_badge_attr_fan_speed":"Lüftergeschwindigkeit · {name}","marker.value_source":"Wertquelle","marker.value_source.help":"Wähle den Wert, der das Symbol ersetzt. Die Tipp-Aktion bleibt unverändert.","marker.value_source.help.aria":"Hilfe: Wertquelle in der Gerätefläche","marker.value_source_auto":"Automatisch (wie bisher)","marker.value_source_missing_hint":"Die gespeicherte Quelle ist derzeit nicht verfügbar. Bis sie wieder verfügbar ist oder ein anderer Wert gewählt wird, zeigt die Fläche —.","marker.light_role_label":"Ist dieses Gerät eine Lichtquelle?","marker.light_role.help":"„Auto“ verwendet die ermittelte Rolle des verknüpften Geräts, „Immer“ erzwingt eine eigene Quelle und „Nie“ schließt sie aus; oben verknüpfte Lichter bleiben unabhängig.","marker.light_role.help.aria":"Hilfe: ob dieses Gerät eine Lichtquelle ist","marker.light_role_auto_yes":"Automatisch (Lichtquelle)","marker.light_role_auto_no":"Automatisch (keine Lichtquelle)","marker.light_role_always":"Immer eine Lichtquelle","marker.light_role_never":"Nie eine Lichtquelle","marker.light_entity_label":"Führende Lichtereinheit","marker.light_entity.help":"Für ein Verbundgerät wählen Sie die Entität, deren Zustand, Farbe und Helligkeit diese Planquelle darstellen. Der automatische Rückgriff bleibt mit älteren Plänen kompatibel.","marker.light_entity.help.aria":"Hilfe: führende Lichtentität","marker.light_entity_auto":"Automatisch ({entity})","marker.light_entity_none":"keine steuerbare Entität","marker.light_entity_missing":"Die gespeicherte Entität {entity} ist nicht verfügbar. House Plan verwendet vorübergehend {fallback}; die gespeicherte Auswahl wird wiederhergestellt, wenn sie zurückkehrt.","marker.toggle_entity_label":"Zu toggelnde Entität","marker.toggle_entity.help":"Für ein Verbundgerät wählen Sie das genaue eigene Licht oder den Schalter, der durch Tippen bedient wird. Automatisch behält die vorherigen Zielregeln bei und ist unabhängig von der führenden Lichtentität.","marker.toggle_entity.help.aria":"Hilfe: zu toggelnde Entität","marker.toggle_entity_auto":"Automatisch ({entity})","marker.toggle_entity_none":"keine eigene steuerbare Entität","marker.toggle_entity_missing":"Die gespeicherte Entität {entity} ist nicht mehr unter den auswählbaren Kanälen dieses Markers. House Plan verwendet vorübergehend {fallback}; die gespeicherte Auswahl wird wiederhergestellt, wenn sie zurückkehrt.","marker.glow_color_label":"Leuchtfarbe und Helligkeit","marker.glow_mode.help":"Verwenden Sie Live-Quellwerte, überschreiben Sie nur deren Farbe oder fixieren Sie sowohl Farbe als auch Helligkeit. Das Minimum beträgt 1 %; um die Quelle zu deaktivieren, wählen Sie „Nie“.","marker.glow_mode.help.aria":"Hilfe: Leuchtfarbe und Helligkeit","marker.glow_mode_auto":"Von Quelle","marker.glow_mode_color":"Farbe einstellen","marker.glow_mode_fixed":"Farbe und Helligkeit einstellen","marker.glow_color":"Leuchtfarbe","marker.glow_brightness":"Helligkeit","marker.glow_disabled_never":"Leuchteinstellungen sind nicht verfügbar, da dieser Marker ausdrücklich keine Lichtquelle ist.","marker.glow_disabled_auto":"Im Automatikmodus wurde keine räumliche Lichtquelle für diesen Marker gefunden.","marker.glow_disabled_no_entity":"Keine aktive steuerbare Home Assistant-Entität ist für diese räumliche Quelle verfügbar.","marker.glow_passive_hint":"Diese Quelle hat keine eigenen Home Assistant-Daten. Stellen Sie ihre Farbe und Helligkeit manuell ein; ihr Radius bleibt verfügbar.","marker.control_broken":"Gespeicherte Quelle fehlt oder ist nicht mehr als Licht markiert","marker.control_missing_label":"Fehlendes Planlicht","marker.control_passive":"passive Quelle","toast.marker_control_cycle":"Dieser Link würde eine kreisförmige Kette von Lichtsteuerungen erzeugen.","toast.marker_binding_required":"Wählen Sie ein Home Assistant-Gerät, bevor Sie eine andere Lichtquelle verlinken.","confirm.unlock_title":"Schloss öffnen?","confirm.unlock_body":"House Plan sendet einen Befehl zum Öffnen an dieses Schloss.","toast.files_migrate_failed":"Anhänge konnten nicht zur neuen Bindung verschoben werden, Links zeigen weiterhin auf die alten Dateien: {err}","space.pick_saved":"Bereits hochgeladen","space.pick_saved_hint":"Auf dem Server gespeicherte Pläne, einschließlich solcher, die Sie zuvor getrennt haben","space.no_saved":"Noch keine Pläne auf dem Server gespeichert.","space.loading":"Laden…","space.used_by":"in Benutzung: {list}","space.in_use":"Ein Bereich verwendet diesen Plan noch — zuerst die Verknüpfung lösen","btn.use":"Verwenden","confirm.delete_plan_title":"Plandatei löschen?","confirm.delete_plan_body":"Die Datei wird vom Server gelöscht. Dieser Vorgang kann nicht rückgängig gemacht werden.","toast.plans_list_failed":"Konnte die gespeicherten Pläne nicht auflisten: {err}","toast.plan_delete_failed":"Konnte den Plan nicht löschen: {err}","marker.hide":"Ausblenden","marker.hide_tip":'Das Gerät wird nach dem Speichern aus dem Plan verschwinden, aber weiterhin zum Signalsignal des Raums zählen. Stellen Sie es über den Katalog "Geräte" im Geräte-Editor wieder her.',"marker.show":"Anzeigen","marker.show_tip":"Das Gerät wird nach dem Speichern wieder im Plan erscheinen.","marker.hidden_ghost":"Vom Benutzer ausgeblendetes Gerät","marker.ha_disabled_device":"Das Gerät ist in Home Assistant deaktiviert und im Plan ausgeblendet.","marker.ha_disabled_entity":"Die Entität ist in Home Assistant deaktiviert und im Plan ausgeblendet.","marker.ha_disabled_all_entities":"Das Gerät hat keine aktiven Home Assistant-Entitäten, daher ist es im Plan ausgeblendet.","marker.ha_registry_limited":"Das vollständige Home Assistant-Register ist für diesen Benutzer nicht verfügbar. Das nicht verifizierte Objekt kann vorerst nicht angezeigt oder verwendet werden.","marker.delete_tip":"Löschen Sie das Gerät vollständig aus dem Plan und allen Aggregaten. Sie können es später wieder hinzufügen.","tap.run":"Führen Sie Automation/Skript/Szene aus","tap.none":"Nichts tun","marker.run_target_label":"Was ausführen","marker.run_search_ph":"Suchen: Automation, Skript oder Szene…","marker.run_target_gone":"Ziel {id} nicht gefunden — erneut auswählen","marker.tap_confirm":"Um Bestätigung bitten","marker.tap_confirm_tip":"Vor der Ausführung ein Bestätigungsdialogfeld anzeigen — eine Vorsichtsmaßnahme gegen versehentliche Berührungen.","marker.toggle_hint_single":"Ziel: {name} ({id}).","marker.virtual_light_target":"Virtuelles Licht: {name}.","marker.virtual_light_current":"Manueller Zustand: {state} → {effect}.","marker.virtual_light_state_on":"ein","marker.virtual_light_state_off":"aus","marker.toggle_hint_group":"Wird {count}-Quelle(n) umschalten: {names}.","marker.toggle_hint_current":"Jetzt: {state} → {effect}.","marker.toggle_hint_group_current":"Derzeit an: {on} von {count} → {effect}.","marker.toggle_hint_skipped":"Wird übersprungen ({count}): {targets}.","marker.toggle_effect_turn_on":"wird eingeschaltet","marker.toggle_effect_turn_off":"wird ausgeschaltet","marker.toggle_effect_open":"wird geöffnet","marker.toggle_effect_close":"wird geschlossen","marker.toggle_effect_stop":"wird gestoppt","marker.toggle_effect_toggle":"Zustand wird umgeschaltet","marker.toggle_skip_missing":"nicht gefunden","marker.toggle_skip_ha_disabled":"in HA deaktiviert","marker.toggle_skip_unavailable":"nicht verfügbar","marker.toggle_skip_unsupported":"Umschalten wird nicht unterstützt","marker.toggle_skip_secure":"aus Sicherheitsgründen blockiert","marker.toggle_none_no_binding":"Dieses Gerät hat keine Bindung, daher gibt es keinen Zustand, der umgeschaltet werden könnte. Tippen bewirkt nichts.","marker.toggle_none_no_actionable_entity":"Dieses Gerät hat keinen Zustand, der umgeschaltet werden könnte. Tippen bewirkt nichts.","marker.toggle_none_configured_targets_missing":"Die konfigurierten Ziele sind nicht verfügbar. Die eigene Entität des Geräts wird nicht ersetzt.","marker.toggle_none_ha_disabled":"Das Ziel ist in Home Assistant deaktiviert und kann im Plan nicht verwendet werden.","marker.toggle_none_unavailable":"Das Ziel ist derzeit nicht verfügbar. Tippen bewirkt nichts.","marker.toggle_none_unsupported":"Home Assistant bietet keine sichere Umschaltfunktion für dieses Gerät. Tippen bewirkt nichts.","marker.toggle_none_secure":"Das Umschalten von Schlössern, Alarmen und gesicherten Toren über den Plan ist aus Sicherheitsgründen gesperrt.","run.automation":"Automatisierung","run.script":"Skript","run.scene":"Szene","confirm.tap_run":'"{name}" ausführen?',"confirm.tap_toggle":'"{name}" umschalten?',"confirm.current_state":"Aktueller Zustand: {state}","confirm.expected_state":"Nach dem Umschalten: {state}","confirm.group_current":"an {on} von {total}","confirm.group_all_on":"alle sind eingeschaltet","confirm.group_all_off":"alle sind ausgeschaltet","confirm.unavailable_targets":"Nicht verfügbar: {count}","confirm.expected_by_ha":"Home Assistant ermittelt den Zustand","confirm.state_on":"Ein","confirm.state_off":"Aus","confirm.state_open":"Offen","confirm.state_closed":"Geschlossen","confirm.state_opening":"Wird geöffnet","confirm.state_closing":"Wird geschlossen","confirm.state_stopped":"Gestoppt","confirm.state_unknown":"Unbekannt","toast.run_started":"Gestartet: {name}","toast.run_target_missing":"Ausführungsziel nicht gefunden — überprüfen Sie die Geräteeinstellungen","toast.run_target_required":"Wählen Sie eine Automatisierung, ein Skript oder eine Szene aus","toast.tap_target_changed":"Das Ziel der Aktion hat sich geändert. Versuchen Sie es erneut.","toast.virtual_light_toggle_failed":"Das virtuelle Licht konnte nicht umgeschaltet werden: {err}","toast.value_badge_source_required":"Einen Wert für den Badge auswählen","btn.run":"Ausführen","vac.section":"Roboterstaubsauger: aktuelle Position","vac.autocal":"Automatisch einrichten","vac.live":"Aktuelle Position im Plan","vac.trail":"Roboterpfad anzeigen","vac.autocal_no_rooms":'Die Integration meldet keine Raumliste — öffnen Sie "Manuell anpassen"',"vac.route_warn_unmapped":"Der Roboter reinigt eine Karte, die keiner Etage zugeordnet ist","vac.route_warn_needs_calibration":"Die Karte ist einer Etage zugeordnet, aber nicht kalibriert","vac.route_warn_ambiguous":"Zwei Karten sind nicht unterscheidbar — keine Etage gewählt","vac.route_warn_missing_space":"Der Raum dieser Karte wurde gelöscht","vac.autocal_no_match":'Raumnamen stimmten nicht überein (mindestens 3 müssen übereinstimmen) — öffnen Sie "Manuell anpassen"',"vac.autocal_done":"Fertig: über {rooms} Räume zugeordnet. Eine Reinigung starten und das Ergebnis prüfen.","vac.cal_need_pos":"Der Roboter meldet keine Koordinaten — starten Sie eine Reinigung und pausieren Sie sie","vac.cal_done":"Kalibrierung gespeichert. Eine Reinigung starten und das Ergebnis prüfen.","vac.cal_cancelled":"Kalibrierung abgebrochen","vac.fit":"Manuell anpassen","vac.fit_hint":"Roboterkarte an die richtige Position ziehen und an den Ecken skalieren","vac.fit_rotate":"90° drehen","vac.fit_mirror":"Spiegeln","vac.trail_never":"Nie","vac.trail_cleaning":"Beim Reinigen","vac.trail_always":"Immer","gs.bg_group":"Bühnenhintergrund","gs.bg_color":"Hintergrund um den Plan","gs.bg_default":"Standardthema","gs.bg_theme":"Standardthema","gs.bg_mode":"Planhintergrund","gs.bg_mode.help":"„Folgt der Sonne“ verwendet sun.sun und ersatzweise die lokale Browserzeit; „Statische Farbe“ zeigt immer die ausgewählte Farbe.","gs.bg_mode.help.aria":"Hilfe: allgemeiner Planhintergrund","gs.bg_static":"Statische Farbe","gs.bg_daynight":"Folgt der Sonne","gs.sun_group":"Sonne","gs.sun_missing":"Die sun.sun-Entität wurde nicht gefunden — der Hintergrund folgt Ihrer lokalen Uhr; Fensterstrahlen sind nicht verfügbar.","gs.north":"Norden auf dem Plan","gs.north.help":"Der Winkel wird im Uhrzeigersinn von der oberen Vertikalen des Plans gemessen; Norden wird für Fensterstrahlen benötigt, nicht für den Hintergrund „Folgt der Sonne“.","gs.north.help.aria":"Hilfe: allgemeine Nordrichtung","gs.north_ph":"nicht gesetzt","gs.north_clear":"Löschen","gs.north_letter":"N","gs.sun_rays":"Sonnenlicht durch Fenster","gs.sun_ray_origin":"Sonnenstrahlen","gs.sun_ray_origin.inner":"Von den inneren Fensterecken","gs.sun_ray_origin.outer":"Von den äußeren Fensterecken","gs.about_version":"House Plan Card v{v}","gs.about_github":"GitHub · Dokumentation & Probleme","gs.about_telegram":"Telegram-Chat","support.title":"Hilfe & Feedback","space.bg_color":"Hintergrund rund um den Plan","space.bg_inherit":"Allgemein erben","space.bg_inherited":"erbt allgemeine Einstellungen","space.bg_mode":"Planhintergrund","space.bg_mode.help":"Übernehmen Sie den allgemeinen Hintergrund oder überschreiben Sie diesen Bereich mit einer statischen Farbe oder „Folgt der Sonne“.","space.bg_mode.help.aria":"Hilfe: Hintergrund des Bereichs","space.north":"Norden auf dem Plan (überschreiben)","space.north.help":"Überschreibt die allgemeine Nordrichtung für diesen Bereich; der Winkel wird im Uhrzeigersinn von der oberen Vertikalen des Plans gemessen und für Fensterstrahlen verwendet.","space.north.help.aria":"Hilfe: Norden für diesen Bereich","space.north_inherited":"geerbt: {v}","space.sun_rays":"Sonnenlicht durch Fenster","space.sun_inherit":"Allgemein erben","space.sun_on":"Ein","space.sun_off":"Aus","canvas.far_objects":"{n} Objekt(e) weit vom Plan entfernt","canvas.show_far":"Anzeigen","canvas.home_tip":"Der Plan ist dort drüben — klicken, um ihn anzupassen","gs.grid_group":"Planwartung","gs.grid_hint":"Aktualisiert Datenmodelle, richtet Planelemente am Raster aus und fasst redundante Wandfragmente zusammen. Ein exakter Bericht wird angezeigt, bevor etwas gespeichert wird.","gs.align_all":"Pläne optimieren","gs.align_title":"Pläne optimieren","gs.align_none":"Alle Pläne verwenden bereits das aktuelle optimierte Datenmodell.","gs.optimize_no_automatic_changes":"Es gibt keine automatischen Änderungen, die angewendet werden müssen. Überprüfen Sie die unten stehenden Punkte.","gs.align_count":"{n} von {total} Elementen werden sich um höchstens {cm} cm bewegen.","gs.align_where":"Die größte Verschiebung ist in „{s}“.","gs.align_turned":"Öffnungen, deren Winkel korrigiert wurde: {n}.","gs.align_preflight_failed":"Die Geometrie der folgenden Bereiche konnte nicht sicher überprüft werden: {spaces}{more}.","gs.align_preflight_hint":"Pläne wurden nicht geändert. Kopieren Sie die Diagnosen mit dem untenstehenden Button und fügen Sie sie zusammen mit einem Raumexport dem Fehlerbericht bei.","gs.preflight_reason_prepare-exception":"Die Bereichsgeometrie konnte nicht vorbereitet werden (Ausnahme beim Erstellen des Modells)","gs.preflight_reason_wall-null":"Der Wandkörper wurde nicht erstellt (die Vereinigung lieferte leer zurück)","gs.preflight_reason_wall-degraded-extra":"Der Wandkörper wurde mit zusätzlicher Geometrie beschädigt","gs.preflight_reason_wall-failed-core":"Der Kern des Wandkörpers konnte nicht zusammengesetzt werden","gs.preflight_reason_wall-exception":"Die Wandkonstruktion warf eine Ausnahme","gs.preflight_reason_floor-null":"Der Fußbodenumriss wurde nicht erstellt","gs.preflight_reason_floor-exception":"Bodenaufbau hat eine Ausnahme ausgelöst","gs.preflight_copy":"Diagnosen kopieren","gs.preflight_copied":"Diagnosen kopiert","gs.preflight_update_hint":"Die Karten- und Integrationsversionen unterscheiden sich — Hausplan aktualisieren und erneut versuchen.","gs.align_preflight_space":"Bereich {n}","gs.align_preflight_more":", und {n} mehr","gs.optimize_changes":"Modellmigrationen: {m}; aktualisierte Bereiche: {c}; entfernte verrauschte Koordinatenwerte: {p}; zusammengeführte Fragmente realer Wände: {w}; zusammengeführte Fragmente von Wänden ohne Dicke: {s}; unabhängige Wände: {i}.","gs.zero_walls_migrated":"Virtuelle Wandspannweiten konvertiert: {n}.","gs.wall_segments_migrated":"Wandsegmente stabilisiert: {n}.","gs.room_drafts_migrated":"Unvollständige Konturen wurden in normale Wände umgewandelt: {drafts}; Wandsegmente: {segments}.","gs.optimize_lattice_summary":"Rauschen in den Koordinatenwerten kanonisiert: {n}; maximale Bewegung: {cm} cm.","gs.optimize_lattice_space":"{space}: Koordinatenwerte kanonisiert: {n}; außerhalb des Rasters liegende Werte unverändert gelassen: {far}.","gs.optimize_coincident_partitions":"Versteckte unabhängige Wandabschnitte in Raumwände integriert: {n}.","gs.optimize_openings_rehosted":"Öffnungen wieder an Raumwände angebracht: {n}.","gs.optimize_walls_straightened":"Wände begradigt: {n}; maximale Bewegung: {cm} cm.","gs.optimize_walls_straightened_where":"Größte Wandkorrektur: {s}.","gs.optimize_walls_straighten_skipped":"Nahe Achsenwände unverändert gelassen, da sie nicht sicher repariert werden konnten: {n}.","gs.optimize_glow_migration":"Legacy Glow: {spaces} Bereiche → keine Datenfüllung + unabhängiges Glow; {rooms} Räume → geerbte Datenfüllung + unabhängiges Glow.","gs.optimize_references":"Referenzen repariert: Bereiche — {spaces}; Räume — {rooms}; Positionen — {positions}; Geräte aus fehlenden Bereichen gelöst — {detached}.","gs.optimize_reference_more":", und {n} mehr","gs.optimize_orphans_removed":"Vergessene Einträge entfernt: {total} — Raumbezeichnungen: {rooms}; Geräte: {devices}; Gruppenmarkierungen: {groups}. Sie gehörten zu zuvor gelöschten Bereichen.","gs.optimize_live_positions":"Alte Positionen in gelöschten Bereichen gehören zu vorhandenen Objekten: {n}{names}. Sie werden beibehalten.","gs.optimize_live_positions_remove":"Alte Positionen in gelöschten Bereichen gehören zu vorhandenen Objekten: {n}{names}. Sie sind zur Entfernung ausgewählt.","gs.optimize_live_names":": {names}{more}","gs.optimize_live_remove":"Alte Positionen entfernen","gs.optimize_live_keep":"Alte Positionen beibehalten","gs.optimize_live_selected":"Alte Positionen werden nach der Anwendung von Optimieren entfernt.","gs.optimize_unverified":"Positionen konnten nicht sicher überprüft werden: {n}. Sie wurden unverändert belassen.","gs.optimize_registry_limited":"Voller Administratorzugriff auf die Home Assistant-Registries ist für eine sichere Überprüfung erforderlich.","gs.optimize_vacuum_warning":"Raumzuordnungen, die noch überprüft werden müssen: {n}.","gs.optimize_details":"Details","gs.optimize_details_more":"Und {n} weitere Einträge.","gs.optimize_detail_removed":"wird entfernt","gs.optimize_detail_live":"wird beibehalten","gs.optimize_detail_unverified":"nicht überprüft","gs.optimize_detail_room_label":"Raumkennzeichnung","gs.optimize_detail_device":"Gerät","gs.optimize_detail_group":"Gruppenkennzeichen","gs.optimize_detail_unknown":"unbekannter Eigentümer","gs.optimize_detail_item":"{status}: {kind} {id}; alter Bereich {space}","gs.align_warn":"Absichtlich zwischen Rasterknoten platzierte Elemente werden sich bewegen. Nach der Operation ist nur eine Rückgängig-Funktion verfügbar, und zwar nur bis zur nächsten Planbearbeitung.","gs.align_run":"Optimieren","gs.align_done":"Pläne optimiert: {n} Elemente bewegt, {m} Datensätze beibehalten, {r} Verweise repariert","gs.optimize_undo":"Letzte Optimierung rückgängig machen","gs.optimize_undone":"Die letzte Optimierung wurde rückgängig gemacht","decor.furniture":"Möbel","decor.image":"Bild","decor.image_title":"Eigene Bilder","decor.image_upload":"Bild hochladen","decor.image_replace":"Bild ersetzen","decor.image_uploading":"Wird hochgeladen…","decor.image_asset":"Bilddatei","decor.image_pick_hint":"Ein Bild hochladen oder ein vorhandenes auswählen.","decor.image_place_hint":"Auf den Plan klicken, um das Bild zu platzieren.","decor.image_none":"Noch keine Bilder hochgeladen.","decor.image_unavailable":"Bild nicht verfügbar","decor.image_used":"In {n} Objekten verwendet","decor.image_upload_failed":"Bild konnte nicht hochgeladen werden: {err}","decor.image_error_capacity":"Der Speicher für benutzerdefinierte Bilder ist voll.","decor.image_in_use":"Vor dem Löschen alle platzierten Kopien entfernen.","decor.image_delete_title":"Bilddatei löschen?","decor.image_delete_message":"„{name}“ aus House Plan löschen? Dies kann nicht rückgängig gemacht werden.","furn.title":"Möbelbibliothek","furn.symbol":"Symbol","furn.group_furniture":"Möbel","furn.group_appliance":"Geräte","furn.group_sanitary":"Sanitär","furn.group_other":"Sonstiges","furn.width":"Breite","furn.depth":"Tiefe","furn.back_to_categories":"Alle Kategorien","furn.pick_hint":"Wählen Sie eine Kategorie und dann ein Symbol.","furn.place_hint":"Klicken Sie auf den Plan — das Element wird an der nächsten Wand platziert. Mit Shift wird es frei platziert.","furn.cat_air_conditioner":"Klimaanlagen","furn.cat_armchair":"Sessel","furn.cat_bathtub":"Badewannen","furn.cat_bed":"Betten","furn.cat_bidet":"Bidets","furn.cat_boiler":"Warmwasserbereiter","furn.cat_chair":"Stühle","furn.cat_coffee_table":"Couchtische","furn.cat_cooktop":"Kochfelder","furn.cat_dining_table":"Esstische","furn.cat_dishwasher":"Geschirrspüler","furn.cat_dryer":"Wäschetrockner","furn.cat_fireplace":"Kamine","furn.cat_fridge":"Kühlschränke","furn.cat_kitchen_cabinet":"Küchenschränke","furn.cat_kitchen_sink":"Küchenspülen","furn.cat_nightstand":"Schränke","furn.cat_plant":"Pflanzen","furn.cat_rug":"Teppiche","furn.cat_shelving":"Regale","furn.cat_shower":"Duschen","furn.cat_sink":"Waschbecken","furn.cat_sofa":"Sofas","furn.cat_stairs":"Treppen","furn.cat_toilet":"Toiletten","furn.cat_tv":"Fernseher","furn.cat_wardrobe":"Kleiderschränke","furn.cat_washer":"Waschmaschinen","furn.cat_work_table":"Schreibtische","furn.sym_sofa":"Zweisitzer-Sofa","furn.sym_sofa_three_seat":"Dreisitzer-Sofa","furn.sym_sofa_corner_right":"Ecksofa rechts","furn.sym_armchair":"Polstersessel","furn.sym_armchair_office":"Bürostuhl","furn.sym_coffee_table":"Rechteckiger Couchtisch","furn.sym_coffee_table_round":"Runder Couchtisch","furn.sym_coffee_table_oval":"Ovaler Couchtisch","furn.sym_coffee_table_rounded":"Abgerundeter Couchtisch","furn.sym_table_dining":"Rechteckiger Esstisch","furn.sym_table_round":"Rundtisch","furn.sym_table_dining_oval":"Ovaler Esstisch","furn.sym_table_dining_rounded":"Abgerundeter Esstisch","furn.sym_chair":"Stuhl","furn.sym_chair_bar":"Barhocker","furn.sym_desk":"Rechteckiger Schreibtisch","furn.sym_desk_corner":"Eckschreibtisch","furn.sym_bed_double":"Doppelbett","furn.sym_bed_single":"Einzelbett","furn.sym_nightstand":"Nachttisch","furn.sym_cabinet_tv":"TV-Schrank","furn.sym_cabinet_shoe":"Schuhschrank","furn.sym_cabinet_sink":"Waschtischunterschrank","furn.sym_wardrobe":"Kleiderschrank","furn.sym_bookshelf":"Bücherschrank","furn.sym_wall_unit":"Schrankwand","furn.sym_kitchen_floor":"Küchen-Unterschrank","furn.sym_kitchen_floor_corner":"Küchen-Eckunterschrank","furn.sym_kitchen_wall":"Küchen-Hängeschrank","furn.sym_kitchen_wall_corner":"Küchen-Eckhängeschrank","furn.sym_shelf_floor":"Standregal","furn.sym_shelf_wall":"Wandregal","furn.sym_fridge":"Kühlschrank","furn.sym_stove":"Vierflammiges Kochfeld","furn.sym_cooktop_two":"Zweiflammiges Kochfeld","furn.sym_dishwasher":"Geschirrspüler","furn.sym_washer":"Waschmaschine","furn.sym_dryer":"Wäschetrockner","furn.sym_tv":"Fernseher mit Standfuß","furn.sym_tv_wall":"Wandfernseher","furn.sym_ac":"Klimaanlage","furn.sym_water_heater":"Wassererhitzer","furn.sym_toilet":"Stand-WC","furn.sym_toilet_built_in":"Wand-WC","furn.sym_bathtub":"Rechteckige Badewanne","furn.sym_bathtub_corner":"Eckbadewanne","furn.sym_shower":"Dusche","furn.sym_sink":"Waschbecken","furn.sym_kitchen_sink":"Einzel-Küchenspüle","furn.sym_kitchen_sink_double":"Doppel-Küchenspüle","furn.sym_bidet":"Stand-Bidet","furn.sym_bidet_built_in":"Wand-Bidet","furn.sym_stairs":"Treppe","furn.sym_fireplace":"Kamin","furn.sym_plant":"Pflanze","furn.sym_rug":"Teppich","common.yes":"Ja","common.no":"Nein","vac.diag_source":"Quelle","vac.diag_platform":"Integration","vac.diag_status":"Status","vac.diag_position":"Position","vac.diag_rooms":"Räume","vac.diag_rooms_value":"{total} · {matched} Namen stimmen überein · {readiness}","vac.autocal_ready":"Auto-Kalibrierung verfügbar","vac.autocal_not_ready":"3 übereinstimmende Namen erforderlich","vac.diag_path":"Integrationspfad","vac.diag_map":"Karten-ID","vac.source_none":"nicht ausgewählt","vac.source_status_ok":"Bereit","vac.source_status_missing":"Fehlend","vac.source_status_disabled":"In Home Assistant deaktiviert","vac.source_status_unavailable":"Nicht verfügbar","vac.source_status_unverified":"Kann mit den aktuellen Berechtigungen nicht verifizieren","vac.source_status_unsupported":"Keine Positionsdaten","vac.source_status_none":"Keine Quelle","vac.source_banner_missing":"Die gespeicherte Quelle existiert nicht mehr. Sie wurde nicht automatisch ersetzt; wählen Sie eine andere Quelle oder stellen Sie sie in Home Assistant wieder her.","vac.source_banner_disabled":"Die gespeicherte Quelle ist in Home Assistant deaktiviert. Aktivieren Sie sie dort oder wählen Sie eine andere Quelle.","vac.source_banner_unverified":"Die aktuellen Home Assistant-Berechtigungen können diese gespeicherte Quelle nicht verifizieren. Sie bleibt angepinnt und wird nicht automatisch ersetzt.","vac.choose_source":"Quelle wählen","vac.source_auto":"Automatisch","vac.source_auto_hint":"Verwenden Sie eine kompatible Entität von diesem Gerät","vac.all_cameras":"Alle Kameras","vac.all_cameras_warn":"Eine Kamera liefert möglicherweise keine Roboter-Daten. Wählen Sie eine nur, wenn es Ihre Saugroboter-Karte ist.","vac.all_cameras_empty":"Keine anderen Kamera-Entitäten gefunden.","vac.platform_unknown":"unbekannte Integration","vac.cap_position":"Position","vac.cap_rooms_short":"Räume","vac.cap_path":"Pfad","vac.cap_map":"Karten-ID","vac.cap_none":"Keine Roboter-Daten erkannt","vac.xcme_hint":"Aktivieren Sie diese Xiaomi Cloud Map Extractor-Attribute:","vac.documentation":"Dokumentation","vac.residual_title":"Automatische Kalibrierung überprüfen","vac.residual_message":"Die zugeordneten Räume weichen um bis zu {error} voneinander ab. Diese ungefähre Kalibrierung anwenden, manuell verfeinern oder ohne Änderung der gespeicherten Einrichtung abbrechen.","vac.apply_proposal":"Anwenden","gs.backup_group":"Sichern und übertragen","gs.backup_hint":"Laden Sie ein tragbares JSON-Backup herunter oder sehen Sie eine Vorschau und importieren Sie ein Backup, das mit House Plan erstellt wurde.","backup.export_open":"Exportieren","backup.import_open":"Importieren","backup.export_title":"House Plan exportieren","backup.import_title":"House Plan importieren","backup.export_hint":"Wählen Sie, ob das Backup die gesamte House Plan-Konfiguration oder nur den aktuellen Bereich enthalten soll.","backup.full":"Vollständiges Backup","backup.current_space":"Aktueller Bereich","backup.current_space_title":"Aktueller Bereich: {title}","backup.no_current_space":"Kein aktueller Bereich","backup.plan_only":"Nur Plan","backup.plan_only_hint":"Räume, Wände, Öffnungen, Dekor und Raumbezeichnungspositionen ohne Geräte oder Home Assistant-Bindungen beibehalten.","backup.plan_only_preview":"Diese Datei enthält nur den Plan.","backup.privacy_warning":"Das Archiv enthält Namen, Home Assistant-Kennungen und genaue Koordinaten. Interne Pläne und Anhänge werden referenziert, nicht eingebettet; Laufzeitzustände und Staubsaugerspuren sind nicht enthalten.","backup.download":"JSON herunterladen","backup.export_done":"Backup heruntergeladen","backup.reading":"Überprüfe das Backup…","backup.revalidated":"Der Plan wurde nach dieser Vorschau geändert. Die Zusammenfassung wurde aktualisiert; überprüfen Sie sie und bestätigen Sie erneut.","backup.error.support_invalid_message":"Prüfen Sie die Supportnachricht und versuchen Sie es erneut.","backup.error.support_package_too_large":"Das anonymisierte Supportpaket überschreitet das Limit von 8 MiB.","backup.error.support_preview_expired":"Die Vorschau des Supportanhangs ist abgelaufen oder nicht mehr verfügbar.","backup.error.support_rate_limited":"Zu viele Supportberichte oder Vorschauen wurden angefordert. Versuchen Sie es später erneut.","backup.error.support_rejected":"Der Bericht hat die Prüfung des Supportdienstes nicht bestanden.","backup.error.support_unavailable":"Der private Supportdienst ist vorübergehend nicht verfügbar.","backup.error.unauthorized":"Sie haben keine Berechtigung, diesen Plan zu exportieren oder zu importieren.","backup.error.not_ready":"Der Hausplan ist noch nicht fertig. Versuchen Sie es in einem Moment erneut.","backup.error.too_large":"Das Backup überschreitet das 8-MiB-Limit.","backup.error.invalid_json":"Die ausgewählte Datei ist kein gültiges JSON.","backup.error.invalid_format":"Die ausgewählte Datei ist kein House Plan-Backup.","backup.error.invalid_image":"Das Bild ist beschädigt oder entspricht nicht seinem Format.","backup.error.unsupported_export_version":"Dieses Backup-Format wird von der installierten Version nicht unterstützt.","backup.error.unsupported_image":"Verwenden Sie ein unterstütztes PNG-, JPEG-, WebP- oder SVG-Bild.","backup.error.future_model":"Das Backup wurde mit einem neueren House-Plan-Datenmodell erstellt.","backup.error.invalid_config":"Das Backup enthält eine ungültige House-Plan-Konfiguration.","backup.error.wall_model_migration_blocked":"Das Backup-Wandmodell konnte nicht sicher aktualisiert werden. Optimieren Sie zuerst den Quellplan und exportieren Sie ihn dann erneut.","backup.error.invalid_layout":"Das Backup enthält ungültige Objektpositionen.","backup.error.invalid_content":"Das Backup enthält ungültige oder inkonsistente Inhaltsreferenzen.","backup.error.space_not_found":"Der ausgewählte Bereich existiert nicht mehr.","backup.error.capacity_exceeded":"Durch das Hinzufügen dieses Backups würden die Planlimits überschritten.","backup.error.preview_expired":"Die Vorschau ist abgelaufen. Wählen Sie die Backup-Datei erneut aus.","backup.error.preview_owner_mismatch":"Diese Vorschau gehört zu einem anderen Home-Assistant-Benutzer.","backup.error.conflict":"Der Plan hat sich nach der Vorschau geändert. Überprüfen Sie die aktualisierte Zusammenfassung.","backup.error.content_confirmation_required":"Bestätigen Sie, dass nicht verfügbare lokale Inhalte getrennt werden können.","backup.error.commit_failed":"Das Backup konnte nicht sicher angewendet werden. Der vorherige Plan wurde wiederhergestellt oder wartet auf die Wiederherstellung.","backup.error.missing_plan":"Eine referenzierte Plan-Datei ist nach der Vorschau verschwunden. Überprüfen Sie das Backup erneut.","backup.error.missing_content":"Ein referenziertes lokales Anhangselement ist nach der Vorschau verschwunden. Überprüfen Sie das Backup erneut.","backup.error.marker_control_missing":"Ein verknüpftes Planlicht fehlt im Backup.","backup.error.marker_control_not_light":"Ein verknüpftes Planziel ist nicht mehr als Lichtquelle markiert.","backup.error.marker_control_self":"Eine Lichtquelle kann sich nicht selbst steuern.","backup.error.marker_control_cycle":"Das Backup enthält eine kreisförmige Kette von Lichtsteuerungen.","backup.error.duplicate_marker_control":"Das Backup enthält eine doppelte Plan-Licht-Verknüpfung.","backup.error.no_backup":"Es gibt keinen Import- oder Optimierungssnapshot zur Wiederherstellung.","backup.error.in_use":"Das Element wird noch verwendet","backup.error.invalid_data":"Die Anfrage enthält ungültige Daten","backup.error.invalid_light_entity":"Das führende Licht muss eine light.*- oder switch.*-Entität sein","backup.error.invalid_marker_control":"Ungültige Marker-Steuerungsreferenz","backup.error.invalid_name":"Der Name ist ungültig","backup.error.invalid_partition_opening_host":"Die Öffnung muss ihren Trennwand-Träger behalten","backup.error.invalid_partition_opening_jamb_margin":"Die Öffnung lässt keinen physischen Pfosten am Wandende","backup.error.invalid_passage_fields":"Ein offener Durchgang kann keine Tür-Einstellungen tragen","backup.error.invalid_space_id":"Unbekannter Raumbereich","backup.error.invalid_toggle_entity":"Die Schalt-Entität muss light.* oder switch.* sein","backup.error.invalid_value_badge":"Ungültige Wert-Badge-Einstellungen","backup.error.invalid_value_badge_attribute":"Ungültiges Wert-Badge-Attribut","backup.error.invalid_value_badge_position":"Ungültige Wert-Badge-Position","backup.error.invalid_value_badge_source":"Ungültige Wert-Badge-Quelle","backup.error.invalid_vacuum_map_route":"Prüfen Sie die Zuordnung der Roboterkarten zu Räumen.","backup.error.invalid_value_source":"Ungültige Wertquelle","backup.error.invalid_value_source_attribute":"Ungültiges Wertquellen-Attribut","backup.error.io_error":"Eine Dateioperation auf dem Server ist fehlgeschlagen","backup.error.not_toggleable":"Dieses Gerät kann nicht geschaltet werden","backup.error.nothing_to_repair":"Nichts zu reparieren","backup.error.space_in_use":"Der Raumbereich wird noch referenziert","backup.error.value_badge_source_required":"Das Wert-Badge braucht eine Quelle","backup.error.wall_model_client_outdated":"Der Plan wurde anderswo aktualisiert — Seite neu laden","backup.same_source":"Erstellt auf dieser Home Assistant-Instanz","backup.foreign_source":"Erstellt auf einer anderen Home Assistant-Instanz","backup.created":"Erstellt: {value}","backup.versions":"Karte {card}; Integration {integration}; Datenmodell {model}","backup.count_spaces":"Bereiche: {n}","backup.count_rooms":"Räume: {n}","backup.count_walls":"Wände: {n}","backup.count_openings":"Öffnungen: {n}","backup.count_decor":"Dekorationsobjekte: {n}","backup.count_markers":"Geräte: {n}","backup.count_layout":"Positionen: {n}","backup.bindings":"Verknüpfungen — Geräte: {device}, Entitäten: {entity}, virtuell: {virtual}; Positionen ohne Bereich: {legacy}","backup.binding_status":"Zielstatus — aktiv: {active}, deaktiviert: {disabled}, fehlt: {missing}","backup.missing_areas":"Auf dem Ziel fehlende Bereiche: {areas}","backup.dropped_marker_links":"Planlicht-Verknüpfungen außerhalb dieses übertragenen Bereichs wurden ausgelassen: {n}.","backup.room_drafts_migrated":"Alte unvollständige Konturen wurden in normale Wände umgewandelt: {drafts}; Wandsegmente: {segments}.","backup.repaired_target_refs":"Durch den Import dieses Bereichs wiederhergestellte vorhandene Referenzen: {n}.","backup.preserved_unresolved_refs":"Referenzen, die nicht eindeutig wiederhergestellt werden konnten, wurden beibehalten: {n}.","backup.preserved_unresolved_hint":"Es wurden keine Daten geraten oder gelöscht. Führen Sie nach dem Import Optimierungspläne aus, um die verbleibenden Referenzen zu überprüfen.","backup.import_details":"Importieren von Referenzdetails","backup.import_detail.incoming_remapped":"Referenzen innerhalb der importierten Kopie aktualisiert: {n}","backup.import_detail.target_repaired":"Vorhandene Referenzen wiederhergestellt: {n}","backup.import_detail.preserved_unresolved":"Unaufgelöste Referenzen beibehalten: {n}","backup.import_detail.collisions":"Zielkonflikte sicher beibehalten: {n}","backup.import_detail.dropped_links":"Eingehende Links durch Übertragungsregeln ausgelassen: {n}","backup.import_detail.bounded_lineages":"Übermäßig verschachtelte Kennungen begrenzt belassen: {n}","backup.replace_warning":"Dies ersetzt die aktuelle Konfiguration und das Layout. Hochgeladene Dateien werden niemals gelöscht. Eine Rückgängig-Möglichkeit bleibt bis zur nächsten Planbearbeitung verfügbar.","backup.foreign_bookkeeping":"Instanzspezifische bekannte/neue Gerätebuchführung wird nicht importiert.","backup.final_name":"Name des neuen Bereichs","backup.target_settings":"Die globalen Einstellungen der Zielinstanz bleiben unverändert.","backup.duplicates":"Bindungen bereits vorhanden: {n}","backup.skip":"Doppelte Geräte überspringen","backup.virtual_copy":"Sichere statische virtuelle Kopien hinzufügen","backup.content":"Referenzierter Inhalt","backup.decor_images_summary":"Eigene Bilder: {objects} Objekte, {assets} Dateien; fehlende Dateien: {missing}.","backup.content_available":"lokal verfügbar","backup.content_external":"externer Link","backup.content_detach_required":"wird getrennt","backup.confirm_detach":"Ich verstehe, dass nicht verfügbare interne Pläne und Anhänge von der importierten Konfiguration getrennt werden.","backup.confirm_missing_images":"Ich verstehe, dass fehlende eigene Bilder als reparierbare Platzhalter erhalten bleiben und andere nicht verfügbare lokale Dateien getrennt werden.","backup.replace":"Ersetzen","backup.add":"Bereich hinzufügen","backup.space_done":"Bereich importiert: {rooms} Räume, {markers} Geräte, {refs} bestehende Referenzen wiederhergestellt","backup.full_done":"Backup wiederhergestellt: {spaces} Bereiche, {rooms} Räume, {markers} Geräte","backup.undo_import":"Letzten vollständigen Import rückgängig machen","backup.import_undone":"Vollständiger Import rückgängig gemacht","backdrop.large_title":"Großes Bild","backdrop.large_body":"Dieses Bild ist {w}×{h} ({fileMb} MB Datei) und benötigt etwa {decodedMb} MB Speicher zur Anzeige. Auf Tablets kann das die Seite zum Absturz bringen.","backdrop.unknown_body":"Die Bildabmessungen konnten nicht gelesen werden — die Datei ist möglicherweise beschädigt. Fortfahren kann die Seite auf Tablets zum Absturz bringen.","backdrop.reduced_dimensions":"Verkleinerte Kopie: {w}×{h} px.","backdrop.use_downscaled":"Verkleinerte Kopie hochladen","backdrop.reducing":"Wird verkleinert…","backdrop.keep_original":"Original behalten","backdrop.too_large_title":"Bild ist zu groß","backdrop.too_large_body":"Dieses Bild überschreitet die Anzeigegrenzen des Browsers ({w}×{h}, Limit {limit} px pro Seite). Bitte verkleinern Sie es in einem Desktop-Editor und laden Sie es erneut hoch.","backdrop.downscale_failed":"Die verkleinerte Kopie konnte nicht erstellt werden. Der aktuelle Plan wurde nicht geändert."};const n="34d1dbfc181acaf58842dfced0e6aa3a899aef6b8d1eeba53732ef729a63137e";export{e as dictionary,n as fingerprint};
+globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="4da0d706a85c3f1c08ab6de960deb5feb08baaf9055265234e7bd1b554332653";var e={"editor.context_actions":"Aktionen: {object}","editor.tool_options":"Werkzeugoptionen: {tool}","editor.palette":"Palette: {tool}","editor.open_group":"Werkzeuggruppe: {group}","editor.group_active":"{group} — aktiv: {item}","editor.disabled_action":"{action} ist nicht verfügbar: {reason}","editor.loading":"Editor wird geladen…","editor.loading_aria":"Der Plan-Editor wird geladen","editor.load_failed":"Der Editor konnte nicht geladen werden.","editor.refresh_advice":"Seite aktualisieren und erneut versuchen.","editor.retry_advice":"Verbindung prüfen und erneut drücken.","version_mismatch.title":"Die House Plan-Versionen stimmen nicht überein","version_mismatch.body":"Falls Home Assistant noch neu startet, warten Sie den Abschluss ab und laden Sie dann diese Seite neu.","version_mismatch.frontend":"Karte","version_mismatch.backend":"Integration","version_mismatch.reload":"Seite neu laden","color_picker.title":"Farbwähler","color_picker.hue":"Farbton","color_picker.saturation":"Sättigung","color_picker.value":"Helligkeit","color_picker.hex":"Hex-Farbe","color_picker.invalid_hex":"Geben Sie eine 3- oder 6-stellige Hex-Farbe ein","color_picker.confirm":"OK","btn.properties":"Eigenschaften","btn.keep_as_walls":"Als Wände behalten","btn.delete_room_keep_walls":"Raum löschen, Wände behalten","btn.delete_room_with_walls":"Raum und Wände löschen","title.markup_select":"Wände und Säulen auswählen und bearbeiten","title.markup_column":"Säule: Klicken Sie auf einen Rasterpunkt, um eine quadratische Säule zu platzieren","markup.partition":"Trennwand","markup.column":"Säule","markup.hint_column":"Klicken Sie auf einen Rasterpunkt, um eine quadratische Säule zu platzieren","history.wall_segment":"Wandsegment hinzufügen","history.column_add":"Säule hinzufügen","history.physical_edit":"Physisches Objekt ändern","history.physical_delete":"Physisches Objekt löschen","history.physical_move":"Physisches Objekt verschieben","history.wall_face_batch":"Räume aus Wänden erstellen","toast.column_duplicate":"Eine Säule mit demselben Zentrum und äußerer Größe existiert bereits","physical.partition_properties":"Eigenschaften der Trennwand","physical.column_properties":"Eigenschaften der Säule","physical.shape":"Form","physical.square":"Quadrat","physical.circle":"Kreis","physical.diameter":"Durchmesser","physical.side":"Seite","physical.rotation":"Drehwinkel","physical.length":"Länge","physical.allowed_range":"Erlaubt: {min}–{max} {unit}","physical.column_size_title":"Außenmaß der per Klick platzierten quadratischen Säule (1–150 cm).","card.title":"Hausplan","count.devices":"{n} Entwicklung","empty.no_spaces":"Noch keine Bereiche.","nav.spaces":"House-Plan-Bereiche","empty.add_first":"Ersten Bereich hinzufügen und einen Grundriss hochladen.","empty.read_only":"Es sind keine Bereiche eingerichtet. Bitten Sie einen Administrator, einen hinzuzufügen.","empty.install":"Installieren Sie die House Plan-Integration und fügen Sie sie unter „Geräte & Dienste“ hinzu.","btn.add_space":"Bereich hinzufügen","btn.cancel":"Abbrechen","btn.save":"Speichern","btn.close":"Schließen","btn.delete":"Löschen","btn.copy":"Kopieren","btn.edit":"Bearbeiten","btn.open_in_ha":"In HA öffnen","btn.reset":"Zurücksetzen","btn.attach":"Anhängen…","btn.upload":"Hochladen…","btn.replace":"Ersetzen…","title.zoom_in":"Zoomen","title.zoom_out":"Herauszoomen","title.zoom_fit":"Alles anpassen","title.configure_space":"Bereich konfigurieren","title.add_space":"Bereich hinzufügen","title.markup_add":"Wände: eine durchgehende Kette zeichnen; jedes bestätigte Segment wird einzeln gespeichert. Umschalt sperrt auf 45°","title.markup_merge":"Zusammenführen: Klicken Sie auf einen Raum und dann auf den Nachbarraum, mit dem er eine Wand teilt","title.markup_split":"Raum teilen: Klicken Sie auf den Raum und dann auf zwei Punkte an seinen Wänden","title.markup_delroom":"Raum löschen: Klicken Sie in einen Raum und bestätigen Sie","title.need_plan":"Einen Grundriss hochladen","markup.add":"Wände","markup.merge":"Zusammenführen","markup.split":"Teilen","markup.resize":"Größe ändern","title.markup_resize":"Räume vergrößern/verkleinern: Ziehen Sie einen verfügbaren horizontalen oder vertikalen Wandgriff","markup.hint_resize":"Ziehen Sie einen verfügbaren Wandgriff · die Wand stoppt an der ersten unsicheren Position · Esc bricht ab · Strg+Z — rückgängig","resize.disabled.diagonal":"Diese Wand ist geneigt; Größe ändern unterstützt nur horizontale und vertikale Wände","resize.disabled.side-angle":"Eine angrenzende Wand ist geneigt; Größe ändern erfordert, dass beide angrenzenden Wände diese Wand im rechten Winkel treffen","resize.disabled.duplicate-physical-wall":"Eine separate Trennwand oder ein Pfeiler überlappt diese Wand; entfernen oder verschieben Sie sie, bevor Sie die Größe ändern","resize.disabled.partial-shared":"Ein angrenzender Raum nutzt nur einen Teil dieser Wand, daher kann sie nicht sicher als gemeinsame Wand verschoben werden","resize.disabled.unequal-shared":"Der angrenzende Raum nutzt andere Endpunkte oder Wandlängen, daher können die Wände nicht gemeinsam sicher bewegt werden","resize.disabled.multiple-rooms":"Das Verschieben dieser Wand würde mehr als zwei Räume betreffen","resize.disabled.thickness-conflict":"Die Wandstärke kann nicht sicher beibehalten werden","resize.disabled.opening-conflict":"Eine Öffnung an dieser Wand kann nicht sicher verschoben werden","resize.disabled.invalid-geometry":"Diese Wand kann nicht ohne Änderung der Planstruktur geändert werden","resize.limit_stopped":"Wand gestoppt: der nächste Schritt würde ein Anschlusslimit verletzen","resize.commit_failed":"Größenänderung wurde abgebrochen, da der endgültige Plan die Geometrieprüfung nicht bestanden hat","resize.preview_failed":"Größenänderung am letzten sicheren Punkt gestoppt, da die Plan-Geometrie nicht beibehalten werden konnte","markup.opening":"Öffnung","markup.delete_room":"Raum löschen","history.undo":"Rückgängig","history.redo":"Wiederholen","history.undo_named":"Rückgängig: {name} (Strg+Z)","history.redo_named":"Wiederholen: {name} (Strg+Shift+Z / Strg+Y)","history.undo_empty":"Nichts zu widerrufen","history.redo_empty":"Nichts zu wiederholen","history.undone":"Rückgängig gemacht: {name}","history.redone":"Wiederholt: {name}","history.add_room":"Raum erstellen","history.split_room":"Raum teilen","history.merge_rooms":"Räume zusammenführen","history.resize_room":"Raumgröße ändern","history.wall_thickness":"Wandstärke ändern","history.add_opening":"Tür- oder Fensteröffnung hinzufügen","history.edit_opening":"Öffnung bearbeiten","history.move_opening":"Öffnung verschieben","history.delete_opening":"Öffnung löschen","history.delete_room_keep_walls":"Raum löschen, Wände behalten","history.delete_room_with_walls":"Raum und Wände löschen","history.decor_add":"Dekorobjekt hinzufügen","history.decor_edit":"Dekorobjekt bearbeiten","history.decor_move":"Dekorobjekt verschieben","history.decor_transform":"Dekorobjekt transformieren","history.decor_delete":"Dekorobjekt löschen","history.backdrop_transform":"Plan-Hintergrund transformieren","history.device_move":"{name} verschieben","history.device_stale":"Der Positionsverlauf ist nicht mehr anwendbar und wurde gelöscht","opening.new":"Neue Öffnung","opening.edit":"Öffnung","opening.door":"Tür","opening.window":"Fenster","opening.gate":"Tor","opening.passage":"Offener Durchgang","opening.passage_binding_warning":"Das Speichern entfernt den Öffnungs-/Schließsensor und das Schloss.","opening.invalid_passage_fields":"Der offene Durchgang auf dem Plan „{room}“ hat nicht unterstützte Einstellungen: {fields}.","opening.type_label":"Typ","opening.length_label":"Länge, cm","opening.contact_label":"Öffnungs-/Schließsensor","opening.lock_label":"Schloss","opening.none":"— keine —","opening.search_ph":"Suche: Name oder Entitäts-ID…","opening.invert":"Geöffnet/geschlossen invertieren","opening.flip_h":"Scharnier an der anderen Zarge","opening.flip_v":"Öffnet zur anderen Seite","opening.open":"Offen","opening.closed":"Geschlossen","opening.locked":"Verriegelt","opening.unlocked":"Entriegelt","opening.state_unknown":"nicht verfügbar","opening.no_entities":"Keine Sensoren gebunden — ein statisches Symbol auf dem Plan.","toast.opening_no_wall":"Neben eine Raumwand oder eine unabhängige Wand klicken","opening.host_partition":"Unabhängige Wand","opening.partition_orphan":"Die unabhängige Wand für diese Öffnung existiert nicht mehr","opening.partition_jamb_margin":"Mindestens {distance} zwischen der Öffnung und dem Wandende lassen","opening.rebind_partition":"An eine andere unabhängige Wand anfügen","confirm.delete_partition_openings_title":"Wand und Öffnungen löschen?","confirm.delete_partition_openings_body":"Diese Wand enthält {count} Öffnung(en). Sie werden zusammen gelöscht.","confirm.delete_partition_openings_item":"• {type}, {length}","markup.hint_points":"Punkte: {n} · Shift — 45° Schritte · Esc — Kette beenden · Ctrl+Z — Punkt rückgängig machen · Schließen eines Bereichs erstellt einen Raum","markup.hint_start":"Klicken Sie auf einen Rasterpunkt, um eine Wandkette zu starten","tip.lqi":"durchschnittliches Zigbee-Signal:","tip.area":"Bereich: {value}","info.device_header":"Gerät im Plan","info.model":"Modell","info.state":"Status","info.link":"Verbindung","info.manuals":"Handbücher","info.none":"Keine zusätzlichen Informationen","marker.new_device":"Neues Gerät","marker.name_label":"Name (im Plan angezeigt)","marker.name_ph":"Name","marker.binding_label":"An ein HA-Gerät binden","marker.binding_disabled":"in Home Assistant deaktiviert","marker.virtual_option":"Virtuelles Gerät (keine Bindung)","marker.search_ph":"Gerät/Gruppe suchen…","marker.nothing_found":"Nichts gefunden","marker.room_label":"Raum","marker.room_override":" (Platzierung überschreiben)","marker.room_choose":"— Raum auswählen —","marker.room_auto":"— nach Gerätebereich (auto) —","marker.icon_label":"Symbol","marker.icon_ph":"mdi:… (leer = automatisch)","marker.display_label":"Anzeige","display.badge":"Symbol + Zustand","display.icon_ripple":"Symbol + Zustand und Aktivität","display.static_icon":"Immer statisches Symbol","display.value_static_icon":"Wert + statisches Symbol","marker.display_hint_badge":"Das Symbol und die dynamische Platte zeigen den Gerätezustand ohne den üblichen Aktivitätspuls. Rote Alarme bleiben sichtbar.","marker.display_hint_icon_ripple":"Das Symbol, die dynamische Platte und der Puls zeigen einen kurzen Puls für Ereignisse und einen kontinuierlichen Puls für Arbeit, Bewegung oder Anwesenheit. Rote Alarme haben eine separate Priorität.","marker.display_hint_value":"Ein ausgewählter oder automatisch ermittelter Home Assistant-Wert ersetzt das Symbol, während die Platte weiterhin den Zustand anzeigt. Rote Alarme bleiben sichtbar.","marker.display_hint_static_icon":"Die themenabhängige Hülle und das Symbol bleiben immer gleich. Zustand, Aktivität, Nichtverfügbarkeit und Alarme verändern nicht das Erscheinungsbild.","marker.display_hint_value_static_icon":"Der Marker zeigt den gewählten Wert, während die Hülle themenabhängig bleibt. Zustand, Aktivität, Nichtverfügbarkeit und Alarme ändern die Markerfarbe nicht.","marker.static_alarm_warning":"Dieses Gerät kann Alarme melden. Die statische Anzeige verbirgt die visuelle Alarmanzeige des Markers.","marker.preview.title":"Anzeigevorschau","marker.preview.actual":"Jetzt","marker.preview.example":"Beispiel","marker.preview.integration":"Bereitgestellt von","marker.preview.source":"Anzeigquelle","marker.preview.current_state":"Aktueller Zustand","marker.preview.result":"Auf dem Plan","marker.preview.details":"Quelldetails","marker.preview.select_source":"Ein Home-Assistant-Gerät oder eine Entität auswählen, um die tatsächliche Anzeige zu sehen.","marker.preview.unknown_provider":"Unbekannte Integration","marker.preview.virtual_provider":"House Plan · virtuelles Gerät","marker.preview.no_source":"Keine aktive Quelle","marker.preview.no_state":"Kein aktueller Zustand","marker.preview.mixed_states":"Mehrere verschiedene Zustände","marker.preview.multiple_sources":"{n}-Quellen","marker.preview.more_sources":"+{n} mehr","marker.preview.scaled":"Die Vorschau wird auf {n}% skaliert, um zu passen. Die gespeicherte Größe bleibt unverändert.","marker.preview.demo_short":"Kurze Aktivität anzeigen","marker.preview.demo_continuous":"Kontinuierliche Aktivität anzeigen","marker.preview.stop_continuous":"Kontinuierliche Aktivität stoppen","marker.preview.demo_short_notice":"Kurzes Aktivitätsbeispiel; der tatsächliche Gerätezustand bleibt unverändert.","marker.preview.demo_continuous_notice":"Kontinuierliches Aktivitätsbeispiel; der tatsächliche Gerätezustand bleibt unverändert.","marker.preview.demo_already_visible":"Der aktuelle Zustand zeigt bereits eine echte Aktivitäts- oder Alarmeffekt.","marker.preview.reduced_motion":"Systemweit reduzierte Bewegungen sind aktiviert, daher wird gewöhnliche Aktivität als Punkt angezeigt.","marker.preview.reason.neutral":"Neutrale dunkle Platte","marker.preview.reason.working":"Gelbe Platte: Das Gerät arbeitet jetzt","marker.preview.reason.working_activity":"Gelbe Platte und Aktivitätseffekt: das Gerät funktioniert jetzt","marker.preview.reason.open":"Orange Platte: physisch geöffnet oder entriegelt","marker.preview.reason.cover_icon_state":"Neutrale Platte; die Abdeckungseinheit steuert den angezeigten Zustand und das Symbol","marker.preview.reason.presence":"Aktivitätseffekt, während Präsenz erkannt wird","marker.preview.reason.event":"Kurzer Aktivitätseffekt nach einem erkannten Ereignis","marker.preview.reason.transition":"Aktivitätseffekt, während das Gerät sich bewegt oder den Zustand ändert","marker.preview.reason.media_neutral":"Mediengeräte bleiben im verfügbaren Zustand auf einer neutralen dunklen Platte","marker.preview.reason.unavailable":"Gedämpfte neutrale Platte: nicht verfügbar oder ausgeschaltet","marker.preview.reason.alarm":"Rote Alarmplatte; Alarmanzeige wird immer angezeigt","marker.preview.reason.live_states_disabled":"Live-Zustandsstil ist für diese Karte deaktiviert","marker.preview.reason.value_no_state":"Kein nutzbarer Zustandswert; stattdessen wird das Symbol angezeigt","marker.preview.reason.value_ambiguous_sources":"Mehrere mögliche Wertequellen; stattdessen wird das Symbol angezeigt","marker.preview.reason.value_non_scalar":"Die Quelle lieferte keinen einfachen Wert; stattdessen wird das Symbol angezeigt","marker.preview.reason.value_virtual":"Ein virtuelles Gerät hat keinen Home Assistant-Wert; stattdessen wird das Symbol angezeigt","marker.preview.reason.vacuum_live_plan_only":"Echtzeitposition und -spur des Staubsaugers sind nur im vollständigen Plan verfügbar","marker.preview.reason.hidden_design_preview":"Das Gerät ist im Plan ausgeblendet; diese Designvorschau bleibt sichtbar","marker.preview.reason.composite_power_source":"Der Status stammt vom Power-Entity des Geräts; Hilfsschalter werden ignoriert","marker.preview.reason.activity_display_disabled":"Der gewählte Anzeigemodus zeigt gewöhnliche Aktivitätseffekte nicht an","marker.preview.reason.ha_disabled":"Die Home Assistant-Verbindung ist deaktiviert und wird im Plan ausgeblendet","marker.preview.reason.orphaned":"Die gespeicherte Home Assistant-Verbindung konnte nicht mehr gefunden werden","marker.preview.reason.static_icon":"Statischer Modus: Der Gerätestatus ändert das Symbol nicht","marker.preview.reason.value_static_icon":"Statischer Modus mit Wert: Der Gerätestatus ändert die Markerfarbe nicht","marker.activity_color":"Aktivitätspulsfarbe","marker.ripple_size":"Aktivitätspulsgröße","marker.activity_alarm_note":"Farbe und Größe betreffen nur gewöhnliche Aktivität und ändern keine roten Alarme.","marker.pulse_a11y_alarm":"Alarm","marker.pulse_a11y_event":"Kürzliches Ereignis","marker.pulse_a11y_presence":"Anwesenheit erkannt","marker.pulse_a11y_transition":"Statusänderung","marker.pulse_a11y_running":"Arbeitet","marker.state_a11y_neutral":"Standardzustand","marker.state_a11y_working":"Funktionierend","marker.state_a11y_open":"Offen","marker.state_a11y_locked":"Verschlossen","marker.state_a11y_unlocked":"Entriegelt","marker.state_a11y_alarm":"Alarm","marker.state_a11y_unavailable":"Nicht verfügbar","marker.lqi_a11y_low":"LQI {value}, schwaches Signal","marker.lqi_a11y_mid":"LQI {value}, mittleres Signal","marker.lqi_a11y_high":"LQI {value}, starkes Signal","marker.size_label":"Symbolgröße / Drehung","marker.angle_label":"Drehen","marker.model_label":"Modell","marker.model_ph":"z.B. Aqara T&H","marker.link_label":"Link","marker.desc_label":"Beschreibung","marker.desc_ph":"Notizen, Spezifikationen…","marker.manuals_label":"Handbücher (PDF usw.)","marker.sub_device":"Gerät","marker.sub_z2m_group":"· Z2M Gruppe","marker.sub_group":"Gruppe","marker.sub_helper":"Helfer","space.new":"Neuer Bereich","space.copy_title":"Bereich kopieren","space.copy_name":"Name des neuen Bereichs","space.copy_fallback":"Bereich","space.copy_create":"Kopie erstellen","space.copy_optimize_title":"Vor dem Kopieren optimieren?","space.copy_optimize_body":"Vor dem Erstellen von „{name}“ muss House Plan den gesamten Plan einschließlich anderer Bereiche optimieren. Fortfahren?","space.copy_optimize_confirm":"Optimieren und kopieren","space.copy_error_changed":"Der Plan wurde während der Bestätigung geändert. Bitte prüfen und erneut versuchen.","space.copy_error_source_missing":"Der Quellbereich existiert nicht mehr. Öffnen Sie seine Einstellungen erneut.","space.copy_error_source_invalid":"House Plan konnte nicht alle Wände dieses Bereichs prüfen. Korrigieren Sie den Quellbereich.","space.copy_error_spaces_limit":"House Plan enthält bereits die maximale Anzahl an Bereichen.","space.copy_error_partitions_limit":"Dieser Bereich enthält zu viele Wände zum Kopieren.","space.copy_error_openings_limit":"Dieser Bereich enthält zu viele Öffnungen zum Kopieren.","space.copy_error_decor_limit":"Dieser Bereich enthält zu viele Hintergrundobjekte zum Kopieren.","space.copy_error_columns_limit":"Dieser Bereich enthält zu viele Säulen zum Kopieren.","space.copy_error_opening_host":"Eine Öffnung ist keiner Wand mehr zugeordnet. Korrigieren oder löschen Sie sie vor dem Kopieren.","space.copy_error_geometry":"Die Kopie würde eine unsichere Wandgeometrie erzeugen. Korrigieren Sie den Quellbereich.","space.copy_error_optimize_geometry":"Das Kopieren wurde gestoppt, weil die Optimierung des gesamten Plans für einen Bereich unsicher ist.","space.header":"Bereich","space.title_label":"Titel","space.title_ph":"z.B. Garage","space.plan_label":"Grundriss (Hintergrund)","space.no_plan":"Kein Planbild","space.plan_alt":"Grundriss","room.new":"Neuer Raum","room.name_label":"Anzeigename","room.name_ph":"z.B. Terrasse","room.area_label":"Home Assistant Bereich (nicht zugewiesen)","room.no_area_option":"— kein Bereich —","room.default_name":"Raum","device.unnamed":"unbenannt","device.light_group":"Lichtgruppe","device.fallback":"Gerät","device.virtual":"Virtuelles Gerät","confirm.delete_room_title":'Raum "{name}" löschen?',"confirm.delete_room_body":"Festlegen, ob die ausschließlich zu diesem Raum gehörenden physischen Wände erhalten bleiben. Mit einem anderen Raum geteilte Wände bleiben immer erhalten.","confirm.remove_marker_title":"Gerät aus dem Plan löschen?","confirm.remove_marker_body":"Das Gerät verschwindet vollständig und trägt nicht mehr zu den Plandaten bei. Es kann später erneut hinzugefügt werden.","confirm.erase_decor":"Das Objekt „{kind}“ löschen? Diese Aktion kann im Editor rückgängig gemacht werden.","confirm.delete_space_title":"Bereich löschen?","confirm.delete_space_body":"Der Bereich, alle seine Räume und die gesamte Planmarkierung werden gelöscht.","confirm.delete_space_vac_routes":"Zuordnungen von Roboterkarten werden ebenfalls entfernt: {count}.","space.delete_blocked":"Dieser Bereich wird noch von {n} Gerät(en) verwendet. Die Geräte zuerst in einen anderen Bereich verschieben oder löschen.","toast.pos_save_failed":"Position nicht gespeichert: {err}","toast.no_entity":"Das Gerät hat keine geeignete Entität","toast.ha_disabled_action":"Ein deaktiviertes Home Assistant-Objekt kann im Plan nicht verwendet werden.","toast.ha_disabled_show_device":"Ein in Home Assistant deaktiviertes Gerät kann im Plan nicht angezeigt werden. Aktivieren Sie es zuerst in Home Assistant.","toast.ha_disabled_show_entity":"Eine in Home Assistant deaktivierte Entität kann im Plan nicht angezeigt werden. Aktivieren Sie sie zuerst in Home Assistant.","toast.ha_disabled_add":"Ein deaktiviertes Home Assistant-Objekt kann nicht dem Plan hinzugefügt werden. Aktivieren Sie es zuerst in Home Assistant.","toast.ha_binding_unverified":"Der Status des Objekts konnte über das Home Assistant-Register nicht überprüft werden. Anzeige und Aktionen sind vorübergehend nicht verfügbar.","toast.markup_needs_server":"Markup ist verfügbar, nachdem die Konfiguration auf den Server verschoben wurde.","toast.space_order_changed":"Reihenfolge geändert. Wenn eine Karte ihr Stockwerk nach Nummer festlegt, überprüfen Sie diese Paneele.","toast.conflict":"Die Konfiguration wurde in einem anderen Fenster geändert — Daten aktualisiert, wiederholen Sie Ihre letzte Aktion.","toast.cfg_save_failed":"Speichern der Konfiguration fehlgeschlagen: {err}","toast.room_overlap":"Die Umrisse überlappen den Raum „{name}“ — Räume dürfen sich nicht überlappen","toast.contour_cannot_close":"Die Kontur kann nicht geschlossen werden, da sie entartet ist oder sich selbst schneidet","toast.merge_not_adjacent":"Es können nur Räume zusammengeführt werden, die eine Wand teilen","toast.rooms_merged":"Räume zu „{name}“ zusammengeführt","toast.split_pick_wall":"Beginnen Sie den Schnitt an der Wand des Raumes","toast.split_bad_cut":"Der Schnitt muss wand-zu-wand innerhalb des Raumes verlaufen, ohne Wände oder sich selbst zu kreuzen","merge.header":"Räume zusammenführen","merge.hint":"Der zusammengeführte Raum behält einen Namen und eine Fläche. Die andere Fläche wird freigegeben — ihre Geräte verlassen den Plan, bis ein anderer Raum sie beansprucht.","merge.keep":"Behalten","merge.no_area":"keine Fläche","toast.room_saved":"Raum gespeichert ({n}). Hinzugefügte Geräte: {added}. Zeichnen Sie die nächste Kontur oder verlassen Sie die Markierung.","toast.room_saved_no_area":"Raum gespeichert ({n}, keine Fläche). Zeichnen Sie die nächste Kontur oder verlassen Sie die Markierung.","toast.marker_needs_server":"Die Gerätebearbeitung ist verfügbar, nachdem die Konfiguration auf den Server verschoben wurde","toast.virtual_name_required":"Einen Namen für das virtuelle Gerät eingeben","toast.marker_saved":"Gerät gespeichert","toast.marker_removed":"Gerät aus dem Plan gelöscht","toast.integration_missing":"Die House Plan-Integration ist nicht installiert — Verwaltung nicht verfügbar","toast.plan_formats":"Unterstützte Formate: SVG, PNG, JPG, WebP","toast.plan_required":"Grundriss hochladen — erforderlich","toast.space_added_onboard":"Bereich hinzugefügt. Räume einzeichnen: Rasterpunkte anklicken und die Kontur schließen.","toast.space_added":"Bereich hinzugefügt","toast.space_copied":"Bereich „{name}“ erstellt","toast.space_saved":"Bereich gespeichert","toast.space_deleted":"Bereich gelöscht","toast.delete_failed":"Löschen fehlgeschlagen: {err}","toast.error":"Fehler: {err}","toast.toggle_target_unavailable":"Ziel „{name}“ ist nicht verfügbar — keine Aktion durchgeführt","toast.toggle_targets_unavailable":"Ziele nicht verfügbar: {names}. Keine Aktion durchgeführt","toast.file_failed":'Datei "{name}" wurde nicht hochgeladen: {err}',"toast.files_attached":"Dateien angehängt: {n}","err.unknown":"unbekannter Fehler","err.code":"Code {code}","err.too_large":"Datei größer als {mb} MB","err.bad_ext":"nicht unterstützter Typ (PDF/Bild erwartet)","err.unauthorized":"Administratorrechte erforderlich","editor.title":"Titel","editor.default_floor":"Anfangsbereich","editor.default_floor_missing":"Anfangsbereich „{id}“ existiert nicht mehr. Wählen Sie einen anderen Bereich.","editor.floor":"Fester Bereich","editor.floor_none":"— nicht fest —","editor.floor_index":"YAML-Index {index} (beibehalten)","fixed_floor.loading":"Lade den festen Bereich…","fixed_floor.invalid_title":"Der feste Bereich ist nicht verfügbar","fixed_floor.invalid_body":"Überprüfen Sie die Etage in der Kartenkonfiguration. Der konfigurierte Wert ist: {value}","editor.icon_size":"Symbolgröße, % der Planbreite","editor.show_temperature":"Temperatur anzeigen","editor.live_states":"Live-Zustände (ein/aus, offen…)","editor.light_pools":"Lichtkegel und Wandschatten","editor.show_signal":"Zigbee-Signal anzeigen (LQI)","editor.language":"Schnittstellensprache","editor.lang_auto":"Automatisch (HA-Profil)","title.icon_rules":"Symbolregeln: welche MDI-Symbole Geräte nach Namen erhalten","rules.title":"Symbolregeln","rules.hint":'Regeln werden von oben anhand von "Gerätename + Modell" (Großschreibungs-unempfindliches Regex) überprüft; das erste Match gewinnt. Wenn nichts übereinstimmt, entscheidet die Entität-Geräteklasse, dann das generische Chip-Symbol.',"rules.pattern_ph":"regex, z. B. Stecker|Steckdose","rules.icon_ph":"mdi:power-socket-de","rules.add":"Regel hinzufügen","rules.reset":"Zurücksetzen auf Standardeinstellungen","rules.test_ph":"Versuch mal einen Gerätenamen...","rules.invalid":"ungültiges regex","rules.saved":"Icon-Regeln gespeichert","btn.up":"Nach oben","btn.down":"Nach unten","tap.info":"Gerätekarte","tap.more_info":"HA Mehr-Info-Dialog","tap.toggle":"Zustand umschalten","marker.tap_label":"Tap-Aktion für dieses Gerät","tap.toggle_note":"Der aufgelöste Zustand ist unten dargestellt. Sichere Geräte werden niemals aus dem Plan umgeschaltet.","import.title":"Bereiche aus HA-Etagen erstellen","import.hint":"Home Assistant kennt diese Etagen bereits. Die Etagen auswählen, die zu Planbereichen werden sollen; anschließend für jeden Bereich einen Grundriss hochladen. Die Räume werden danach von Hand eingezeichnet.","import.start":"{n} Bereich(e) erstellen","import.manual":"Von Grund auf neu starten","import.progress":"Etage {i} von {n}","import.done":"Bereiche erstellt. Räume einzeichnen: Rasterpunkte anklicken und die Kontur schließen.","btn.skip":"Überspringen","space.scale_label":"Maßstab (Rasterzellen-Größe)","space.cell_cm.help":"Verknüpft das Raster mit realen Abmessungen: Davon hängen Längen und Flächen, Wandstärken, Öffnungsgrößen und der Leuchtradius ab. Eine spätere Änderung verändert die berechneten Abmessungen des gesamten Bereichs, verschiebt aber keine Punkte im Plan.","space.cell_cm.help.aria":"Hilfe: Maßstab des Bereichs","space.scale_unit":"cm pro Zelle","space.scale_unit_imperial":"Zoll pro Zelle","space.display_section":"Anzeige","space.show_borders":"Raumgrenzen immer anzeigen","space.zero_wall_style":"Wände ohne Dicke","space.zero_wall_style.help":"Gestrichelte Wände ohne Dicke lassen Glow und Sonnenstrahlen durch, durchgezogene blockieren sie als Barriere ohne Fläche. Die Auswahl gilt für alle solchen Wände im Bereich, auch wenn ihre Linie in der Ansicht ausgeblendet ist.","space.zero_wall_style.help.aria":"Hilfe: Darstellung der Wände ohne Dicke","space.zero_wall_dashed":"Gestrichelt","space.zero_wall_solid":"Durchgezogen","space.show_names":"Raumnamen anzeigen (zum Verschieben ziehen)","space.room_color":"Farbe der Begrenzung & des Namens","space.opacity":"Deckkraft","space.fill_label":"Raumausfüllung","space.fill_mode.help":"„Eigene Farbe“ gestaltet den Bereich; „Licht“, „Temperatur“ und „LQI“ verwenden aktuelle Daten aus Home Assistant. Glow wird separat aktiviert.","space.fill_mode.help.aria":"Hilfe: Modus der Raumausfüllung","fill.none":"Keine","fill.lqi":"Zigbee-Signal","fill.light":"Lichter","fill.custom":"Benutzerdefinierte Farbe","space.custom_fill":"Füllfarbe","space.source_file":"Ich habe einen Grundriss als Bild","space.source_draw":"Kein Bild – ich werde die Räume von Hand umreißen","fill.temp":"Temperatur","tip.temp_avg":"Durchschnittstemperatur:","tip.hum_avg":"Durchschnittliche Luftfeuchtigkeit:","space_card.button":"Grundriss öffnen","space_card.not_found":"Bereich „{id}“ nicht gefunden","space_card.loading":"Laden…","continuity.restore_plan":"Grundriss wiederherstellen…","continuity.restore_connection":"Geräteverbindung wiederherstellen…","continuity.retry":"Erneut versuchen","editor.space":"Bereich","editor.framing":"Bildausschnitt","editor.fit_content":"Alle sichtbaren Inhalte","editor.fit_house":"Eng an der Hausgeometrie","editor.show_button":"Schaltfläche anzeigen","editor.button_label":"Beschriftung der Schaltfläche","editor.button_target":"Ziel-Dashboard-Pfad","marker.sub_entity":"Entität","title.general_settings":"Allgemeine Einstellungen","title.export_pdf":"Als PDF speichern","pdf.title":"Als PDF speichern","pdf.dimensions":"Maße und Flächen anzeigen","pdf.decor":"Möbel und weitere Dekoration anzeigen","pdf.room_names":"Raumnamen anzeigen","pdf.backdrop":"Hintergrund anzeigen","pdf.save":"Speichern","pdf.saving":"Wird erstellt…","pdf.failed":"Die PDF-Datei konnte nicht erstellt werden.","pdf.too_large":"Die Bilder überschreiten das PDF-Limit von 25 MB.","pdf.asset_failed":"Ein Hintergrund- oder Dekorbild konnte nicht geladen werden.","pdf.scale":"Maßstab 1:{n}","pdf.north":"Nord","gs.title":"Allgemeine Einstellungen","gs.light_group":"Füllung: Licht","gs.light_on":"Lichter an","gs.light_off":"Alle Lichter aus","gs.temp_group":"Füllung: Temperatur","gs.temp_cold":"Kalt","gs.temp_ok":"Angenehm","gs.temp_hot":"Heiß","gs.lqi_group":"Füllung: Zigbee-Signal","gs.lqi_low":"Schwaches Signal","gs.lqi_high":"Starkes Signal","gs.reset":"Auf Standard zurücksetzen","gs.saved":"Allgemeine Einstellungen gespeichert","gs.radar_show_live":"Live-Präsenz auf dem Plan anzeigen","gs.radar_show_live_hint":"Blendet alle Live-Radarziele ein oder aus. Eine Beobachtungsaufzeichnung wird dadurch weder gestartet noch beendet.","radar.title":"Präsenz auf dem Plan","radar.help":"Verbinde diese Markierung mit exakten Home-Assistant-Radarentitäten und wähle Position sowie Koordinatenprofil. Live-Positionen werden auf den ausgewählten Raum begrenzt.","radar.help.aria":"Hilfe: Einstellungen des Präsenzradars","radar.enabled":"Dieses Präsenzradar verwenden","radar.show_live":"Live-Ziele anzeigen","radar.configure":"Radar konfigurieren","radar.configure_on_plan":"Auf dem Plan konfigurieren","radar.change_installation":"Installation ändern","radar.no_contour":"Dieser Raum hat keine Begrenzung. Radarpunkte werden nicht zugeschnitten.","radar.discard_setup_title":"Radareinrichtung verwerfen?","radar.discard_setup":"Die nicht gespeicherte Radareinrichtung geht verloren.","radar.step_place_mount":"Markieren Sie die physische Sensorposition","radar.step_place_heading":"Markieren Sie einen Punkt direkt vor dem Sensor","radar.step_reference":"Markieren Sie Referenzposition {n} und starten Sie die Messung","radar.step_check_reference":"Markieren Sie eine unabhängige Prüfposition","radar.start_measure":"Messung starten","radar.countdown":"Stellen Sie sich in {seconds} s auf die Markierung","radar.capturing":"Bleiben Sie während der Messung allein und ruhig…","radar.fit_ready":"Kalibrierung ist bereit","radar.check_third":"An einer weiteren Position prüfen","radar.check_complete":"Unabhängige Prüfung abgeschlossen","radar.error_distance":"Positionsabweichung: {distance}","radar.ambiguous_target":"Mehr als ein Ziel wurde gemeldet. Wiederholen Sie die Messung allein.","radar.insufficient_samples":"Nicht genügend aktuelle Koordinaten. Wiederholen Sie die Messung oder richten Sie sie manuell ein.","radar.bad_references":"Wählen Sie getrennte Referenzen in verschiedenen Richtungen vom Sensor.","radar.ambiguous_sources":"Die Messungen lassen zwei gleich plausible Richtungen zu. Wählen Sie Referenzpunkte, die links und rechts unterscheiden.","radar.bad_fit":"Die Messungen stimmen nicht überein. Prüfen Sie Einheiten, Sensorposition und Referenzen.","radar.desktop_hint":"Verwenden Sie für eine präzise Einrichtung einen Computer. Die Bearbeitung auf Touch-Geräten ist nur eingeschränkt verfügbar.","radar.detected":"House Plan hat Radarmetadaten erkannt. Prüfe vor dem Speichern die exakten Quellen.","radar.detected_ld2450":"House Plan hat ESPHome-LD2450-Koordinaten erkannt. Prüfe vor dem Speichern die X/Y-Quellen.","radar.additional_actions":"Weitere Aktionen","radar.declare":"Dies ist ein Präsenzradar","radar.profile":"Datenprofil","radar.profile_esphome_ld2450_v1":"ESPHome LD2450 (X/Y-Ziele)","radar.profile_cartesian_v1":"Kartesische Ziele (X/Y)","radar.profile_polar_v1":"Polares Ziel (Entfernung/Winkel)","radar.profile_range_v1":"Nur Entfernung","radar.profile_zones_v1":"Zustände von Zonen","radar.profile_presence_v1":"Nur Präsenz","radar.room":"Radarraum","radar.room_choose":"Raum auswählen","radar.target":"Ziel {n}","radar.axis_x":"Entität für X-Koordinate","radar.axis_y":"Entität für Y-Koordinate","radar.add_target":"Zielplatz hinzufügen","radar.range_channel":"Entfernungskanal {n}","radar.add_range":"Entfernungskanal hinzufügen","radar.presence_gate":"Präsenz-Entität für den Kanal","radar.swap_axes":"X- und Y-Achse vertauschen","radar.axis_x_sign":"X-Richtung","radar.axis_y_sign":"Y-Richtung","radar.distance_source":"Entfernungsentität","radar.angle_source":"Winkelentität","radar.angle_unit":"Winkeleinheit","radar.degrees":"Grad","radar.radians":"Radiant","radar.angle_zero":"Richtung des Nullwinkels","radar.angle_forward":"Vorwärts","radar.angle_right":"Rechts","radar.angle_clockwise":"Winkel wachsen im Uhrzeigersinn","radar.zone_source":"Zonenentität","radar.occupancy_source":"Präsenzentität","radar.count_source":"Entität für Zielanzahl","radar.availability_source":"Verfügbarkeitsentität","radar.source_choose":"Entität auswählen","radar.source_optional":"Optional","radar.source_missing":"derzeit nicht verfügbar","radar.saved_unsupported":"Diese gespeicherte Radar-Konfiguration wird nicht unterstützt oder ist unvollständig. Sie bleibt inaktiv; entfernen Sie sie oder aktualisieren Sie House Plan vor der erneuten Einrichtung.","radar.occupancy":"Präsenz (an/aus)","radar.count":"Anzahl","radar.mount":"Position und Richtung","radar.mount_hint":"Dies ist die physische Sensorposition. Das Verschieben des dekorativen Markers ändert sie nicht.","radar.heading":"Richtung, °","radar.range_cm":"Reichweite, cm","radar.fov_deg":"Sichtfeld, °","radar.unit":"Einheit der Quelle","radar.mirror":"Links-/Rechtsachse spiegeln","radar.remove":"Radareinstellungen entfernen","radar.invalid":"Fülle Raum, Quellen und Position des Radars vor dem Speichern aus.","radar.check_sources":"Live-Daten prüfen","radar.checking":"Wird geprüft…","radar.health":"Verbindungsstatus","radar.live_summary":"Aktuelle Ziele: {targets}; Entfernungsbögen: {ranges}","radar.health_ok":"Aktuelle Daten empfangen","radar.health_off":"Keine Ziele erkannt","radar.health_stale":"Ein Teil der Koordinaten ist veraltet","radar.health_partial":"Einige Quellen sind aktuell, andere veraltet","radar.health_restricted":"Der Zugriff auf eine oder mehrere Quellen ist eingeschränkt","radar.health_incomplete":"Der aktuelle Radarbericht ist unvollständig","radar.health_position_unavailable":"Präsenz gemeldet; aktuelle Position nicht verfügbar","radar.health_unavailable":"Sensordaten nicht verfügbar","radar.health_needs_setup":"Installation muss eingerichtet werden","radar.health_inconsistent":"Die Quellen melden widersprüchliche Daten","radar.health_unknown":"Aktueller Zustand ist unbekannt","radar.health_disabled":"Radar ist deaktiviert","radar.error_invalid_radar":"Prüfe die Radareinstellungen.","radar.error_invalid_selection":"Wähle einen vorhandenen Raum und gültige Quellen.","radar.error_source_restricted":"Du hast nicht auf alle ausgewählten Quellen Zugriff.","radar.error_rate_limited":"Zu viele Anfragen. Versuche es gleich noch einmal.","radar.error_not_ready":"Die Radarverarbeitung ist noch nicht bereit.","radar.error_conflict":"Der Plan wurde geändert. Öffnen Sie die Radareinrichtung erneut und versuchen Sie es noch einmal.","radar.error_source_unavailable":"Mindestens eine ausgewählte Radarquelle ist nicht verfügbar.","radar.error_unsupported_capability":"Diese Radarfunktion wird von der installierten Integration nicht unterstützt.","radar.report_age":"vor {seconds} s","space.show_lqi":"Zigbee-Signal (LQI) neben Geräten anzeigen","space.hide_decor":"Dekorationsschicht ausblenden","space.hide_decor_tip":"Linien, Formen, Beschriftungen und Möbel bleiben an ihrem Platz — im Hintergrundeditor sichtbar, aber nicht auf dem Plan.","space.hide_openings":"Öffnungen ausblenden","space.hide_openings_tip":"Tür-, Fenster- und Tor-Symbole werden nicht gezeichnet, aber die Öffnungen funktionieren weiterhin: Licht fällt hindurch, die Sonne kommt durch ein Fenster herein, Kontaktsensoren öffnen sie weiterhin. Der Planeditor zeigt sie immer an.","gs.light_none":"Keine Lichtquellen","mode.plan":"Planeditor","mode.devices":"Geräteeditor","display.value":"Wert + Zustand","marker.subarea":"kein Bereich, manuell","device.new":"Neues Gerät — Editor öffnen, um zu schließen","opening.unlock_action":"Entsperren","opening.lock_action":"Sperren","opening.lock_pending":"Wird ausgeführt…","title.close_editor":"Editor schließen (zur Ansicht zurück)","title.add_device":"Gerät zum Plan hinzufügen","devbar.add":"Hinzufügen","devbar.rules":"Symbolregeln","device_inbox.button":"Geräte","device_inbox.title":"Geräte auf dem Plan","device_inbox.search":"Geräte, Entitäten und Integrationen suchen…","device_inbox.add_virtual":"Virtuelles Gerät hinzufügen","device_inbox.tab_on_plan":"Auf Plan","device_inbox.tab_available":"Verfügbar","device_inbox.tab_hidden":"Versteckt","device_inbox.tab_readd":"Wieder verfügbar","device_inbox.only_new":"Nur neu","device_inbox.show_entities":"Entitäten anzeigen","device_inbox.show_hidden":"Versteckte auf Plan anzeigen","device_inbox.show_hidden.help":"Zeigt ausgeblendete und deaktivierte Marker vorübergehend als Bearbeitungs-Geister auf dem Plan. Die gespeicherte Sichtbarkeit der Geräte bleibt unverändert.","device_inbox.show_hidden.help.aria":"Hilfe: ausgeblendete Geräte auf dem Plan anzeigen","device_inbox.new":"Neu","device_inbox.find":"Auf dem Plan finden","device_inbox.edit":"Bearbeiten","device_inbox.hide":"Ausblenden","device_inbox.show":"Anzeigen","device_inbox.add":"Hinzufügen","device_inbox.readd":"Wieder hinzufügen","device_inbox.hide_available":"Aus der Liste ausblenden","device_inbox.show_more":"Mehr anzeigen","device_inbox.more_actions":"Weitere Aktionen","device_inbox.find_hidden_hint":"Zuerst „Versteckte auf Plan anzeigen“ aktivieren","device_inbox.show_disabled":"Diese Bindung in Home Assistant aktivieren, bevor sie angezeigt wird","device_inbox.empty_on_plan":"Es befinden sich noch keine passenden Geräte auf dem Plan.","device_inbox.empty_available":"Es sind keine Geräte zum Hinzufügen verfügbar.","device_inbox.empty_hidden":"Es gibt keine versteckten Geräte.","device_inbox.empty_readd":"Es sind keine entfernten Geräte verfügbar, um sie erneut hinzuzufügen.","device_inbox.reason_visible_auto":"Automatisch erkannt","device_inbox.reason_visible_explicit":"Explizit hinzugefügt","device_inbox.reason_manual_hidden":"Vom Benutzer versteckt","device_inbox.reason_automatic_hidden":"Automatisch versteckt","device_inbox.reason_service_entry":"Nur Service-Registry-Eintrag","device_inbox.reason_excluded_integration":"Integration „{integration}“ durch Erkennungsfilter ausgeschlossen","device_inbox.reason_excluded_domain":"Nicht-räumlicher Entitätstyp","device_inbox.reason_grouped_light":"Dargestellt durch eine Raumlichtgruppe","device_inbox.reason_represented_by_parent":"Dargestellt durch sein übergeordnetes Gerät","device_inbox.reason_removed":"Zuvor aus dem Plan entfernt","device_inbox.reason_available":"Zum Hinzufügen zum Plan verfügbar","device_inbox.reason_no_bound_room":"HA-Bereich ist nicht mit einem Planraum verknüpft","device_inbox.status_ha_disabled":"In Home Assistant deaktiviert","device_inbox.status_orphaned":"Bindung ist in Home Assistant nicht mehr vorhanden","device_inbox.status_unverified":"Home Assistant-Register vorübergehend nicht verfügbar","device_inbox.saved":"Geräteliste aktualisiert","device_inbox.filters_excluded":"Ausgeschlossene Integrationen","device_inbox.filters_group_lights":"Raumleuchten zu einem Marker gruppieren","device_inbox.filters_preview_appear":"erscheint: {count}","device_inbox.filters_preview_hide":"verschwindet: {count}","device_inbox.filters_preview_lights":"betroffene Leuchten: {count}","device_inbox.filters_reset":"Empfohlene wiederherstellen","device_inbox.filters_save":"Filter speichern","device_inbox.filters_search_ph":"Integration hinzufügen…","device_inbox.filters_title":"Erkennungsfilter","space.roomcard_section":"Raumkarte zeigt:","space.label_temp":"Temperatur","space.label_hum":"Luftfeuchtigkeit","space.label_lqi":"Durchschnittliches Zigbee-Signal","space.label_light":"Lichter ein/aus","roomcard.light_on":"Ein","roomcard.light_off":"Aus","roomcard.light_partial":"{on} von {total}","toast.split_pick_inside":"Zwischenliegende Schnittpunkte müssen innerhalb des Raumes liegen","mode.decor":"Hintergrundeditor","decor.select":"Auswählen","decor.line":"Linie","decor.rect":"Rechteck","decor.ellipse":"Oval","decor.text":"Text","decor.erase":"Löschen","decor.erase_confirm_title":"Objekt löschen?","decor.color":"Farbe","decor.width":"Linienbreite","decor.line_style":"Linienstil","decor.line_style_solid":"Durchgehend","decor.line_style_dashed":"Gepunktet","decor.fill":"Füllen","decor.fill_color":"Füllfarbe","decor.length":"Länge","decor.size":"Größe","decor.flip_h":"Horizontal spiegeln","decor.flip_v":"Vertikal spiegeln","decor.angle":"Rotationswinkel, °","decor.text_size":"Textgröße","decor.backdrop_properties":"Eigenschaften des Planhintergrunds","decor.text_title":"Textbeschriftung","decor.object_title":"{kind} bearbeiten","decor.text_label":"Text","decor.live_group":"HA-Variable einfügen","decor.live_entity":"Entität","decor.live_entity_ph":"Wählen Sie eine Entität","decor.live_attr":"Wert","decor.live_attr_ph":"Wählen Sie Status oder Attribut","decor.live_state":"Status","decor.backdrop":"Hintergrundbild","decor.backdrop_hint":"Ziehen zum Verschieben; eine Ecke ziehen zum Größenändern; den oberen Griff zum Drehen verwenden. Shift ändert das Verhältnis oder befreit den Winkel.","decor.backdrop_reset":"Bild zurücksetzen","decor.backdrop_reset_done":"Das Bild ist wieder an seinem ursprünglichen Platz und in seiner ursprünglichen Größe","marker.icon_auto":"Auto: {icon} (nach Symbolregeln; wählen Sie eines zur Überschreibung)","marker.icon_pin_auto":"Anheften","mode.plan_tip":"Planungseditor — die Geometrie des Hauses: Räume zeichnen und teilen/zusammenführen, sie mit HA-Bereichen verbinden, Türen, Fenster und Tore platzieren, Raumkarten verschieben, Maßstab festlegen","mode.devices_tip":"Geräteeditor — alles über Symbole: ziehen zum Positionieren, klicken zum Bearbeiten von Bindung/Symbol/Anzeige, virtuelle Geräte hinzufügen, Symbolregeln","mode.decor_tip":"Hintergrundeditor — rein visuelle Dekoration unter dem Plan: Linien, Rechtecke, Ellipsen und Textbeschriftungen, die niemals auf Klicks reagieren","space.glow_enabled":"Lichtquellen-Glühen","gs.glow_group":"Glow von Lichtquellen","gs.glow_base":"Grunddunkelheit des Hauses","gs.glow_light":"Standardlichtfarbe / Intensität","gs.wall_group":"Wände","gs.wall_fill":"Wandfüllung","gs.glow_radius":"Glow-Radius","gs.glow_radius.help":"Legt den allgemeinen Radius des Lichtscheins in Metern oder Fuß fest; ein gerätespezifischer Radius überschreibt diesen Wert.","gs.glow_radius.help.aria":"Hilfe: allgemeiner Glow-Radius","gs.unit_m":"m","gs.unit_ft":"ft","marker.controls_label":"Steuert andere Lichtquellen","marker.controls.help":"Mit der Aktion „Zustand umschalten“ werden die aufgeführten Quellen zusammen mit diesem Marker umgeschaltet. Ihr Glow bleibt an ihren eigenen Markern, und die Verknüpfung allein macht den steuernden Marker nicht zur Lichtquelle.","marker.controls.help.aria":"Hilfe: andere Lichtquellen steuern","marker.controls_filter":"Suchlichter und Schalter…","info.controls":"Steuerungen","marker.glow_radius_label":"Leuchtradius","marker.glow_radius.help":"Legt den Leuchtradius in Metern oder Fuß fest; ein leerer Wert verwendet den Radius aus den allgemeinen Einstellungen.","marker.glow_radius.help.aria":"Hilfe: Leuchtradius","markup.wallthick":"Dicke","markup.select":"Auswählen","title.markup_wallthick":"Dicke — klicken Sie auf eine Wand, um ihre Dicke von 0 bis 100 cm festzulegen.","markup.hint_wallthick":"klicken Sie auf eine Wand · Esc schließt ohne Anwendung","wallthick.field":"Dicke","wallthick.unit_cm":"cm","wallthick.unit_in":"in","wallthick.apply_room":"Auf alle Wände dieses Raums anwenden","markup.draw_wall_title":"Dicke jedes neuen Wandsegments (0–100 cm). Gemeinsame Wände behalten den bestehenden Wert.","room.queue_progress":"Raum {current} von {total}","toast.wall_rooms_saved":"Erstellte Räume: {n}","toast.wall_chain_saved":"Wandkette gespeichert","toast.wallthick_pick":"Eine Wand anklicken","toast.wallthick_set":"Wandstärke eingestellt","toast.wallthick_cleared":"Wandstärke entfernt","toast.physical_range":"Einen Wert von {min} bis {max} {unit} eingeben","toast.zero_wall_opening_conflict":"Entfernen Sie zuerst die Öffnung an diesem Wandsegment.","toast.zero_wall_ambiguous":"Das Wandsegment ist mehrdeutig. Vereinfachen oder passen Sie den Anschluss an.","toast.zero_wall_migration_blocked":"Der Bereich wurde nicht konvertiert: {reason}. Es wurden keine Daten geändert.","toast.physical_angle":"Einen Drehwinkel von 0° bis unter 90° eingeben","toast.physical_limit":"Der Bereich hat das Limit für diesen Geometrietyp erreicht","toast.geometry_unsafe":"Änderung abgebrochen: Wandgeometrie konnte nicht sicher erstellt werden.","junction.limit_angle":"Der Winkel zwischen den Wänden ist zu spitz: {actual}°, mindestens {limit}°.","junction.limit_valence":"Zu viele Wände treffen in einem Knoten aufeinander: {actual}, maximal {limit}.","junction.limit_length":"Das Wandsegment ist zu kurz: {actual} cm, mindestens {limit} cm.","junction.limit_distance":"Wände und Knoten sind zu dicht beieinander: {actual} cm, Minimum {limit} cm.","junction.limit_clearance":"Kein Wohnbereich ist übrig: {actual} cm², Minimum {limit} cm².","junction.limit_check_failed":"Die Überprüfung der Verbindungen konnte nicht durchgeführt werden — die Änderung wurde nicht gespeichert.","toast.wall_model_migration_blocked":"Das Wandmodell konnte nicht aktualisiert werden: {reason}. Der Plan wurde nicht geändert. Führen Sie „Pläne optimieren“ aus; wenn der Fehler erneut auftritt, beheben Sie die widersprüchliche Wandgeometrie.","toast.wall_model_client_outdated":"Aktualisieren Sie die Karte und laden Sie die Seite neu, bevor Sie den Plan bearbeiten.","wall_model.reason.invalid-room":"ungültiger Raumkontur","wall_model.reason.zero-length":"Wandsegment mit null Länge","wall_model.reason.third-owner":"Wand, die von mehr als zwei Räumen geteilt wird","wall_model.reason.duplicate-id":"widersprüchliche Wandkennungen","wall_model.reason.thickness-conflict":"widersprüchliche Wandstärkenwerte","wall_model.reason.opening-host":"Öffnung kann nicht einer Wand zugewiesen werden","toast.delete_room_pick":"Klicken Sie in den Raum, den Sie löschen möchten","toast.plan_snap_ambiguous":"Zoomen Sie hinein, um den Wandknoten auszuwählen","toast.wall_repair_ambiguous":"Der Raumumriss hat mehr als eine mögliche Verbindung. Zoomen Sie hinein und verbinden Sie ihn explizit.","toast.wall_repair_too_large":"Die Lücke ist größer als 2 cm. Verbinden Sie die Wände, bevor Sie den Raum erstellen.","toast.wall_repair_changed":"Die Wandgeometrie hat sich geändert. Versuchen Sie erneut, den Raum zu erstellen.","toast.opening_on_zero_wall":"Öffnungen können nicht auf einer Wand mit null Dicke sitzen.","marker.from_ha_option":"Wählen Sie aus der HA-Liste.","marker.show_entities":"Entitäten anzeigen.","marker.show_entities_tip":"Fügt nicht nur Geräte zur Liste hinzu, sondern auch alle ihre Entitäten.","marker.pick_ph":"Wählen Sie ein Gerät…","room.open_area":"Öffnen Sie den HA-Bereich.","room.fit_action":"Raum {name} einpassen","view.volumetric":"Volumetrische Ansicht.","view.flat":"Flache Ansicht.","kiosk.title":"Die Größen dieses Bildschirms.","kiosk.hint":"Nur auf diesem Gerät gespeichert – jedes Wandtablet oder TV kann seine eigenen komfortablen Größen haben.","kiosk.icon_scale":"Gerätesymbolgröße.","kiosk.font_scale":"Textgröße der Raumkarte.","editor.kiosk":"Wandgeräte- (Kiosk-)Modus.","editor.cycle":"Bereiche automatisch alle N Sekunden wechseln (Kiosk, 0 = aus)","room.settings_title":"Raumeinstellungen.","room.settings_section":"Raumeinstellungen (überschreibt den Bereich)","room.fill_label":"Diesen Raum ausfüllen","fill.inherit":"Als den Bereich","room.custom_fill_space":"Bereichsfarbe","room.custom_fill_own":"Raumfarbe","room.temp_range_label":"Komfortbereich","room.temp_range_min":"Untere Grenze der Komforttemperatur","room.temp_range_max":"Obere Grenze der Komforttemperatur","room.temp_range_reset":"Wie im Bereich","room.temp_range.help":"Dieser Bereich gilt nur für diesen Raum. Leere Felder übernehmen die jeweilige Grenze des Bereichs; sind die Grenzen vertauscht, verwendet House Plan den kleineren Wert als Untergrenze und den größeren als Obergrenze.","room.temp_range.help.aria":"Informationen zum Komfortbereich des Raums","room.temp_src_label":"Temperaturquelle","room.hum_src_label":"Luftfeuchtigkeitsquelle","room.src_average":"Durchschnitt über die Sensoren des Raums (Standard)","room.src_pick":"Ein bestimmtes HA-Gerät oder Entität","room.src_ph":"Quelle wählen…","toast.room_updated":"Raum aktualisiert","space.card_font":"Schriftgröße der Raumkarte (gesamter Bereich)","room.sizes_section":"Schriftgrößen","room.name_scale":"Raumname Größe","room.label_scale":"Metrikgröße","preview.room_name":"Wohnzimmer","toast.cfg_reload_failed":"Der Plan konnte nicht vom Server neu geladen werden: {err}","toast.locale_load_failed":"Das Sprachpaket konnte nicht geladen werden. Bis zum Neuladen der Seite wird Englisch verwendet.","toast.furniture_art_load_failed":"Die Möbelzeichnungen konnten nicht geladen werden. Laden Sie die Seite neu, um sie anzuzeigen.","room.settings_short":"Raumeinstellungen","room.unnamed":"Unbenannter Raum","marker.use_climate_temp":"Geräte-Temperatur im Raum berücksichtigen","marker.use_climate_temp_tip":"Fügt die aktuelle Temperatur einer Klimaanlage oder eines Thermostats zum Raumdurchschnitt hinzu. Das externe Wert-Label unten separat konfigurieren.","marker.value_badge_title":"Wert-Label","marker.value_badge.help":"Zeigt einen ausgewählten Wert neben dem Symbol an. Dies beeinflusst nicht die Raumkennzahlen, Licht, Glanz oder die Tippaktion.","marker.value_badge.help.aria":"Hilfe: Gerätewert-Badge","marker.value_badge_enabled":"Zeige ein Wert-Badge","marker.value_badge_source":"Wert","marker.value_badge_source.help":"Wählen Sie einen bestimmten Zustand, ein unterstütztes Attribut oder einen abgeleiteten Wert dieses Geräts.","marker.value_badge_source.help.aria":"Hilfe: Quelle des Wert-Badges","marker.value_badge_position":"Position","marker.value_badge_position.help":"Die gewählte Seite bleibt fest und dreht sich nicht automatisch an einem Planrand.","marker.value_badge_position.help.aria":"Hilfe: Position des Wert-Badges","marker.value_badge_right":"Rechts","marker.value_badge_bottom":"Unten","marker.value_badge_left":"Links","marker.value_badge_top":"Oben","marker.value_badge_empty":"Für dieses Gerät stehen keine Werte zur Verfügung","marker.value_badge_static":"Ein statisches Symbol zeigt keine Live-Werte an. Die Einstellung wird beibehalten.","marker.value_badge_missing":"Quelle nicht verfügbar","marker.value_badge_missing_hint":"Die gespeicherte Quelle ist derzeit nicht verfügbar. Behalten Sie sie bei, deaktivieren Sie das Badge oder wählen Sie einen anderen Wert.","marker.value_badge_duplicate":"Derselbe Wert wird bereits im Symbol angezeigt.","marker.value_badge_state":"Status · {name}","marker.value_badge_marker_state":"Lichtquellstatus · {name}","marker.value_badge_lqi":"Durchschnittliche Zigbee-Signalqualität","marker.value_badge_attr_current_temperature":"Aktuelle Temperatur · {name}","marker.value_badge_attr_temperature":"Zieltemperatur · {name}","marker.value_badge_attr_current_humidity":"Aktuelle Luftfeuchtigkeit · {name}","marker.value_badge_attr_humidity":"Luftfeuchtigkeit · {name}","marker.value_badge_attr_current_position":"Position · {name}","marker.value_badge_attr_percentage":"Geschwindigkeit · {name}","marker.value_badge_attr_brightness":"Helligkeit · {name}","marker.value_badge_attr_volume_level":"Lautstärke · {name}","marker.value_badge_attr_battery_level":"Batterie · {name}","marker.value_badge_attr_fan_speed":"Lüftergeschwindigkeit · {name}","marker.value_source":"Wertquelle","marker.value_source.help":"Wähle den Wert, der das Symbol ersetzt. Die Tipp-Aktion bleibt unverändert.","marker.value_source.help.aria":"Hilfe: Wertquelle in der Gerätefläche","marker.value_source_auto":"Automatisch (wie bisher)","marker.value_source_missing_hint":"Die gespeicherte Quelle ist derzeit nicht verfügbar. Bis sie wieder verfügbar ist oder ein anderer Wert gewählt wird, zeigt die Fläche —.","marker.light_role_label":"Ist dieses Gerät eine Lichtquelle?","marker.light_role.help":"„Auto“ verwendet die ermittelte Rolle des verknüpften Geräts, „Immer“ erzwingt eine eigene Quelle und „Nie“ schließt sie aus; oben verknüpfte Lichter bleiben unabhängig.","marker.light_role.help.aria":"Hilfe: ob dieses Gerät eine Lichtquelle ist","marker.light_role_auto_yes":"Automatisch (Lichtquelle)","marker.light_role_auto_no":"Automatisch (keine Lichtquelle)","marker.light_role_always":"Immer eine Lichtquelle","marker.light_role_never":"Nie eine Lichtquelle","marker.light_entity_label":"Führende Lichtereinheit","marker.light_entity.help":"Für ein Verbundgerät wählen Sie die Entität, deren Zustand, Farbe und Helligkeit diese Planquelle darstellen. Der automatische Rückgriff bleibt mit älteren Plänen kompatibel.","marker.light_entity.help.aria":"Hilfe: führende Lichtentität","marker.light_entity_auto":"Automatisch ({entity})","marker.light_entity_none":"keine steuerbare Entität","marker.light_entity_missing":"Die gespeicherte Entität {entity} ist nicht verfügbar. House Plan verwendet vorübergehend {fallback}; die gespeicherte Auswahl wird wiederhergestellt, wenn sie zurückkehrt.","marker.toggle_entity_label":"Zu toggelnde Entität","marker.toggle_entity.help":"Für ein Verbundgerät wählen Sie das genaue eigene Licht oder den Schalter, der durch Tippen bedient wird. Automatisch behält die vorherigen Zielregeln bei und ist unabhängig von der führenden Lichtentität.","marker.toggle_entity.help.aria":"Hilfe: zu toggelnde Entität","marker.toggle_entity_auto":"Automatisch ({entity})","marker.toggle_entity_none":"keine eigene steuerbare Entität","marker.toggle_entity_missing":"Die gespeicherte Entität {entity} ist nicht mehr unter den auswählbaren Kanälen dieses Markers. House Plan verwendet vorübergehend {fallback}; die gespeicherte Auswahl wird wiederhergestellt, wenn sie zurückkehrt.","marker.glow_color_label":"Leuchtfarbe und Helligkeit","marker.glow_mode.help":"Verwenden Sie Live-Quellwerte, überschreiben Sie nur deren Farbe oder fixieren Sie sowohl Farbe als auch Helligkeit. Das Minimum beträgt 1 %; um die Quelle zu deaktivieren, wählen Sie „Nie“.","marker.glow_mode.help.aria":"Hilfe: Leuchtfarbe und Helligkeit","marker.glow_mode_auto":"Von Quelle","marker.glow_mode_color":"Farbe einstellen","marker.glow_mode_fixed":"Farbe und Helligkeit einstellen","marker.glow_color":"Leuchtfarbe","marker.glow_brightness":"Helligkeit","marker.glow_disabled_never":"Leuchteinstellungen sind nicht verfügbar, da dieser Marker ausdrücklich keine Lichtquelle ist.","marker.glow_disabled_auto":"Im Automatikmodus wurde keine räumliche Lichtquelle für diesen Marker gefunden.","marker.glow_disabled_no_entity":"Keine aktive steuerbare Home Assistant-Entität ist für diese räumliche Quelle verfügbar.","marker.glow_passive_hint":"Diese Quelle hat keine eigenen Home Assistant-Daten. Stellen Sie ihre Farbe und Helligkeit manuell ein; ihr Radius bleibt verfügbar.","marker.control_broken":"Gespeicherte Quelle fehlt oder ist nicht mehr als Licht markiert","marker.control_missing_label":"Fehlendes Planlicht","marker.control_passive":"passive Quelle","toast.marker_control_cycle":"Dieser Link würde eine kreisförmige Kette von Lichtsteuerungen erzeugen.","toast.marker_binding_required":"Wählen Sie ein Home Assistant-Gerät, bevor Sie eine andere Lichtquelle verlinken.","confirm.unlock_title":"Schloss öffnen?","confirm.unlock_body":"House Plan sendet einen Befehl zum Öffnen an dieses Schloss.","toast.files_migrate_failed":"Anhänge konnten nicht zur neuen Bindung verschoben werden, Links zeigen weiterhin auf die alten Dateien: {err}","space.pick_saved":"Bereits hochgeladen","space.pick_saved_hint":"Auf dem Server gespeicherte Pläne, einschließlich solcher, die Sie zuvor getrennt haben","space.no_saved":"Noch keine Pläne auf dem Server gespeichert.","space.loading":"Laden…","space.used_by":"in Benutzung: {list}","space.in_use":"Ein Bereich verwendet diesen Plan noch — zuerst die Verknüpfung lösen","btn.use":"Verwenden","confirm.delete_plan_title":"Plandatei löschen?","confirm.delete_plan_body":"Die Datei wird vom Server gelöscht. Dieser Vorgang kann nicht rückgängig gemacht werden.","toast.plans_list_failed":"Konnte die gespeicherten Pläne nicht auflisten: {err}","toast.plan_delete_failed":"Konnte den Plan nicht löschen: {err}","marker.hide":"Ausblenden","marker.hide_tip":'Das Gerät wird nach dem Speichern aus dem Plan verschwinden, aber weiterhin zum Signalsignal des Raums zählen. Stellen Sie es über den Katalog "Geräte" im Geräte-Editor wieder her.',"marker.show":"Anzeigen","marker.show_tip":"Das Gerät wird nach dem Speichern wieder im Plan erscheinen.","marker.hidden_ghost":"Vom Benutzer ausgeblendetes Gerät","marker.ha_disabled_device":"Das Gerät ist in Home Assistant deaktiviert und im Plan ausgeblendet.","marker.ha_disabled_entity":"Die Entität ist in Home Assistant deaktiviert und im Plan ausgeblendet.","marker.ha_disabled_all_entities":"Das Gerät hat keine aktiven Home Assistant-Entitäten, daher ist es im Plan ausgeblendet.","marker.ha_registry_limited":"Das vollständige Home Assistant-Register ist für diesen Benutzer nicht verfügbar. Das nicht verifizierte Objekt kann vorerst nicht angezeigt oder verwendet werden.","marker.delete_tip":"Löschen Sie das Gerät vollständig aus dem Plan und allen Aggregaten. Sie können es später wieder hinzufügen.","tap.run":"Führen Sie Automation/Skript/Szene aus","tap.none":"Nichts tun","marker.run_target_label":"Was ausführen","marker.run_search_ph":"Suchen: Automation, Skript oder Szene…","marker.run_target_gone":"Ziel {id} nicht gefunden — erneut auswählen","marker.tap_confirm":"Um Bestätigung bitten","marker.tap_confirm_tip":"Vor der Ausführung ein Bestätigungsdialogfeld anzeigen — eine Vorsichtsmaßnahme gegen versehentliche Berührungen.","marker.toggle_hint_single":"Ziel: {name} ({id}).","marker.virtual_light_target":"Virtuelles Licht: {name}.","marker.virtual_light_current":"Manueller Zustand: {state} → {effect}.","marker.virtual_light_state_on":"ein","marker.virtual_light_state_off":"aus","marker.toggle_hint_group":"Wird {count}-Quelle(n) umschalten: {names}.","marker.toggle_hint_current":"Jetzt: {state} → {effect}.","marker.toggle_hint_group_current":"Derzeit an: {on} von {count} → {effect}.","marker.toggle_hint_skipped":"Wird übersprungen ({count}): {targets}.","marker.toggle_effect_turn_on":"wird eingeschaltet","marker.toggle_effect_turn_off":"wird ausgeschaltet","marker.toggle_effect_open":"wird geöffnet","marker.toggle_effect_close":"wird geschlossen","marker.toggle_effect_stop":"wird gestoppt","marker.toggle_effect_toggle":"Zustand wird umgeschaltet","marker.toggle_skip_missing":"nicht gefunden","marker.toggle_skip_ha_disabled":"in HA deaktiviert","marker.toggle_skip_unavailable":"nicht verfügbar","marker.toggle_skip_unsupported":"Umschalten wird nicht unterstützt","marker.toggle_skip_secure":"aus Sicherheitsgründen blockiert","marker.toggle_none_no_binding":"Dieses Gerät hat keine Bindung, daher gibt es keinen Zustand, der umgeschaltet werden könnte. Tippen bewirkt nichts.","marker.toggle_none_no_actionable_entity":"Dieses Gerät hat keinen Zustand, der umgeschaltet werden könnte. Tippen bewirkt nichts.","marker.toggle_none_configured_targets_missing":"Die konfigurierten Ziele sind nicht verfügbar. Die eigene Entität des Geräts wird nicht ersetzt.","marker.toggle_none_ha_disabled":"Das Ziel ist in Home Assistant deaktiviert und kann im Plan nicht verwendet werden.","marker.toggle_none_unavailable":"Das Ziel ist derzeit nicht verfügbar. Tippen bewirkt nichts.","marker.toggle_none_unsupported":"Home Assistant bietet keine sichere Umschaltfunktion für dieses Gerät. Tippen bewirkt nichts.","marker.toggle_none_secure":"Das Umschalten von Schlössern, Alarmen und gesicherten Toren über den Plan ist aus Sicherheitsgründen gesperrt.","run.automation":"Automatisierung","run.script":"Skript","run.scene":"Szene","confirm.tap_run":'"{name}" ausführen?',"confirm.tap_toggle":'"{name}" umschalten?',"confirm.current_state":"Aktueller Zustand: {state}","confirm.expected_state":"Nach dem Umschalten: {state}","confirm.group_current":"an {on} von {total}","confirm.group_all_on":"alle sind eingeschaltet","confirm.group_all_off":"alle sind ausgeschaltet","confirm.unavailable_targets":"Nicht verfügbar: {count}","confirm.expected_by_ha":"Home Assistant ermittelt den Zustand","confirm.state_on":"Ein","confirm.state_off":"Aus","confirm.state_open":"Offen","confirm.state_closed":"Geschlossen","confirm.state_opening":"Wird geöffnet","confirm.state_closing":"Wird geschlossen","confirm.state_stopped":"Gestoppt","confirm.state_unknown":"Unbekannt","toast.run_started":"Gestartet: {name}","toast.run_target_missing":"Ausführungsziel nicht gefunden — überprüfen Sie die Geräteeinstellungen","toast.run_target_required":"Wählen Sie eine Automatisierung, ein Skript oder eine Szene aus","toast.tap_target_changed":"Das Ziel der Aktion hat sich geändert. Versuchen Sie es erneut.","toast.virtual_light_toggle_failed":"Das virtuelle Licht konnte nicht umgeschaltet werden: {err}","toast.value_badge_source_required":"Einen Wert für den Badge auswählen","btn.run":"Ausführen","vac.section":"Roboterstaubsauger: aktuelle Position","vac.autocal":"Automatisch einrichten","vac.live":"Aktuelle Position im Plan","vac.trail":"Roboterpfad anzeigen","vac.autocal_no_rooms":'Die Integration meldet keine Raumliste — öffnen Sie "Manuell anpassen"',"vac.route_warn_unmapped":"Der Roboter reinigt eine Karte, die keiner Etage zugeordnet ist","vac.route_warn_needs_calibration":"Die Karte ist einer Etage zugeordnet, aber nicht kalibriert","vac.route_warn_ambiguous":"Zwei Karten sind nicht unterscheidbar — keine Etage gewählt","vac.route_warn_missing_space":"Der Raum dieser Karte wurde gelöscht","vac.autocal_no_match":'Raumnamen stimmten nicht überein (mindestens 3 müssen übereinstimmen) — öffnen Sie "Manuell anpassen"',"vac.autocal_done":"Fertig: über {rooms} Räume zugeordnet. Eine Reinigung starten und das Ergebnis prüfen.","vac.cal_need_pos":"Der Roboter meldet keine Koordinaten — starten Sie eine Reinigung und pausieren Sie sie","vac.cal_done":"Kalibrierung gespeichert. Eine Reinigung starten und das Ergebnis prüfen.","vac.cal_cancelled":"Kalibrierung abgebrochen","vac.fit":"Manuell anpassen","vac.fit_hint":"Roboterkarte an die richtige Position ziehen und an den Ecken skalieren","vac.fit_rotate":"90° drehen","vac.fit_mirror":"Spiegeln","vac.trail_never":"Nie","vac.trail_cleaning":"Beim Reinigen","vac.trail_always":"Immer","gs.bg_group":"Bühnenhintergrund","gs.bg_color":"Hintergrund um den Plan","gs.bg_default":"Standardthema","gs.bg_theme":"Standardthema","gs.bg_mode":"Planhintergrund","gs.bg_mode.help":"„Folgt der Sonne“ verwendet sun.sun und ersatzweise die lokale Browserzeit; „Statische Farbe“ zeigt immer die ausgewählte Farbe.","gs.bg_mode.help.aria":"Hilfe: allgemeiner Planhintergrund","gs.bg_static":"Statische Farbe","gs.bg_daynight":"Folgt der Sonne","gs.sun_group":"Sonne","gs.sun_missing":"Die sun.sun-Entität wurde nicht gefunden — der Hintergrund folgt Ihrer lokalen Uhr; Fensterstrahlen sind nicht verfügbar.","gs.north":"Norden auf dem Plan","gs.north.help":"Der Winkel wird im Uhrzeigersinn von der oberen Vertikalen des Plans gemessen; Norden wird für Fensterstrahlen benötigt, nicht für den Hintergrund „Folgt der Sonne“.","gs.north.help.aria":"Hilfe: allgemeine Nordrichtung","gs.north_ph":"nicht gesetzt","gs.north_clear":"Löschen","gs.north_letter":"N","gs.sun_rays":"Sonnenlicht durch Fenster","gs.sun_ray_origin":"Sonnenstrahlen","gs.sun_ray_origin.inner":"Von den inneren Fensterecken","gs.sun_ray_origin.outer":"Von den äußeren Fensterecken","gs.about_version":"House Plan Card v{v}","gs.about_github":"GitHub · Dokumentation & Probleme","gs.about_telegram":"Telegram-Chat","support.title":"Hilfe & Feedback","space.bg_color":"Hintergrund rund um den Plan","space.bg_inherit":"Allgemein erben","space.bg_inherited":"erbt allgemeine Einstellungen","space.bg_mode":"Planhintergrund","space.bg_mode.help":"Übernehmen Sie den allgemeinen Hintergrund oder überschreiben Sie diesen Bereich mit einer statischen Farbe oder „Folgt der Sonne“.","space.bg_mode.help.aria":"Hilfe: Hintergrund des Bereichs","space.north":"Norden auf dem Plan (überschreiben)","space.north.help":"Überschreibt die allgemeine Nordrichtung für diesen Bereich; der Winkel wird im Uhrzeigersinn von der oberen Vertikalen des Plans gemessen und für Fensterstrahlen verwendet.","space.north.help.aria":"Hilfe: Norden für diesen Bereich","space.north_inherited":"geerbt: {v}","space.sun_rays":"Sonnenlicht durch Fenster","space.sun_inherit":"Allgemein erben","space.sun_on":"Ein","space.sun_off":"Aus","canvas.far_objects":"{n} Objekt(e) weit vom Plan entfernt","canvas.show_far":"Anzeigen","canvas.home_tip":"Der Plan ist dort drüben — klicken, um ihn anzupassen","gs.grid_group":"Planwartung","gs.grid_hint":"Aktualisiert Datenmodelle, richtet Planelemente am Raster aus und fasst redundante Wandfragmente zusammen. Ein exakter Bericht wird angezeigt, bevor etwas gespeichert wird.","gs.align_all":"Pläne optimieren","gs.align_title":"Pläne optimieren","gs.align_none":"Alle Pläne verwenden bereits das aktuelle optimierte Datenmodell.","gs.optimize_no_automatic_changes":"Es gibt keine automatischen Änderungen, die angewendet werden müssen. Überprüfen Sie die unten stehenden Punkte.","gs.align_count":"{n} von {total} Elementen werden sich um höchstens {cm} cm bewegen.","gs.align_where":"Die größte Verschiebung ist in „{s}“.","gs.align_turned":"Öffnungen, deren Winkel korrigiert wurde: {n}.","gs.align_preflight_failed":"Die Geometrie der folgenden Bereiche konnte nicht sicher überprüft werden: {spaces}{more}.","gs.align_preflight_hint":"Pläne wurden nicht geändert. Kopieren Sie die Diagnosen mit dem untenstehenden Button und fügen Sie sie zusammen mit einem Raumexport dem Fehlerbericht bei.","gs.preflight_reason_prepare-exception":"Die Bereichsgeometrie konnte nicht vorbereitet werden (Ausnahme beim Erstellen des Modells)","gs.preflight_reason_wall-null":"Der Wandkörper wurde nicht erstellt (die Vereinigung lieferte leer zurück)","gs.preflight_reason_wall-degraded-extra":"Der Wandkörper wurde mit zusätzlicher Geometrie beschädigt","gs.preflight_reason_wall-failed-core":"Der Kern des Wandkörpers konnte nicht zusammengesetzt werden","gs.preflight_reason_wall-exception":"Die Wandkonstruktion warf eine Ausnahme","gs.preflight_reason_floor-null":"Der Fußbodenumriss wurde nicht erstellt","gs.preflight_reason_floor-exception":"Bodenaufbau hat eine Ausnahme ausgelöst","gs.preflight_copy":"Diagnosen kopieren","gs.preflight_copied":"Diagnosen kopiert","gs.preflight_update_hint":"Die Karten- und Integrationsversionen unterscheiden sich — Hausplan aktualisieren und erneut versuchen.","gs.align_preflight_space":"Bereich {n}","gs.align_preflight_more":", und {n} mehr","gs.optimize_changes":"Modellmigrationen: {m}; aktualisierte Bereiche: {c}; entfernte verrauschte Koordinatenwerte: {p}; zusammengeführte Fragmente realer Wände: {w}; zusammengeführte Fragmente von Wänden ohne Dicke: {s}; unabhängige Wände: {i}.","gs.zero_walls_migrated":"Virtuelle Wandspannweiten konvertiert: {n}.","gs.wall_segments_migrated":"Wandsegmente stabilisiert: {n}.","gs.room_drafts_migrated":"Unvollständige Konturen wurden in normale Wände umgewandelt: {drafts}; Wandsegmente: {segments}.","gs.optimize_lattice_summary":"Rauschen in den Koordinatenwerten kanonisiert: {n}; maximale Bewegung: {cm} cm.","gs.optimize_lattice_space":"{space}: Koordinatenwerte kanonisiert: {n}; außerhalb des Rasters liegende Werte unverändert gelassen: {far}.","gs.optimize_coincident_partitions":"Versteckte unabhängige Wandabschnitte in Raumwände integriert: {n}.","gs.optimize_openings_rehosted":"Öffnungen wieder an Raumwände angebracht: {n}.","gs.optimize_walls_straightened":"Wände begradigt: {n}; maximale Bewegung: {cm} cm.","gs.optimize_walls_straightened_where":"Größte Wandkorrektur: {s}.","gs.optimize_walls_straighten_skipped":"Nahe Achsenwände unverändert gelassen, da sie nicht sicher repariert werden konnten: {n}.","gs.optimize_glow_migration":"Legacy Glow: {spaces} Bereiche → keine Datenfüllung + unabhängiges Glow; {rooms} Räume → geerbte Datenfüllung + unabhängiges Glow.","gs.optimize_references":"Referenzen repariert: Bereiche — {spaces}; Räume — {rooms}; Positionen — {positions}; Geräte aus fehlenden Bereichen gelöst — {detached}.","gs.optimize_reference_more":", und {n} mehr","gs.optimize_orphans_removed":"Vergessene Einträge entfernt: {total} — Raumbezeichnungen: {rooms}; Geräte: {devices}; Gruppenmarkierungen: {groups}. Sie gehörten zu zuvor gelöschten Bereichen.","gs.optimize_live_positions":"Alte Positionen in gelöschten Bereichen gehören zu vorhandenen Objekten: {n}{names}. Sie werden beibehalten.","gs.optimize_live_positions_remove":"Alte Positionen in gelöschten Bereichen gehören zu vorhandenen Objekten: {n}{names}. Sie sind zur Entfernung ausgewählt.","gs.optimize_live_names":": {names}{more}","gs.optimize_live_remove":"Alte Positionen entfernen","gs.optimize_live_keep":"Alte Positionen beibehalten","gs.optimize_live_selected":"Alte Positionen werden nach der Anwendung von Optimieren entfernt.","gs.optimize_unverified":"Positionen konnten nicht sicher überprüft werden: {n}. Sie wurden unverändert belassen.","gs.optimize_registry_limited":"Voller Administratorzugriff auf die Home Assistant-Registries ist für eine sichere Überprüfung erforderlich.","gs.optimize_vacuum_warning":"Raumzuordnungen, die noch überprüft werden müssen: {n}.","gs.optimize_details":"Details","gs.optimize_details_more":"Und {n} weitere Einträge.","gs.optimize_detail_removed":"wird entfernt","gs.optimize_detail_live":"wird beibehalten","gs.optimize_detail_unverified":"nicht überprüft","gs.optimize_detail_room_label":"Raumkennzeichnung","gs.optimize_detail_device":"Gerät","gs.optimize_detail_group":"Gruppenkennzeichen","gs.optimize_detail_unknown":"unbekannter Eigentümer","gs.optimize_detail_item":"{status}: {kind} {id}; alter Bereich {space}","gs.align_warn":"Absichtlich zwischen Rasterknoten platzierte Elemente werden sich bewegen. Nach der Operation ist nur eine Rückgängig-Funktion verfügbar, und zwar nur bis zur nächsten Planbearbeitung.","gs.align_run":"Optimieren","gs.align_done":"Pläne optimiert: {n} Elemente bewegt, {m} Datensätze beibehalten, {r} Verweise repariert","gs.optimize_undo":"Letzte Optimierung rückgängig machen","gs.optimize_undone":"Die letzte Optimierung wurde rückgängig gemacht","decor.furniture":"Möbel","decor.image":"Bild","decor.image_title":"Eigene Bilder","decor.image_upload":"Bild hochladen","decor.image_replace":"Bild ersetzen","decor.image_uploading":"Wird hochgeladen…","decor.image_asset":"Bilddatei","decor.image_pick_hint":"Ein Bild hochladen oder ein vorhandenes auswählen.","decor.image_place_hint":"Auf den Plan klicken, um das Bild zu platzieren.","decor.image_none":"Noch keine Bilder hochgeladen.","decor.image_unavailable":"Bild nicht verfügbar","decor.image_used":"In {n} Objekten verwendet","decor.image_upload_failed":"Bild konnte nicht hochgeladen werden: {err}","decor.image_error_capacity":"Der Speicher für benutzerdefinierte Bilder ist voll.","decor.image_in_use":"Vor dem Löschen alle platzierten Kopien entfernen.","decor.image_delete_title":"Bilddatei löschen?","decor.image_delete_message":"„{name}“ aus House Plan löschen? Dies kann nicht rückgängig gemacht werden.","furn.title":"Möbelbibliothek","furn.symbol":"Symbol","furn.group_furniture":"Möbel","furn.group_appliance":"Geräte","furn.group_sanitary":"Sanitär","furn.group_other":"Sonstiges","furn.width":"Breite","furn.depth":"Tiefe","furn.back_to_categories":"Alle Kategorien","furn.pick_hint":"Wählen Sie eine Kategorie und dann ein Symbol.","furn.place_hint":"Klicken Sie auf den Plan — das Element wird an der nächsten Wand platziert. Mit Shift wird es frei platziert.","furn.cat_air_conditioner":"Klimaanlagen","furn.cat_armchair":"Sessel","furn.cat_bathtub":"Badewannen","furn.cat_bed":"Betten","furn.cat_bidet":"Bidets","furn.cat_boiler":"Warmwasserbereiter","furn.cat_chair":"Stühle","furn.cat_coffee_table":"Couchtische","furn.cat_cooktop":"Kochfelder","furn.cat_dining_table":"Esstische","furn.cat_dishwasher":"Geschirrspüler","furn.cat_dryer":"Wäschetrockner","furn.cat_fireplace":"Kamine","furn.cat_fridge":"Kühlschränke","furn.cat_kitchen_cabinet":"Küchenschränke","furn.cat_kitchen_sink":"Küchenspülen","furn.cat_nightstand":"Schränke","furn.cat_plant":"Pflanzen","furn.cat_rug":"Teppiche","furn.cat_shelving":"Regale","furn.cat_shower":"Duschen","furn.cat_sink":"Waschbecken","furn.cat_sofa":"Sofas","furn.cat_stairs":"Treppen","furn.cat_toilet":"Toiletten","furn.cat_tv":"Fernseher","furn.cat_wardrobe":"Kleiderschränke","furn.cat_washer":"Waschmaschinen","furn.cat_work_table":"Schreibtische","furn.sym_sofa":"Zweisitzer-Sofa","furn.sym_sofa_three_seat":"Dreisitzer-Sofa","furn.sym_sofa_corner_right":"Ecksofa rechts","furn.sym_armchair":"Polstersessel","furn.sym_armchair_office":"Bürostuhl","furn.sym_coffee_table":"Rechteckiger Couchtisch","furn.sym_coffee_table_round":"Runder Couchtisch","furn.sym_coffee_table_oval":"Ovaler Couchtisch","furn.sym_coffee_table_rounded":"Abgerundeter Couchtisch","furn.sym_table_dining":"Rechteckiger Esstisch","furn.sym_table_round":"Rundtisch","furn.sym_table_dining_oval":"Ovaler Esstisch","furn.sym_table_dining_rounded":"Abgerundeter Esstisch","furn.sym_chair":"Stuhl","furn.sym_chair_bar":"Barhocker","furn.sym_desk":"Rechteckiger Schreibtisch","furn.sym_desk_corner":"Eckschreibtisch","furn.sym_bed_double":"Doppelbett","furn.sym_bed_single":"Einzelbett","furn.sym_nightstand":"Nachttisch","furn.sym_cabinet_tv":"TV-Schrank","furn.sym_cabinet_shoe":"Schuhschrank","furn.sym_cabinet_sink":"Waschtischunterschrank","furn.sym_wardrobe":"Kleiderschrank","furn.sym_bookshelf":"Bücherschrank","furn.sym_wall_unit":"Schrankwand","furn.sym_kitchen_floor":"Küchen-Unterschrank","furn.sym_kitchen_floor_corner":"Küchen-Eckunterschrank","furn.sym_kitchen_wall":"Küchen-Hängeschrank","furn.sym_kitchen_wall_corner":"Küchen-Eckhängeschrank","furn.sym_shelf_floor":"Standregal","furn.sym_shelf_wall":"Wandregal","furn.sym_fridge":"Kühlschrank","furn.sym_stove":"Vierflammiges Kochfeld","furn.sym_cooktop_two":"Zweiflammiges Kochfeld","furn.sym_dishwasher":"Geschirrspüler","furn.sym_washer":"Waschmaschine","furn.sym_dryer":"Wäschetrockner","furn.sym_tv":"Fernseher mit Standfuß","furn.sym_tv_wall":"Wandfernseher","furn.sym_ac":"Klimaanlage","furn.sym_water_heater":"Wassererhitzer","furn.sym_toilet":"Stand-WC","furn.sym_toilet_built_in":"Wand-WC","furn.sym_bathtub":"Rechteckige Badewanne","furn.sym_bathtub_corner":"Eckbadewanne","furn.sym_shower":"Dusche","furn.sym_sink":"Waschbecken","furn.sym_kitchen_sink":"Einzel-Küchenspüle","furn.sym_kitchen_sink_double":"Doppel-Küchenspüle","furn.sym_bidet":"Stand-Bidet","furn.sym_bidet_built_in":"Wand-Bidet","furn.sym_stairs":"Treppe","furn.sym_fireplace":"Kamin","furn.sym_plant":"Pflanze","furn.sym_rug":"Teppich","common.yes":"Ja","common.no":"Nein","vac.diag_source":"Quelle","vac.diag_platform":"Integration","vac.diag_status":"Status","vac.diag_position":"Position","vac.diag_rooms":"Räume","vac.diag_rooms_value":"{total} · {matched} Namen stimmen überein · {readiness}","vac.autocal_ready":"Auto-Kalibrierung verfügbar","vac.autocal_not_ready":"3 übereinstimmende Namen erforderlich","vac.diag_path":"Integrationspfad","vac.diag_map":"Karten-ID","vac.source_none":"nicht ausgewählt","vac.source_status_ok":"Bereit","vac.source_status_missing":"Fehlend","vac.source_status_disabled":"In Home Assistant deaktiviert","vac.source_status_unavailable":"Nicht verfügbar","vac.source_status_unverified":"Kann mit den aktuellen Berechtigungen nicht verifizieren","vac.source_status_unsupported":"Keine Positionsdaten","vac.source_status_none":"Keine Quelle","vac.source_banner_missing":"Die gespeicherte Quelle existiert nicht mehr. Sie wurde nicht automatisch ersetzt; wählen Sie eine andere Quelle oder stellen Sie sie in Home Assistant wieder her.","vac.source_banner_disabled":"Die gespeicherte Quelle ist in Home Assistant deaktiviert. Aktivieren Sie sie dort oder wählen Sie eine andere Quelle.","vac.source_banner_unverified":"Die aktuellen Home Assistant-Berechtigungen können diese gespeicherte Quelle nicht verifizieren. Sie bleibt angepinnt und wird nicht automatisch ersetzt.","vac.choose_source":"Quelle wählen","vac.source_auto":"Automatisch","vac.source_auto_hint":"Verwenden Sie eine kompatible Entität von diesem Gerät","vac.all_cameras":"Alle Kameras","vac.all_cameras_warn":"Eine Kamera liefert möglicherweise keine Roboter-Daten. Wählen Sie eine nur, wenn es Ihre Saugroboter-Karte ist.","vac.all_cameras_empty":"Keine anderen Kamera-Entitäten gefunden.","vac.platform_unknown":"unbekannte Integration","vac.cap_position":"Position","vac.cap_rooms_short":"Räume","vac.cap_path":"Pfad","vac.cap_map":"Karten-ID","vac.cap_none":"Keine Roboter-Daten erkannt","vac.xcme_hint":"Aktivieren Sie diese Xiaomi Cloud Map Extractor-Attribute:","vac.documentation":"Dokumentation","vac.residual_title":"Automatische Kalibrierung überprüfen","vac.residual_message":"Die zugeordneten Räume weichen um bis zu {error} voneinander ab. Diese ungefähre Kalibrierung anwenden, manuell verfeinern oder ohne Änderung der gespeicherten Einrichtung abbrechen.","vac.apply_proposal":"Anwenden","gs.backup_group":"Sichern und übertragen","gs.backup_hint":"Laden Sie ein tragbares JSON-Backup herunter oder sehen Sie eine Vorschau und importieren Sie ein Backup, das mit House Plan erstellt wurde.","backup.export_open":"Exportieren","backup.import_open":"Importieren","backup.export_title":"House Plan exportieren","backup.import_title":"House Plan importieren","backup.export_hint":"Wählen Sie, ob das Backup die gesamte House Plan-Konfiguration oder nur den aktuellen Bereich enthalten soll.","backup.full":"Vollständiges Backup","backup.current_space":"Aktueller Bereich","backup.current_space_title":"Aktueller Bereich: {title}","backup.no_current_space":"Kein aktueller Bereich","backup.plan_only":"Nur Plan","backup.plan_only_hint":"Räume, Wände, Öffnungen, Dekor und Raumbezeichnungspositionen ohne Geräte oder Home Assistant-Bindungen beibehalten.","backup.plan_only_preview":"Diese Datei enthält nur den Plan.","backup.privacy_warning":"Das Archiv enthält Namen, Home Assistant-Kennungen und genaue Koordinaten. Interne Pläne und Anhänge werden referenziert, nicht eingebettet; Laufzeitzustände und Staubsaugerspuren sind nicht enthalten.","backup.download":"JSON herunterladen","backup.export_done":"Backup heruntergeladen","backup.reading":"Überprüfe das Backup…","backup.revalidated":"Der Plan wurde nach dieser Vorschau geändert. Die Zusammenfassung wurde aktualisiert; überprüfen Sie sie und bestätigen Sie erneut.","backup.error.support_invalid_message":"Prüfen Sie die Supportnachricht und versuchen Sie es erneut.","backup.error.support_package_too_large":"Das anonymisierte Supportpaket überschreitet das Limit von 8 MiB.","backup.error.support_preview_expired":"Die Vorschau des Supportanhangs ist abgelaufen oder nicht mehr verfügbar.","backup.error.support_rate_limited":"Zu viele Supportberichte oder Vorschauen wurden angefordert. Versuchen Sie es später erneut.","backup.error.support_rejected":"Der Bericht hat die Prüfung des Supportdienstes nicht bestanden.","backup.error.support_unavailable":"Der private Supportdienst ist vorübergehend nicht verfügbar.","backup.error.unauthorized":"Sie haben keine Berechtigung, diesen Plan zu exportieren oder zu importieren.","backup.error.not_ready":"Der Hausplan ist noch nicht fertig. Versuchen Sie es in einem Moment erneut.","backup.error.too_large":"Das Backup überschreitet das 8-MiB-Limit.","backup.error.invalid_json":"Die ausgewählte Datei ist kein gültiges JSON.","backup.error.invalid_format":"Die ausgewählte Datei ist kein House Plan-Backup.","backup.error.invalid_image":"Das Bild ist beschädigt oder entspricht nicht seinem Format.","backup.error.unsupported_export_version":"Dieses Backup-Format wird von der installierten Version nicht unterstützt.","backup.error.unsupported_image":"Verwenden Sie ein unterstütztes PNG-, JPEG-, WebP- oder SVG-Bild.","backup.error.future_model":"Das Backup wurde mit einem neueren House-Plan-Datenmodell erstellt.","backup.error.invalid_config":"Das Backup enthält eine ungültige House-Plan-Konfiguration.","backup.error.wall_model_migration_blocked":"Das Backup-Wandmodell konnte nicht sicher aktualisiert werden. Optimieren Sie zuerst den Quellplan und exportieren Sie ihn dann erneut.","backup.error.invalid_layout":"Das Backup enthält ungültige Objektpositionen.","backup.error.invalid_content":"Das Backup enthält ungültige oder inkonsistente Inhaltsreferenzen.","backup.error.space_not_found":"Der ausgewählte Bereich existiert nicht mehr.","backup.error.capacity_exceeded":"Durch das Hinzufügen dieses Backups würden die Planlimits überschritten.","backup.error.preview_expired":"Die Vorschau ist abgelaufen. Wählen Sie die Backup-Datei erneut aus.","backup.error.preview_owner_mismatch":"Diese Vorschau gehört zu einem anderen Home-Assistant-Benutzer.","backup.error.conflict":"Der Plan hat sich nach der Vorschau geändert. Überprüfen Sie die aktualisierte Zusammenfassung.","backup.error.content_confirmation_required":"Bestätigen Sie, dass nicht verfügbare lokale Inhalte getrennt werden können.","backup.error.commit_failed":"Das Backup konnte nicht sicher angewendet werden. Der vorherige Plan wurde wiederhergestellt oder wartet auf die Wiederherstellung.","backup.error.missing_plan":"Eine referenzierte Plan-Datei ist nach der Vorschau verschwunden. Überprüfen Sie das Backup erneut.","backup.error.missing_content":"Ein referenziertes lokales Anhangselement ist nach der Vorschau verschwunden. Überprüfen Sie das Backup erneut.","backup.error.marker_control_missing":"Ein verknüpftes Planlicht fehlt im Backup.","backup.error.marker_control_not_light":"Ein verknüpftes Planziel ist nicht mehr als Lichtquelle markiert.","backup.error.marker_control_self":"Eine Lichtquelle kann sich nicht selbst steuern.","backup.error.marker_control_cycle":"Das Backup enthält eine kreisförmige Kette von Lichtsteuerungen.","backup.error.duplicate_marker_control":"Das Backup enthält eine doppelte Plan-Licht-Verknüpfung.","backup.error.no_backup":"Es gibt keinen Import- oder Optimierungssnapshot zur Wiederherstellung.","backup.error.in_use":"Das Element wird noch verwendet","backup.error.invalid_data":"Die Anfrage enthält ungültige Daten","backup.error.invalid_light_entity":"Das führende Licht muss eine light.*- oder switch.*-Entität sein","backup.error.invalid_marker_control":"Ungültige Marker-Steuerungsreferenz","backup.error.invalid_name":"Der Name ist ungültig","backup.error.invalid_partition_opening_host":"Die Öffnung muss ihren Trennwand-Träger behalten","backup.error.invalid_partition_opening_jamb_margin":"Die Öffnung lässt keinen physischen Pfosten am Wandende","backup.error.invalid_passage_fields":"Ein offener Durchgang kann keine Tür-Einstellungen tragen","backup.error.invalid_space_id":"Unbekannter Raumbereich","backup.error.invalid_toggle_entity":"Die Schalt-Entität muss light.* oder switch.* sein","backup.error.invalid_value_badge":"Ungültige Wert-Badge-Einstellungen","backup.error.invalid_value_badge_attribute":"Ungültiges Wert-Badge-Attribut","backup.error.invalid_value_badge_position":"Ungültige Wert-Badge-Position","backup.error.invalid_value_badge_source":"Ungültige Wert-Badge-Quelle","backup.error.invalid_vacuum_map_route":"Prüfen Sie die Zuordnung der Roboterkarten zu Räumen.","backup.error.invalid_value_source":"Ungültige Wertquelle","backup.error.invalid_value_source_attribute":"Ungültiges Wertquellen-Attribut","backup.error.io_error":"Eine Dateioperation auf dem Server ist fehlgeschlagen","backup.error.not_toggleable":"Dieses Gerät kann nicht geschaltet werden","backup.error.nothing_to_repair":"Nichts zu reparieren","backup.error.space_in_use":"Der Raumbereich wird noch referenziert","backup.error.value_badge_source_required":"Das Wert-Badge braucht eine Quelle","backup.error.wall_model_client_outdated":"Der Plan wurde anderswo aktualisiert — Seite neu laden","backup.same_source":"Erstellt auf dieser Home Assistant-Instanz","backup.foreign_source":"Erstellt auf einer anderen Home Assistant-Instanz","backup.created":"Erstellt: {value}","backup.versions":"Karte {card}; Integration {integration}; Datenmodell {model}","backup.count_spaces":"Bereiche: {n}","backup.count_rooms":"Räume: {n}","backup.count_walls":"Wände: {n}","backup.count_openings":"Öffnungen: {n}","backup.count_decor":"Dekorationsobjekte: {n}","backup.count_markers":"Geräte: {n}","backup.count_layout":"Positionen: {n}","backup.bindings":"Verknüpfungen — Geräte: {device}, Entitäten: {entity}, virtuell: {virtual}; Positionen ohne Bereich: {legacy}","backup.binding_status":"Zielstatus — aktiv: {active}, deaktiviert: {disabled}, fehlt: {missing}","backup.missing_areas":"Auf dem Ziel fehlende Bereiche: {areas}","backup.dropped_marker_links":"Planlicht-Verknüpfungen außerhalb dieses übertragenen Bereichs wurden ausgelassen: {n}.","backup.room_drafts_migrated":"Alte unvollständige Konturen wurden in normale Wände umgewandelt: {drafts}; Wandsegmente: {segments}.","backup.repaired_target_refs":"Durch den Import dieses Bereichs wiederhergestellte vorhandene Referenzen: {n}.","backup.preserved_unresolved_refs":"Referenzen, die nicht eindeutig wiederhergestellt werden konnten, wurden beibehalten: {n}.","backup.preserved_unresolved_hint":"Es wurden keine Daten geraten oder gelöscht. Führen Sie nach dem Import Optimierungspläne aus, um die verbleibenden Referenzen zu überprüfen.","backup.import_details":"Importieren von Referenzdetails","backup.import_detail.incoming_remapped":"Referenzen innerhalb der importierten Kopie aktualisiert: {n}","backup.import_detail.target_repaired":"Vorhandene Referenzen wiederhergestellt: {n}","backup.import_detail.preserved_unresolved":"Unaufgelöste Referenzen beibehalten: {n}","backup.import_detail.collisions":"Zielkonflikte sicher beibehalten: {n}","backup.import_detail.dropped_links":"Eingehende Links durch Übertragungsregeln ausgelassen: {n}","backup.import_detail.bounded_lineages":"Übermäßig verschachtelte Kennungen begrenzt belassen: {n}","backup.replace_warning":"Dies ersetzt die aktuelle Konfiguration und das Layout. Hochgeladene Dateien werden niemals gelöscht. Eine Rückgängig-Möglichkeit bleibt bis zur nächsten Planbearbeitung verfügbar.","backup.foreign_bookkeeping":"Instanzspezifische bekannte/neue Gerätebuchführung wird nicht importiert.","backup.final_name":"Name des neuen Bereichs","backup.target_settings":"Die globalen Einstellungen der Zielinstanz bleiben unverändert.","backup.duplicates":"Bindungen bereits vorhanden: {n}","backup.skip":"Doppelte Geräte überspringen","backup.virtual_copy":"Sichere statische virtuelle Kopien hinzufügen","backup.content":"Referenzierter Inhalt","backup.decor_images_summary":"Eigene Bilder: {objects} Objekte, {assets} Dateien; fehlende Dateien: {missing}.","backup.content_available":"lokal verfügbar","backup.content_external":"externer Link","backup.content_detach_required":"wird getrennt","backup.confirm_detach":"Ich verstehe, dass nicht verfügbare interne Pläne und Anhänge von der importierten Konfiguration getrennt werden.","backup.confirm_missing_images":"Ich verstehe, dass fehlende eigene Bilder als reparierbare Platzhalter erhalten bleiben und andere nicht verfügbare lokale Dateien getrennt werden.","backup.replace":"Ersetzen","backup.add":"Bereich hinzufügen","backup.space_done":"Bereich importiert: {rooms} Räume, {markers} Geräte, {refs} bestehende Referenzen wiederhergestellt","backup.full_done":"Backup wiederhergestellt: {spaces} Bereiche, {rooms} Räume, {markers} Geräte","backup.undo_import":"Letzten vollständigen Import rückgängig machen","backup.import_undone":"Vollständiger Import rückgängig gemacht","backdrop.large_title":"Großes Bild","backdrop.large_body":"Dieses Bild ist {w}×{h} ({fileMb} MB Datei) und benötigt etwa {decodedMb} MB Speicher zur Anzeige. Auf Tablets kann das die Seite zum Absturz bringen.","backdrop.unknown_body":"Die Bildabmessungen konnten nicht gelesen werden — die Datei ist möglicherweise beschädigt. Fortfahren kann die Seite auf Tablets zum Absturz bringen.","backdrop.reduced_dimensions":"Verkleinerte Kopie: {w}×{h} px.","backdrop.use_downscaled":"Verkleinerte Kopie hochladen","backdrop.reducing":"Wird verkleinert…","backdrop.keep_original":"Original behalten","backdrop.too_large_title":"Bild ist zu groß","backdrop.too_large_body":"Dieses Bild überschreitet die Anzeigegrenzen des Browsers ({w}×{h}, Limit {limit} px pro Seite). Bitte verkleinern Sie es in einem Desktop-Editor und laden Sie es erneut hoch.","backdrop.downscale_failed":"Die verkleinerte Kopie konnte nicht erstellt werden. Der aktuelle Plan wurde nicht geändert."};const n="4da0d706a85c3f1c08ab6de960deb5feb08baaf9055265234e7bd1b554332653";export{e as dictionary,n as fingerprint};
diff --git a/dist/houseplan-assets/editor-CAGtS_SG.js b/dist/houseplan-assets/editor-CAGtS_SG.js
deleted file mode 100644
index 993e312e..00000000
--- a/dist/houseplan-assets/editor-CAGtS_SG.js
+++ /dev/null
@@ -1,14 +0,0 @@
-globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="34d1dbfc181acaf58842dfced0e6aa3a899aef6b8d1eeba53732ef729a63137e";import{q as e,l as o,v as t,e7 as s,A as a,e8 as i,e9 as l,ea as n,E as r,c}from"./houseplan-card-BKJrmMEj.js";class h extends e{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 o(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},o=this._floorToken;return o?e.floor=o:Object.prototype.hasOwnProperty.call(e,"floor")||(e.floor=""),e}get _schema(){const e=this._spaces||[],o=this._lang,a=[{value:"",label:t(o,"editor.floor_none")}],i=this._floorToken;i&&a.push({value:i,label:t(o,"editor.floor_index",{index:String(this._config?.floor)})});const l="string"==typeof this._config?.floor?this._config.floor:"";l&&!e.some(e=>e.value===l)&&a.push({value:l,label:l}),a.push(...e);const n="string"==typeof this._config?.default_floor?this._config.default_floor:"",r=[...e];return n&&!e.some(e=>e.value===n)&&r.unshift({value:n,label:n}),[{name:"title",selector:{text:{}}},{name:"floor",selector:{select:{mode:"dropdown",options:a}}},e.length?{name:"default_floor",selector:{select:{mode:"dropdown",options:r}}}:{name:"default_floor",selector:{text:{}}},{name:"language",selector:{select:{mode:"dropdown",options:s(t(o,"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 a;const e=i(this,l,o(this.hass,this._config.language));if("cold"===e)return n();if("warm"===e)return r;this._loadSpaces();const s=this._lang,h={title:t(s,"editor.title"),floor:t(s,"editor.floor"),default_floor:t(s,"editor.default_floor"),language:t(s,"editor.language"),icon_size:t(s,"editor.icon_size"),show_temperature:t(s,"editor.show_temperature"),live_states:t(s,"editor.live_states"),show_signal:t(s,"editor.show_signal"),kiosk:t(s,"editor.kiosk"),cycle:t(s,"editor.cycle")},f=this._schema,_=function(e,o,t){if(!t||null===o)return null;const s="string"==typeof e?.default_floor?e.default_floor:"";return!s||o.some(e=>e.value===s)?null:s}(this._config,this._spaces,this._spacesAuthoritative),d=e=>c`h[e.name]||e.name}
- @value-changed=${this._valueChanged}
- >`;return c`
- ${d(f.slice(0,3))}
- ${_?c`
- ${t(s,"editor.default_floor_missing",{id:_})}
-
`:a}
- ${d(f.slice(3))}
- `}_valueChanged(e){const o={...this._config,...e.detail.value};""===o.floor?delete o.floor:o.floor===this._floorToken&&(o.floor=this._config?.floor);const t=new Event("config-changed",{bubbles:!0,composed:!0});t.detail={config:o},this.dispatchEvent(t)}}h.properties={hass:{attribute:!1},_config:{state:!0},_spaces:{state:!0}},customElements.get("houseplan-card-editor")||customElements.define("houseplan-card-editor",h);
diff --git a/dist/houseplan-assets/editor-lggZMXRH.js b/dist/houseplan-assets/editor-lggZMXRH.js
new file mode 100644
index 00000000..05edf67d
--- /dev/null
+++ b/dist/houseplan-assets/editor-lggZMXRH.js
@@ -0,0 +1,14 @@
+globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="4da0d706a85c3f1c08ab6de960deb5feb08baaf9055265234e7bd1b554332653";import{aI as e,l as o,aL as t,e7 as s,A as a,e8 as i,e9 as l,ea as n,E as r,c}from"./houseplan-card-CAm75-22.js";class h extends e{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 o(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},o=this._floorToken;return o?e.floor=o:Object.prototype.hasOwnProperty.call(e,"floor")||(e.floor=""),e}get _schema(){const e=this._spaces||[],o=this._lang,a=[{value:"",label:t(o,"editor.floor_none")}],i=this._floorToken;i&&a.push({value:i,label:t(o,"editor.floor_index",{index:String(this._config?.floor)})});const l="string"==typeof this._config?.floor?this._config.floor:"";l&&!e.some(e=>e.value===l)&&a.push({value:l,label:l}),a.push(...e);const n="string"==typeof this._config?.default_floor?this._config.default_floor:"",r=[...e];return n&&!e.some(e=>e.value===n)&&r.unshift({value:n,label:n}),[{name:"title",selector:{text:{}}},{name:"floor",selector:{select:{mode:"dropdown",options:a}}},e.length?{name:"default_floor",selector:{select:{mode:"dropdown",options:r}}}:{name:"default_floor",selector:{text:{}}},{name:"language",selector:{select:{mode:"dropdown",options:s(t(o,"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 a;const e=i(this,l,o(this.hass,this._config.language));if("cold"===e)return n();if("warm"===e)return r;this._loadSpaces();const s=this._lang,h={title:t(s,"editor.title"),floor:t(s,"editor.floor"),default_floor:t(s,"editor.default_floor"),language:t(s,"editor.language"),icon_size:t(s,"editor.icon_size"),show_temperature:t(s,"editor.show_temperature"),live_states:t(s,"editor.live_states"),show_signal:t(s,"editor.show_signal"),kiosk:t(s,"editor.kiosk"),cycle:t(s,"editor.cycle")},f=this._schema,_=function(e,o,t){if(!t||null===o)return null;const s="string"==typeof e?.default_floor?e.default_floor:"";return!s||o.some(e=>e.value===s)?null:s}(this._config,this._spaces,this._spacesAuthoritative),d=e=>c`h[e.name]||e.name}
+ @value-changed=${this._valueChanged}
+ >`;return c`
+ ${d(f.slice(0,3))}
+ ${_?c`
+ ${t(s,"editor.default_floor_missing",{id:_})}
+
`:a}
+ ${d(f.slice(3))}
+ `}_valueChanged(e){const o={...this._config,...e.detail.value};""===o.floor?delete o.floor:o.floor===this._floorToken&&(o.floor=this._config?.floor);const t=new Event("config-changed",{bubbles:!0,composed:!0});t.detail={config:o},this.dispatchEvent(t)}}h.properties={hass:{attribute:!1},_config:{state:!0},_spaces:{state:!0}},customElements.get("houseplan-card-editor")||customElements.define("houseplan-card-editor",h);
diff --git a/custom_components/houseplan/frontend/houseplan-assets/fr-BAV7hmLH.js b/dist/houseplan-assets/fr-Y07FWZ2v.js
similarity index 99%
rename from custom_components/houseplan/frontend/houseplan-assets/fr-BAV7hmLH.js
rename to dist/houseplan-assets/fr-Y07FWZ2v.js
index 968231e2..956504aa 100644
--- a/custom_components/houseplan/frontend/houseplan-assets/fr-BAV7hmLH.js
+++ b/dist/houseplan-assets/fr-Y07FWZ2v.js
@@ -1 +1 @@
-globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="34d1dbfc181acaf58842dfced0e6aa3a899aef6b8d1eeba53732ef729a63137e";var e={"editor.context_actions":"Actions : {object}","editor.tool_options":"Options de l’outil : {tool}","editor.palette":"Palette : {tool}","editor.open_group":"Groupe d’outils : {group}","editor.group_active":"{group} — actif : {item}","editor.disabled_action":"{action} est indisponible : {reason}","editor.loading":"Chargement de l'éditeur…","editor.loading_aria":"L'éditeur de plan est en cours de chargement","editor.load_failed":"Impossible de charger l'éditeur.","editor.refresh_advice":"Actualisez la page et réessayez.","editor.retry_advice":"Vérifiez votre connexion et appuyez à nouveau.","version_mismatch.title":"Les versions de House Plan ne correspondent pas","version_mismatch.body":"Si Home Assistant redémarre encore, attendez la fin, puis rechargez cette page.","version_mismatch.frontend":"Carte","version_mismatch.backend":"Intégration","version_mismatch.reload":"Recharger la page","color_picker.title":"Sélecteur de couleur","color_picker.hue":"Teinte","color_picker.saturation":"Saturation","color_picker.value":"Luminosité","color_picker.hex":"Couleur hexadécimale","color_picker.invalid_hex":"Saisissez une couleur hexadécimale à 3 ou 6 chiffres","color_picker.confirm":"OK","btn.properties":"Propriétés","btn.keep_as_walls":"Conserver comme murs","btn.delete_room_keep_walls":"Supprimer la pièce, conserver les murs","btn.delete_room_with_walls":"Supprimer la pièce et les murs","title.markup_select":"Sélectionner et modifier les murs et les colonnes","title.markup_column":"Colonne : cliquez sur un point de la grille pour placer une colonne carrée","markup.partition":"Cloison","markup.column":"Colonne","markup.hint_column":"cliquez sur un point de la grille pour placer une colonne carrée","history.wall_segment":"Ajouter un segment de mur","history.column_add":"Ajouter une colonne","history.physical_edit":"Modifier l’objet physique","history.physical_delete":"Supprimer l’objet physique","history.physical_move":"Déplacer l’objet physique","history.wall_face_batch":"Créer des pièces à partir des murs","toast.column_duplicate":"Une colonne avec le même centre et la même dimension extérieure existe déjà","physical.partition_properties":"Propriétés de la cloison","physical.column_properties":"Propriétés de la colonne","physical.shape":"Forme","physical.square":"Carré","physical.circle":"Cercle","physical.diameter":"Diamètre","physical.side":"Côté","physical.rotation":"Angle de rotation","physical.length":"Longueur","physical.allowed_range":"Autorisé : {min}–{max} {unit}","physical.column_size_title":"Côté extérieur de la colonne carrée placée par le clic (1–150 cm).","card.title":"Plan de la maison","count.devices":"{n} app.","empty.no_spaces":"Aucun espace pour le moment.","nav.spaces":"Espaces House Plan","empty.add_first":"Ajoutez le premier espace et importez un plan.","empty.read_only":"Aucun espace n’est configuré. Demandez à un administrateur d’en ajouter un.","empty.install":"Installez l’intégration House Plan et ajoutez-la dans « Appareils et services ».","btn.add_space":"Ajouter un espace","btn.cancel":"Annuler","btn.save":"Enregistrer","btn.close":"Fermer","btn.delete":"Supprimer","btn.copy":"Copier","btn.edit":"Modifier","btn.open_in_ha":"Ouvrir dans HA","btn.reset":"Réinitialiser","btn.attach":"Joindre…","btn.upload":"Importer…","btn.replace":"Remplacer…","title.zoom_in":"Zoomer","title.zoom_out":"Dézoomer","title.zoom_fit":"Tout ajuster","title.configure_space":"Configurer l’espace","title.add_space":"Ajouter un espace","title.markup_add":"Murs : tracez une chaîne continue ; chaque segment accepté est enregistré séparément. Maj verrouille à 45°","title.markup_merge":"Fusionner : cliquez sur une pièce, puis sur la pièce voisine avec laquelle elle partage un mur","title.markup_split":"Diviser une pièce : cliquez sur la pièce, puis sur deux points de ses murs","title.markup_delroom":"Supprimer une pièce : cliquez à l’intérieur de la pièce puis confirmez","title.need_plan":"Importer une image de plan","markup.add":"Murs","markup.merge":"Fusionner","markup.split":"Diviser","markup.resize":"Redimensionner","title.markup_resize":"Redimensionner les pièces : faites glisser une poignée disponible sur un mur horizontal ou vertical","markup.hint_resize":"faites glisser une poignée de mur disponible · le mur s’arrête à la première position non sûre · Échap annule · Ctrl+Z — annuler","resize.disabled.diagonal":"Ce mur est incliné ; le redimensionnement ne prend en charge que les murs horizontaux et verticaux","resize.disabled.side-angle":"Un mur adjacent est incliné ; le redimensionnement exige que les deux murs adjacents rencontrent ce mur à angle droit","resize.disabled.duplicate-physical-wall":"Une cloison distincte ou une colonne chevauche ce mur ; supprimez-la ou déplacez-la avant de redimensionner","resize.disabled.partial-shared":"Une pièce voisine n’utilise qu’une partie de ce mur ; il ne peut donc pas être déplacé en toute sécurité comme un mur partagé unique","resize.disabled.unequal-shared":"La pièce voisine utilise des extrémités ou une longueur de mur différentes ; les murs ne peuvent donc pas être déplacés ensemble en toute sécurité","resize.disabled.multiple-rooms":"Déplacer ce mur affecterait plus de deux pièces","resize.disabled.thickness-conflict":"L’épaisseur du mur ne peut pas être conservée en toute sécurité","resize.disabled.opening-conflict":"Une ouverture sur ce mur ne peut pas être déplacée en toute sécurité","resize.disabled.invalid-geometry":"Ce mur ne peut pas être redimensionné sans modifier la structure du plan","resize.limit_stopped":"Mur arrêté : l'étape suivante enfreindrait une limite de jonction","resize.commit_failed":"Le redimensionnement a été annulé car le plan final n’a pas passé le contrôle de géométrie","resize.preview_failed":"Le redimensionnement s’est arrêté à la dernière position sûre car la géométrie du plan ne pouvait pas être préservée","markup.opening":"Ouverture","markup.delete_room":"Supprimer la pièce","history.undo":"Annuler","history.redo":"Rétablir","history.undo_named":"Annuler : {name} (Ctrl+Z)","history.redo_named":"Rétablir : {name} (Ctrl+Maj+Z / Ctrl+Y)","history.undo_empty":"Rien à annuler","history.redo_empty":"Rien à rétablir","history.undone":"Annulé : {name}","history.redone":"Rétabli : {name}","history.add_room":"Créer une pièce","history.split_room":"Diviser la pièce","history.merge_rooms":"Fusionner les pièces","history.resize_room":"Redimensionner la pièce","history.wall_thickness":"Modifier l’épaisseur du mur","history.add_opening":"Ajouter une ouverture de porte ou de fenêtre","history.edit_opening":"Modifier l’ouverture","history.move_opening":"Déplacer l’ouverture","history.delete_opening":"Supprimer l’ouverture","history.delete_room_keep_walls":"Supprimer la pièce, conserver les murs","history.delete_room_with_walls":"Supprimer la pièce et les murs","history.decor_add":"Ajouter un objet décoratif","history.decor_edit":"Modifier l’objet décoratif","history.decor_move":"Déplacer l’objet décoratif","history.decor_transform":"Transformer l’objet décoratif","history.decor_delete":"Supprimer l’objet décoratif","history.backdrop_transform":"Transformer l’arrière-plan du plan","history.device_move":"Déplacer {name}","history.device_stale":"L’historique des positions n’est plus applicable et a été effacé","opening.new":"Nouvelle ouverture","opening.edit":"Ouverture","opening.door":"Porte","opening.window":"Fenêtre","opening.gate":"Portail","opening.passage":"Passage ouvert","opening.passage_binding_warning":"L’enregistrement supprimera le capteur d’ouverture/fermeture et la serrure.","opening.invalid_passage_fields":"Le passage ouvert du plan « {room} » possède des paramètres non pris en charge : {fields}.","opening.type_label":"Type","opening.length_label":"Longueur, cm","opening.contact_label":"Capteur d’ouverture/fermeture","opening.lock_label":"Serrure","opening.none":"— aucun —","opening.search_ph":"Rechercher : nom ou ID d’entité…","opening.invert":"Inverser ouvert/fermé","opening.flip_h":"Charnière sur l’autre montant","opening.flip_v":"Ouverture de l’autre côté","opening.open":"Ouvert","opening.closed":"Fermé","opening.locked":"Verrouillé","opening.unlocked":"Déverrouillé","opening.state_unknown":"indisponible","opening.no_entities":"Aucun capteur associé — symbole statique sur le plan.","toast.opening_no_wall":"Cliquez près d’un mur de pièce ou d’un mur indépendant","opening.host_partition":"Mur indépendant","opening.partition_orphan":"Le mur indépendant de cette ouverture n’existe plus","opening.partition_jamb_margin":"Laissez au moins {distance} entre l’ouverture et l’extrémité du mur","opening.rebind_partition":"Associer à un autre mur indépendant","confirm.delete_partition_openings_title":"Supprimer le mur et les ouvertures ?","confirm.delete_partition_openings_body":"Ce mur contient {count} ouverture(s). Elles seront supprimées avec lui.","confirm.delete_partition_openings_item":"• {type}, {length}","markup.hint_points":"points : {n} · Maj — pas de 45° · Échap — terminer la chaîne · Ctrl+Z — annuler un point · fermer une zone propose de créer une pièce","markup.hint_start":"cliquez sur un point de la grille pour commencer une chaîne de murs","tip.lqi":"signal Zigbee moyen :","tip.area":"surface : {value}","info.device_header":"Appareil sur le plan","info.model":"Modèle","info.state":"État","info.link":"Lien","info.manuals":"Manuels","info.none":"Aucune information supplémentaire","marker.new_device":"Nouvel appareil","marker.name_label":"Nom (affiché sur le plan)","marker.name_ph":"Nom","marker.binding_label":"Associer à un appareil HA","marker.binding_disabled":"désactivé dans Home Assistant","marker.virtual_option":"Appareil virtuel (sans association)","marker.search_ph":"Rechercher un appareil / groupe…","marker.nothing_found":"aucun résultat","marker.room_label":"Pièce","marker.room_override":" (placement forcé)","marker.room_choose":"— sélectionner une pièce —","marker.room_auto":"— selon la zone de l’appareil (auto) —","marker.icon_label":"Icône","marker.icon_ph":"mdi:… (vide = auto)","marker.display_label":"Affichage","display.badge":"Icône + état","display.icon_ripple":"Icône + état et activité","display.static_icon":"Icône toujours statique","display.value_static_icon":"Valeur + icône statique","marker.display_hint_badge":"L’icône et le fond dynamique affichent l’état de l’appareil sans la pulsation d’activité habituelle. Les alarmes rouges restent visibles.","marker.display_hint_icon_ripple":"L’icône, le fond dynamique et la pulsation affichent une brève animation pour les événements et une animation continue pour le fonctionnement, le mouvement ou la présence. Les alarmes rouges restent prioritaires.","marker.display_hint_value":"Une valeur Home Assistant sélectionnée ou résolue automatiquement remplace l’icône tandis que le fond continue d’indiquer l’état. Les alarmes rouges restent visibles.","marker.display_hint_static_icon":"Le contour adapté au thème et l’icône restent toujours identiques. L’état, l’activité, l’indisponibilité et les alarmes ne modifient pas l’apparence.","marker.display_hint_value_static_icon":"Le marqueur affiche la valeur choisie tandis que le contour reste adapté au thème. L’état, l’activité, l’indisponibilité et les alarmes ne modifient pas la couleur du marqueur.","marker.static_alarm_warning":"Cet appareil peut signaler des alarmes. L’affichage statique masque l’indication visuelle d’alarme du marqueur.","marker.preview.title":"Aperçu de l’affichage","marker.preview.actual":"Actuel","marker.preview.example":"Exemple","marker.preview.integration":"Fourni par","marker.preview.source":"Source d’affichage","marker.preview.current_state":"État actuel","marker.preview.result":"Sur le plan","marker.preview.details":"Détails de la source","marker.preview.select_source":"Choisissez un appareil ou une entité Home Assistant pour voir son affichage réel.","marker.preview.unknown_provider":"Intégration inconnue","marker.preview.virtual_provider":"House Plan · appareil virtuel","marker.preview.no_source":"Aucune source active","marker.preview.no_state":"Aucun état actuel","marker.preview.mixed_states":"Plusieurs états différents","marker.preview.multiple_sources":"{n} sources","marker.preview.more_sources":"+{n} de plus","marker.preview.scaled":"L’aperçu est redimensionné à {n}% pour tenir dans la zone. La taille enregistrée reste inchangée.","marker.preview.demo_short":"Afficher une activité brève","marker.preview.demo_continuous":"Afficher une activité continue","marker.preview.stop_continuous":"Arrêter l’activité continue","marker.preview.demo_short_notice":"Exemple d’activité brève ; l’état réel de l’appareil reste inchangé.","marker.preview.demo_continuous_notice":"Exemple d’activité continue ; l’état réel de l’appareil reste inchangé.","marker.preview.demo_already_visible":"L’état actuel affiche déjà un véritable effet d’activité ou d’alarme.","marker.preview.reduced_motion":"La réduction des animations est activée sur le système ; l’activité normale est donc affichée sous forme de point.","marker.preview.reason.neutral":"Fond sombre neutre","marker.preview.reason.working":"Fond jaune : l’appareil fonctionne actuellement","marker.preview.reason.working_activity":"Fond jaune et effet d’activité : l’appareil fonctionne actuellement","marker.preview.reason.open":"Fond orange : physiquement ouvert ou déverrouillé","marker.preview.reason.cover_icon_state":"Fond neutre ; l’entité de volet contrôle l’état et l’icône affichés","marker.preview.reason.presence":"Effet d’activité tant qu’une présence est détectée","marker.preview.reason.event":"Effet d’activité bref après un événement détecté","marker.preview.reason.transition":"Effet d’activité pendant que l’appareil se déplace ou change d’état","marker.preview.reason.media_neutral":"Les appareils multimédias restent sur un fond sombre neutre tant qu’ils sont disponibles","marker.preview.reason.unavailable":"Fond neutre atténué : indisponible ou éteint","marker.preview.reason.alarm":"Fond d’alarme rouge ; l’indication d’alarme est toujours affichée","marker.preview.reason.live_states_disabled":"Le style selon les états en direct est désactivé pour cette carte","marker.preview.reason.value_no_state":"Aucune valeur d’état exploitable ; l’icône est affichée à la place","marker.preview.reason.value_ambiguous_sources":"Plusieurs sources de valeur possibles ; l’icône est affichée à la place","marker.preview.reason.value_non_scalar":"La source n’a pas renvoyé de valeur simple ; l’icône est affichée à la place","marker.preview.reason.value_virtual":"Un appareil virtuel n’a aucune valeur Home Assistant ; l’icône est affichée à la place","marker.preview.reason.vacuum_live_plan_only":"La position et la trajectoire en direct de l’aspirateur ne sont disponibles que sur le plan complet","marker.preview.reason.hidden_design_preview":"L’appareil est masqué sur le plan ; cet aperçu de conception reste visible","marker.preview.reason.composite_power_source":"L’état provient de l’entité d’alimentation de l’appareil ; les interrupteurs auxiliaires sont ignorés","marker.preview.reason.activity_display_disabled":"Le mode d’affichage sélectionné n’affiche pas les effets d’activité habituels","marker.preview.reason.ha_disabled":"L’association Home Assistant est désactivée et sera masquée sur le plan","marker.preview.reason.orphaned":"L’association Home Assistant enregistrée est introuvable","marker.preview.reason.static_icon":"Mode statique : l’état de l’appareil ne modifie pas l’icône","marker.preview.reason.value_static_icon":"Mode statique avec valeur : l’état de l’appareil ne modifie pas la couleur du marqueur","marker.activity_color":"Couleur de la pulsation d’activité","marker.ripple_size":"Taille de la pulsation d’activité","marker.activity_alarm_note":"La couleur et la taille n’affectent que l’activité normale et ne modifient pas les alarmes rouges.","marker.pulse_a11y_alarm":"Alarme","marker.pulse_a11y_event":"Événement récent","marker.pulse_a11y_presence":"Présence détectée","marker.pulse_a11y_transition":"Changement d’état","marker.pulse_a11y_running":"En fonctionnement","marker.state_a11y_neutral":"État par défaut","marker.state_a11y_working":"En fonctionnement","marker.state_a11y_open":"Ouvert","marker.state_a11y_locked":"Verrouillé","marker.state_a11y_unlocked":"Déverrouillé","marker.state_a11y_alarm":"Alarme","marker.state_a11y_unavailable":"Indisponible","marker.lqi_a11y_low":"LQI {value}, signal faible","marker.lqi_a11y_mid":"LQI {value}, signal moyen","marker.lqi_a11y_high":"LQI {value}, signal fort","marker.size_label":"Taille / rotation de l’icône","marker.angle_label":"Rotation","marker.model_label":"Modèle","marker.model_ph":"ex. Aqara T&H","marker.link_label":"Lien","marker.desc_label":"Description","marker.desc_ph":"Notes, caractéristiques…","marker.manuals_label":"Manuels (PDF, etc.)","marker.sub_device":"appareil","marker.sub_z2m_group":" · groupe Z2M","marker.sub_group":"groupe","marker.sub_helper":"assistant","space.new":"Nouvel espace","space.copy_title":"Copier l’espace","space.copy_name":"Nom du nouvel espace","space.copy_fallback":"Espace","space.copy_create":"Créer la copie","space.copy_optimize_title":"Optimiser avant de copier ?","space.copy_optimize_body":"Avant de créer « {name} », House Plan doit optimiser tout le plan, y compris les autres espaces. Continuer ?","space.copy_optimize_confirm":"Optimiser et copier","space.copy_error_changed":"Le plan a changé pendant la confirmation. Vérifiez-le et réessayez.","space.copy_error_source_missing":"L’espace source n’existe plus. Rouvrez ses réglages et réessayez.","space.copy_error_source_invalid":"House Plan n’a pas pu valider tous les murs de cet espace. Corrigez l’espace source.","space.copy_error_spaces_limit":"House Plan contient déjà le nombre maximal d’espaces.","space.copy_error_partitions_limit":"Cet espace contient trop de murs pour être copié.","space.copy_error_openings_limit":"Cet espace contient trop d’ouvertures pour être copié.","space.copy_error_decor_limit":"Cet espace contient trop d’objets d’arrière-plan pour être copié.","space.copy_error_columns_limit":"Cet espace contient trop de colonnes pour être copié.","space.copy_error_opening_host":"Une ouverture n’est plus rattachée à un mur. Corrigez-la ou supprimez-la avant la copie.","space.copy_error_geometry":"La copie créerait une géométrie de murs non sûre. Corrigez l’espace source.","space.copy_error_optimize_geometry":"La copie est arrêtée car l’optimisation de tout le plan n’est pas sûre pour un espace.","space.header":"Espace","space.title_label":"Titre","space.title_ph":"ex. Garage","space.plan_label":"Plan (arrière-plan)","space.no_plan":"aucune image de plan","space.plan_alt":"plan","room.new":"Nouvelle pièce","room.name_label":"Nom affiché","room.name_ph":"ex. Terrasse","room.area_label":"Zone Home Assistant (non attribuée)","room.no_area_option":"— aucune zone —","room.default_name":"Pièce","device.unnamed":"sans nom","device.light_group":"groupe de lumières","device.fallback":"appareil","device.virtual":"appareil virtuel","confirm.delete_room_title":"Supprimer la pièce « {name} » ?","confirm.delete_room_body":"Choisissez si les murs physiques propres à la pièce doivent être conservés. Les murs partagés avec une autre pièce sont toujours conservés.","confirm.remove_marker_title":"Supprimer l’appareil du plan ?","confirm.remove_marker_body":"L’appareil disparaîtra complètement et ne contribuera plus aux données du plan. Vous pourrez l’ajouter de nouveau plus tard.","confirm.erase_decor":"Effacer l’objet {kind} ? Vous pouvez annuler cette action depuis l’historique de l’éditeur.","confirm.delete_space_title":"Supprimer l’espace ?","confirm.delete_space_body":"L’espace, toutes ses pièces et tout le tracé du plan seront supprimés.","confirm.delete_space_vac_routes":"Les affectations de cartes de robots seront aussi supprimées : {count}.","space.delete_blocked":"Cet espace est encore utilisé par {n} appareil(s). Déplacez-les vers un autre espace ou supprimez-les d’abord.","toast.pos_save_failed":"Échec de l’enregistrement de la position : {err}","toast.no_entity":"L’appareil n’a aucune entité adaptée","toast.ha_disabled_action":"Un objet Home Assistant désactivé ne peut pas être utilisé sur le plan.","toast.ha_disabled_show_device":"Un appareil désactivé dans Home Assistant ne peut pas être affiché sur le plan. Activez-le d’abord dans Home Assistant.","toast.ha_disabled_show_entity":"Une entité désactivée dans Home Assistant ne peut pas être affichée sur le plan. Activez-la d’abord dans Home Assistant.","toast.ha_disabled_add":"Un objet Home Assistant désactivé ne peut pas être ajouté au plan. Activez-le d’abord dans Home Assistant.","toast.ha_binding_unverified":"L’état de l’objet n’a pas pu être vérifié via le registre Home Assistant. L’affichage et les actions sont temporairement indisponibles.","toast.markup_needs_server":"Le tracé est disponible une fois la configuration déplacée sur le serveur","toast.space_order_changed":"L’ordre a changé. Si une carte fixe son étage par numéro, vérifiez ces tableaux de bord.","toast.conflict":"La configuration a été modifiée dans une autre fenêtre — données actualisées, répétez votre dernière action","toast.cfg_save_failed":"Échec de l’enregistrement de la configuration : {err}","toast.room_overlap":"Le contour chevauche la pièce « {name} » — les pièces ne doivent pas se chevaucher","toast.contour_cannot_close":"Le contour ne peut pas être fermé car il est dégénéré ou s’auto-intersecte","toast.merge_not_adjacent":"Seules les pièces partageant un mur peuvent être fusionnées","toast.rooms_merged":"Pièces fusionnées dans « {name} »","toast.split_pick_wall":"Commencez la découpe sur le mur de la pièce","toast.split_bad_cut":"La découpe doit aller d’un mur à l’autre à l’intérieur de la pièce, sans croiser de mur ni se croiser elle-même","merge.header":"Fusionner les pièces","merge.hint":"La pièce fusionnée conserve un nom et une zone. L’autre zone est libérée — ses appareils quittent le plan jusqu’à ce qu’une autre pièce la récupère.","merge.keep":"Conserver","merge.no_area":"aucune zone","toast.room_saved":"Pièce enregistrée ({n}). Appareils ajoutés : {added}. Tracez la suivante ou quittez le mode tracé.","toast.room_saved_no_area":"Pièce enregistrée ({n}, sans zone). Tracez la suivante ou quittez le mode tracé.","toast.marker_needs_server":"La modification des appareils est disponible une fois la configuration déplacée sur le serveur","toast.virtual_name_required":"Saisissez un nom pour l’appareil virtuel","toast.marker_saved":"Appareil enregistré","toast.marker_removed":"Appareil supprimé du plan","toast.integration_missing":"L’intégration House Plan n’est pas installée — gestion indisponible","toast.plan_formats":"Formats pris en charge : SVG, PNG, JPG, WebP","toast.plan_required":"Importez un plan — il est obligatoire","toast.space_added_onboard":"Espace ajouté. Tracez les pièces : cliquez sur les points de la grille et fermez le contour.","toast.space_added":"Espace ajouté","toast.space_copied":"Espace « {name} » créé","toast.space_saved":"Espace enregistré","toast.space_deleted":"Espace supprimé","toast.delete_failed":"Échec de la suppression : {err}","toast.error":"Erreur : {err}","toast.toggle_target_unavailable":"La cible « {name} » est indisponible — aucune action n’a été effectuée","toast.toggle_targets_unavailable":"Cibles indisponibles : {names}. Aucune action n’a été effectuée","toast.file_failed":"Le fichier « {name} » n’a pas été importé : {err}","toast.files_attached":"Fichiers joints : {n}","err.unknown":"erreur inconnue","err.code":"code {code}","err.too_large":"fichier supérieur à {mb} Mo","err.bad_ext":"type non pris en charge (PDF/image attendu)","err.unauthorized":"droits administrateur requis","editor.title":"Titre","editor.default_floor":"Espace initial","editor.default_floor_missing":"L’espace initial « {id} » n’existe plus. Choisissez un autre espace.","editor.floor":"Espace fixe","editor.floor_none":"— non fixé —","editor.floor_index":"Index YAML {index} (conservé)","fixed_floor.loading":"Chargement de l’espace fixe…","fixed_floor.invalid_title":"L’espace fixe est indisponible","fixed_floor.invalid_body":"Vérifiez floor dans la configuration de la carte. Valeur configurée : {value}","editor.icon_size":"Taille des icônes, % de la largeur du plan","editor.show_temperature":"Afficher la température","editor.live_states":"États en direct (on/off, ouvert…)","editor.light_pools":"Halos lumineux et ombres des murs","editor.show_signal":"Afficher le signal Zigbee (LQI)","editor.language":"Langue de l’interface","editor.lang_auto":"Auto (profil HA)","title.icon_rules":"Règles d’icônes : quelle icône MDI attribuer aux appareils selon leur nom","rules.title":"Règles d’icônes","rules.hint":"Les règles sont testées de haut en bas sur « nom de l’appareil + modèle » (expression régulière insensible à la casse) ; la première correspondance gagne. Si rien ne correspond, la classe d’appareil de l’entité est utilisée, puis l’icône générique.","rules.pattern_ph":"regex, ex. plug|socket","rules.icon_ph":"mdi:power-socket-de","rules.add":"Ajouter une règle","rules.reset":"Réinitialiser par défaut","rules.test_ph":"Tester un nom d’appareil…","rules.invalid":"expression régulière invalide","rules.saved":"Règles d’icônes enregistrées","btn.up":"Monter","btn.down":"Descendre","tap.info":"Fiche de l’appareil","tap.more_info":"Boîte de dialogue Plus d’infos de HA","tap.toggle":"Basculer l’état","marker.tap_label":"Action au toucher pour cet appareil","tap.toggle_note":"L’état déterminé est affiché ci-dessous. Les appareils sécurisés ne sont jamais basculés depuis le plan.","import.title":"Créer des espaces à partir des étages HA","import.hint":"Votre Home Assistant connaît déjà ces étages. Sélectionnez ceux à transformer en espaces du plan — vous importerez ensuite une image de plan pour chacun. Les pièces sont ensuite tracées manuellement sur le plan.","import.start":"Créer {n} espace(s)","import.manual":"Commencer de zéro","import.progress":"Étage {i} sur {n}","import.done":"Espaces créés. Tracez les pièces : cliquez sur les points de la grille et fermez le contour.","btn.skip":"Passer","space.scale_label":"Échelle (taille d’une cellule de grille)","space.cell_cm.help":"Relie la grille aux dimensions réelles : les longueurs, les surfaces, l’épaisseur des murs, la taille des ouvertures et le rayon du halo en dépendent. Une modification ultérieure change les dimensions calculées de tout l’espace sans déplacer ses points sur le plan.","space.cell_cm.help.aria":"Aide : échelle de l’espace","space.scale_unit":"cm par cellule","space.scale_unit_imperial":"po par cellule","space.display_section":"Affichage","space.show_borders":"Toujours afficher les contours des pièces","space.zero_wall_style":"Murs d’épaisseur nulle","space.zero_wall_style.help":"Les murs d’épaisseur nulle en pointillés laissent passer le halo et les rayons du soleil, tandis que les murs pleins les bloquent comme une barrière sans surface. Ce choix s’applique à tous ces murs de l’espace, même si leur ligne est masquée en mode Vue.","space.zero_wall_style.help.aria":"Aide : style des murs d’épaisseur nulle","space.zero_wall_dashed":"Pointillés","space.zero_wall_solid":"Plein","space.show_names":"Afficher les noms des pièces (faire glisser pour déplacer)","space.room_color":"Couleur du contour et du nom","space.opacity":"Opacité","space.fill_label":"Remplissage de la pièce","space.fill_mode.help":"« Couleur personnalisée » définit le style, tandis que « Lumière », « Température » et « LQI » utilisent les données actuelles de Home Assistant. Le halo s’active séparément.","space.fill_mode.help.aria":"Aide : mode de remplissage des pièces","fill.none":"Aucun","fill.lqi":"Signal Zigbee","fill.light":"Lumières","fill.custom":"Couleur personnalisée","space.custom_fill":"Couleur de remplissage","space.source_file":"J’ai une image de plan","space.source_draw":"Aucune image — je tracerai les pièces à la main","fill.temp":"Température","tip.temp_avg":"température moyenne :","tip.hum_avg":"humidité moyenne :","space_card.button":"Ouvrir le plan de l’espace","space_card.not_found":"Espace « {id} » introuvable","space_card.loading":"Chargement…","continuity.restore_plan":"Restauration du plan…","continuity.restore_connection":"Restauration de la connexion aux appareils…","continuity.retry":"Réessayer","editor.space":"Espace","editor.framing":"Cadrage","editor.fit_content":"Tout le contenu visible","editor.fit_house":"Ajusté à la géométrie de la maison","editor.show_button":"Afficher le bouton","editor.button_label":"Libellé du bouton","editor.button_target":"Chemin du tableau de bord cible","marker.sub_entity":"entité","title.general_settings":"Paramètres généraux","title.export_pdf":"Enregistrer en PDF","pdf.title":"Enregistrement en PDF","pdf.dimensions":"Afficher les dimensions et les surfaces","pdf.decor":"Afficher les meubles et les autres éléments","pdf.room_names":"Afficher les noms des pièces","pdf.backdrop":"Afficher le fond de plan","pdf.save":"Enregistrer","pdf.saving":"Création…","pdf.failed":"Impossible de créer le PDF.","pdf.too_large":"Les images dépassent la limite PDF de 25 Mo.","pdf.asset_failed":"Impossible de charger une image de fond ou de décoration.","pdf.scale":"Échelle 1:{n}","pdf.north":"Nord","gs.title":"Paramètres généraux","gs.light_group":"Remplissage : lumières","gs.light_on":"Lumières allumées","gs.light_off":"Toutes les lumières éteintes","gs.temp_group":"Remplissage : température","gs.temp_cold":"Froid","gs.temp_ok":"Confortable","gs.temp_hot":"Chaud","gs.lqi_group":"Remplissage : signal Zigbee","gs.lqi_low":"Signal faible","gs.lqi_high":"Signal fort","gs.reset":"Réinitialiser par défaut","gs.saved":"Paramètres généraux enregistrés","gs.radar_show_live":"Afficher la présence en direct sur le plan","gs.radar_show_live_hint":"Masque ou affiche toutes les cibles radar en direct. Cela ne démarre ni n’arrête l’enregistrement des observations.","radar.title":"Présence sur le plan","radar.help":"Reliez ce marqueur aux entités radar exactes de Home Assistant, placez le capteur et choisissez son profil de coordonnées. Les positions en direct sont limitées à la pièce sélectionnée.","radar.help.aria":"Aide : paramètres du radar de présence","radar.enabled":"Utiliser ce radar de présence","radar.show_live":"Afficher les cibles en direct","radar.configure":"Configurer le radar","radar.configure_on_plan":"Configurer sur le plan","radar.change_installation":"Changer l’installation","radar.no_contour":"Cette pièce n’a pas de contour. Les points radar ne seront pas limités.","radar.discard_setup_title":"Abandonner la configuration du radar ?","radar.discard_setup":"La configuration du radar non enregistrée sera perdue.","radar.step_place_mount":"Indiquez la position physique du capteur","radar.step_place_heading":"Indiquez un point droit devant le capteur","radar.step_reference":"Indiquez la position de référence {n}, puis lancez la mesure","radar.step_check_reference":"Indiquez une position de contrôle indépendante","radar.start_measure":"Lancer la mesure","radar.countdown":"Placez-vous sur le repère dans {seconds} s","radar.capturing":"Restez immobile et seul pendant la mesure…","radar.fit_ready":"Le calibrage est prêt","radar.check_third":"Vérifier à une autre position","radar.check_complete":"Contrôle indépendant terminé","radar.error_distance":"Écart de position : {distance}","radar.ambiguous_target":"Plusieurs cibles ont été signalées. Recommencez la mesure seul.","radar.insufficient_samples":"Coordonnées actuelles insuffisantes. Réessayez ou utilisez le réglage manuel.","radar.bad_references":"Choisissez des références espacées dans des directions différentes du capteur.","radar.ambiguous_sources":"Les mesures permettent deux directions également plausibles. Choisissez des repères distinguant la gauche de la droite.","radar.bad_fit":"Les mesures ne correspondent pas. Vérifiez les unités, la position du capteur et les références.","radar.desktop_hint":"Utilisez un ordinateur pour un réglage précis. L’édition sur appareils tactiles est prise en charge au mieux.","radar.detected":"House Plan a reconnu les métadonnées radar de cet appareil. Vérifiez les sources exactes avant d’enregistrer.","radar.detected_ld2450":"House Plan a trouvé un ensemble de coordonnées ESPHome LD2450. Vérifiez les sources X/Y exactes avant d’enregistrer.","radar.additional_actions":"Actions supplémentaires","radar.declare":"Ceci est un radar de présence","radar.profile":"Profil de données","radar.profile_esphome_ld2450_v1":"ESPHome LD2450 (cibles X/Y)","radar.profile_cartesian_v1":"Cibles cartésiennes (X/Y)","radar.profile_polar_v1":"Cible polaire (distance/angle)","radar.profile_range_v1":"Distance uniquement","radar.profile_zones_v1":"États des zones","radar.profile_presence_v1":"Présence uniquement","radar.room":"Pièce observée","radar.room_choose":"Choisir une pièce","radar.target":"Cible {n}","radar.axis_x":"Entité de coordonnée X","radar.axis_y":"Entité de coordonnée Y","radar.add_target":"Ajouter un emplacement de cible","radar.range_channel":"Canal de distance {n}","radar.add_range":"Ajouter un canal de distance","radar.presence_gate":"Entité de présence du canal","radar.swap_axes":"Permuter les axes X et Y","radar.axis_x_sign":"Direction X","radar.axis_y_sign":"Direction Y","radar.distance_source":"Entité de distance","radar.angle_source":"Entité d’angle","radar.angle_unit":"Unité d’angle","radar.degrees":"Degrés","radar.radians":"Radians","radar.angle_zero":"Direction de l’angle zéro","radar.angle_forward":"Vers l’avant","radar.angle_right":"Vers la droite","radar.angle_clockwise":"Les angles augmentent dans le sens horaire","radar.zone_source":"Entité de zone","radar.occupancy_source":"Entité de présence","radar.count_source":"Entité du nombre de cibles","radar.availability_source":"Entité de disponibilité","radar.source_choose":"Choisir une entité","radar.source_optional":"Facultatif","radar.source_missing":"actuellement indisponible","radar.saved_unsupported":"Cette configuration radar enregistrée est incomplète ou non prise en charge. Elle reste inactive ; supprimez-la ou mettez House Plan à jour avant de la reconfigurer.","radar.occupancy":"Présence (activée/désactivée)","radar.count":"Nombre","radar.mount":"Position et direction","radar.mount_hint":"Il s’agit de la position physique du capteur. Déplacer son marqueur décoratif ne la modifie pas.","radar.heading":"Direction, °","radar.range_cm":"Portée, cm","radar.fov_deg":"Champ de vision, °","radar.unit":"Unité de la source","radar.mirror":"Inverser l’axe gauche/droite","radar.remove":"Supprimer les paramètres radar","radar.invalid":"Renseignez la pièce, les sources et la position du radar avant d’enregistrer.","radar.check_sources":"Vérifier les données en direct","radar.checking":"Vérification…","radar.health":"État de la connexion","radar.live_summary":"Cibles actuelles : {targets} ; arcs de distance : {ranges}","radar.health_ok":"Données actuelles reçues","radar.health_off":"Aucune cible détectée","radar.health_stale":"Certaines coordonnées sont obsolètes","radar.health_partial":"Certaines sources sont à jour, d’autres sont obsolètes","radar.health_restricted":"L’accès à une ou plusieurs sources est limité","radar.health_incomplete":"Le rapport radar actuel est incomplet","radar.health_position_unavailable":"Présence signalée ; position actuelle indisponible","radar.health_unavailable":"Données du capteur indisponibles","radar.health_needs_setup":"L’installation doit être configurée","radar.health_inconsistent":"Les sources fournissent des valeurs contradictoires","radar.health_unknown":"L’état actuel est inconnu","radar.health_disabled":"Le radar est désactivé","radar.error_invalid_radar":"Vérifiez les paramètres radar.","radar.error_invalid_selection":"Sélectionnez une pièce existante et des sources valides.","radar.error_source_restricted":"Vous n’avez pas accès à toutes les sources sélectionnées.","radar.error_rate_limited":"Trop de demandes. Réessayez dans un instant.","radar.error_not_ready":"Le traitement radar n’est pas encore prêt.","radar.error_conflict":"Le plan a changé. Rouvrez la configuration radar et réessayez.","radar.error_source_unavailable":"Une ou plusieurs sources radar sélectionnées sont indisponibles.","radar.error_unsupported_capability":"Cette fonction radar n’est pas prise en charge par l’intégration installée.","radar.report_age":"il y a {seconds} s","space.show_lqi":"Afficher le signal Zigbee (LQI) à côté des appareils","space.hide_decor":"Masquer la couche décorative","space.hide_decor_tip":"Les lignes, formes, étiquettes et meubles restent à leur place — visibles dans l’éditeur d’arrière-plan, mais pas sur le plan.","space.hide_openings":"Masquer les ouvertures","space.hide_openings_tip":"Les symboles de portes, fenêtres et portails ne sont pas dessinés, mais les ouvertures continuent de fonctionner : la lumière les traverse, le soleil entre par les fenêtres et les capteurs de contact continuent de les ouvrir. L’éditeur de plan les affiche toujours.","gs.light_none":"Aucune source lumineuse","mode.plan":"Éditeur de plan","mode.devices":"Éditeur d’appareils","display.value":"Valeur + état","marker.subarea":"aucune zone, manuel","device.new":"Nouvel appareil — ouvrez son éditeur pour fermer","opening.unlock_action":"Déverrouiller","opening.lock_action":"Verrouiller","opening.lock_pending":"En cours…","title.close_editor":"Fermer l’éditeur (retour à la vue)","title.add_device":"Ajouter un appareil au plan","devbar.add":"Ajouter","devbar.rules":"Règles d’icônes","device_inbox.button":"Appareils","device_inbox.title":"Appareils sur le plan","device_inbox.search":"Rechercher appareils, entités et intégrations…","device_inbox.add_virtual":"Ajouter un appareil virtuel","device_inbox.tab_on_plan":"Sur le plan","device_inbox.tab_available":"Disponibles","device_inbox.tab_hidden":"Masqués","device_inbox.tab_readd":"De nouveau disponibles","device_inbox.only_new":"Nouveaux uniquement","device_inbox.show_entities":"Afficher les entités","device_inbox.show_hidden":"Afficher les masqués sur le plan","device_inbox.show_hidden.help":"Affiche temporairement les marqueurs masqués et désactivés sous forme de fantômes réservés à l’éditeur. La visibilité enregistrée des appareils ne change pas.","device_inbox.show_hidden.help.aria":"Aide : afficher les appareils masqués sur le plan","device_inbox.new":"Nouveau","device_inbox.find":"Trouver sur le plan","device_inbox.edit":"Modifier","device_inbox.hide":"Masquer","device_inbox.show":"Afficher","device_inbox.add":"Ajouter","device_inbox.readd":"Ajouter à nouveau","device_inbox.hide_available":"Masquer de la liste","device_inbox.show_more":"Afficher plus","device_inbox.more_actions":"Plus d'actions","device_inbox.find_hidden_hint":"Activez d'abord « Afficher les masqués sur le plan »","device_inbox.show_disabled":"Activez cette liaison dans Home Assistant avant de l'afficher","device_inbox.empty_on_plan":"Aucun appareil correspondant n'est encore sur le plan.","device_inbox.empty_available":"Aucun appareil disponible à ajouter.","device_inbox.empty_hidden":"Il n'y a aucun appareil masqué.","device_inbox.empty_readd":"Aucun appareil supprimé n'est disponible pour un nouvel ajout.","device_inbox.reason_visible_auto":"Découvert automatiquement","device_inbox.reason_visible_explicit":"Ajouté explicitement","device_inbox.reason_manual_hidden":"Masqué par l'utilisateur","device_inbox.reason_automatic_hidden":"Masqué automatiquement","device_inbox.reason_service_entry":"Entrée de registre de service uniquement","device_inbox.reason_excluded_integration":"Intégration « {integration} » exclue par les filtres de découverte","device_inbox.reason_excluded_domain":"Type d'entité non spatial","device_inbox.reason_grouped_light":"Représenté par un groupe de lumières de la pièce","device_inbox.reason_represented_by_parent":"Représenté par son appareil parent","device_inbox.reason_removed":"Précédemment retiré du plan","device_inbox.reason_available":"Disponible pour ajout au plan","device_inbox.reason_no_bound_room":"La zone HA n'est liée à aucune pièce du plan","device_inbox.status_ha_disabled":"Désactivé dans Home Assistant","device_inbox.status_orphaned":"La liaison n'existe plus dans Home Assistant","device_inbox.status_unverified":"Le registre Home Assistant est temporairement indisponible","device_inbox.saved":"Liste des appareils mise à jour","device_inbox.filters_excluded":"Intégrations exclues","device_inbox.filters_group_lights":"Regrouper les lumières de la pièce en un marqueur","device_inbox.filters_preview_appear":"apparaîtra : {count}","device_inbox.filters_preview_hide":"disparaîtra : {count}","device_inbox.filters_preview_lights":"lumières concernées : {count}","device_inbox.filters_reset":"Rétablir les recommandées","device_inbox.filters_save":"Enregistrer les filtres","device_inbox.filters_search_ph":"Ajouter une intégration…","device_inbox.filters_title":"Filtres de découverte","space.roomcard_section":"La carte de pièce affiche :","space.label_temp":"Température","space.label_hum":"Humidité","space.label_lqi":"Signal Zigbee moyen","space.label_light":"Lumières allumées/éteintes","roomcard.light_on":"Allumé","roomcard.light_off":"Éteint","roomcard.light_partial":"{on} sur {total}","toast.split_pick_inside":"Les points intermédiaires de découpe doivent se trouver à l’intérieur de la pièce","mode.decor":"Éditeur d’arrière-plan","decor.select":"Sélectionner","decor.line":"Ligne","decor.rect":"Rectangle","decor.ellipse":"Ovale","decor.text":"Texte","decor.erase":"Effacer","decor.erase_confirm_title":"Effacer l’objet ?","decor.color":"Couleur","decor.width":"Épaisseur de ligne","decor.line_style":"Style de ligne","decor.line_style_solid":"Plein","decor.line_style_dashed":"Pointillés","decor.fill":"Remplissage","decor.fill_color":"Couleur de remplissage","decor.length":"Longueur","decor.size":"Taille","decor.flip_h":"Retourner horizontalement","decor.flip_v":"Retourner verticalement","decor.angle":"Angle de rotation, °","decor.text_size":"Taille du texte","decor.backdrop_properties":"Propriétés de l’arrière-plan du plan","decor.text_title":"Étiquette de texte","decor.object_title":"Modifier {kind}","decor.text_label":"Texte","decor.live_group":"Insérer une variable HA","decor.live_entity":"Entité","decor.live_entity_ph":"choisir une entité","decor.live_attr":"Valeur","decor.live_attr_ph":"choisir l’état ou un attribut","decor.live_state":"État","decor.backdrop":"Image d’arrière-plan","decor.backdrop_hint":"Faites glisser pour déplacer ; tirez un coin pour redimensionner ; utilisez la poignée supérieure pour faire pivoter. Maj modifie les proportions ou libère l’angle.","decor.backdrop_reset":"Réinitialiser l’image","decor.backdrop_reset_done":"L’image a retrouvé sa position et sa taille d’origine","marker.icon_auto":"Auto : {icon} (selon les règles d’icônes ; choisissez-en une pour remplacer)","marker.icon_pin_auto":"Épingle","mode.plan_tip":"Éditeur de plan — la géométrie du logement : dessiner et diviser/fusionner les pièces, les associer aux zones HA, placer portes, fenêtres et portails, déplacer les cartes de pièces, régler l’échelle","mode.devices_tip":"Éditeur d’appareils — tout ce qui concerne les icônes : faire glisser pour positionner, cliquer pour modifier l’association/l’icône/l’affichage, ajouter des appareils virtuels, règles d’icônes","mode.decor_tip":"Éditeur d’arrière-plan — décoration purement visuelle sous le plan : lignes, rectangles, ovales et étiquettes de texte qui ne réagissent jamais aux clics","space.glow_enabled":"Halo des sources lumineuses","gs.glow_group":"Halo des sources lumineuses","gs.glow_base":"Obscurité de la maison","gs.glow_light":"Couleur / intensité de lumière par défaut","gs.wall_group":"Murs","gs.wall_fill":"Remplissage des murs","gs.glow_radius":"Rayon du halo","gs.glow_radius.help":"Définit le rayon général du halo en mètres ou en pieds ; le rayon propre à un appareil remplace cette valeur.","gs.glow_radius.help.aria":"Aide : rayon général du halo","gs.unit_m":"m","gs.unit_ft":"pi","marker.controls_label":"Contrôle d’autres sources lumineuses","marker.controls.help":"Avec l’action « Basculer l’état », les sources répertoriées basculent avec ce marqueur. Leur halo reste sur leurs propres marqueurs et ce lien ne transforme pas à lui seul le marqueur de contrôle en source lumineuse.","marker.controls.help.aria":"Aide : contrôler d’autres sources lumineuses","marker.controls_filter":"Rechercher des lumières et interrupteurs…","info.controls":"Contrôle","marker.glow_radius_label":"Rayon du halo","marker.glow_radius.help":"Définit le rayon du halo en mètres ou en pieds ; une valeur vide utilise le rayon des paramètres généraux.","marker.glow_radius.help.aria":"Aide : rayon du halo","markup.wallthick":"Épaisseur","markup.select":"Sélectionner","title.markup_wallthick":"Épaisseur — cliquez sur un mur pour définir son épaisseur de 0 à 100 cm.","markup.hint_wallthick":"cliquez sur un mur · Échap ferme sans appliquer","wallthick.field":"Épaisseur","wallthick.unit_cm":"cm","wallthick.unit_in":"po","wallthick.apply_room":"Appliquer à tous les murs de cette pièce","markup.draw_wall_title":"Épaisseur de chaque nouveau segment de mur (0–100 cm). Les murs partagés conservent la valeur existante.","room.queue_progress":"Pièce {current} sur {total}","toast.wall_rooms_saved":"Pièces créées : {n}","toast.wall_chain_saved":"Chaîne de murs enregistrée","toast.wallthick_pick":"Cliquez sur un mur","toast.wallthick_set":"Épaisseur du mur définie","toast.wallthick_cleared":"Épaisseur du mur supprimée","toast.physical_range":"Saisissez une valeur comprise entre {min} et {max} {unit}","toast.zero_wall_opening_conflict":"Supprimez d’abord l’ouverture sur ce segment de mur.","toast.zero_wall_ambiguous":"Le segment de mur est ambigu. Simplifiez ou ajustez la jonction.","toast.zero_wall_migration_blocked":"L’espace n’a pas été converti : {reason}. Aucune donnée n’a été modifiée.","toast.physical_angle":"Saisissez un angle de rotation compris entre 0° inclus et 90° exclu","toast.physical_limit":"L’espace a atteint la limite pour ce type de géométrie","toast.geometry_unsafe":"Modification annulée : la géométrie des murs n’a pas pu être construite en toute sécurité.","junction.limit_angle":"L'angle entre les murs est trop aigu : {actual}°, minimum {limit}°.","junction.limit_valence":"Trop de murs se rejoignent en un nœud : {actual}, maximum {limit}.","junction.limit_length":"Le segment de mur est trop court : {actual} cm, minimum {limit} cm.","junction.limit_distance":"Les murs et les nœuds sont trop proches : {actual} cm, minimum {limit} cm.","junction.limit_clearance":"Il ne reste plus d'intérieur de pièce : {actual} cm², minimum {limit} cm².","junction.limit_check_failed":"La vérification des jonctions n'a pas pu s'exécuter — la modification n'a pas été enregistrée","toast.wall_model_migration_blocked":"Le modèle de murs n’a pas pu être mis à jour : {reason}. Le plan n’a pas été modifié. Lancez « Optimiser les plans » ; si l’erreur se reproduit, corrigez la géométrie de mur conflictuelle.","toast.wall_model_client_outdated":"Mettez à jour la carte et rechargez la page avant de modifier le plan.","wall_model.reason.invalid-room":"contour de pièce invalide","wall_model.reason.zero-length":"segment de mur de longueur nulle","wall_model.reason.third-owner":"mur partagé par plus de deux pièces","wall_model.reason.duplicate-id":"identifiants de mur en conflit","wall_model.reason.thickness-conflict":"valeurs d’épaisseur de mur en conflit","wall_model.reason.opening-host":"l’ouverture ne peut pas être attribuée à un seul mur","toast.delete_room_pick":"Cliquez à l’intérieur de la pièce que vous souhaitez supprimer","toast.plan_snap_ambiguous":"Zoomez pour choisir le nœud du mur","toast.wall_repair_ambiguous":"Le contour de la pièce possède plusieurs connexions possibles. Zoomez et reliez-le explicitement.","toast.wall_repair_too_large":"L’écart dépasse 2 cm. Reliez les murs avant de créer la pièce.","toast.wall_repair_changed":"La géométrie des murs a changé. Essayez de créer de nouveau la pièce.","toast.opening_on_zero_wall":"Les ouvertures ne peuvent pas être placées sur un mur d’épaisseur nulle","marker.from_ha_option":"Choisir dans la liste HA","marker.show_entities":"Afficher les entités","marker.show_entities_tip":"Ajoute à la liste non seulement les appareils, mais aussi toutes leurs entités","marker.pick_ph":"Choisir un appareil…","room.open_area":"Ouvrir la zone HA","room.fit_action":"Ajuster la pièce {name}","view.volumetric":"Vue volumétrique","view.flat":"Vue plane","kiosk.title":"Tailles pour cet écran","kiosk.hint":"Enregistrées uniquement sur cet appareil — chaque tablette murale ou TV peut avoir ses propres tailles confortables.","kiosk.icon_scale":"Taille des icônes d’appareils","kiosk.font_scale":"Taille du texte des cartes de pièces","editor.kiosk":"Mode appareil mural (kiosque)","editor.cycle":"Changer automatiquement d’espace toutes les N secondes (kiosque, 0 = désactivé)","room.settings_title":"Paramètres de la pièce","room.settings_section":"Paramètres de la pièce (remplacent ceux de l’espace)","room.fill_label":"Remplissage de CETTE pièce","fill.inherit":"Comme l’espace","room.custom_fill_space":"Couleur de l’espace","room.custom_fill_own":"Couleur de la pièce","room.temp_range_label":"Plage de confort","room.temp_range_min":"Limite basse de température confortable","room.temp_range_max":"Limite haute de température confortable","room.temp_range_reset":"Comme l’espace","room.temp_range.help":"Cette plage s’applique uniquement à cette pièce. Un champ vide hérite de la limite correspondante de l’espace ; si les limites sont inversées, House Plan utilise la plus petite comme limite basse et la plus grande comme limite haute.","room.temp_range.help.aria":"À propos de la plage de confort de la pièce","room.temp_src_label":"Source de température","room.hum_src_label":"Source d’humidité","room.src_average":"Moyenne des capteurs de la pièce (par défaut)","room.src_pick":"Un appareil ou une entité HA spécifique","room.src_ph":"Choisir une source…","toast.room_updated":"Pièce mise à jour","space.card_font":"Taille de police des cartes de pièces (tout l’espace)","room.sizes_section":"Tailles de police","room.name_scale":"Taille du nom de la pièce","room.label_scale":"Taille des mesures","preview.room_name":"Salon","toast.cfg_reload_failed":"Impossible de recharger le plan depuis le serveur : {err}","toast.locale_load_failed":"Impossible de charger le pack de langue. L'anglais est utilisé jusqu'au rechargement de la page.","toast.furniture_art_load_failed":"Impossible de charger les dessins de meubles. Rechargez la page pour les afficher.","room.settings_short":"Paramètres de la pièce","room.unnamed":"Pièce sans nom","marker.use_climate_temp":"Inclure la température de l’appareil dans la pièce","marker.use_climate_temp_tip":"Ajoute la valeur current_temperature d’un climatiseur ou thermostat à la moyenne de la pièce. Configurez séparément le badge de valeur externe ci-dessous.","marker.value_badge_title":"Badge de valeur","marker.value_badge.help":"Affiche une valeur sélectionnée à côté de l’icône. Cela n’affecte pas les mesures de la pièce, la lumière, le halo ni l’action au toucher.","marker.value_badge.help.aria":"Aide : badge de valeur de l’appareil","marker.value_badge_enabled":"Afficher un badge de valeur","marker.value_badge_source":"Valeur","marker.value_badge_source.help":"Choisissez un état précis, un attribut pris en charge ou une valeur dérivée de cet appareil.","marker.value_badge_source.help.aria":"Aide : source du badge de valeur","marker.value_badge_position":"Position","marker.value_badge_position.help":"Le côté choisi reste fixe et ne bascule pas automatiquement au bord du plan.","marker.value_badge_position.help.aria":"Aide : position du badge de valeur","marker.value_badge_right":"À droite","marker.value_badge_bottom":"En dessous","marker.value_badge_left":"À gauche","marker.value_badge_top":"Au-dessus","marker.value_badge_empty":"Cet appareil n’a aucune valeur disponible","marker.value_badge_static":"Une icône statique n’affiche pas de valeurs en direct. Le paramètre est conservé.","marker.value_badge_missing":"Source indisponible","marker.value_badge_missing_hint":"La source enregistrée est actuellement indisponible. Conservez-la, désactivez le badge ou choisissez une autre valeur.","marker.value_badge_duplicate":"La même valeur est déjà affichée dans l’icône.","marker.value_badge_state":"État · {name}","marker.value_badge_marker_state":"État de la source lumineuse · {name}","marker.value_badge_lqi":"Qualité moyenne du signal Zigbee","marker.value_badge_attr_current_temperature":"Température actuelle · {name}","marker.value_badge_attr_temperature":"Température cible · {name}","marker.value_badge_attr_current_humidity":"Humidité actuelle · {name}","marker.value_badge_attr_humidity":"Humidité · {name}","marker.value_badge_attr_current_position":"Position · {name}","marker.value_badge_attr_percentage":"Vitesse · {name}","marker.value_badge_attr_brightness":"Luminosité · {name}","marker.value_badge_attr_volume_level":"Volume · {name}","marker.value_badge_attr_battery_level":"Batterie · {name}","marker.value_badge_attr_fan_speed":"Vitesse du ventilateur · {name}","marker.value_source":"Source de la valeur","marker.value_source.help":"Choisissez la valeur qui remplace l’icône. L’action au toucher ne change pas.","marker.value_source.help.aria":"Aide : source de la valeur dans le marqueur","marker.value_source_auto":"Automatique (comme avant)","marker.value_source_missing_hint":"La source enregistrée est indisponible. Le marqueur affiche — jusqu’à son retour ou jusqu’au choix d’une autre valeur.","marker.light_role_label":"Cet appareil est-il une source lumineuse ?","marker.light_role.help":"« Auto » utilise le rôle déterminé de l’appareil lié, « Toujours » force sa propre source et « Jamais » l’exclut ; les lumières liées ci-dessus restent indépendantes.","marker.light_role.help.aria":"Aide : cet appareil est-il une source lumineuse","marker.light_role_auto_yes":"Auto (source lumineuse)","marker.light_role_auto_no":"Auto (pas une source lumineuse)","marker.light_role_always":"Toujours une source lumineuse","marker.light_role_never":"Jamais une source lumineuse","marker.light_entity_label":"Entité lumineuse principale","marker.light_entity.help":"Pour un appareil composite, choisissez l’entité dont l’état, la couleur et la luminosité représentent cette source sur le plan. Le choix automatique reste compatible avec les anciens plans.","marker.light_entity.help.aria":"Aide : entité lumineuse principale","marker.light_entity_auto":"Automatique ({entity})","marker.light_entity_none":"aucune entité contrôlable","marker.light_entity_missing":"L’entité enregistrée {entity} est indisponible. House Plan utilise temporairement {fallback} ; le choix enregistré sera restauré si elle revient.","marker.toggle_entity_label":"Entité à basculer","marker.toggle_entity.help":"Pour un appareil composite, choisissez précisément la lumière ou l’interrupteur propre à actionner par un toucher. Automatique conserve les règles de cible précédentes et reste indépendant de l’entité lumineuse principale.","marker.toggle_entity.help.aria":"Aide : entité à basculer","marker.toggle_entity_auto":"Automatique ({entity})","marker.toggle_entity_none":"aucune entité propre contrôlable","marker.toggle_entity_missing":"L’entité enregistrée {entity} ne fait plus partie des canaux sélectionnables de ce marqueur. House Plan utilise temporairement {fallback} ; le choix enregistré sera restauré si elle revient.","marker.glow_color_label":"Couleur et luminosité du halo","marker.glow_mode.help":"Utilisez les valeurs en direct de la source, remplacez uniquement sa couleur ou fixez à la fois la couleur et la luminosité. Le minimum est 1 % ; pour désactiver la source, choisissez « Jamais ».","marker.glow_mode.help.aria":"Aide : couleur et luminosité du halo","marker.glow_mode_auto":"Depuis la source","marker.glow_mode_color":"Définir la couleur","marker.glow_mode_fixed":"Définir la couleur et la luminosité","marker.glow_color":"Couleur du halo","marker.glow_brightness":"Luminosité","marker.glow_disabled_never":"Les paramètres du halo sont indisponibles car ce marqueur est explicitement défini comme n’étant pas une source lumineuse.","marker.glow_disabled_auto":"Le mode Auto n’a trouvé aucune source lumineuse spatiale pour ce marqueur.","marker.glow_disabled_no_entity":"Aucune entité Home Assistant contrôlable et active n’est disponible pour cette source spatiale.","marker.glow_passive_hint":"Cette source ne possède aucune donnée Home Assistant propre. Définissez manuellement sa couleur et sa luminosité ; son rayon reste disponible.","marker.control_broken":"La source enregistrée est absente ou n’est plus marquée comme lumière","marker.control_missing_label":"Lumière du plan manquante","marker.control_passive":"source passive","toast.marker_control_cycle":"Ce lien créerait une chaîne circulaire de contrôles de lumière.","toast.marker_binding_required":"Choisissez un appareil Home Assistant avant de lier une autre source lumineuse.","confirm.unlock_title":"Déverrouiller ?","confirm.unlock_body":"House Plan enverra une commande de déverrouillage à cette serrure.","toast.files_migrate_failed":"Les pièces jointes n’ont pas pu être déplacées vers la nouvelle association ; les liens continuent de pointer vers les anciens fichiers : {err}","space.pick_saved":"Déjà importé","space.pick_saved_hint":"Plans stockés sur le serveur, y compris ceux que vous avez précédemment dissociés","space.no_saved":"Aucun plan n’est encore stocké sur le serveur.","space.loading":"Chargement…","space.used_by":"utilisé par : {list}","space.in_use":"Un espace utilise encore ce plan — dissociez-le d’abord","btn.use":"Utiliser","confirm.delete_plan_title":"Supprimer le fichier du plan ?","confirm.delete_plan_body":"Le fichier sera supprimé du serveur. Cette action est irréversible.","toast.plans_list_failed":"Impossible de lister les plans stockés : {err}","toast.plan_delete_failed":"Impossible de supprimer le plan : {err}","marker.hide":"Masquer","marker.hide_tip":"L’appareil disparaîtra du plan après l’enregistrement mais continuera de compter dans le signal de la pièce. Restaurez-le via « Masqués et désactivés » dans l’éditeur d’appareils.","marker.show":"Afficher","marker.show_tip":"L’appareil apparaîtra de nouveau sur le plan après l’enregistrement.","marker.hidden_ghost":"Appareil masqué par l’utilisateur","marker.ha_disabled_device":"L’appareil est désactivé dans Home Assistant et masqué du plan.","marker.ha_disabled_entity":"L’entité est désactivée dans Home Assistant et masquée du plan.","marker.ha_disabled_all_entities":"L’appareil n’a aucune entité Home Assistant active ; il est donc masqué du plan.","marker.ha_registry_limited":"Le registre Home Assistant complet n’est pas accessible à cet utilisateur. L’objet non vérifié ne peut pas être affiché ni utilisé pour le moment.","marker.delete_tip":"Supprimer complètement l’appareil du plan et de tous les agrégats. Vous pourrez l’ajouter de nouveau plus tard.","tap.run":"Exécuter une automatisation/un script/une scène","tap.none":"Ne rien faire","marker.run_target_label":"Élément à exécuter","marker.run_search_ph":"Rechercher : automatisation, script ou scène…","marker.run_target_gone":"Cible {id} introuvable — choisissez-en une autre","marker.tap_confirm":"Demander une confirmation","marker.tap_confirm_tip":"Afficher une boîte de dialogue de confirmation avant l’action — protection contre les appuis accidentels.","marker.toggle_hint_single":"Cible : {name} ({id}).","marker.virtual_light_target":"Lumière virtuelle : {name}.","marker.virtual_light_current":"État manuel : {state} → {effect}.","marker.virtual_light_state_on":"allumé","marker.virtual_light_state_off":"éteint","marker.toggle_hint_group":"Basculera {count} source(s) : {names}.","marker.toggle_hint_current":"Actuellement : {state} → {effect}.","marker.toggle_hint_group_current":"Actuellement allumées : {on} sur {count} → {effect}.","marker.toggle_hint_skipped":"Seront ignorées ({count}) : {targets}.","marker.toggle_effect_turn_on":"sera allumé","marker.toggle_effect_turn_off":"sera éteint","marker.toggle_effect_open":"sera ouvert","marker.toggle_effect_close":"sera fermé","marker.toggle_effect_stop":"sera arrêté","marker.toggle_effect_toggle":"l’état sera basculé","marker.toggle_skip_missing":"introuvable","marker.toggle_skip_ha_disabled":"désactivé dans HA","marker.toggle_skip_unavailable":"indisponible","marker.toggle_skip_unsupported":"basculement non pris en charge","marker.toggle_skip_secure":"bloqué pour des raisons de sécurité","marker.toggle_none_no_binding":"Cet appareil n’a aucune association ; il n’y a donc aucun état à basculer. Un toucher ne fera rien.","marker.toggle_none_no_actionable_entity":"Cet appareil n’a aucun état pouvant être basculé. Un toucher ne fera rien.","marker.toggle_none_configured_targets_missing":"Les cibles configurées sont indisponibles. L’entité propre de l’appareil ne leur sera pas substituée.","marker.toggle_none_ha_disabled":"La cible est désactivée dans Home Assistant et ne peut pas être utilisée sur le plan.","marker.toggle_none_unavailable":"La cible est actuellement indisponible. Un toucher ne fera rien.","marker.toggle_none_unsupported":"Home Assistant n’expose aucune opération de basculement sûre pour cette entité. Un toucher ne fera rien.","marker.toggle_none_secure":"Le basculement des serrures, alarmes et portails sécurisés depuis le plan est bloqué pour des raisons de sécurité.","run.automation":"automatisation","run.script":"script","run.scene":"scène","confirm.tap_run":"Exécuter « {name} » ?","confirm.tap_toggle":"Basculer « {name} » ?","confirm.current_state":"État actuel : {state}","confirm.expected_state":"Après basculement : {state}","confirm.group_current":"{on} allumé(s) sur {total}","confirm.group_all_on":"tout est allumé","confirm.group_all_off":"tout est éteint","confirm.unavailable_targets":"Indisponibles : {count}","confirm.expected_by_ha":"Home Assistant déterminera l’état","confirm.state_on":"Allumé","confirm.state_off":"Éteint","confirm.state_open":"Ouvert","confirm.state_closed":"Fermé","confirm.state_opening":"Ouverture en cours","confirm.state_closing":"Fermeture en cours","confirm.state_stopped":"Arrêté","confirm.state_unknown":"Inconnu","toast.run_started":"Démarré : {name}","toast.run_target_missing":"Cible d’exécution introuvable — vérifiez les paramètres de l’appareil","toast.run_target_required":"Choisissez une automatisation, un script ou une scène","toast.tap_target_changed":"La cible de l’action a changé. Réessayez.","toast.virtual_light_toggle_failed":"Impossible de basculer la lumière virtuelle : {err}","toast.value_badge_source_required":"Choisissez une valeur pour le badge","btn.run":"Exécuter","vac.section":"Robot aspirateur : position en direct","vac.autocal":"Configurer automatiquement","vac.live":"Position en direct sur le plan","vac.trail":"Afficher le trajet du robot","vac.autocal_no_rooms":"L’intégration ne fournit aucune liste de pièces — ouvrez « Ajuster manuellement »","vac.route_warn_unmapped":"Le robot nettoie une carte qui n'est assignée à aucun étage","vac.route_warn_needs_calibration":"La carte est assignée à un étage mais n'est pas calibrée","vac.route_warn_ambiguous":"Deux cartes sont indiscernables — aucun étage choisi","vac.route_warn_missing_space":"L'espace de cette carte a été supprimé","vac.autocal_no_match":"Les noms de pièces ne correspondent pas (il en faut ≥3 en commun) — ouvrez « Ajuster manuellement »","vac.autocal_done":"Terminé : association via {rooms} pièces. Lancez un nettoyage et vérifiez","vac.cal_need_pos":"Le robot ne transmet pas de coordonnées — lancez un nettoyage puis mettez-le en pause","vac.cal_done":"Calibration enregistrée. Lancez un nettoyage et vérifiez","vac.cal_cancelled":"Calibration annulée","vac.fit":"Ajuster manuellement","vac.fit_hint":"Faites glisser la carte du robot pour la positionner, étirez-la par les coins","vac.fit_rotate":"Rotation de 90°","vac.fit_mirror":"Miroir","vac.trail_never":"Jamais","vac.trail_cleaning":"Pendant le nettoyage","vac.trail_always":"Toujours","gs.bg_group":"Arrière-plan de la scène","gs.bg_color":"Arrière-plan autour du plan","gs.bg_default":"Valeur par défaut du thème","gs.bg_theme":"valeur par défaut du thème","gs.bg_mode":"Arrière-plan du plan","gs.bg_mode.help":"« Suit le soleil » utilise sun.sun ou, à défaut, l’heure locale du navigateur ; « Couleur statique » affiche toujours la couleur choisie.","gs.bg_mode.help.aria":"Aide : arrière-plan général du plan","gs.bg_static":"Couleur statique","gs.bg_daynight":"Suit le soleil","gs.sun_group":"Soleil","gs.sun_missing":"L’entité sun.sun est introuvable — l’arrière-plan suit votre heure locale ; les rayons de soleil par les fenêtres sont indisponibles.","gs.north":"Nord sur le plan","gs.north.help":"L’angle se mesure dans le sens horaire depuis la verticale supérieure du plan ; le nord sert aux rayons des fenêtres, pas à l’arrière-plan « Suit le soleil ».","gs.north.help.aria":"Aide : direction générale du nord","gs.north_ph":"non défini","gs.north_clear":"Effacer","gs.north_letter":"N","gs.sun_rays":"Lumière du soleil à travers les fenêtres","gs.sun_ray_origin":"Rayons du soleil","gs.sun_ray_origin.inner":"Depuis les angles intérieurs des fenêtres","gs.sun_ray_origin.outer":"Depuis les angles extérieurs des fenêtres","gs.about_version":"Houseplan Card v{v}","gs.about_github":"GitHub · documentation et problèmes","gs.about_telegram":"Discussion Telegram","support.title":"Aide et commentaires","space.bg_color":"Arrière-plan autour du plan","space.bg_inherit":"Hériter des paramètres généraux","space.bg_inherited":"hérite des paramètres généraux","space.bg_mode":"Arrière-plan du plan","space.bg_mode.help":"Héritez de l’arrière-plan général ou remplacez-le pour cet espace par une couleur statique ou le mode « Suit le soleil ».","space.bg_mode.help.aria":"Aide : arrière-plan de l’espace","space.north":"Nord sur le plan (remplacement)","space.north.help":"Remplace le nord général pour cet espace ; l’angle se mesure dans le sens horaire depuis la verticale supérieure du plan et sert aux rayons des fenêtres.","space.north.help.aria":"Aide : nord de cet espace","space.north_inherited":"hérité : {v}","space.sun_rays":"Lumière du soleil à travers les fenêtres","space.sun_inherit":"Hériter des paramètres généraux","space.sun_on":"Activé","space.sun_off":"Désactivé","canvas.far_objects":"{n} objet(s) éloigné(s) du plan","canvas.show_far":"Afficher","canvas.home_tip":"Le plan est là-bas — cliquez pour l’ajuster à l’écran","gs.grid_group":"Maintenance du plan","gs.grid_hint":"Met à jour les modèles de données, aligne les éléments du plan sur la grille et fusionne les fragments de murs redondants. Un rapport précis est affiché avant tout enregistrement.","gs.align_all":"Optimiser les plans","gs.align_title":"Optimiser les plans","gs.align_none":"Tous les plans utilisent déjà le modèle de données optimisé actuel.","gs.optimize_no_automatic_changes":"Aucune modification automatique n’est à appliquer. Vérifiez les éléments ci-dessous.","gs.align_count":"{n} élément(s) sur {total} seront déplacés, de {cm} cm au maximum.","gs.align_where":"Le plus grand déplacement se trouve dans « {s} ».","gs.align_turned":"Ouvertures dont l’angle est corrigé : {n}.","gs.align_preflight_failed":"Impossible de vérifier en toute sécurité la géométrie des espaces suivants : {spaces}{more}.","gs.align_preflight_hint":"Les plans n’ont pas été modifiés. Copiez les diagnostics avec le bouton ci-dessous et joignez-les au rapport de bug avec un export de l’espace.","gs.preflight_reason_prepare-exception":"Impossible de préparer la géométrie de l’espace (exception lors de la construction du modèle)","gs.preflight_reason_wall-null":"Le corps du mur n’a pas pu être construit (l’union a renvoyé un résultat vide)","gs.preflight_reason_wall-degraded-extra":"Le corps du mur s’est dégradé avec une géométrie supplémentaire","gs.preflight_reason_wall-failed-core":"Le noyau du corps du mur n’a pas pu être assemblé","gs.preflight_reason_wall-exception":"La construction du mur a déclenché une exception","gs.preflight_reason_floor-null":"Le contour du sol n’a pas pu être construit","gs.preflight_reason_floor-exception":"La construction du sol a déclenché une exception","gs.preflight_copy":"Copier les diagnostics","gs.preflight_copied":"Diagnostics copiés","gs.preflight_update_hint":"Les versions de la carte et de l’intégration diffèrent — mettez House Plan à jour puis réessayez.","gs.align_preflight_space":"Espace {n}","gs.align_preflight_more":", et {n} de plus","gs.optimize_changes":"Migrations de modèle : {m} ; espaces mis à jour : {c} ; valeurs de coordonnées parasites supprimées : {p} ; fragments de murs réels fusionnés : {w} ; fragments de murs d’épaisseur nulle fusionnés : {s} ; murs indépendants : {i}.","gs.zero_walls_migrated":"Portions de murs virtuels converties : {n}.","gs.wall_segments_migrated":"Segments de murs stabilisés : {n}.","gs.room_drafts_migrated":"Contours inachevés convertis en murs ordinaires : {drafts} ; segments : {segments}.","gs.optimize_lattice_summary":"Valeurs de coordonnées parasites normalisées : {n} ; déplacement maximal : {cm} cm.","gs.optimize_lattice_space":"{space} : valeurs de coordonnées normalisées : {n} ; valeurs hors grille laissées inchangées : {far}.","gs.optimize_coincident_partitions":"Sections de murs indépendants masquées absorbées dans les murs des pièces : {n}.","gs.optimize_openings_rehosted":"Ouvertures rattachées aux murs des pièces : {n}.","gs.optimize_walls_straightened":"Murs redressés : {n} ; déplacement maximal : {cm} cm.","gs.optimize_walls_straightened_where":"Plus grande correction de mur : {s}.","gs.optimize_walls_straighten_skipped":"Murs proches d’un axe laissés inchangés car ils ne pouvaient pas être réparés en toute sécurité : {n}.","gs.optimize_glow_migration":"Ancien mode Glow : {spaces} espaces → aucun remplissage de données + Glow indépendant ; {rooms} pièces → remplissage de données hérité + Glow indépendant.","gs.optimize_references":"Références réparées : espaces — {spaces} ; pièces — {rooms} ; positions — {positions} ; appareils dissociés des espaces manquants — {detached}.","gs.optimize_reference_more":", et {n} de plus","gs.optimize_orphans_removed":"Enregistrements oubliés supprimés : {total} — étiquettes de pièces : {rooms} ; appareils : {devices} ; marqueurs de groupe : {groups}. Ils appartenaient à des espaces supprimés précédemment.","gs.optimize_live_positions":"Anciennes positions dans des espaces supprimés appartenant à des objets existants : {n}{names}. Elles seront conservées.","gs.optimize_live_positions_remove":"Anciennes positions dans des espaces supprimés appartenant à des objets existants : {n}{names}. Elles sont sélectionnées pour suppression.","gs.optimize_live_names":" : {names}{more}","gs.optimize_live_remove":"Supprimer les anciennes positions","gs.optimize_live_keep":"Conserver les anciennes positions","gs.optimize_live_selected":"Les anciennes positions seront supprimées après l’application de l’optimisation.","gs.optimize_unverified":"Impossible de vérifier en toute sécurité les positions : {n}. Elles ont été laissées inchangées.","gs.optimize_registry_limited":"Un accès administrateur complet aux registres Home Assistant est requis pour une vérification sûre.","gs.optimize_vacuum_warning":"Associations de pièces d’aspirateur nécessitant encore une vérification : {n}.","gs.optimize_details":"Détails","gs.optimize_details_more":"Et {n} enregistrement(s) de plus.","gs.optimize_detail_removed":"sera supprimé","gs.optimize_detail_live":"sera conservé","gs.optimize_detail_unverified":"non vérifié","gs.optimize_detail_room_label":"étiquette de pièce","gs.optimize_detail_device":"appareil","gs.optimize_detail_group":"marqueur de groupe","gs.optimize_detail_unknown":"propriétaire inconnu","gs.optimize_detail_item":"{status} : {kind} {id} ; ancien espace {space}","gs.align_warn":"Les éléments volontairement placés entre les nœuds de la grille seront déplacés. Une seule annulation est disponible après l’opération, uniquement jusqu’à la prochaine modification du plan.","gs.align_run":"Optimiser","gs.align_done":"Plans optimisés : {n} élément(s) déplacé(s), {m} enregistrement(s) maintenu(s), {r} référence(s) réparée(s)","gs.optimize_undo":"Annuler la dernière optimisation","gs.optimize_undone":"La dernière optimisation a été annulée","decor.furniture":"Mobilier","decor.image":"Image","decor.image_title":"Images personnalisées","decor.image_upload":"Importer une image","decor.image_replace":"Remplacer l’image","decor.image_uploading":"Importation…","decor.image_asset":"Fichier image","decor.image_pick_hint":"Importez une image ou choisissez-en une existante.","decor.image_place_hint":"Cliquez sur le plan pour placer l’image.","decor.image_none":"Aucune image importée pour le moment.","decor.image_unavailable":"Image indisponible","decor.image_used":"Utilisée dans {n} objets","decor.image_upload_failed":"Impossible d’importer l’image : {err}","decor.image_error_capacity":"Le stockage des images personnalisées est plein.","decor.image_in_use":"Supprimez toutes les copies placées avant ce fichier.","decor.image_delete_title":"Supprimer le fichier image ?","decor.image_delete_message":"Supprimer « {name} » de House Plan ? Cette action est irréversible.","furn.title":"Bibliothèque de mobilier","furn.symbol":"Symbole","furn.group_furniture":"Mobilier","furn.group_appliance":"Électroménager","furn.group_sanitary":"Sanitaires","furn.group_other":"Autre","furn.width":"Largeur","furn.depth":"Profondeur","furn.back_to_categories":"Toutes les catégories","furn.pick_hint":"Choisissez un symbole, puis cliquez sur le plan.","furn.place_hint":"Cliquez sur le plan — le meuble se place contre le mur le plus proche. Maj permet un placement libre.","furn.cat_air_conditioner":"Climatiseurs","furn.cat_armchair":"Fauteuils","furn.cat_bathtub":"Baignoires","furn.cat_bed":"Lits","furn.cat_bidet":"Bidets","furn.cat_boiler":"Chauffe-eau","furn.cat_chair":"Chaises","furn.cat_coffee_table":"Tables basses","furn.cat_cooktop":"Plaques de cuisson","furn.cat_dining_table":"Tables à manger","furn.cat_dishwasher":"Lave-vaisselle","furn.cat_dryer":"Sèche-linge","furn.cat_fireplace":"Cheminées","furn.cat_fridge":"Réfrigérateurs","furn.cat_kitchen_cabinet":"Meubles de cuisine","furn.cat_kitchen_sink":"Éviers de cuisine","furn.cat_nightstand":"Meubles","furn.cat_plant":"Plantes","furn.cat_rug":"Tapis","furn.cat_shelving":"Étagères","furn.cat_shower":"Douches","furn.cat_sink":"Lavabos","furn.cat_sofa":"Canapés","furn.cat_stairs":"Escaliers","furn.cat_toilet":"Toilettes","furn.cat_tv":"Téléviseurs","furn.cat_wardrobe":"Armoires","furn.cat_washer":"Lave-linge","furn.cat_work_table":"Bureaux","furn.sym_sofa":"Canapé","furn.sym_sofa_three_seat":"Canapé trois places","furn.sym_sofa_corner_right":"Canapé d'angle droit","furn.sym_armchair":"Fauteuil","furn.sym_armchair_office":"Chaise de bureau","furn.sym_coffee_table":"Table basse","furn.sym_coffee_table_round":"Table basse ronde","furn.sym_coffee_table_oval":"Table basse ovale","furn.sym_coffee_table_rounded":"Table basse arrondie","furn.sym_table_dining":"Table à manger","furn.sym_table_round":"Table ronde","furn.sym_table_dining_oval":"Table à manger ovale","furn.sym_table_dining_rounded":"Table à manger arrondie","furn.sym_chair":"Chaise","furn.sym_chair_bar":"Tabouret de bar","furn.sym_desk":"Bureau","furn.sym_desk_corner":"Bureau d'angle","furn.sym_bed_double":"Lit double","furn.sym_bed_single":"Lit simple","furn.sym_nightstand":"Table de chevet","furn.sym_cabinet_tv":"Meuble TV","furn.sym_cabinet_shoe":"Meuble à chaussures","furn.sym_cabinet_sink":"Meuble sous lavabo","furn.sym_wardrobe":"Armoire","furn.sym_bookshelf":"Bibliothèque","furn.sym_wall_unit":"Élément mural","furn.sym_kitchen_floor":"Module de cuisine bas","furn.sym_kitchen_floor_corner":"Module de cuisine bas d'angle","furn.sym_kitchen_wall":"Module de cuisine haut","furn.sym_kitchen_wall_corner":"Module de cuisine haut d'angle","furn.sym_shelf_floor":"Étagère au sol","furn.sym_shelf_wall":"Étagère murale","furn.sym_fridge":"Réfrigérateur","furn.sym_stove":"Cuisinière","furn.sym_cooktop_two":"Plaque à deux feux","furn.sym_dishwasher":"Lave-vaisselle","furn.sym_washer":"Lave-linge","furn.sym_dryer":"Sèche-linge","furn.sym_tv":"Téléviseur","furn.sym_tv_wall":"Téléviseur mural","furn.sym_ac":"Climatiseur","furn.sym_water_heater":"Chauffe-eau","furn.sym_toilet":"Toilettes","furn.sym_toilet_built_in":"Toilettes suspendues","furn.sym_bathtub":"Baignoire","furn.sym_bathtub_corner":"Baignoire d'angle","furn.sym_shower":"Douche","furn.sym_sink":"Lavabo","furn.sym_kitchen_sink":"Évier de cuisine","furn.sym_kitchen_sink_double":"Évier de cuisine double","furn.sym_bidet":"Bidet","furn.sym_bidet_built_in":"Bidet suspendu","furn.sym_stairs":"Escalier","furn.sym_fireplace":"Cheminée","furn.sym_plant":"Plante","furn.sym_rug":"Tapis","common.yes":"Oui","common.no":"Non","vac.diag_source":"Source","vac.diag_platform":"Intégration","vac.diag_status":"État","vac.diag_position":"Position","vac.diag_rooms":"Pièces","vac.diag_rooms_value":"{total} · {matched} noms correspondent · {readiness}","vac.autocal_ready":"calibration automatique disponible","vac.autocal_not_ready":"3 noms correspondants requis","vac.diag_path":"Chemin de l’intégration","vac.diag_map":"ID de carte","vac.source_none":"non sélectionné","vac.source_status_ok":"Prêt","vac.source_status_missing":"Manquant","vac.source_status_disabled":"Désactivé dans Home Assistant","vac.source_status_unavailable":"Indisponible","vac.source_status_unverified":"Impossible à vérifier avec les autorisations actuelles","vac.source_status_unsupported":"Aucune donnée de position","vac.source_status_none":"Aucune source","vac.source_banner_missing":"La source enregistrée n’existe plus. Elle n’a pas été remplacée automatiquement ; choisissez une autre source ou restaurez-la dans Home Assistant.","vac.source_banner_disabled":"La source enregistrée est désactivée dans Home Assistant. Activez-la ou choisissez une autre source.","vac.source_banner_unverified":"Les autorisations Home Assistant actuelles ne permettent pas de vérifier cette source enregistrée. Elle reste épinglée et ne sera pas remplacée automatiquement.","vac.choose_source":"Choisir la source","vac.source_auto":"Automatique","vac.source_auto_hint":"Utiliser une entité compatible de cet appareil","vac.all_cameras":"Toutes les caméras","vac.all_cameras_warn":"Une caméra peut ne pas fournir de données du robot. Choisissez-en une uniquement s’il s’agit de la carte de votre aspirateur.","vac.all_cameras_empty":"Aucune autre entité caméra trouvée.","vac.platform_unknown":"intégration inconnue","vac.cap_position":"position","vac.cap_rooms_short":"pièces","vac.cap_path":"trajet","vac.cap_map":"ID de carte","vac.cap_none":"aucune donnée de robot détectée","vac.xcme_hint":"Activez ces attributs Xiaomi Cloud Map Extractor :","vac.documentation":"Documentation","vac.residual_title":"Vérifier la calibration automatique","vac.residual_message":"Les pièces correspondantes présentent un écart maximal de {error}. Appliquez cette calibration approximative, affinez-la manuellement ou annulez sans modifier la configuration enregistrée.","vac.apply_proposal":"Appliquer","gs.backup_group":"Sauvegarde et transfert","gs.backup_hint":"Téléchargez une sauvegarde JSON portable ou prévisualisez et importez une sauvegarde créée par House Plan.","backup.export_open":"Exporter","backup.import_open":"Importer","backup.export_title":"Exporter House Plan","backup.import_title":"Importer House Plan","backup.export_hint":"Choisissez si la sauvegarde doit contenir toute la configuration House Plan ou uniquement l’espace actuel.","backup.full":"Sauvegarde complète","backup.current_space":"Espace actuel","backup.current_space_title":"Espace actuel : {title}","backup.no_current_space":"Aucun espace actuel","backup.plan_only":"Plan uniquement","backup.plan_only_hint":"Conserver les pièces, murs, ouvertures, décorations et positions des étiquettes de pièces sans les appareils ni les associations Home Assistant.","backup.plan_only_preview":"Ce fichier contient uniquement le plan","backup.privacy_warning":"L’archive conserve les noms, identifiants Home Assistant et coordonnées exactes. Les plans internes et pièces jointes sont référencés, pas intégrés ; les états d’exécution et trajets d’aspirateur ne sont pas inclus.","backup.download":"Télécharger le JSON","backup.export_done":"Sauvegarde téléchargée","backup.reading":"Vérification de la sauvegarde…","backup.revalidated":"Le plan a changé depuis cet aperçu. Le résumé a été actualisé ; vérifiez-le et confirmez de nouveau.","backup.error.support_invalid_message":"Vérifiez le message d’assistance et réessayez.","backup.error.support_package_too_large":"Le paquet d’assistance anonymisé dépasse la limite de 8 Mio.","backup.error.support_preview_expired":"L’aperçu de la pièce jointe d’assistance a expiré ou n’est plus disponible.","backup.error.support_rate_limited":"Trop de rapports ou d’aperçus d’assistance ont été demandés. Réessayez plus tard.","backup.error.support_rejected":"Le rapport n’a pas passé la validation du service d’assistance.","backup.error.support_unavailable":"Le service d’assistance privé est temporairement indisponible.","backup.error.unauthorized":"Vous n’avez pas l’autorisation d’exporter ou d’importer ce plan.","backup.error.not_ready":"House Plan n’est pas encore prêt. Réessayez dans un instant.","backup.error.too_large":"La sauvegarde dépasse la limite de 8 Mio.","backup.error.invalid_json":"Le fichier sélectionné n’est pas un JSON valide.","backup.error.invalid_format":"Le fichier sélectionné n’est pas une sauvegarde House Plan.","backup.error.invalid_image":"L’image est endommagée ou ne correspond pas à son format.","backup.error.unsupported_export_version":"Ce format de sauvegarde n’est pas pris en charge par la version installée.","backup.error.unsupported_image":"Utilisez une image PNG, JPEG, WebP ou SVG prise en charge.","backup.error.future_model":"La sauvegarde a été créée avec un modèle de données House Plan plus récent.","backup.error.invalid_config":"La sauvegarde contient une configuration House Plan invalide.","backup.error.wall_model_migration_blocked":"Le modèle de murs de la sauvegarde n’a pas pu être mis à niveau en toute sécurité. Optimisez d’abord le plan source, puis exportez-le de nouveau.","backup.error.invalid_layout":"La sauvegarde contient des positions d’objets invalides.","backup.error.invalid_content":"La sauvegarde contient des références de contenu invalides ou incohérentes.","backup.error.space_not_found":"L’espace sélectionné n’existe plus.","backup.error.capacity_exceeded":"L’ajout de cette sauvegarde dépasserait les limites du plan.","backup.error.preview_expired":"L’aperçu a expiré. Sélectionnez de nouveau le fichier de sauvegarde.","backup.error.preview_owner_mismatch":"Cet aperçu appartient à un autre utilisateur Home Assistant.","backup.error.conflict":"Le plan a changé depuis l’aperçu. Vérifiez le résumé actualisé.","backup.error.content_confirmation_required":"Confirmez que le contenu local indisponible peut être dissocié.","backup.error.commit_failed":"La sauvegarde n’a pas pu être appliquée en toute sécurité. Le plan précédent a été restauré ou est en attente de récupération.","backup.error.missing_plan":"Un fichier de plan référencé a disparu depuis l’aperçu. Vérifiez de nouveau la sauvegarde.","backup.error.missing_content":"Une pièce jointe locale référencée a disparu depuis l’aperçu. Vérifiez de nouveau la sauvegarde.","backup.error.marker_control_missing":"Une lumière liée au plan est absente de la sauvegarde.","backup.error.marker_control_not_light":"Une cible liée au plan n’est plus marquée comme source lumineuse.","backup.error.marker_control_self":"Une source lumineuse ne peut pas se contrôler elle-même.","backup.error.marker_control_cycle":"La sauvegarde contient une chaîne circulaire de contrôles de lumière.","backup.error.duplicate_marker_control":"La sauvegarde contient un lien de lumière du plan en doublon.","backup.error.no_backup":"Aucun instantané d’importation ou d’optimisation n’est disponible à restaurer.","backup.error.in_use":"L'élément est encore utilisé","backup.error.invalid_data":"La requête contient des données invalides","backup.error.invalid_light_entity":"La lumière principale doit être une entité light.* ou switch.*","backup.error.invalid_marker_control":"Référence de contrôle de marqueur invalide","backup.error.invalid_name":"Le nom est invalide","backup.error.invalid_partition_opening_host":"L'ouverture doit conserver sa cloison porteuse","backup.error.invalid_partition_opening_jamb_margin":"L'ouverture ne laisse aucun jambage physique au bout du mur","backup.error.invalid_passage_fields":"Un passage ouvert ne peut pas porter de réglages de porte","backup.error.invalid_space_id":"Espace inconnu","backup.error.invalid_toggle_entity":"L'entité de bascule doit être light.* ou switch.*","backup.error.invalid_value_badge":"Réglages de badge de valeur invalides","backup.error.invalid_value_badge_attribute":"Attribut de badge de valeur invalide","backup.error.invalid_value_badge_position":"Position de badge de valeur invalide","backup.error.invalid_value_badge_source":"Source de badge de valeur invalide","backup.error.invalid_vacuum_map_route":"Vérifiez l'affectation des cartes du robot aux espaces.","backup.error.invalid_value_source":"Source de valeur invalide","backup.error.invalid_value_source_attribute":"Attribut de source de valeur invalide","backup.error.io_error":"Une opération de fichier a échoué sur le serveur","backup.error.not_toggleable":"Cet appareil ne peut pas être basculé","backup.error.nothing_to_repair":"Rien à réparer","backup.error.space_in_use":"L'espace est encore référencé","backup.error.value_badge_source_required":"Le badge de valeur nécessite une source","backup.error.wall_model_client_outdated":"Le plan a été mis à jour ailleurs — rechargez la page","backup.same_source":"Créée sur cette instance Home Assistant","backup.foreign_source":"Créée sur une autre instance Home Assistant","backup.created":"Créée : {value}","backup.versions":"Carte {card} ; intégration {integration} ; modèle de données {model}","backup.count_spaces":"Espaces : {n}","backup.count_rooms":"Pièces : {n}","backup.count_walls":"Murs : {n}","backup.count_openings":"Ouvertures : {n}","backup.count_decor":"Objets décoratifs : {n}","backup.count_markers":"Appareils : {n}","backup.count_layout":"Positions : {n}","backup.bindings":"Associations — appareils : {device}, entités : {entity}, virtuels : {virtual} ; positions sans espace : {legacy}","backup.binding_status":"État des cibles — actives : {active}, désactivées : {disabled}, manquantes : {missing}","backup.missing_areas":"Zones absentes sur la cible : {areas}","backup.dropped_marker_links":"Liens de lumières du plan hors de cet espace transféré omis : {n}.","backup.room_drafts_migrated":"Anciens contours inachevés convertis en murs ordinaires : {drafts} ; segments : {segments}.","backup.repaired_target_refs":"Références existantes restaurées par cet import d’espace : {n}.","backup.preserved_unresolved_refs":"Références qui n’ont pas pu être restaurées sans ambiguïté conservées : {n}.","backup.preserved_unresolved_hint":"Aucune donnée n’a été devinée ni supprimée. Après l’importation, lancez « Optimiser les plans » pour examiner les références restantes.","backup.import_details":"Détails des références d’importation","backup.import_detail.incoming_remapped":"Références mises à jour dans la copie importée : {n}","backup.import_detail.target_repaired":"Références existantes restaurées : {n}","backup.import_detail.preserved_unresolved":"Références non résolues conservées : {n}","backup.import_detail.collisions":"Conflits de destination conservés en toute sécurité : {n}","backup.import_detail.dropped_links":"Liens entrants omis selon les règles de transfert : {n}","backup.import_detail.bounded_lineages":"Identifiants trop imbriqués maintenus dans les limites : {n}","backup.replace_warning":"Cela remplace la configuration et la disposition actuelles. Les fichiers importés ne sont jamais supprimés. Une seule annulation reste disponible jusqu’à la prochaine modification du plan.","backup.foreign_bookkeeping":"Les données de suivi des appareils connus/nouveaux propres à l’instance ne seront pas importées.","backup.final_name":"Nom du nouvel espace","backup.target_settings":"Les paramètres généraux de l’instance cible restent inchangés.","backup.duplicates":"Associations déjà présentes : {n}","backup.skip":"Ignorer les appareils en doublon","backup.virtual_copy":"Ajouter des copies virtuelles statiques sûres","backup.content":"Contenu référencé","backup.decor_images_summary":"Images personnalisées : {objects} objets, {assets} fichiers ; fichiers absents : {missing}.","backup.content_available":"disponible localement","backup.content_external":"lien externe","backup.content_detach_required":"sera dissocié","backup.confirm_detach":"Je comprends que les plans internes et pièces jointes indisponibles seront dissociés de la configuration importée.","backup.confirm_missing_images":"Je comprends que les images personnalisées absentes resteront des espaces réservés réparables et que les autres fichiers locaux indisponibles seront dissociés.","backup.replace":"Remplacer","backup.add":"Ajouter un espace","backup.space_done":"Espace importé : {rooms} pièces, {markers} appareils, {refs} références existantes restaurées","backup.full_done":"Sauvegarde restaurée : {spaces} espaces, {rooms} pièces, {markers} appareils","backup.undo_import":"Annuler la dernière importation complète","backup.import_undone":"Importation complète annulée","backdrop.large_title":"Grande image","backdrop.large_body":"Cette image fait {w}×{h} (fichier de {fileMb} Mo) et nécessite environ {decodedMb} Mo de mémoire pour s'afficher. Sur tablette, cela peut faire planter la page.","backdrop.unknown_body":"Les dimensions de l'image n'ont pas pu être lues — le fichier est peut-être endommagé. Continuer peut faire planter la page sur tablette.","backdrop.reduced_dimensions":"Copie réduite : {w}×{h} px.","backdrop.use_downscaled":"Téléverser une copie réduite","backdrop.reducing":"Réduction…","backdrop.keep_original":"Conserver l'original","backdrop.too_large_title":"Image trop grande","backdrop.too_large_body":"Cette image dépasse ce que les navigateurs peuvent afficher ({w}×{h}, limite {limit} px par côté). Réduisez-la dans un éditeur de bureau puis téléversez-la à nouveau.","backdrop.downscale_failed":"Impossible de créer la copie réduite. Le plan actuel n'a pas été modifié."};const r="34d1dbfc181acaf58842dfced0e6aa3a899aef6b8d1eeba53732ef729a63137e";export{e as dictionary,r as fingerprint};
+globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="4da0d706a85c3f1c08ab6de960deb5feb08baaf9055265234e7bd1b554332653";var e={"editor.context_actions":"Actions : {object}","editor.tool_options":"Options de l’outil : {tool}","editor.palette":"Palette : {tool}","editor.open_group":"Groupe d’outils : {group}","editor.group_active":"{group} — actif : {item}","editor.disabled_action":"{action} est indisponible : {reason}","editor.loading":"Chargement de l'éditeur…","editor.loading_aria":"L'éditeur de plan est en cours de chargement","editor.load_failed":"Impossible de charger l'éditeur.","editor.refresh_advice":"Actualisez la page et réessayez.","editor.retry_advice":"Vérifiez votre connexion et appuyez à nouveau.","version_mismatch.title":"Les versions de House Plan ne correspondent pas","version_mismatch.body":"Si Home Assistant redémarre encore, attendez la fin, puis rechargez cette page.","version_mismatch.frontend":"Carte","version_mismatch.backend":"Intégration","version_mismatch.reload":"Recharger la page","color_picker.title":"Sélecteur de couleur","color_picker.hue":"Teinte","color_picker.saturation":"Saturation","color_picker.value":"Luminosité","color_picker.hex":"Couleur hexadécimale","color_picker.invalid_hex":"Saisissez une couleur hexadécimale à 3 ou 6 chiffres","color_picker.confirm":"OK","btn.properties":"Propriétés","btn.keep_as_walls":"Conserver comme murs","btn.delete_room_keep_walls":"Supprimer la pièce, conserver les murs","btn.delete_room_with_walls":"Supprimer la pièce et les murs","title.markup_select":"Sélectionner et modifier les murs et les colonnes","title.markup_column":"Colonne : cliquez sur un point de la grille pour placer une colonne carrée","markup.partition":"Cloison","markup.column":"Colonne","markup.hint_column":"cliquez sur un point de la grille pour placer une colonne carrée","history.wall_segment":"Ajouter un segment de mur","history.column_add":"Ajouter une colonne","history.physical_edit":"Modifier l’objet physique","history.physical_delete":"Supprimer l’objet physique","history.physical_move":"Déplacer l’objet physique","history.wall_face_batch":"Créer des pièces à partir des murs","toast.column_duplicate":"Une colonne avec le même centre et la même dimension extérieure existe déjà","physical.partition_properties":"Propriétés de la cloison","physical.column_properties":"Propriétés de la colonne","physical.shape":"Forme","physical.square":"Carré","physical.circle":"Cercle","physical.diameter":"Diamètre","physical.side":"Côté","physical.rotation":"Angle de rotation","physical.length":"Longueur","physical.allowed_range":"Autorisé : {min}–{max} {unit}","physical.column_size_title":"Côté extérieur de la colonne carrée placée par le clic (1–150 cm).","card.title":"Plan de la maison","count.devices":"{n} app.","empty.no_spaces":"Aucun espace pour le moment.","nav.spaces":"Espaces House Plan","empty.add_first":"Ajoutez le premier espace et importez un plan.","empty.read_only":"Aucun espace n’est configuré. Demandez à un administrateur d’en ajouter un.","empty.install":"Installez l’intégration House Plan et ajoutez-la dans « Appareils et services ».","btn.add_space":"Ajouter un espace","btn.cancel":"Annuler","btn.save":"Enregistrer","btn.close":"Fermer","btn.delete":"Supprimer","btn.copy":"Copier","btn.edit":"Modifier","btn.open_in_ha":"Ouvrir dans HA","btn.reset":"Réinitialiser","btn.attach":"Joindre…","btn.upload":"Importer…","btn.replace":"Remplacer…","title.zoom_in":"Zoomer","title.zoom_out":"Dézoomer","title.zoom_fit":"Tout ajuster","title.configure_space":"Configurer l’espace","title.add_space":"Ajouter un espace","title.markup_add":"Murs : tracez une chaîne continue ; chaque segment accepté est enregistré séparément. Maj verrouille à 45°","title.markup_merge":"Fusionner : cliquez sur une pièce, puis sur la pièce voisine avec laquelle elle partage un mur","title.markup_split":"Diviser une pièce : cliquez sur la pièce, puis sur deux points de ses murs","title.markup_delroom":"Supprimer une pièce : cliquez à l’intérieur de la pièce puis confirmez","title.need_plan":"Importer une image de plan","markup.add":"Murs","markup.merge":"Fusionner","markup.split":"Diviser","markup.resize":"Redimensionner","title.markup_resize":"Redimensionner les pièces : faites glisser une poignée disponible sur un mur horizontal ou vertical","markup.hint_resize":"faites glisser une poignée de mur disponible · le mur s’arrête à la première position non sûre · Échap annule · Ctrl+Z — annuler","resize.disabled.diagonal":"Ce mur est incliné ; le redimensionnement ne prend en charge que les murs horizontaux et verticaux","resize.disabled.side-angle":"Un mur adjacent est incliné ; le redimensionnement exige que les deux murs adjacents rencontrent ce mur à angle droit","resize.disabled.duplicate-physical-wall":"Une cloison distincte ou une colonne chevauche ce mur ; supprimez-la ou déplacez-la avant de redimensionner","resize.disabled.partial-shared":"Une pièce voisine n’utilise qu’une partie de ce mur ; il ne peut donc pas être déplacé en toute sécurité comme un mur partagé unique","resize.disabled.unequal-shared":"La pièce voisine utilise des extrémités ou une longueur de mur différentes ; les murs ne peuvent donc pas être déplacés ensemble en toute sécurité","resize.disabled.multiple-rooms":"Déplacer ce mur affecterait plus de deux pièces","resize.disabled.thickness-conflict":"L’épaisseur du mur ne peut pas être conservée en toute sécurité","resize.disabled.opening-conflict":"Une ouverture sur ce mur ne peut pas être déplacée en toute sécurité","resize.disabled.invalid-geometry":"Ce mur ne peut pas être redimensionné sans modifier la structure du plan","resize.limit_stopped":"Mur arrêté : l'étape suivante enfreindrait une limite de jonction","resize.commit_failed":"Le redimensionnement a été annulé car le plan final n’a pas passé le contrôle de géométrie","resize.preview_failed":"Le redimensionnement s’est arrêté à la dernière position sûre car la géométrie du plan ne pouvait pas être préservée","markup.opening":"Ouverture","markup.delete_room":"Supprimer la pièce","history.undo":"Annuler","history.redo":"Rétablir","history.undo_named":"Annuler : {name} (Ctrl+Z)","history.redo_named":"Rétablir : {name} (Ctrl+Maj+Z / Ctrl+Y)","history.undo_empty":"Rien à annuler","history.redo_empty":"Rien à rétablir","history.undone":"Annulé : {name}","history.redone":"Rétabli : {name}","history.add_room":"Créer une pièce","history.split_room":"Diviser la pièce","history.merge_rooms":"Fusionner les pièces","history.resize_room":"Redimensionner la pièce","history.wall_thickness":"Modifier l’épaisseur du mur","history.add_opening":"Ajouter une ouverture de porte ou de fenêtre","history.edit_opening":"Modifier l’ouverture","history.move_opening":"Déplacer l’ouverture","history.delete_opening":"Supprimer l’ouverture","history.delete_room_keep_walls":"Supprimer la pièce, conserver les murs","history.delete_room_with_walls":"Supprimer la pièce et les murs","history.decor_add":"Ajouter un objet décoratif","history.decor_edit":"Modifier l’objet décoratif","history.decor_move":"Déplacer l’objet décoratif","history.decor_transform":"Transformer l’objet décoratif","history.decor_delete":"Supprimer l’objet décoratif","history.backdrop_transform":"Transformer l’arrière-plan du plan","history.device_move":"Déplacer {name}","history.device_stale":"L’historique des positions n’est plus applicable et a été effacé","opening.new":"Nouvelle ouverture","opening.edit":"Ouverture","opening.door":"Porte","opening.window":"Fenêtre","opening.gate":"Portail","opening.passage":"Passage ouvert","opening.passage_binding_warning":"L’enregistrement supprimera le capteur d’ouverture/fermeture et la serrure.","opening.invalid_passage_fields":"Le passage ouvert du plan « {room} » possède des paramètres non pris en charge : {fields}.","opening.type_label":"Type","opening.length_label":"Longueur, cm","opening.contact_label":"Capteur d’ouverture/fermeture","opening.lock_label":"Serrure","opening.none":"— aucun —","opening.search_ph":"Rechercher : nom ou ID d’entité…","opening.invert":"Inverser ouvert/fermé","opening.flip_h":"Charnière sur l’autre montant","opening.flip_v":"Ouverture de l’autre côté","opening.open":"Ouvert","opening.closed":"Fermé","opening.locked":"Verrouillé","opening.unlocked":"Déverrouillé","opening.state_unknown":"indisponible","opening.no_entities":"Aucun capteur associé — symbole statique sur le plan.","toast.opening_no_wall":"Cliquez près d’un mur de pièce ou d’un mur indépendant","opening.host_partition":"Mur indépendant","opening.partition_orphan":"Le mur indépendant de cette ouverture n’existe plus","opening.partition_jamb_margin":"Laissez au moins {distance} entre l’ouverture et l’extrémité du mur","opening.rebind_partition":"Associer à un autre mur indépendant","confirm.delete_partition_openings_title":"Supprimer le mur et les ouvertures ?","confirm.delete_partition_openings_body":"Ce mur contient {count} ouverture(s). Elles seront supprimées avec lui.","confirm.delete_partition_openings_item":"• {type}, {length}","markup.hint_points":"points : {n} · Maj — pas de 45° · Échap — terminer la chaîne · Ctrl+Z — annuler un point · fermer une zone propose de créer une pièce","markup.hint_start":"cliquez sur un point de la grille pour commencer une chaîne de murs","tip.lqi":"signal Zigbee moyen :","tip.area":"surface : {value}","info.device_header":"Appareil sur le plan","info.model":"Modèle","info.state":"État","info.link":"Lien","info.manuals":"Manuels","info.none":"Aucune information supplémentaire","marker.new_device":"Nouvel appareil","marker.name_label":"Nom (affiché sur le plan)","marker.name_ph":"Nom","marker.binding_label":"Associer à un appareil HA","marker.binding_disabled":"désactivé dans Home Assistant","marker.virtual_option":"Appareil virtuel (sans association)","marker.search_ph":"Rechercher un appareil / groupe…","marker.nothing_found":"aucun résultat","marker.room_label":"Pièce","marker.room_override":" (placement forcé)","marker.room_choose":"— sélectionner une pièce —","marker.room_auto":"— selon la zone de l’appareil (auto) —","marker.icon_label":"Icône","marker.icon_ph":"mdi:… (vide = auto)","marker.display_label":"Affichage","display.badge":"Icône + état","display.icon_ripple":"Icône + état et activité","display.static_icon":"Icône toujours statique","display.value_static_icon":"Valeur + icône statique","marker.display_hint_badge":"L’icône et le fond dynamique affichent l’état de l’appareil sans la pulsation d’activité habituelle. Les alarmes rouges restent visibles.","marker.display_hint_icon_ripple":"L’icône, le fond dynamique et la pulsation affichent une brève animation pour les événements et une animation continue pour le fonctionnement, le mouvement ou la présence. Les alarmes rouges restent prioritaires.","marker.display_hint_value":"Une valeur Home Assistant sélectionnée ou résolue automatiquement remplace l’icône tandis que le fond continue d’indiquer l’état. Les alarmes rouges restent visibles.","marker.display_hint_static_icon":"Le contour adapté au thème et l’icône restent toujours identiques. L’état, l’activité, l’indisponibilité et les alarmes ne modifient pas l’apparence.","marker.display_hint_value_static_icon":"Le marqueur affiche la valeur choisie tandis que le contour reste adapté au thème. L’état, l’activité, l’indisponibilité et les alarmes ne modifient pas la couleur du marqueur.","marker.static_alarm_warning":"Cet appareil peut signaler des alarmes. L’affichage statique masque l’indication visuelle d’alarme du marqueur.","marker.preview.title":"Aperçu de l’affichage","marker.preview.actual":"Actuel","marker.preview.example":"Exemple","marker.preview.integration":"Fourni par","marker.preview.source":"Source d’affichage","marker.preview.current_state":"État actuel","marker.preview.result":"Sur le plan","marker.preview.details":"Détails de la source","marker.preview.select_source":"Choisissez un appareil ou une entité Home Assistant pour voir son affichage réel.","marker.preview.unknown_provider":"Intégration inconnue","marker.preview.virtual_provider":"House Plan · appareil virtuel","marker.preview.no_source":"Aucune source active","marker.preview.no_state":"Aucun état actuel","marker.preview.mixed_states":"Plusieurs états différents","marker.preview.multiple_sources":"{n} sources","marker.preview.more_sources":"+{n} de plus","marker.preview.scaled":"L’aperçu est redimensionné à {n}% pour tenir dans la zone. La taille enregistrée reste inchangée.","marker.preview.demo_short":"Afficher une activité brève","marker.preview.demo_continuous":"Afficher une activité continue","marker.preview.stop_continuous":"Arrêter l’activité continue","marker.preview.demo_short_notice":"Exemple d’activité brève ; l’état réel de l’appareil reste inchangé.","marker.preview.demo_continuous_notice":"Exemple d’activité continue ; l’état réel de l’appareil reste inchangé.","marker.preview.demo_already_visible":"L’état actuel affiche déjà un véritable effet d’activité ou d’alarme.","marker.preview.reduced_motion":"La réduction des animations est activée sur le système ; l’activité normale est donc affichée sous forme de point.","marker.preview.reason.neutral":"Fond sombre neutre","marker.preview.reason.working":"Fond jaune : l’appareil fonctionne actuellement","marker.preview.reason.working_activity":"Fond jaune et effet d’activité : l’appareil fonctionne actuellement","marker.preview.reason.open":"Fond orange : physiquement ouvert ou déverrouillé","marker.preview.reason.cover_icon_state":"Fond neutre ; l’entité de volet contrôle l’état et l’icône affichés","marker.preview.reason.presence":"Effet d’activité tant qu’une présence est détectée","marker.preview.reason.event":"Effet d’activité bref après un événement détecté","marker.preview.reason.transition":"Effet d’activité pendant que l’appareil se déplace ou change d’état","marker.preview.reason.media_neutral":"Les appareils multimédias restent sur un fond sombre neutre tant qu’ils sont disponibles","marker.preview.reason.unavailable":"Fond neutre atténué : indisponible ou éteint","marker.preview.reason.alarm":"Fond d’alarme rouge ; l’indication d’alarme est toujours affichée","marker.preview.reason.live_states_disabled":"Le style selon les états en direct est désactivé pour cette carte","marker.preview.reason.value_no_state":"Aucune valeur d’état exploitable ; l’icône est affichée à la place","marker.preview.reason.value_ambiguous_sources":"Plusieurs sources de valeur possibles ; l’icône est affichée à la place","marker.preview.reason.value_non_scalar":"La source n’a pas renvoyé de valeur simple ; l’icône est affichée à la place","marker.preview.reason.value_virtual":"Un appareil virtuel n’a aucune valeur Home Assistant ; l’icône est affichée à la place","marker.preview.reason.vacuum_live_plan_only":"La position et la trajectoire en direct de l’aspirateur ne sont disponibles que sur le plan complet","marker.preview.reason.hidden_design_preview":"L’appareil est masqué sur le plan ; cet aperçu de conception reste visible","marker.preview.reason.composite_power_source":"L’état provient de l’entité d’alimentation de l’appareil ; les interrupteurs auxiliaires sont ignorés","marker.preview.reason.activity_display_disabled":"Le mode d’affichage sélectionné n’affiche pas les effets d’activité habituels","marker.preview.reason.ha_disabled":"L’association Home Assistant est désactivée et sera masquée sur le plan","marker.preview.reason.orphaned":"L’association Home Assistant enregistrée est introuvable","marker.preview.reason.static_icon":"Mode statique : l’état de l’appareil ne modifie pas l’icône","marker.preview.reason.value_static_icon":"Mode statique avec valeur : l’état de l’appareil ne modifie pas la couleur du marqueur","marker.activity_color":"Couleur de la pulsation d’activité","marker.ripple_size":"Taille de la pulsation d’activité","marker.activity_alarm_note":"La couleur et la taille n’affectent que l’activité normale et ne modifient pas les alarmes rouges.","marker.pulse_a11y_alarm":"Alarme","marker.pulse_a11y_event":"Événement récent","marker.pulse_a11y_presence":"Présence détectée","marker.pulse_a11y_transition":"Changement d’état","marker.pulse_a11y_running":"En fonctionnement","marker.state_a11y_neutral":"État par défaut","marker.state_a11y_working":"En fonctionnement","marker.state_a11y_open":"Ouvert","marker.state_a11y_locked":"Verrouillé","marker.state_a11y_unlocked":"Déverrouillé","marker.state_a11y_alarm":"Alarme","marker.state_a11y_unavailable":"Indisponible","marker.lqi_a11y_low":"LQI {value}, signal faible","marker.lqi_a11y_mid":"LQI {value}, signal moyen","marker.lqi_a11y_high":"LQI {value}, signal fort","marker.size_label":"Taille / rotation de l’icône","marker.angle_label":"Rotation","marker.model_label":"Modèle","marker.model_ph":"ex. Aqara T&H","marker.link_label":"Lien","marker.desc_label":"Description","marker.desc_ph":"Notes, caractéristiques…","marker.manuals_label":"Manuels (PDF, etc.)","marker.sub_device":"appareil","marker.sub_z2m_group":" · groupe Z2M","marker.sub_group":"groupe","marker.sub_helper":"assistant","space.new":"Nouvel espace","space.copy_title":"Copier l’espace","space.copy_name":"Nom du nouvel espace","space.copy_fallback":"Espace","space.copy_create":"Créer la copie","space.copy_optimize_title":"Optimiser avant de copier ?","space.copy_optimize_body":"Avant de créer « {name} », House Plan doit optimiser tout le plan, y compris les autres espaces. Continuer ?","space.copy_optimize_confirm":"Optimiser et copier","space.copy_error_changed":"Le plan a changé pendant la confirmation. Vérifiez-le et réessayez.","space.copy_error_source_missing":"L’espace source n’existe plus. Rouvrez ses réglages et réessayez.","space.copy_error_source_invalid":"House Plan n’a pas pu valider tous les murs de cet espace. Corrigez l’espace source.","space.copy_error_spaces_limit":"House Plan contient déjà le nombre maximal d’espaces.","space.copy_error_partitions_limit":"Cet espace contient trop de murs pour être copié.","space.copy_error_openings_limit":"Cet espace contient trop d’ouvertures pour être copié.","space.copy_error_decor_limit":"Cet espace contient trop d’objets d’arrière-plan pour être copié.","space.copy_error_columns_limit":"Cet espace contient trop de colonnes pour être copié.","space.copy_error_opening_host":"Une ouverture n’est plus rattachée à un mur. Corrigez-la ou supprimez-la avant la copie.","space.copy_error_geometry":"La copie créerait une géométrie de murs non sûre. Corrigez l’espace source.","space.copy_error_optimize_geometry":"La copie est arrêtée car l’optimisation de tout le plan n’est pas sûre pour un espace.","space.header":"Espace","space.title_label":"Titre","space.title_ph":"ex. Garage","space.plan_label":"Plan (arrière-plan)","space.no_plan":"aucune image de plan","space.plan_alt":"plan","room.new":"Nouvelle pièce","room.name_label":"Nom affiché","room.name_ph":"ex. Terrasse","room.area_label":"Zone Home Assistant (non attribuée)","room.no_area_option":"— aucune zone —","room.default_name":"Pièce","device.unnamed":"sans nom","device.light_group":"groupe de lumières","device.fallback":"appareil","device.virtual":"appareil virtuel","confirm.delete_room_title":"Supprimer la pièce « {name} » ?","confirm.delete_room_body":"Choisissez si les murs physiques propres à la pièce doivent être conservés. Les murs partagés avec une autre pièce sont toujours conservés.","confirm.remove_marker_title":"Supprimer l’appareil du plan ?","confirm.remove_marker_body":"L’appareil disparaîtra complètement et ne contribuera plus aux données du plan. Vous pourrez l’ajouter de nouveau plus tard.","confirm.erase_decor":"Effacer l’objet {kind} ? Vous pouvez annuler cette action depuis l’historique de l’éditeur.","confirm.delete_space_title":"Supprimer l’espace ?","confirm.delete_space_body":"L’espace, toutes ses pièces et tout le tracé du plan seront supprimés.","confirm.delete_space_vac_routes":"Les affectations de cartes de robots seront aussi supprimées : {count}.","space.delete_blocked":"Cet espace est encore utilisé par {n} appareil(s). Déplacez-les vers un autre espace ou supprimez-les d’abord.","toast.pos_save_failed":"Échec de l’enregistrement de la position : {err}","toast.no_entity":"L’appareil n’a aucune entité adaptée","toast.ha_disabled_action":"Un objet Home Assistant désactivé ne peut pas être utilisé sur le plan.","toast.ha_disabled_show_device":"Un appareil désactivé dans Home Assistant ne peut pas être affiché sur le plan. Activez-le d’abord dans Home Assistant.","toast.ha_disabled_show_entity":"Une entité désactivée dans Home Assistant ne peut pas être affichée sur le plan. Activez-la d’abord dans Home Assistant.","toast.ha_disabled_add":"Un objet Home Assistant désactivé ne peut pas être ajouté au plan. Activez-le d’abord dans Home Assistant.","toast.ha_binding_unverified":"L’état de l’objet n’a pas pu être vérifié via le registre Home Assistant. L’affichage et les actions sont temporairement indisponibles.","toast.markup_needs_server":"Le tracé est disponible une fois la configuration déplacée sur le serveur","toast.space_order_changed":"L’ordre a changé. Si une carte fixe son étage par numéro, vérifiez ces tableaux de bord.","toast.conflict":"La configuration a été modifiée dans une autre fenêtre — données actualisées, répétez votre dernière action","toast.cfg_save_failed":"Échec de l’enregistrement de la configuration : {err}","toast.room_overlap":"Le contour chevauche la pièce « {name} » — les pièces ne doivent pas se chevaucher","toast.contour_cannot_close":"Le contour ne peut pas être fermé car il est dégénéré ou s’auto-intersecte","toast.merge_not_adjacent":"Seules les pièces partageant un mur peuvent être fusionnées","toast.rooms_merged":"Pièces fusionnées dans « {name} »","toast.split_pick_wall":"Commencez la découpe sur le mur de la pièce","toast.split_bad_cut":"La découpe doit aller d’un mur à l’autre à l’intérieur de la pièce, sans croiser de mur ni se croiser elle-même","merge.header":"Fusionner les pièces","merge.hint":"La pièce fusionnée conserve un nom et une zone. L’autre zone est libérée — ses appareils quittent le plan jusqu’à ce qu’une autre pièce la récupère.","merge.keep":"Conserver","merge.no_area":"aucune zone","toast.room_saved":"Pièce enregistrée ({n}). Appareils ajoutés : {added}. Tracez la suivante ou quittez le mode tracé.","toast.room_saved_no_area":"Pièce enregistrée ({n}, sans zone). Tracez la suivante ou quittez le mode tracé.","toast.marker_needs_server":"La modification des appareils est disponible une fois la configuration déplacée sur le serveur","toast.virtual_name_required":"Saisissez un nom pour l’appareil virtuel","toast.marker_saved":"Appareil enregistré","toast.marker_removed":"Appareil supprimé du plan","toast.integration_missing":"L’intégration House Plan n’est pas installée — gestion indisponible","toast.plan_formats":"Formats pris en charge : SVG, PNG, JPG, WebP","toast.plan_required":"Importez un plan — il est obligatoire","toast.space_added_onboard":"Espace ajouté. Tracez les pièces : cliquez sur les points de la grille et fermez le contour.","toast.space_added":"Espace ajouté","toast.space_copied":"Espace « {name} » créé","toast.space_saved":"Espace enregistré","toast.space_deleted":"Espace supprimé","toast.delete_failed":"Échec de la suppression : {err}","toast.error":"Erreur : {err}","toast.toggle_target_unavailable":"La cible « {name} » est indisponible — aucune action n’a été effectuée","toast.toggle_targets_unavailable":"Cibles indisponibles : {names}. Aucune action n’a été effectuée","toast.file_failed":"Le fichier « {name} » n’a pas été importé : {err}","toast.files_attached":"Fichiers joints : {n}","err.unknown":"erreur inconnue","err.code":"code {code}","err.too_large":"fichier supérieur à {mb} Mo","err.bad_ext":"type non pris en charge (PDF/image attendu)","err.unauthorized":"droits administrateur requis","editor.title":"Titre","editor.default_floor":"Espace initial","editor.default_floor_missing":"L’espace initial « {id} » n’existe plus. Choisissez un autre espace.","editor.floor":"Espace fixe","editor.floor_none":"— non fixé —","editor.floor_index":"Index YAML {index} (conservé)","fixed_floor.loading":"Chargement de l’espace fixe…","fixed_floor.invalid_title":"L’espace fixe est indisponible","fixed_floor.invalid_body":"Vérifiez floor dans la configuration de la carte. Valeur configurée : {value}","editor.icon_size":"Taille des icônes, % de la largeur du plan","editor.show_temperature":"Afficher la température","editor.live_states":"États en direct (on/off, ouvert…)","editor.light_pools":"Halos lumineux et ombres des murs","editor.show_signal":"Afficher le signal Zigbee (LQI)","editor.language":"Langue de l’interface","editor.lang_auto":"Auto (profil HA)","title.icon_rules":"Règles d’icônes : quelle icône MDI attribuer aux appareils selon leur nom","rules.title":"Règles d’icônes","rules.hint":"Les règles sont testées de haut en bas sur « nom de l’appareil + modèle » (expression régulière insensible à la casse) ; la première correspondance gagne. Si rien ne correspond, la classe d’appareil de l’entité est utilisée, puis l’icône générique.","rules.pattern_ph":"regex, ex. plug|socket","rules.icon_ph":"mdi:power-socket-de","rules.add":"Ajouter une règle","rules.reset":"Réinitialiser par défaut","rules.test_ph":"Tester un nom d’appareil…","rules.invalid":"expression régulière invalide","rules.saved":"Règles d’icônes enregistrées","btn.up":"Monter","btn.down":"Descendre","tap.info":"Fiche de l’appareil","tap.more_info":"Boîte de dialogue Plus d’infos de HA","tap.toggle":"Basculer l’état","marker.tap_label":"Action au toucher pour cet appareil","tap.toggle_note":"L’état déterminé est affiché ci-dessous. Les appareils sécurisés ne sont jamais basculés depuis le plan.","import.title":"Créer des espaces à partir des étages HA","import.hint":"Votre Home Assistant connaît déjà ces étages. Sélectionnez ceux à transformer en espaces du plan — vous importerez ensuite une image de plan pour chacun. Les pièces sont ensuite tracées manuellement sur le plan.","import.start":"Créer {n} espace(s)","import.manual":"Commencer de zéro","import.progress":"Étage {i} sur {n}","import.done":"Espaces créés. Tracez les pièces : cliquez sur les points de la grille et fermez le contour.","btn.skip":"Passer","space.scale_label":"Échelle (taille d’une cellule de grille)","space.cell_cm.help":"Relie la grille aux dimensions réelles : les longueurs, les surfaces, l’épaisseur des murs, la taille des ouvertures et le rayon du halo en dépendent. Une modification ultérieure change les dimensions calculées de tout l’espace sans déplacer ses points sur le plan.","space.cell_cm.help.aria":"Aide : échelle de l’espace","space.scale_unit":"cm par cellule","space.scale_unit_imperial":"po par cellule","space.display_section":"Affichage","space.show_borders":"Toujours afficher les contours des pièces","space.zero_wall_style":"Murs d’épaisseur nulle","space.zero_wall_style.help":"Les murs d’épaisseur nulle en pointillés laissent passer le halo et les rayons du soleil, tandis que les murs pleins les bloquent comme une barrière sans surface. Ce choix s’applique à tous ces murs de l’espace, même si leur ligne est masquée en mode Vue.","space.zero_wall_style.help.aria":"Aide : style des murs d’épaisseur nulle","space.zero_wall_dashed":"Pointillés","space.zero_wall_solid":"Plein","space.show_names":"Afficher les noms des pièces (faire glisser pour déplacer)","space.room_color":"Couleur du contour et du nom","space.opacity":"Opacité","space.fill_label":"Remplissage de la pièce","space.fill_mode.help":"« Couleur personnalisée » définit le style, tandis que « Lumière », « Température » et « LQI » utilisent les données actuelles de Home Assistant. Le halo s’active séparément.","space.fill_mode.help.aria":"Aide : mode de remplissage des pièces","fill.none":"Aucun","fill.lqi":"Signal Zigbee","fill.light":"Lumières","fill.custom":"Couleur personnalisée","space.custom_fill":"Couleur de remplissage","space.source_file":"J’ai une image de plan","space.source_draw":"Aucune image — je tracerai les pièces à la main","fill.temp":"Température","tip.temp_avg":"température moyenne :","tip.hum_avg":"humidité moyenne :","space_card.button":"Ouvrir le plan de l’espace","space_card.not_found":"Espace « {id} » introuvable","space_card.loading":"Chargement…","continuity.restore_plan":"Restauration du plan…","continuity.restore_connection":"Restauration de la connexion aux appareils…","continuity.retry":"Réessayer","editor.space":"Espace","editor.framing":"Cadrage","editor.fit_content":"Tout le contenu visible","editor.fit_house":"Ajusté à la géométrie de la maison","editor.show_button":"Afficher le bouton","editor.button_label":"Libellé du bouton","editor.button_target":"Chemin du tableau de bord cible","marker.sub_entity":"entité","title.general_settings":"Paramètres généraux","title.export_pdf":"Enregistrer en PDF","pdf.title":"Enregistrement en PDF","pdf.dimensions":"Afficher les dimensions et les surfaces","pdf.decor":"Afficher les meubles et les autres éléments","pdf.room_names":"Afficher les noms des pièces","pdf.backdrop":"Afficher le fond de plan","pdf.save":"Enregistrer","pdf.saving":"Création…","pdf.failed":"Impossible de créer le PDF.","pdf.too_large":"Les images dépassent la limite PDF de 25 Mo.","pdf.asset_failed":"Impossible de charger une image de fond ou de décoration.","pdf.scale":"Échelle 1:{n}","pdf.north":"Nord","gs.title":"Paramètres généraux","gs.light_group":"Remplissage : lumières","gs.light_on":"Lumières allumées","gs.light_off":"Toutes les lumières éteintes","gs.temp_group":"Remplissage : température","gs.temp_cold":"Froid","gs.temp_ok":"Confortable","gs.temp_hot":"Chaud","gs.lqi_group":"Remplissage : signal Zigbee","gs.lqi_low":"Signal faible","gs.lqi_high":"Signal fort","gs.reset":"Réinitialiser par défaut","gs.saved":"Paramètres généraux enregistrés","gs.radar_show_live":"Afficher la présence en direct sur le plan","gs.radar_show_live_hint":"Masque ou affiche toutes les cibles radar en direct. Cela ne démarre ni n’arrête l’enregistrement des observations.","radar.title":"Présence sur le plan","radar.help":"Reliez ce marqueur aux entités radar exactes de Home Assistant, placez le capteur et choisissez son profil de coordonnées. Les positions en direct sont limitées à la pièce sélectionnée.","radar.help.aria":"Aide : paramètres du radar de présence","radar.enabled":"Utiliser ce radar de présence","radar.show_live":"Afficher les cibles en direct","radar.configure":"Configurer le radar","radar.configure_on_plan":"Configurer sur le plan","radar.change_installation":"Changer l’installation","radar.no_contour":"Cette pièce n’a pas de contour. Les points radar ne seront pas limités.","radar.discard_setup_title":"Abandonner la configuration du radar ?","radar.discard_setup":"La configuration du radar non enregistrée sera perdue.","radar.step_place_mount":"Indiquez la position physique du capteur","radar.step_place_heading":"Indiquez un point droit devant le capteur","radar.step_reference":"Indiquez la position de référence {n}, puis lancez la mesure","radar.step_check_reference":"Indiquez une position de contrôle indépendante","radar.start_measure":"Lancer la mesure","radar.countdown":"Placez-vous sur le repère dans {seconds} s","radar.capturing":"Restez immobile et seul pendant la mesure…","radar.fit_ready":"Le calibrage est prêt","radar.check_third":"Vérifier à une autre position","radar.check_complete":"Contrôle indépendant terminé","radar.error_distance":"Écart de position : {distance}","radar.ambiguous_target":"Plusieurs cibles ont été signalées. Recommencez la mesure seul.","radar.insufficient_samples":"Coordonnées actuelles insuffisantes. Réessayez ou utilisez le réglage manuel.","radar.bad_references":"Choisissez des références espacées dans des directions différentes du capteur.","radar.ambiguous_sources":"Les mesures permettent deux directions également plausibles. Choisissez des repères distinguant la gauche de la droite.","radar.bad_fit":"Les mesures ne correspondent pas. Vérifiez les unités, la position du capteur et les références.","radar.desktop_hint":"Utilisez un ordinateur pour un réglage précis. L’édition sur appareils tactiles est prise en charge au mieux.","radar.detected":"House Plan a reconnu les métadonnées radar de cet appareil. Vérifiez les sources exactes avant d’enregistrer.","radar.detected_ld2450":"House Plan a trouvé un ensemble de coordonnées ESPHome LD2450. Vérifiez les sources X/Y exactes avant d’enregistrer.","radar.additional_actions":"Actions supplémentaires","radar.declare":"Ceci est un radar de présence","radar.profile":"Profil de données","radar.profile_esphome_ld2450_v1":"ESPHome LD2450 (cibles X/Y)","radar.profile_cartesian_v1":"Cibles cartésiennes (X/Y)","radar.profile_polar_v1":"Cible polaire (distance/angle)","radar.profile_range_v1":"Distance uniquement","radar.profile_zones_v1":"États des zones","radar.profile_presence_v1":"Présence uniquement","radar.room":"Pièce observée","radar.room_choose":"Choisir une pièce","radar.target":"Cible {n}","radar.axis_x":"Entité de coordonnée X","radar.axis_y":"Entité de coordonnée Y","radar.add_target":"Ajouter un emplacement de cible","radar.range_channel":"Canal de distance {n}","radar.add_range":"Ajouter un canal de distance","radar.presence_gate":"Entité de présence du canal","radar.swap_axes":"Permuter les axes X et Y","radar.axis_x_sign":"Direction X","radar.axis_y_sign":"Direction Y","radar.distance_source":"Entité de distance","radar.angle_source":"Entité d’angle","radar.angle_unit":"Unité d’angle","radar.degrees":"Degrés","radar.radians":"Radians","radar.angle_zero":"Direction de l’angle zéro","radar.angle_forward":"Vers l’avant","radar.angle_right":"Vers la droite","radar.angle_clockwise":"Les angles augmentent dans le sens horaire","radar.zone_source":"Entité de zone","radar.occupancy_source":"Entité de présence","radar.count_source":"Entité du nombre de cibles","radar.availability_source":"Entité de disponibilité","radar.source_choose":"Choisir une entité","radar.source_optional":"Facultatif","radar.source_missing":"actuellement indisponible","radar.saved_unsupported":"Cette configuration radar enregistrée est incomplète ou non prise en charge. Elle reste inactive ; supprimez-la ou mettez House Plan à jour avant de la reconfigurer.","radar.occupancy":"Présence (activée/désactivée)","radar.count":"Nombre","radar.mount":"Position et direction","radar.mount_hint":"Il s’agit de la position physique du capteur. Déplacer son marqueur décoratif ne la modifie pas.","radar.heading":"Direction, °","radar.range_cm":"Portée, cm","radar.fov_deg":"Champ de vision, °","radar.unit":"Unité de la source","radar.mirror":"Inverser l’axe gauche/droite","radar.remove":"Supprimer les paramètres radar","radar.invalid":"Renseignez la pièce, les sources et la position du radar avant d’enregistrer.","radar.check_sources":"Vérifier les données en direct","radar.checking":"Vérification…","radar.health":"État de la connexion","radar.live_summary":"Cibles actuelles : {targets} ; arcs de distance : {ranges}","radar.health_ok":"Données actuelles reçues","radar.health_off":"Aucune cible détectée","radar.health_stale":"Certaines coordonnées sont obsolètes","radar.health_partial":"Certaines sources sont à jour, d’autres sont obsolètes","radar.health_restricted":"L’accès à une ou plusieurs sources est limité","radar.health_incomplete":"Le rapport radar actuel est incomplet","radar.health_position_unavailable":"Présence signalée ; position actuelle indisponible","radar.health_unavailable":"Données du capteur indisponibles","radar.health_needs_setup":"L’installation doit être configurée","radar.health_inconsistent":"Les sources fournissent des valeurs contradictoires","radar.health_unknown":"L’état actuel est inconnu","radar.health_disabled":"Le radar est désactivé","radar.error_invalid_radar":"Vérifiez les paramètres radar.","radar.error_invalid_selection":"Sélectionnez une pièce existante et des sources valides.","radar.error_source_restricted":"Vous n’avez pas accès à toutes les sources sélectionnées.","radar.error_rate_limited":"Trop de demandes. Réessayez dans un instant.","radar.error_not_ready":"Le traitement radar n’est pas encore prêt.","radar.error_conflict":"Le plan a changé. Rouvrez la configuration radar et réessayez.","radar.error_source_unavailable":"Une ou plusieurs sources radar sélectionnées sont indisponibles.","radar.error_unsupported_capability":"Cette fonction radar n’est pas prise en charge par l’intégration installée.","radar.report_age":"il y a {seconds} s","space.show_lqi":"Afficher le signal Zigbee (LQI) à côté des appareils","space.hide_decor":"Masquer la couche décorative","space.hide_decor_tip":"Les lignes, formes, étiquettes et meubles restent à leur place — visibles dans l’éditeur d’arrière-plan, mais pas sur le plan.","space.hide_openings":"Masquer les ouvertures","space.hide_openings_tip":"Les symboles de portes, fenêtres et portails ne sont pas dessinés, mais les ouvertures continuent de fonctionner : la lumière les traverse, le soleil entre par les fenêtres et les capteurs de contact continuent de les ouvrir. L’éditeur de plan les affiche toujours.","gs.light_none":"Aucune source lumineuse","mode.plan":"Éditeur de plan","mode.devices":"Éditeur d’appareils","display.value":"Valeur + état","marker.subarea":"aucune zone, manuel","device.new":"Nouvel appareil — ouvrez son éditeur pour fermer","opening.unlock_action":"Déverrouiller","opening.lock_action":"Verrouiller","opening.lock_pending":"En cours…","title.close_editor":"Fermer l’éditeur (retour à la vue)","title.add_device":"Ajouter un appareil au plan","devbar.add":"Ajouter","devbar.rules":"Règles d’icônes","device_inbox.button":"Appareils","device_inbox.title":"Appareils sur le plan","device_inbox.search":"Rechercher appareils, entités et intégrations…","device_inbox.add_virtual":"Ajouter un appareil virtuel","device_inbox.tab_on_plan":"Sur le plan","device_inbox.tab_available":"Disponibles","device_inbox.tab_hidden":"Masqués","device_inbox.tab_readd":"De nouveau disponibles","device_inbox.only_new":"Nouveaux uniquement","device_inbox.show_entities":"Afficher les entités","device_inbox.show_hidden":"Afficher les masqués sur le plan","device_inbox.show_hidden.help":"Affiche temporairement les marqueurs masqués et désactivés sous forme de fantômes réservés à l’éditeur. La visibilité enregistrée des appareils ne change pas.","device_inbox.show_hidden.help.aria":"Aide : afficher les appareils masqués sur le plan","device_inbox.new":"Nouveau","device_inbox.find":"Trouver sur le plan","device_inbox.edit":"Modifier","device_inbox.hide":"Masquer","device_inbox.show":"Afficher","device_inbox.add":"Ajouter","device_inbox.readd":"Ajouter à nouveau","device_inbox.hide_available":"Masquer de la liste","device_inbox.show_more":"Afficher plus","device_inbox.more_actions":"Plus d'actions","device_inbox.find_hidden_hint":"Activez d'abord « Afficher les masqués sur le plan »","device_inbox.show_disabled":"Activez cette liaison dans Home Assistant avant de l'afficher","device_inbox.empty_on_plan":"Aucun appareil correspondant n'est encore sur le plan.","device_inbox.empty_available":"Aucun appareil disponible à ajouter.","device_inbox.empty_hidden":"Il n'y a aucun appareil masqué.","device_inbox.empty_readd":"Aucun appareil supprimé n'est disponible pour un nouvel ajout.","device_inbox.reason_visible_auto":"Découvert automatiquement","device_inbox.reason_visible_explicit":"Ajouté explicitement","device_inbox.reason_manual_hidden":"Masqué par l'utilisateur","device_inbox.reason_automatic_hidden":"Masqué automatiquement","device_inbox.reason_service_entry":"Entrée de registre de service uniquement","device_inbox.reason_excluded_integration":"Intégration « {integration} » exclue par les filtres de découverte","device_inbox.reason_excluded_domain":"Type d'entité non spatial","device_inbox.reason_grouped_light":"Représenté par un groupe de lumières de la pièce","device_inbox.reason_represented_by_parent":"Représenté par son appareil parent","device_inbox.reason_removed":"Précédemment retiré du plan","device_inbox.reason_available":"Disponible pour ajout au plan","device_inbox.reason_no_bound_room":"La zone HA n'est liée à aucune pièce du plan","device_inbox.status_ha_disabled":"Désactivé dans Home Assistant","device_inbox.status_orphaned":"La liaison n'existe plus dans Home Assistant","device_inbox.status_unverified":"Le registre Home Assistant est temporairement indisponible","device_inbox.saved":"Liste des appareils mise à jour","device_inbox.filters_excluded":"Intégrations exclues","device_inbox.filters_group_lights":"Regrouper les lumières de la pièce en un marqueur","device_inbox.filters_preview_appear":"apparaîtra : {count}","device_inbox.filters_preview_hide":"disparaîtra : {count}","device_inbox.filters_preview_lights":"lumières concernées : {count}","device_inbox.filters_reset":"Rétablir les recommandées","device_inbox.filters_save":"Enregistrer les filtres","device_inbox.filters_search_ph":"Ajouter une intégration…","device_inbox.filters_title":"Filtres de découverte","space.roomcard_section":"La carte de pièce affiche :","space.label_temp":"Température","space.label_hum":"Humidité","space.label_lqi":"Signal Zigbee moyen","space.label_light":"Lumières allumées/éteintes","roomcard.light_on":"Allumé","roomcard.light_off":"Éteint","roomcard.light_partial":"{on} sur {total}","toast.split_pick_inside":"Les points intermédiaires de découpe doivent se trouver à l’intérieur de la pièce","mode.decor":"Éditeur d’arrière-plan","decor.select":"Sélectionner","decor.line":"Ligne","decor.rect":"Rectangle","decor.ellipse":"Ovale","decor.text":"Texte","decor.erase":"Effacer","decor.erase_confirm_title":"Effacer l’objet ?","decor.color":"Couleur","decor.width":"Épaisseur de ligne","decor.line_style":"Style de ligne","decor.line_style_solid":"Plein","decor.line_style_dashed":"Pointillés","decor.fill":"Remplissage","decor.fill_color":"Couleur de remplissage","decor.length":"Longueur","decor.size":"Taille","decor.flip_h":"Retourner horizontalement","decor.flip_v":"Retourner verticalement","decor.angle":"Angle de rotation, °","decor.text_size":"Taille du texte","decor.backdrop_properties":"Propriétés de l’arrière-plan du plan","decor.text_title":"Étiquette de texte","decor.object_title":"Modifier {kind}","decor.text_label":"Texte","decor.live_group":"Insérer une variable HA","decor.live_entity":"Entité","decor.live_entity_ph":"choisir une entité","decor.live_attr":"Valeur","decor.live_attr_ph":"choisir l’état ou un attribut","decor.live_state":"État","decor.backdrop":"Image d’arrière-plan","decor.backdrop_hint":"Faites glisser pour déplacer ; tirez un coin pour redimensionner ; utilisez la poignée supérieure pour faire pivoter. Maj modifie les proportions ou libère l’angle.","decor.backdrop_reset":"Réinitialiser l’image","decor.backdrop_reset_done":"L’image a retrouvé sa position et sa taille d’origine","marker.icon_auto":"Auto : {icon} (selon les règles d’icônes ; choisissez-en une pour remplacer)","marker.icon_pin_auto":"Épingle","mode.plan_tip":"Éditeur de plan — la géométrie du logement : dessiner et diviser/fusionner les pièces, les associer aux zones HA, placer portes, fenêtres et portails, déplacer les cartes de pièces, régler l’échelle","mode.devices_tip":"Éditeur d’appareils — tout ce qui concerne les icônes : faire glisser pour positionner, cliquer pour modifier l’association/l’icône/l’affichage, ajouter des appareils virtuels, règles d’icônes","mode.decor_tip":"Éditeur d’arrière-plan — décoration purement visuelle sous le plan : lignes, rectangles, ovales et étiquettes de texte qui ne réagissent jamais aux clics","space.glow_enabled":"Halo des sources lumineuses","gs.glow_group":"Halo des sources lumineuses","gs.glow_base":"Obscurité de la maison","gs.glow_light":"Couleur / intensité de lumière par défaut","gs.wall_group":"Murs","gs.wall_fill":"Remplissage des murs","gs.glow_radius":"Rayon du halo","gs.glow_radius.help":"Définit le rayon général du halo en mètres ou en pieds ; le rayon propre à un appareil remplace cette valeur.","gs.glow_radius.help.aria":"Aide : rayon général du halo","gs.unit_m":"m","gs.unit_ft":"pi","marker.controls_label":"Contrôle d’autres sources lumineuses","marker.controls.help":"Avec l’action « Basculer l’état », les sources répertoriées basculent avec ce marqueur. Leur halo reste sur leurs propres marqueurs et ce lien ne transforme pas à lui seul le marqueur de contrôle en source lumineuse.","marker.controls.help.aria":"Aide : contrôler d’autres sources lumineuses","marker.controls_filter":"Rechercher des lumières et interrupteurs…","info.controls":"Contrôle","marker.glow_radius_label":"Rayon du halo","marker.glow_radius.help":"Définit le rayon du halo en mètres ou en pieds ; une valeur vide utilise le rayon des paramètres généraux.","marker.glow_radius.help.aria":"Aide : rayon du halo","markup.wallthick":"Épaisseur","markup.select":"Sélectionner","title.markup_wallthick":"Épaisseur — cliquez sur un mur pour définir son épaisseur de 0 à 100 cm.","markup.hint_wallthick":"cliquez sur un mur · Échap ferme sans appliquer","wallthick.field":"Épaisseur","wallthick.unit_cm":"cm","wallthick.unit_in":"po","wallthick.apply_room":"Appliquer à tous les murs de cette pièce","markup.draw_wall_title":"Épaisseur de chaque nouveau segment de mur (0–100 cm). Les murs partagés conservent la valeur existante.","room.queue_progress":"Pièce {current} sur {total}","toast.wall_rooms_saved":"Pièces créées : {n}","toast.wall_chain_saved":"Chaîne de murs enregistrée","toast.wallthick_pick":"Cliquez sur un mur","toast.wallthick_set":"Épaisseur du mur définie","toast.wallthick_cleared":"Épaisseur du mur supprimée","toast.physical_range":"Saisissez une valeur comprise entre {min} et {max} {unit}","toast.zero_wall_opening_conflict":"Supprimez d’abord l’ouverture sur ce segment de mur.","toast.zero_wall_ambiguous":"Le segment de mur est ambigu. Simplifiez ou ajustez la jonction.","toast.zero_wall_migration_blocked":"L’espace n’a pas été converti : {reason}. Aucune donnée n’a été modifiée.","toast.physical_angle":"Saisissez un angle de rotation compris entre 0° inclus et 90° exclu","toast.physical_limit":"L’espace a atteint la limite pour ce type de géométrie","toast.geometry_unsafe":"Modification annulée : la géométrie des murs n’a pas pu être construite en toute sécurité.","junction.limit_angle":"L'angle entre les murs est trop aigu : {actual}°, minimum {limit}°.","junction.limit_valence":"Trop de murs se rejoignent en un nœud : {actual}, maximum {limit}.","junction.limit_length":"Le segment de mur est trop court : {actual} cm, minimum {limit} cm.","junction.limit_distance":"Les murs et les nœuds sont trop proches : {actual} cm, minimum {limit} cm.","junction.limit_clearance":"Il ne reste plus d'intérieur de pièce : {actual} cm², minimum {limit} cm².","junction.limit_check_failed":"La vérification des jonctions n'a pas pu s'exécuter — la modification n'a pas été enregistrée","toast.wall_model_migration_blocked":"Le modèle de murs n’a pas pu être mis à jour : {reason}. Le plan n’a pas été modifié. Lancez « Optimiser les plans » ; si l’erreur se reproduit, corrigez la géométrie de mur conflictuelle.","toast.wall_model_client_outdated":"Mettez à jour la carte et rechargez la page avant de modifier le plan.","wall_model.reason.invalid-room":"contour de pièce invalide","wall_model.reason.zero-length":"segment de mur de longueur nulle","wall_model.reason.third-owner":"mur partagé par plus de deux pièces","wall_model.reason.duplicate-id":"identifiants de mur en conflit","wall_model.reason.thickness-conflict":"valeurs d’épaisseur de mur en conflit","wall_model.reason.opening-host":"l’ouverture ne peut pas être attribuée à un seul mur","toast.delete_room_pick":"Cliquez à l’intérieur de la pièce que vous souhaitez supprimer","toast.plan_snap_ambiguous":"Zoomez pour choisir le nœud du mur","toast.wall_repair_ambiguous":"Le contour de la pièce possède plusieurs connexions possibles. Zoomez et reliez-le explicitement.","toast.wall_repair_too_large":"L’écart dépasse 2 cm. Reliez les murs avant de créer la pièce.","toast.wall_repair_changed":"La géométrie des murs a changé. Essayez de créer de nouveau la pièce.","toast.opening_on_zero_wall":"Les ouvertures ne peuvent pas être placées sur un mur d’épaisseur nulle","marker.from_ha_option":"Choisir dans la liste HA","marker.show_entities":"Afficher les entités","marker.show_entities_tip":"Ajoute à la liste non seulement les appareils, mais aussi toutes leurs entités","marker.pick_ph":"Choisir un appareil…","room.open_area":"Ouvrir la zone HA","room.fit_action":"Ajuster la pièce {name}","view.volumetric":"Vue volumétrique","view.flat":"Vue plane","kiosk.title":"Tailles pour cet écran","kiosk.hint":"Enregistrées uniquement sur cet appareil — chaque tablette murale ou TV peut avoir ses propres tailles confortables.","kiosk.icon_scale":"Taille des icônes d’appareils","kiosk.font_scale":"Taille du texte des cartes de pièces","editor.kiosk":"Mode appareil mural (kiosque)","editor.cycle":"Changer automatiquement d’espace toutes les N secondes (kiosque, 0 = désactivé)","room.settings_title":"Paramètres de la pièce","room.settings_section":"Paramètres de la pièce (remplacent ceux de l’espace)","room.fill_label":"Remplissage de CETTE pièce","fill.inherit":"Comme l’espace","room.custom_fill_space":"Couleur de l’espace","room.custom_fill_own":"Couleur de la pièce","room.temp_range_label":"Plage de confort","room.temp_range_min":"Limite basse de température confortable","room.temp_range_max":"Limite haute de température confortable","room.temp_range_reset":"Comme l’espace","room.temp_range.help":"Cette plage s’applique uniquement à cette pièce. Un champ vide hérite de la limite correspondante de l’espace ; si les limites sont inversées, House Plan utilise la plus petite comme limite basse et la plus grande comme limite haute.","room.temp_range.help.aria":"À propos de la plage de confort de la pièce","room.temp_src_label":"Source de température","room.hum_src_label":"Source d’humidité","room.src_average":"Moyenne des capteurs de la pièce (par défaut)","room.src_pick":"Un appareil ou une entité HA spécifique","room.src_ph":"Choisir une source…","toast.room_updated":"Pièce mise à jour","space.card_font":"Taille de police des cartes de pièces (tout l’espace)","room.sizes_section":"Tailles de police","room.name_scale":"Taille du nom de la pièce","room.label_scale":"Taille des mesures","preview.room_name":"Salon","toast.cfg_reload_failed":"Impossible de recharger le plan depuis le serveur : {err}","toast.locale_load_failed":"Impossible de charger le pack de langue. L'anglais est utilisé jusqu'au rechargement de la page.","toast.furniture_art_load_failed":"Impossible de charger les dessins de meubles. Rechargez la page pour les afficher.","room.settings_short":"Paramètres de la pièce","room.unnamed":"Pièce sans nom","marker.use_climate_temp":"Inclure la température de l’appareil dans la pièce","marker.use_climate_temp_tip":"Ajoute la valeur current_temperature d’un climatiseur ou thermostat à la moyenne de la pièce. Configurez séparément le badge de valeur externe ci-dessous.","marker.value_badge_title":"Badge de valeur","marker.value_badge.help":"Affiche une valeur sélectionnée à côté de l’icône. Cela n’affecte pas les mesures de la pièce, la lumière, le halo ni l’action au toucher.","marker.value_badge.help.aria":"Aide : badge de valeur de l’appareil","marker.value_badge_enabled":"Afficher un badge de valeur","marker.value_badge_source":"Valeur","marker.value_badge_source.help":"Choisissez un état précis, un attribut pris en charge ou une valeur dérivée de cet appareil.","marker.value_badge_source.help.aria":"Aide : source du badge de valeur","marker.value_badge_position":"Position","marker.value_badge_position.help":"Le côté choisi reste fixe et ne bascule pas automatiquement au bord du plan.","marker.value_badge_position.help.aria":"Aide : position du badge de valeur","marker.value_badge_right":"À droite","marker.value_badge_bottom":"En dessous","marker.value_badge_left":"À gauche","marker.value_badge_top":"Au-dessus","marker.value_badge_empty":"Cet appareil n’a aucune valeur disponible","marker.value_badge_static":"Une icône statique n’affiche pas de valeurs en direct. Le paramètre est conservé.","marker.value_badge_missing":"Source indisponible","marker.value_badge_missing_hint":"La source enregistrée est actuellement indisponible. Conservez-la, désactivez le badge ou choisissez une autre valeur.","marker.value_badge_duplicate":"La même valeur est déjà affichée dans l’icône.","marker.value_badge_state":"État · {name}","marker.value_badge_marker_state":"État de la source lumineuse · {name}","marker.value_badge_lqi":"Qualité moyenne du signal Zigbee","marker.value_badge_attr_current_temperature":"Température actuelle · {name}","marker.value_badge_attr_temperature":"Température cible · {name}","marker.value_badge_attr_current_humidity":"Humidité actuelle · {name}","marker.value_badge_attr_humidity":"Humidité · {name}","marker.value_badge_attr_current_position":"Position · {name}","marker.value_badge_attr_percentage":"Vitesse · {name}","marker.value_badge_attr_brightness":"Luminosité · {name}","marker.value_badge_attr_volume_level":"Volume · {name}","marker.value_badge_attr_battery_level":"Batterie · {name}","marker.value_badge_attr_fan_speed":"Vitesse du ventilateur · {name}","marker.value_source":"Source de la valeur","marker.value_source.help":"Choisissez la valeur qui remplace l’icône. L’action au toucher ne change pas.","marker.value_source.help.aria":"Aide : source de la valeur dans le marqueur","marker.value_source_auto":"Automatique (comme avant)","marker.value_source_missing_hint":"La source enregistrée est indisponible. Le marqueur affiche — jusqu’à son retour ou jusqu’au choix d’une autre valeur.","marker.light_role_label":"Cet appareil est-il une source lumineuse ?","marker.light_role.help":"« Auto » utilise le rôle déterminé de l’appareil lié, « Toujours » force sa propre source et « Jamais » l’exclut ; les lumières liées ci-dessus restent indépendantes.","marker.light_role.help.aria":"Aide : cet appareil est-il une source lumineuse","marker.light_role_auto_yes":"Auto (source lumineuse)","marker.light_role_auto_no":"Auto (pas une source lumineuse)","marker.light_role_always":"Toujours une source lumineuse","marker.light_role_never":"Jamais une source lumineuse","marker.light_entity_label":"Entité lumineuse principale","marker.light_entity.help":"Pour un appareil composite, choisissez l’entité dont l’état, la couleur et la luminosité représentent cette source sur le plan. Le choix automatique reste compatible avec les anciens plans.","marker.light_entity.help.aria":"Aide : entité lumineuse principale","marker.light_entity_auto":"Automatique ({entity})","marker.light_entity_none":"aucune entité contrôlable","marker.light_entity_missing":"L’entité enregistrée {entity} est indisponible. House Plan utilise temporairement {fallback} ; le choix enregistré sera restauré si elle revient.","marker.toggle_entity_label":"Entité à basculer","marker.toggle_entity.help":"Pour un appareil composite, choisissez précisément la lumière ou l’interrupteur propre à actionner par un toucher. Automatique conserve les règles de cible précédentes et reste indépendant de l’entité lumineuse principale.","marker.toggle_entity.help.aria":"Aide : entité à basculer","marker.toggle_entity_auto":"Automatique ({entity})","marker.toggle_entity_none":"aucune entité propre contrôlable","marker.toggle_entity_missing":"L’entité enregistrée {entity} ne fait plus partie des canaux sélectionnables de ce marqueur. House Plan utilise temporairement {fallback} ; le choix enregistré sera restauré si elle revient.","marker.glow_color_label":"Couleur et luminosité du halo","marker.glow_mode.help":"Utilisez les valeurs en direct de la source, remplacez uniquement sa couleur ou fixez à la fois la couleur et la luminosité. Le minimum est 1 % ; pour désactiver la source, choisissez « Jamais ».","marker.glow_mode.help.aria":"Aide : couleur et luminosité du halo","marker.glow_mode_auto":"Depuis la source","marker.glow_mode_color":"Définir la couleur","marker.glow_mode_fixed":"Définir la couleur et la luminosité","marker.glow_color":"Couleur du halo","marker.glow_brightness":"Luminosité","marker.glow_disabled_never":"Les paramètres du halo sont indisponibles car ce marqueur est explicitement défini comme n’étant pas une source lumineuse.","marker.glow_disabled_auto":"Le mode Auto n’a trouvé aucune source lumineuse spatiale pour ce marqueur.","marker.glow_disabled_no_entity":"Aucune entité Home Assistant contrôlable et active n’est disponible pour cette source spatiale.","marker.glow_passive_hint":"Cette source ne possède aucune donnée Home Assistant propre. Définissez manuellement sa couleur et sa luminosité ; son rayon reste disponible.","marker.control_broken":"La source enregistrée est absente ou n’est plus marquée comme lumière","marker.control_missing_label":"Lumière du plan manquante","marker.control_passive":"source passive","toast.marker_control_cycle":"Ce lien créerait une chaîne circulaire de contrôles de lumière.","toast.marker_binding_required":"Choisissez un appareil Home Assistant avant de lier une autre source lumineuse.","confirm.unlock_title":"Déverrouiller ?","confirm.unlock_body":"House Plan enverra une commande de déverrouillage à cette serrure.","toast.files_migrate_failed":"Les pièces jointes n’ont pas pu être déplacées vers la nouvelle association ; les liens continuent de pointer vers les anciens fichiers : {err}","space.pick_saved":"Déjà importé","space.pick_saved_hint":"Plans stockés sur le serveur, y compris ceux que vous avez précédemment dissociés","space.no_saved":"Aucun plan n’est encore stocké sur le serveur.","space.loading":"Chargement…","space.used_by":"utilisé par : {list}","space.in_use":"Un espace utilise encore ce plan — dissociez-le d’abord","btn.use":"Utiliser","confirm.delete_plan_title":"Supprimer le fichier du plan ?","confirm.delete_plan_body":"Le fichier sera supprimé du serveur. Cette action est irréversible.","toast.plans_list_failed":"Impossible de lister les plans stockés : {err}","toast.plan_delete_failed":"Impossible de supprimer le plan : {err}","marker.hide":"Masquer","marker.hide_tip":"L’appareil disparaîtra du plan après l’enregistrement mais continuera de compter dans le signal de la pièce. Restaurez-le via « Masqués et désactivés » dans l’éditeur d’appareils.","marker.show":"Afficher","marker.show_tip":"L’appareil apparaîtra de nouveau sur le plan après l’enregistrement.","marker.hidden_ghost":"Appareil masqué par l’utilisateur","marker.ha_disabled_device":"L’appareil est désactivé dans Home Assistant et masqué du plan.","marker.ha_disabled_entity":"L’entité est désactivée dans Home Assistant et masquée du plan.","marker.ha_disabled_all_entities":"L’appareil n’a aucune entité Home Assistant active ; il est donc masqué du plan.","marker.ha_registry_limited":"Le registre Home Assistant complet n’est pas accessible à cet utilisateur. L’objet non vérifié ne peut pas être affiché ni utilisé pour le moment.","marker.delete_tip":"Supprimer complètement l’appareil du plan et de tous les agrégats. Vous pourrez l’ajouter de nouveau plus tard.","tap.run":"Exécuter une automatisation/un script/une scène","tap.none":"Ne rien faire","marker.run_target_label":"Élément à exécuter","marker.run_search_ph":"Rechercher : automatisation, script ou scène…","marker.run_target_gone":"Cible {id} introuvable — choisissez-en une autre","marker.tap_confirm":"Demander une confirmation","marker.tap_confirm_tip":"Afficher une boîte de dialogue de confirmation avant l’action — protection contre les appuis accidentels.","marker.toggle_hint_single":"Cible : {name} ({id}).","marker.virtual_light_target":"Lumière virtuelle : {name}.","marker.virtual_light_current":"État manuel : {state} → {effect}.","marker.virtual_light_state_on":"allumé","marker.virtual_light_state_off":"éteint","marker.toggle_hint_group":"Basculera {count} source(s) : {names}.","marker.toggle_hint_current":"Actuellement : {state} → {effect}.","marker.toggle_hint_group_current":"Actuellement allumées : {on} sur {count} → {effect}.","marker.toggle_hint_skipped":"Seront ignorées ({count}) : {targets}.","marker.toggle_effect_turn_on":"sera allumé","marker.toggle_effect_turn_off":"sera éteint","marker.toggle_effect_open":"sera ouvert","marker.toggle_effect_close":"sera fermé","marker.toggle_effect_stop":"sera arrêté","marker.toggle_effect_toggle":"l’état sera basculé","marker.toggle_skip_missing":"introuvable","marker.toggle_skip_ha_disabled":"désactivé dans HA","marker.toggle_skip_unavailable":"indisponible","marker.toggle_skip_unsupported":"basculement non pris en charge","marker.toggle_skip_secure":"bloqué pour des raisons de sécurité","marker.toggle_none_no_binding":"Cet appareil n’a aucune association ; il n’y a donc aucun état à basculer. Un toucher ne fera rien.","marker.toggle_none_no_actionable_entity":"Cet appareil n’a aucun état pouvant être basculé. Un toucher ne fera rien.","marker.toggle_none_configured_targets_missing":"Les cibles configurées sont indisponibles. L’entité propre de l’appareil ne leur sera pas substituée.","marker.toggle_none_ha_disabled":"La cible est désactivée dans Home Assistant et ne peut pas être utilisée sur le plan.","marker.toggle_none_unavailable":"La cible est actuellement indisponible. Un toucher ne fera rien.","marker.toggle_none_unsupported":"Home Assistant n’expose aucune opération de basculement sûre pour cette entité. Un toucher ne fera rien.","marker.toggle_none_secure":"Le basculement des serrures, alarmes et portails sécurisés depuis le plan est bloqué pour des raisons de sécurité.","run.automation":"automatisation","run.script":"script","run.scene":"scène","confirm.tap_run":"Exécuter « {name} » ?","confirm.tap_toggle":"Basculer « {name} » ?","confirm.current_state":"État actuel : {state}","confirm.expected_state":"Après basculement : {state}","confirm.group_current":"{on} allumé(s) sur {total}","confirm.group_all_on":"tout est allumé","confirm.group_all_off":"tout est éteint","confirm.unavailable_targets":"Indisponibles : {count}","confirm.expected_by_ha":"Home Assistant déterminera l’état","confirm.state_on":"Allumé","confirm.state_off":"Éteint","confirm.state_open":"Ouvert","confirm.state_closed":"Fermé","confirm.state_opening":"Ouverture en cours","confirm.state_closing":"Fermeture en cours","confirm.state_stopped":"Arrêté","confirm.state_unknown":"Inconnu","toast.run_started":"Démarré : {name}","toast.run_target_missing":"Cible d’exécution introuvable — vérifiez les paramètres de l’appareil","toast.run_target_required":"Choisissez une automatisation, un script ou une scène","toast.tap_target_changed":"La cible de l’action a changé. Réessayez.","toast.virtual_light_toggle_failed":"Impossible de basculer la lumière virtuelle : {err}","toast.value_badge_source_required":"Choisissez une valeur pour le badge","btn.run":"Exécuter","vac.section":"Robot aspirateur : position en direct","vac.autocal":"Configurer automatiquement","vac.live":"Position en direct sur le plan","vac.trail":"Afficher le trajet du robot","vac.autocal_no_rooms":"L’intégration ne fournit aucune liste de pièces — ouvrez « Ajuster manuellement »","vac.route_warn_unmapped":"Le robot nettoie une carte qui n'est assignée à aucun étage","vac.route_warn_needs_calibration":"La carte est assignée à un étage mais n'est pas calibrée","vac.route_warn_ambiguous":"Deux cartes sont indiscernables — aucun étage choisi","vac.route_warn_missing_space":"L'espace de cette carte a été supprimé","vac.autocal_no_match":"Les noms de pièces ne correspondent pas (il en faut ≥3 en commun) — ouvrez « Ajuster manuellement »","vac.autocal_done":"Terminé : association via {rooms} pièces. Lancez un nettoyage et vérifiez","vac.cal_need_pos":"Le robot ne transmet pas de coordonnées — lancez un nettoyage puis mettez-le en pause","vac.cal_done":"Calibration enregistrée. Lancez un nettoyage et vérifiez","vac.cal_cancelled":"Calibration annulée","vac.fit":"Ajuster manuellement","vac.fit_hint":"Faites glisser la carte du robot pour la positionner, étirez-la par les coins","vac.fit_rotate":"Rotation de 90°","vac.fit_mirror":"Miroir","vac.trail_never":"Jamais","vac.trail_cleaning":"Pendant le nettoyage","vac.trail_always":"Toujours","gs.bg_group":"Arrière-plan de la scène","gs.bg_color":"Arrière-plan autour du plan","gs.bg_default":"Valeur par défaut du thème","gs.bg_theme":"valeur par défaut du thème","gs.bg_mode":"Arrière-plan du plan","gs.bg_mode.help":"« Suit le soleil » utilise sun.sun ou, à défaut, l’heure locale du navigateur ; « Couleur statique » affiche toujours la couleur choisie.","gs.bg_mode.help.aria":"Aide : arrière-plan général du plan","gs.bg_static":"Couleur statique","gs.bg_daynight":"Suit le soleil","gs.sun_group":"Soleil","gs.sun_missing":"L’entité sun.sun est introuvable — l’arrière-plan suit votre heure locale ; les rayons de soleil par les fenêtres sont indisponibles.","gs.north":"Nord sur le plan","gs.north.help":"L’angle se mesure dans le sens horaire depuis la verticale supérieure du plan ; le nord sert aux rayons des fenêtres, pas à l’arrière-plan « Suit le soleil ».","gs.north.help.aria":"Aide : direction générale du nord","gs.north_ph":"non défini","gs.north_clear":"Effacer","gs.north_letter":"N","gs.sun_rays":"Lumière du soleil à travers les fenêtres","gs.sun_ray_origin":"Rayons du soleil","gs.sun_ray_origin.inner":"Depuis les angles intérieurs des fenêtres","gs.sun_ray_origin.outer":"Depuis les angles extérieurs des fenêtres","gs.about_version":"Houseplan Card v{v}","gs.about_github":"GitHub · documentation et problèmes","gs.about_telegram":"Discussion Telegram","support.title":"Aide et commentaires","space.bg_color":"Arrière-plan autour du plan","space.bg_inherit":"Hériter des paramètres généraux","space.bg_inherited":"hérite des paramètres généraux","space.bg_mode":"Arrière-plan du plan","space.bg_mode.help":"Héritez de l’arrière-plan général ou remplacez-le pour cet espace par une couleur statique ou le mode « Suit le soleil ».","space.bg_mode.help.aria":"Aide : arrière-plan de l’espace","space.north":"Nord sur le plan (remplacement)","space.north.help":"Remplace le nord général pour cet espace ; l’angle se mesure dans le sens horaire depuis la verticale supérieure du plan et sert aux rayons des fenêtres.","space.north.help.aria":"Aide : nord de cet espace","space.north_inherited":"hérité : {v}","space.sun_rays":"Lumière du soleil à travers les fenêtres","space.sun_inherit":"Hériter des paramètres généraux","space.sun_on":"Activé","space.sun_off":"Désactivé","canvas.far_objects":"{n} objet(s) éloigné(s) du plan","canvas.show_far":"Afficher","canvas.home_tip":"Le plan est là-bas — cliquez pour l’ajuster à l’écran","gs.grid_group":"Maintenance du plan","gs.grid_hint":"Met à jour les modèles de données, aligne les éléments du plan sur la grille et fusionne les fragments de murs redondants. Un rapport précis est affiché avant tout enregistrement.","gs.align_all":"Optimiser les plans","gs.align_title":"Optimiser les plans","gs.align_none":"Tous les plans utilisent déjà le modèle de données optimisé actuel.","gs.optimize_no_automatic_changes":"Aucune modification automatique n’est à appliquer. Vérifiez les éléments ci-dessous.","gs.align_count":"{n} élément(s) sur {total} seront déplacés, de {cm} cm au maximum.","gs.align_where":"Le plus grand déplacement se trouve dans « {s} ».","gs.align_turned":"Ouvertures dont l’angle est corrigé : {n}.","gs.align_preflight_failed":"Impossible de vérifier en toute sécurité la géométrie des espaces suivants : {spaces}{more}.","gs.align_preflight_hint":"Les plans n’ont pas été modifiés. Copiez les diagnostics avec le bouton ci-dessous et joignez-les au rapport de bug avec un export de l’espace.","gs.preflight_reason_prepare-exception":"Impossible de préparer la géométrie de l’espace (exception lors de la construction du modèle)","gs.preflight_reason_wall-null":"Le corps du mur n’a pas pu être construit (l’union a renvoyé un résultat vide)","gs.preflight_reason_wall-degraded-extra":"Le corps du mur s’est dégradé avec une géométrie supplémentaire","gs.preflight_reason_wall-failed-core":"Le noyau du corps du mur n’a pas pu être assemblé","gs.preflight_reason_wall-exception":"La construction du mur a déclenché une exception","gs.preflight_reason_floor-null":"Le contour du sol n’a pas pu être construit","gs.preflight_reason_floor-exception":"La construction du sol a déclenché une exception","gs.preflight_copy":"Copier les diagnostics","gs.preflight_copied":"Diagnostics copiés","gs.preflight_update_hint":"Les versions de la carte et de l’intégration diffèrent — mettez House Plan à jour puis réessayez.","gs.align_preflight_space":"Espace {n}","gs.align_preflight_more":", et {n} de plus","gs.optimize_changes":"Migrations de modèle : {m} ; espaces mis à jour : {c} ; valeurs de coordonnées parasites supprimées : {p} ; fragments de murs réels fusionnés : {w} ; fragments de murs d’épaisseur nulle fusionnés : {s} ; murs indépendants : {i}.","gs.zero_walls_migrated":"Portions de murs virtuels converties : {n}.","gs.wall_segments_migrated":"Segments de murs stabilisés : {n}.","gs.room_drafts_migrated":"Contours inachevés convertis en murs ordinaires : {drafts} ; segments : {segments}.","gs.optimize_lattice_summary":"Valeurs de coordonnées parasites normalisées : {n} ; déplacement maximal : {cm} cm.","gs.optimize_lattice_space":"{space} : valeurs de coordonnées normalisées : {n} ; valeurs hors grille laissées inchangées : {far}.","gs.optimize_coincident_partitions":"Sections de murs indépendants masquées absorbées dans les murs des pièces : {n}.","gs.optimize_openings_rehosted":"Ouvertures rattachées aux murs des pièces : {n}.","gs.optimize_walls_straightened":"Murs redressés : {n} ; déplacement maximal : {cm} cm.","gs.optimize_walls_straightened_where":"Plus grande correction de mur : {s}.","gs.optimize_walls_straighten_skipped":"Murs proches d’un axe laissés inchangés car ils ne pouvaient pas être réparés en toute sécurité : {n}.","gs.optimize_glow_migration":"Ancien mode Glow : {spaces} espaces → aucun remplissage de données + Glow indépendant ; {rooms} pièces → remplissage de données hérité + Glow indépendant.","gs.optimize_references":"Références réparées : espaces — {spaces} ; pièces — {rooms} ; positions — {positions} ; appareils dissociés des espaces manquants — {detached}.","gs.optimize_reference_more":", et {n} de plus","gs.optimize_orphans_removed":"Enregistrements oubliés supprimés : {total} — étiquettes de pièces : {rooms} ; appareils : {devices} ; marqueurs de groupe : {groups}. Ils appartenaient à des espaces supprimés précédemment.","gs.optimize_live_positions":"Anciennes positions dans des espaces supprimés appartenant à des objets existants : {n}{names}. Elles seront conservées.","gs.optimize_live_positions_remove":"Anciennes positions dans des espaces supprimés appartenant à des objets existants : {n}{names}. Elles sont sélectionnées pour suppression.","gs.optimize_live_names":" : {names}{more}","gs.optimize_live_remove":"Supprimer les anciennes positions","gs.optimize_live_keep":"Conserver les anciennes positions","gs.optimize_live_selected":"Les anciennes positions seront supprimées après l’application de l’optimisation.","gs.optimize_unverified":"Impossible de vérifier en toute sécurité les positions : {n}. Elles ont été laissées inchangées.","gs.optimize_registry_limited":"Un accès administrateur complet aux registres Home Assistant est requis pour une vérification sûre.","gs.optimize_vacuum_warning":"Associations de pièces d’aspirateur nécessitant encore une vérification : {n}.","gs.optimize_details":"Détails","gs.optimize_details_more":"Et {n} enregistrement(s) de plus.","gs.optimize_detail_removed":"sera supprimé","gs.optimize_detail_live":"sera conservé","gs.optimize_detail_unverified":"non vérifié","gs.optimize_detail_room_label":"étiquette de pièce","gs.optimize_detail_device":"appareil","gs.optimize_detail_group":"marqueur de groupe","gs.optimize_detail_unknown":"propriétaire inconnu","gs.optimize_detail_item":"{status} : {kind} {id} ; ancien espace {space}","gs.align_warn":"Les éléments volontairement placés entre les nœuds de la grille seront déplacés. Une seule annulation est disponible après l’opération, uniquement jusqu’à la prochaine modification du plan.","gs.align_run":"Optimiser","gs.align_done":"Plans optimisés : {n} élément(s) déplacé(s), {m} enregistrement(s) maintenu(s), {r} référence(s) réparée(s)","gs.optimize_undo":"Annuler la dernière optimisation","gs.optimize_undone":"La dernière optimisation a été annulée","decor.furniture":"Mobilier","decor.image":"Image","decor.image_title":"Images personnalisées","decor.image_upload":"Importer une image","decor.image_replace":"Remplacer l’image","decor.image_uploading":"Importation…","decor.image_asset":"Fichier image","decor.image_pick_hint":"Importez une image ou choisissez-en une existante.","decor.image_place_hint":"Cliquez sur le plan pour placer l’image.","decor.image_none":"Aucune image importée pour le moment.","decor.image_unavailable":"Image indisponible","decor.image_used":"Utilisée dans {n} objets","decor.image_upload_failed":"Impossible d’importer l’image : {err}","decor.image_error_capacity":"Le stockage des images personnalisées est plein.","decor.image_in_use":"Supprimez toutes les copies placées avant ce fichier.","decor.image_delete_title":"Supprimer le fichier image ?","decor.image_delete_message":"Supprimer « {name} » de House Plan ? Cette action est irréversible.","furn.title":"Bibliothèque de mobilier","furn.symbol":"Symbole","furn.group_furniture":"Mobilier","furn.group_appliance":"Électroménager","furn.group_sanitary":"Sanitaires","furn.group_other":"Autre","furn.width":"Largeur","furn.depth":"Profondeur","furn.back_to_categories":"Toutes les catégories","furn.pick_hint":"Choisissez un symbole, puis cliquez sur le plan.","furn.place_hint":"Cliquez sur le plan — le meuble se place contre le mur le plus proche. Maj permet un placement libre.","furn.cat_air_conditioner":"Climatiseurs","furn.cat_armchair":"Fauteuils","furn.cat_bathtub":"Baignoires","furn.cat_bed":"Lits","furn.cat_bidet":"Bidets","furn.cat_boiler":"Chauffe-eau","furn.cat_chair":"Chaises","furn.cat_coffee_table":"Tables basses","furn.cat_cooktop":"Plaques de cuisson","furn.cat_dining_table":"Tables à manger","furn.cat_dishwasher":"Lave-vaisselle","furn.cat_dryer":"Sèche-linge","furn.cat_fireplace":"Cheminées","furn.cat_fridge":"Réfrigérateurs","furn.cat_kitchen_cabinet":"Meubles de cuisine","furn.cat_kitchen_sink":"Éviers de cuisine","furn.cat_nightstand":"Meubles","furn.cat_plant":"Plantes","furn.cat_rug":"Tapis","furn.cat_shelving":"Étagères","furn.cat_shower":"Douches","furn.cat_sink":"Lavabos","furn.cat_sofa":"Canapés","furn.cat_stairs":"Escaliers","furn.cat_toilet":"Toilettes","furn.cat_tv":"Téléviseurs","furn.cat_wardrobe":"Armoires","furn.cat_washer":"Lave-linge","furn.cat_work_table":"Bureaux","furn.sym_sofa":"Canapé","furn.sym_sofa_three_seat":"Canapé trois places","furn.sym_sofa_corner_right":"Canapé d'angle droit","furn.sym_armchair":"Fauteuil","furn.sym_armchair_office":"Chaise de bureau","furn.sym_coffee_table":"Table basse","furn.sym_coffee_table_round":"Table basse ronde","furn.sym_coffee_table_oval":"Table basse ovale","furn.sym_coffee_table_rounded":"Table basse arrondie","furn.sym_table_dining":"Table à manger","furn.sym_table_round":"Table ronde","furn.sym_table_dining_oval":"Table à manger ovale","furn.sym_table_dining_rounded":"Table à manger arrondie","furn.sym_chair":"Chaise","furn.sym_chair_bar":"Tabouret de bar","furn.sym_desk":"Bureau","furn.sym_desk_corner":"Bureau d'angle","furn.sym_bed_double":"Lit double","furn.sym_bed_single":"Lit simple","furn.sym_nightstand":"Table de chevet","furn.sym_cabinet_tv":"Meuble TV","furn.sym_cabinet_shoe":"Meuble à chaussures","furn.sym_cabinet_sink":"Meuble sous lavabo","furn.sym_wardrobe":"Armoire","furn.sym_bookshelf":"Bibliothèque","furn.sym_wall_unit":"Élément mural","furn.sym_kitchen_floor":"Module de cuisine bas","furn.sym_kitchen_floor_corner":"Module de cuisine bas d'angle","furn.sym_kitchen_wall":"Module de cuisine haut","furn.sym_kitchen_wall_corner":"Module de cuisine haut d'angle","furn.sym_shelf_floor":"Étagère au sol","furn.sym_shelf_wall":"Étagère murale","furn.sym_fridge":"Réfrigérateur","furn.sym_stove":"Cuisinière","furn.sym_cooktop_two":"Plaque à deux feux","furn.sym_dishwasher":"Lave-vaisselle","furn.sym_washer":"Lave-linge","furn.sym_dryer":"Sèche-linge","furn.sym_tv":"Téléviseur","furn.sym_tv_wall":"Téléviseur mural","furn.sym_ac":"Climatiseur","furn.sym_water_heater":"Chauffe-eau","furn.sym_toilet":"Toilettes","furn.sym_toilet_built_in":"Toilettes suspendues","furn.sym_bathtub":"Baignoire","furn.sym_bathtub_corner":"Baignoire d'angle","furn.sym_shower":"Douche","furn.sym_sink":"Lavabo","furn.sym_kitchen_sink":"Évier de cuisine","furn.sym_kitchen_sink_double":"Évier de cuisine double","furn.sym_bidet":"Bidet","furn.sym_bidet_built_in":"Bidet suspendu","furn.sym_stairs":"Escalier","furn.sym_fireplace":"Cheminée","furn.sym_plant":"Plante","furn.sym_rug":"Tapis","common.yes":"Oui","common.no":"Non","vac.diag_source":"Source","vac.diag_platform":"Intégration","vac.diag_status":"État","vac.diag_position":"Position","vac.diag_rooms":"Pièces","vac.diag_rooms_value":"{total} · {matched} noms correspondent · {readiness}","vac.autocal_ready":"calibration automatique disponible","vac.autocal_not_ready":"3 noms correspondants requis","vac.diag_path":"Chemin de l’intégration","vac.diag_map":"ID de carte","vac.source_none":"non sélectionné","vac.source_status_ok":"Prêt","vac.source_status_missing":"Manquant","vac.source_status_disabled":"Désactivé dans Home Assistant","vac.source_status_unavailable":"Indisponible","vac.source_status_unverified":"Impossible à vérifier avec les autorisations actuelles","vac.source_status_unsupported":"Aucune donnée de position","vac.source_status_none":"Aucune source","vac.source_banner_missing":"La source enregistrée n’existe plus. Elle n’a pas été remplacée automatiquement ; choisissez une autre source ou restaurez-la dans Home Assistant.","vac.source_banner_disabled":"La source enregistrée est désactivée dans Home Assistant. Activez-la ou choisissez une autre source.","vac.source_banner_unverified":"Les autorisations Home Assistant actuelles ne permettent pas de vérifier cette source enregistrée. Elle reste épinglée et ne sera pas remplacée automatiquement.","vac.choose_source":"Choisir la source","vac.source_auto":"Automatique","vac.source_auto_hint":"Utiliser une entité compatible de cet appareil","vac.all_cameras":"Toutes les caméras","vac.all_cameras_warn":"Une caméra peut ne pas fournir de données du robot. Choisissez-en une uniquement s’il s’agit de la carte de votre aspirateur.","vac.all_cameras_empty":"Aucune autre entité caméra trouvée.","vac.platform_unknown":"intégration inconnue","vac.cap_position":"position","vac.cap_rooms_short":"pièces","vac.cap_path":"trajet","vac.cap_map":"ID de carte","vac.cap_none":"aucune donnée de robot détectée","vac.xcme_hint":"Activez ces attributs Xiaomi Cloud Map Extractor :","vac.documentation":"Documentation","vac.residual_title":"Vérifier la calibration automatique","vac.residual_message":"Les pièces correspondantes présentent un écart maximal de {error}. Appliquez cette calibration approximative, affinez-la manuellement ou annulez sans modifier la configuration enregistrée.","vac.apply_proposal":"Appliquer","gs.backup_group":"Sauvegarde et transfert","gs.backup_hint":"Téléchargez une sauvegarde JSON portable ou prévisualisez et importez une sauvegarde créée par House Plan.","backup.export_open":"Exporter","backup.import_open":"Importer","backup.export_title":"Exporter House Plan","backup.import_title":"Importer House Plan","backup.export_hint":"Choisissez si la sauvegarde doit contenir toute la configuration House Plan ou uniquement l’espace actuel.","backup.full":"Sauvegarde complète","backup.current_space":"Espace actuel","backup.current_space_title":"Espace actuel : {title}","backup.no_current_space":"Aucun espace actuel","backup.plan_only":"Plan uniquement","backup.plan_only_hint":"Conserver les pièces, murs, ouvertures, décorations et positions des étiquettes de pièces sans les appareils ni les associations Home Assistant.","backup.plan_only_preview":"Ce fichier contient uniquement le plan","backup.privacy_warning":"L’archive conserve les noms, identifiants Home Assistant et coordonnées exactes. Les plans internes et pièces jointes sont référencés, pas intégrés ; les états d’exécution et trajets d’aspirateur ne sont pas inclus.","backup.download":"Télécharger le JSON","backup.export_done":"Sauvegarde téléchargée","backup.reading":"Vérification de la sauvegarde…","backup.revalidated":"Le plan a changé depuis cet aperçu. Le résumé a été actualisé ; vérifiez-le et confirmez de nouveau.","backup.error.support_invalid_message":"Vérifiez le message d’assistance et réessayez.","backup.error.support_package_too_large":"Le paquet d’assistance anonymisé dépasse la limite de 8 Mio.","backup.error.support_preview_expired":"L’aperçu de la pièce jointe d’assistance a expiré ou n’est plus disponible.","backup.error.support_rate_limited":"Trop de rapports ou d’aperçus d’assistance ont été demandés. Réessayez plus tard.","backup.error.support_rejected":"Le rapport n’a pas passé la validation du service d’assistance.","backup.error.support_unavailable":"Le service d’assistance privé est temporairement indisponible.","backup.error.unauthorized":"Vous n’avez pas l’autorisation d’exporter ou d’importer ce plan.","backup.error.not_ready":"House Plan n’est pas encore prêt. Réessayez dans un instant.","backup.error.too_large":"La sauvegarde dépasse la limite de 8 Mio.","backup.error.invalid_json":"Le fichier sélectionné n’est pas un JSON valide.","backup.error.invalid_format":"Le fichier sélectionné n’est pas une sauvegarde House Plan.","backup.error.invalid_image":"L’image est endommagée ou ne correspond pas à son format.","backup.error.unsupported_export_version":"Ce format de sauvegarde n’est pas pris en charge par la version installée.","backup.error.unsupported_image":"Utilisez une image PNG, JPEG, WebP ou SVG prise en charge.","backup.error.future_model":"La sauvegarde a été créée avec un modèle de données House Plan plus récent.","backup.error.invalid_config":"La sauvegarde contient une configuration House Plan invalide.","backup.error.wall_model_migration_blocked":"Le modèle de murs de la sauvegarde n’a pas pu être mis à niveau en toute sécurité. Optimisez d’abord le plan source, puis exportez-le de nouveau.","backup.error.invalid_layout":"La sauvegarde contient des positions d’objets invalides.","backup.error.invalid_content":"La sauvegarde contient des références de contenu invalides ou incohérentes.","backup.error.space_not_found":"L’espace sélectionné n’existe plus.","backup.error.capacity_exceeded":"L’ajout de cette sauvegarde dépasserait les limites du plan.","backup.error.preview_expired":"L’aperçu a expiré. Sélectionnez de nouveau le fichier de sauvegarde.","backup.error.preview_owner_mismatch":"Cet aperçu appartient à un autre utilisateur Home Assistant.","backup.error.conflict":"Le plan a changé depuis l’aperçu. Vérifiez le résumé actualisé.","backup.error.content_confirmation_required":"Confirmez que le contenu local indisponible peut être dissocié.","backup.error.commit_failed":"La sauvegarde n’a pas pu être appliquée en toute sécurité. Le plan précédent a été restauré ou est en attente de récupération.","backup.error.missing_plan":"Un fichier de plan référencé a disparu depuis l’aperçu. Vérifiez de nouveau la sauvegarde.","backup.error.missing_content":"Une pièce jointe locale référencée a disparu depuis l’aperçu. Vérifiez de nouveau la sauvegarde.","backup.error.marker_control_missing":"Une lumière liée au plan est absente de la sauvegarde.","backup.error.marker_control_not_light":"Une cible liée au plan n’est plus marquée comme source lumineuse.","backup.error.marker_control_self":"Une source lumineuse ne peut pas se contrôler elle-même.","backup.error.marker_control_cycle":"La sauvegarde contient une chaîne circulaire de contrôles de lumière.","backup.error.duplicate_marker_control":"La sauvegarde contient un lien de lumière du plan en doublon.","backup.error.no_backup":"Aucun instantané d’importation ou d’optimisation n’est disponible à restaurer.","backup.error.in_use":"L'élément est encore utilisé","backup.error.invalid_data":"La requête contient des données invalides","backup.error.invalid_light_entity":"La lumière principale doit être une entité light.* ou switch.*","backup.error.invalid_marker_control":"Référence de contrôle de marqueur invalide","backup.error.invalid_name":"Le nom est invalide","backup.error.invalid_partition_opening_host":"L'ouverture doit conserver sa cloison porteuse","backup.error.invalid_partition_opening_jamb_margin":"L'ouverture ne laisse aucun jambage physique au bout du mur","backup.error.invalid_passage_fields":"Un passage ouvert ne peut pas porter de réglages de porte","backup.error.invalid_space_id":"Espace inconnu","backup.error.invalid_toggle_entity":"L'entité de bascule doit être light.* ou switch.*","backup.error.invalid_value_badge":"Réglages de badge de valeur invalides","backup.error.invalid_value_badge_attribute":"Attribut de badge de valeur invalide","backup.error.invalid_value_badge_position":"Position de badge de valeur invalide","backup.error.invalid_value_badge_source":"Source de badge de valeur invalide","backup.error.invalid_vacuum_map_route":"Vérifiez l'affectation des cartes du robot aux espaces.","backup.error.invalid_value_source":"Source de valeur invalide","backup.error.invalid_value_source_attribute":"Attribut de source de valeur invalide","backup.error.io_error":"Une opération de fichier a échoué sur le serveur","backup.error.not_toggleable":"Cet appareil ne peut pas être basculé","backup.error.nothing_to_repair":"Rien à réparer","backup.error.space_in_use":"L'espace est encore référencé","backup.error.value_badge_source_required":"Le badge de valeur nécessite une source","backup.error.wall_model_client_outdated":"Le plan a été mis à jour ailleurs — rechargez la page","backup.same_source":"Créée sur cette instance Home Assistant","backup.foreign_source":"Créée sur une autre instance Home Assistant","backup.created":"Créée : {value}","backup.versions":"Carte {card} ; intégration {integration} ; modèle de données {model}","backup.count_spaces":"Espaces : {n}","backup.count_rooms":"Pièces : {n}","backup.count_walls":"Murs : {n}","backup.count_openings":"Ouvertures : {n}","backup.count_decor":"Objets décoratifs : {n}","backup.count_markers":"Appareils : {n}","backup.count_layout":"Positions : {n}","backup.bindings":"Associations — appareils : {device}, entités : {entity}, virtuels : {virtual} ; positions sans espace : {legacy}","backup.binding_status":"État des cibles — actives : {active}, désactivées : {disabled}, manquantes : {missing}","backup.missing_areas":"Zones absentes sur la cible : {areas}","backup.dropped_marker_links":"Liens de lumières du plan hors de cet espace transféré omis : {n}.","backup.room_drafts_migrated":"Anciens contours inachevés convertis en murs ordinaires : {drafts} ; segments : {segments}.","backup.repaired_target_refs":"Références existantes restaurées par cet import d’espace : {n}.","backup.preserved_unresolved_refs":"Références qui n’ont pas pu être restaurées sans ambiguïté conservées : {n}.","backup.preserved_unresolved_hint":"Aucune donnée n’a été devinée ni supprimée. Après l’importation, lancez « Optimiser les plans » pour examiner les références restantes.","backup.import_details":"Détails des références d’importation","backup.import_detail.incoming_remapped":"Références mises à jour dans la copie importée : {n}","backup.import_detail.target_repaired":"Références existantes restaurées : {n}","backup.import_detail.preserved_unresolved":"Références non résolues conservées : {n}","backup.import_detail.collisions":"Conflits de destination conservés en toute sécurité : {n}","backup.import_detail.dropped_links":"Liens entrants omis selon les règles de transfert : {n}","backup.import_detail.bounded_lineages":"Identifiants trop imbriqués maintenus dans les limites : {n}","backup.replace_warning":"Cela remplace la configuration et la disposition actuelles. Les fichiers importés ne sont jamais supprimés. Une seule annulation reste disponible jusqu’à la prochaine modification du plan.","backup.foreign_bookkeeping":"Les données de suivi des appareils connus/nouveaux propres à l’instance ne seront pas importées.","backup.final_name":"Nom du nouvel espace","backup.target_settings":"Les paramètres généraux de l’instance cible restent inchangés.","backup.duplicates":"Associations déjà présentes : {n}","backup.skip":"Ignorer les appareils en doublon","backup.virtual_copy":"Ajouter des copies virtuelles statiques sûres","backup.content":"Contenu référencé","backup.decor_images_summary":"Images personnalisées : {objects} objets, {assets} fichiers ; fichiers absents : {missing}.","backup.content_available":"disponible localement","backup.content_external":"lien externe","backup.content_detach_required":"sera dissocié","backup.confirm_detach":"Je comprends que les plans internes et pièces jointes indisponibles seront dissociés de la configuration importée.","backup.confirm_missing_images":"Je comprends que les images personnalisées absentes resteront des espaces réservés réparables et que les autres fichiers locaux indisponibles seront dissociés.","backup.replace":"Remplacer","backup.add":"Ajouter un espace","backup.space_done":"Espace importé : {rooms} pièces, {markers} appareils, {refs} références existantes restaurées","backup.full_done":"Sauvegarde restaurée : {spaces} espaces, {rooms} pièces, {markers} appareils","backup.undo_import":"Annuler la dernière importation complète","backup.import_undone":"Importation complète annulée","backdrop.large_title":"Grande image","backdrop.large_body":"Cette image fait {w}×{h} (fichier de {fileMb} Mo) et nécessite environ {decodedMb} Mo de mémoire pour s'afficher. Sur tablette, cela peut faire planter la page.","backdrop.unknown_body":"Les dimensions de l'image n'ont pas pu être lues — le fichier est peut-être endommagé. Continuer peut faire planter la page sur tablette.","backdrop.reduced_dimensions":"Copie réduite : {w}×{h} px.","backdrop.use_downscaled":"Téléverser une copie réduite","backdrop.reducing":"Réduction…","backdrop.keep_original":"Conserver l'original","backdrop.too_large_title":"Image trop grande","backdrop.too_large_body":"Cette image dépasse ce que les navigateurs peuvent afficher ({w}×{h}, limite {limit} px par côté). Réduisez-la dans un éditeur de bureau puis téléversez-la à nouveau.","backdrop.downscale_failed":"Impossible de créer la copie réduite. Le plan actuel n'a pas été modifié."};const r="4da0d706a85c3f1c08ab6de960deb5feb08baaf9055265234e7bd1b554332653";export{e as dictionary,r as fingerprint};
diff --git a/dist/houseplan-assets/furniture-plan-art.generated-BfO1XOcD.js b/dist/houseplan-assets/furniture-plan-art.generated-CDfS5UbT.js
similarity index 99%
rename from dist/houseplan-assets/furniture-plan-art.generated-BfO1XOcD.js
rename to dist/houseplan-assets/furniture-plan-art.generated-CDfS5UbT.js
index f533b6e6..18e965a9 100644
--- a/dist/houseplan-assets/furniture-plan-art.generated-BfO1XOcD.js
+++ b/dist/houseplan-assets/furniture-plan-art.generated-CDfS5UbT.js
@@ -1 +1 @@
-globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="34d1dbfc181acaf58842dfced0e6aa3a899aef6b8d1eeba53732ef729a63137e";const L="34d1dbfc181acaf58842dfced0e6aa3a899aef6b8d1eeba53732ef729a63137e",M={coffee_table:{d:"M 0,2.4996674 C 0,1.11983275 1.11965812,0 2.5,0 L 117.5,0 C 118.88141026,0 120,1.11869239 120,2.4996674 L 120,57.49919225 C 120,58.88130761 118.88141026,60 117.5,60 L 2.5,60 C 1.11965812,60 0,58.88130761 0,57.5003326 L 0,2.4996674 M 106,13.00123539 L 106,6.99952485 M 106,6.99952487 A 1.00009503,1 90 0,1 106.29289321,6.29235088 A 1.00009503,1 90 0,1 106.99999999,5.99942982 M 107,5.99942982 L 113,5.99942982 A 1.00009503,1 90 0,1 113.70710678,6.29235087 A 1.00009503,1 90 0,1 114,6.99952485 L 114,13.00009503 M 114,13.00009502 A 1.00009503,1 90 0,1 113.70710679,13.707269 A 1.00009503,1 90 0,1 113.00000001,14.00019006 M 113,14.00019006 L 107,14.00019006 M 107,14.00019006 A 1.00009503,1 90 0,1 106.29289322,13.70726901 A 1.00009503,1 90 0,1 106,13.00009503 M 106,53.00161551 L 106,47.00104533 M 106,47.00104534 A 1.00009503,1 90 0,1 106.29289321,46.29387136 A 1.00009503,1 90 0,1 106.99999999,46.0009503 M 107,46.0009503 L 113,46.0009503 M 113,46.0009503 A 1.00009503,1 90 0,1 113.70710678,46.29387135 A 1.00009503,1 90 0,1 114,47.00104533 M 114,47.00104533 L 114,53.00161551 M 114,53.00161549 A 1.00009503,1 90 0,1 113.70710679,53.70878948 A 1.00009503,1 90 0,1 113.00000001,54.00171054 M 113,54.00171054 L 107,54.00171054 M 107,54.00171054 A 1.00009503,1 90 0,1 106.29289322,53.70878949 A 1.00009503,1 90 0,1 106,53.00161551 M 6,13.00123539 L 6,6.99952485 M 6,6.99952487 A 1.00009503,1 90 0,1 6.29289321,6.29235088 A 1.00009503,1 90 0,1 6.99999999,5.99942982 M 7,5.99942982 L 13,5.99942982 A 1.00009503,1 90 0,1 13.70710678,6.29235087 A 1.00009503,1 90 0,1 14,6.99952485 L 14,13.00009503 M 14,13.00009502 A 1.00009503,1 90 0,1 13.70710679,13.707269 A 1.00009503,1 90 0,1 13.00000001,14.00019006 M 13,14.00019006 L 7,14.00019006 A 1.00009503,1 90 0,1 6.29289322,13.70726901 A 1.00009503,1 90 0,1 6,13.00009503 M 6,53.00161551 L 6,47.00104533 M 6,47.00104533 A 1.00009503,1 90 0,1 6.29289322,46.29387135 A 1.00009503,1 90 0,1 7,46.0009503 M 7,46.0009503 L 13,46.0009503 M 13,46.0009503 A 1.00009503,1 90 0,1 13.70710678,46.29387135 A 1.00009503,1 90 0,1 14,47.00104533 M 14,47.00104533 L 14,53.00161551 A 1.00009503,1 90 0,1 13.70710678,53.70878949 A 1.00009503,1 90 0,1 13,54.00171054 M 13,54.00171054 L 7,54.00171054 M 7,54.00171054 A 1.00009503,1 90 0,1 6.29289322,53.70878949 A 1.00009503,1 90 0,1 6,53.00161551",viewW:120,viewH:60},coffee_table_round:{d:"M 0,40 A 40,40 0 0,0 40,80 A 40,40 0 0,0 80,40 A 40,40 0 0,0 40,0 A 40,40 0 0,0 0,40 M 57.94949634,25.60507796 L 53.70718918,21.3627708 A 1.00013799,1.00013799 0 0,1 53.70718918,19.94977232 L 57.94949634,15.70636125 A 1.00013799,1.00013799 0 0,1 59.36359873,15.70636125 L 63.6070098,19.94866841 A 1.00013799,1.00013799 0 0,1 63.6070098,21.3627708 L 59.36359873,25.60618187 A 1.00013799,1.00013799 0 0,1 57.95060025,25.60618187 M 57.94949634,63.86753139 L 53.70718918,59.62522423 A 1.00013799,1.00013799 0 0,1 53.70718918,58.21112184 L 57.94949634,53.96771078 A 1.00013799,1.00013799 0 0,1 59.36359873,53.96771078 L 63.60590589,58.21112184 A 1.00013799,1.00013799 0 0,1 63.60590589,59.62412033 L 59.36359873,63.86753139 A 1.00013799,1.00013799 0 0,1 57.94949634,63.86753139 M 19.94977232,25.60618187 L 15.70746516,21.36387471 A 1.00013799,1.00013799 0 0,1 15.70746516,19.94977232 L 19.94977232,15.70636125 A 1.00013799,1.00013799 0 0,1 21.36387471,15.70636125 L 25.60728577,19.94977232 A 1.00013799,1.00013799 0 0,1 25.60728577,21.3627708 L 21.36387471,25.60618187 A 1.00013799,1.00013799 0 0,1 19.95087622,25.60618187 M 19.94977232,63.86753139 L 15.70746516,59.62522423 A 1.00013799,1.00013799 0 0,1 15.70746516,58.21112184 L 19.94977232,53.96881468 A 1.00013799,1.00013799 0 0,1 21.36387471,53.96881468 L 25.60728577,58.21112184 A 1.00013799,1.00013799 0 0,1 25.60728577,59.62522423 L 21.36387471,63.86753139 A 1.00013799,1.00013799 0 0,1 19.95087622,63.86753139",viewW:80,viewH:80},coffee_table_oval:{d:"M 0,30.00057018 C 0,13.43115081 13.43162393,0 30,0 L 90,0 C 106.56944444,0 120,13.43115081 120,30.00057018 C 120,46.56998955 106.56944444,60 90,60 L 30,60 C 13.43162393,60 0,46.56998955 0,30.00057018 M 82,13.00123539 L 82,6.99952485 M 82,6.99952487 A 1.00009503,1 90 0,1 82.29289321,6.29235088 A 1.00009503,1 90 0,1 82.99999999,5.99942982 M 83,5.99942982 L 89,5.99942982 A 1.00009503,1 90 0,1 89.70710678,6.29235087 A 1.00009503,1 90 0,1 90,6.99952485 L 90,13.00009503 M 90,13.00009502 A 1.00009503,1 90 0,1 89.70710679,13.707269 A 1.00009503,1 90 0,1 89.00000001,14.00019006 M 89,14.00019006 L 83,14.00019006 M 83,14.00019006 A 1.00009503,1 90 0,1 82.29289322,13.70726901 A 1.00009503,1 90 0,1 82,13.00009503 M 82,53.00047515 L 82,46.99990497 M 82,46.99990498 A 1.00009503,1 90 0,1 82.29289321,46.292731 A 1.00009503,1 90 0,1 82.99999999,45.99980994 M 83,45.99980994 L 89,45.99980994 M 89,45.99980994 A 1.00009503,1 90 0,1 89.70710678,46.29273099 A 1.00009503,1 90 0,1 90,46.99990497 M 90,46.99990497 L 90,53.00047515 M 90,53.00047513 A 1.00009503,1 90 0,1 89.70710679,53.70764912 A 1.00009503,1 90 0,1 89.00000001,54.00057018 M 89,54.00057018 L 83,54.00057018 M 83,54.00057018 A 1.00009503,1 90 0,1 82.29289322,53.70764913 A 1.00009503,1 90 0,1 82,53.00047515 M 30,13.00123539 L 30,6.99952485 M 30,6.99952487 A 1.00009503,1 90 0,1 30.29289321,6.29235088 A 1.00009503,1 90 0,1 30.99999999,5.99942982 M 31,5.99942982 L 37,5.99942982 M 37,5.99942982 A 1.00009503,1 90 0,1 37.70710678,6.29235087 A 1.00009503,1 90 0,1 38,6.99952485 L 38,13.00009503 A 1.00009503,1 90 0,1 37,13.9990497 L 31,13.9990497 A 1.00009503,1 90 0,1 30,13.00009503 M 30,53.00047515 L 30,46.99990497 M 30,46.99990497 A 1.00009503,1 90 0,1 30.29289322,46.29273099 A 1.00009503,1 90 0,1 31,45.99980994 M 31,45.99980994 L 37,45.99980994 M 37,45.99980994 A 1.00009503,1 90 0,1 37.70710678,46.29273099 A 1.00009503,1 90 0,1 38,46.99990497 M 38,46.99990497 L 38,53.00047515 A 1.00009503,1 90 0,1 37,53.99942982 L 31,53.99942982 A 1.00009503,1 90 0,1 30,53.00047515",viewW:120,viewH:60},coffee_table_rounded:{d:"M 0,10.00057016 C 0,4.47802041 4.47649573,0 10,0 L 110,0 C 115.52350427,0 120,4.47802041 120,10.00057016 L 120,49.99942984 C 120,55.52197959 115.52350427,60 110,60 L 10,60 C 4.47649573,60 0,55.52197959 0,49.99942984 L 0,10.00057016 M 106,13.00188152 L 106,7.00039911 M 106,7.00039913 A 1.00005702,1 90 0,1 106.29289321,6.29325202 A 1.00005702,1 90 0,1 106.99999999,6.00034209 M 107,6.00034209 L 113,6.00034209 A 1.00005702,1 90 0,1 113.70710678,6.29325201 A 1.00005702,1 90 0,1 114,7.00039911 L 114,13.00074121 M 114,13.00074119 A 1.00005702,1 90 0,1 113.70710679,13.70788829 A 1.00005702,1 90 0,1 113.00000001,14.00079822 M 113,14.00079822 L 107,14.00079822 M 107,14.00079822 A 1.00005702,1 90 0,1 106.29289322,13.7078883 A 1.00005702,1 90 0,1 106,13.00074121 M 106,53.00074121 L 106,47.00039911 M 106,47.00039913 A 1.00005702,1 90 0,1 106.29289321,46.29325202 A 1.00005702,1 90 0,1 106.99999999,46.00034209 M 107,46.00034209 L 113,46.00034209 M 113,46.00034209 A 1.00005702,1 90 0,1 113.70710678,46.29325201 A 1.00005702,1 90 0,1 114,47.00039911 M 114,47.00039911 L 114,53.00074121 M 114,53.00074119 A 1.00005702,1 90 0,1 113.70710679,53.70788829 A 1.00005702,1 90 0,1 113.00000001,54.00079822 M 113,54.00079822 L 107,54.00079822 M 107,54.00079822 A 1.00005702,1 90 0,1 106.29289322,53.7078883 A 1.00005702,1 90 0,1 106,53.00074121 M 6,13.00188152 L 6,7.00039911 M 6,7.00039913 A 1.00005702,1 90 0,1 6.29289321,6.29325202 A 1.00005702,1 90 0,1 6.99999999,6.00034209 M 7,6.00034209 L 13,6.00034209 A 1.00005702,1 90 0,1 13.70710678,6.29325201 A 1.00005702,1 90 0,1 14,7.00039911 L 14,13.00074121 M 14,13.00074119 A 1.00005702,1 90 0,1 13.70710679,13.70788829 A 1.00005702,1 90 0,1 13.00000001,14.00079822 M 13,14.00079822 L 7,14.00079822 M 7,14.00079822 A 1.00005702,1 90 0,1 6.29289322,13.7078883 A 1.00005702,1 90 0,1 6,13.00074121 M 6,53.00074121 L 6,47.00039911 M 6,47.00039911 A 1.00005702,1 90 0,1 6.29289322,46.29325201 A 1.00005702,1 90 0,1 7,46.00034209 M 7,46.00034209 L 13,46.00034209 M 13,46.00034209 A 1.00005702,1 90 0,1 13.70710678,46.29325201 A 1.00005702,1 90 0,1 14,47.00039911 M 14,47.00039911 L 14,53.00074121 M 14,53.00074121 A 1.00005702,1 90 0,1 13.70710678,53.7078883 A 1.00005702,1 90 0,1 13,54.00079822 M 13,54.00079822 L 7,54.00079822 M 7,54.00079822 A 1.00005702,1 90 0,1 6.29289322,53.7078883 A 1.00005702,1 90 0,1 6,53.00074121",viewW:120,viewH:60},table_dining:{d:"M 0,2.50060665 C 0,1.11926717 1.11927063,0 2.49917894,0 L 157.49871914,0 C 158.87967841,0 160,1.11926717 160,2.50060665 L 160,87.49939335 C 160,88.88073283 158.87967841,90 157.49871914,90 L 2.49917894,90 C 1.11927063,90 0,88.88073283 0,87.49939335 L 0,2.50060665 M 142.00023647,16.99975734 L 142.00023647,10.99939335 A 1.00051234,1.00024266 0 0,1 142.99969785,10.00024266 L 149.00066999,10.00024266 A 1.00051234,1.00024266 0 0,1 149.99908041,10.99939335 L 149.99908041,16.99975734 A 1.00051234,1.00024266 0 0,1 149.00066999,18 L 142.99969785,18 A 1.00051234,1.00024266 0 0,1 142.00023647,16.99975734 M 141.99918551,78.99951468 L 141.99918551,72.99915069 A 1.00051234,1.00024266 0 0,1 142.99969785,72 L 148.99961903,72 A 1.00051234,1.00024266 0 0,1 149.99908041,72.99915069 L 149.99908041,78.99951468 A 1.00051234,1.00024266 0 0,1 148.99961903,79.99975734 L 142.99864689,79.99975734 A 1.00051234,1.00024266 0 0,1 142.00023647,78.99951468 M 9.99986863,16.99975734 L 9.99986863,10.99939335 A 1.00051234,1.00024266 0 0,1 10.99933001,9.99915069 L 17.00030215,9.99915069 A 1.00051234,1.00024266 0 0,1 17.99871258,10.99939335 L 17.99871258,16.99975734 A 1.00051234,1.00024266 0 0,1 17.00030215,17.99890803 L 10.99933001,17.99890803 A 1.00051234,1.00024266 0 0,1 9.99986863,16.99975734 M 9.99881767,79.00060665 L 9.99881767,73.00024266 A 1.00051234,1.00024266 0 0,1 10.99933001,72 L 16.99925119,72 A 1.00051234,1.00024266 0 0,1 17.99871258,73.00024266 L 17.99871258,79.00060665 A 1.00051234,1.00024266 0 0,1 16.99925119,79.99975734 L 10.99827906,79.99975734 A 1.00051234,1.00024266 0 0,1 9.99986863,79.00060665",viewW:160,viewH:90},table_round:{d:"M 0,55 A 55,55 90 0,0 55,110 A 55,55 90 0,0 110,55 A 55,55 90 0,0 55,0 A 55,55 90 0,0 0,55 M 82.94844112,30.60630783 L 78.70638697,26.36425368 A 0.99952125,0.99952125 90 0,1 78.41321383,25.65706553 A 0.99952125,0.99952125 90 0,1 78.70638697,24.94987738 M 78.70638697,24.94987738 L 82.94844112,20.70674848 A 0.99952125,0.99952125 90 0,1 83.65562927,20.41357533 A 0.99952125,0.99952125 90 0,1 84.36281742,20.70674848 L 88.60594632,24.94987738 M 88.60594632,24.94987738 A 0.99952125,0.99952125 90 0,1 88.89911946,25.65706553 A 0.99952125,0.99952125 90 0,1 88.60594632,26.36425368 L 84.36281742,30.60630783 A 0.99952125,0.99952125 90 0,1 83.65562927,30.89948097 A 0.99952125,0.99952125 90 0,1 82.94844112,30.60630783 M 82.94844112,89.6070797 L 78.70638697,85.3639508 A 0.99952125,0.99952125 90 0,1 78.41321383,84.65676265 A 0.99952125,0.99952125 90 0,1 78.70638697,83.9495745 L 82.94844112,79.70752035 A 0.99952125,0.99952125 90 0,1 83.65562927,79.4143472 A 0.99952125,0.99952125 90 0,1 84.36281742,79.70752035 L 88.60594632,83.9495745 A 0.99952125,0.99952125 90 0,1 88.89911946,84.65676265 A 0.99952125,0.99952125 90 0,1 88.60594632,85.3639508 L 84.36174266,89.6070797 A 0.99952125,0.99952125 90 0,1 83.65455451,89.90025284 A 0.99952125,0.99952125 90 0,1 82.94736636,89.6070797 M 24.94934,30.60738258 L 20.70728586,26.36425368 A 0.99952125,0.99952125 90 0,1 20.70728586,24.95095213 L 24.95041476,20.70782323 A 0.99952125,0.99952125 90 0,1 26.3637163,20.70782323 L 30.60684521,24.95095213 A 0.99952125,0.99952125 90 0,1 30.60684521,26.36425368 L 26.3637163,30.60738258 A 0.99952125,0.99952125 90 0,1 24.95041476,30.60738258 M 24.94934,89.29325152 L 20.70728586,85.05012262 A 0.99952125,0.99952125 90 0,1 20.41411271,84.34293447 A 0.99952125,0.99952125 90 0,1 20.70728586,83.63574632 L 24.95041476,79.39369217 A 0.99952125,0.99952125 90 0,1 26.3637163,79.39369217 L 30.60684521,83.63574632 A 0.99952125,0.99952125 90 0,1 30.90001835,84.34293447 A 0.99952125,0.99952125 90 0,1 30.60684521,85.05012262 L 26.3637163,89.29325152 A 0.99952125,0.99952125 90 0,1 24.95041476,89.29325152",viewW:110,viewH:110},table_dining_oval:{d:"M 0,50 C 0,22.38579779 22.38594332,0 49.99994193,0 L 129.99901287,0 C 157.61301149,0 180,22.38579779 180,50 C 180,77.61420221 157.61301149,100 129.99901287,100 L 49.99994193,100 C 22.38594332,100 0,77.61420221 0,50 M 123.99960515,16.99935051 L 123.99960515,10.99805153 A 1.00024968,1.0002165 0 0,1 124.99880964,9.99783503 L 130.99821737,9.99783503 M 130.99821737,9.99783503 A 1.00024968,1.0002165 0 0,1 131.70617646,10.29042188 A 1.00024968,1.0002165 0 0,1 131.99951224,10.99805153 M 131.99951224,10.99805153 L 131.99951224,16.99826802 A 1.00024968,1.0002165 0 0,1 130.99926256,17.99848452 L 124.99985483,17.99848452 A 1.00024968,1.0002165 0 0,1 124.29189574,17.70589767 A 1.00024968,1.0002165 0 0,1 123.99855996,16.99826802 M 123.99960515,89.00086599 L 123.99960515,83.00064949 M 123.99960515,83.00064951 A 1.00024968,1.0002165 0 0,1 124.29257149,82.29338963 A 1.00024968,1.0002165 0 0,1 124.99985482,82.00043299 M 124.99985483,82.00043299 L 130.99926256,82.00043299 A 1.00024968,1.0002165 0 0,1 131.70654589,82.29338962 A 1.00024968,1.0002165 0 0,1 131.99951224,83.00064949 L 131.99951224,89.00086599 M 131.99951224,89.00086597 A 1.00024968,1.0002165 0 0,1 131.7065459,89.70812585 A 1.00024968,1.0002165 0 0,1 130.99926257,90.00108249 M 130.99926256,90.00108249 L 124.99985483,90.00108249 A 1.00024968,1.0002165 0 0,1 124.2925715,89.70812586 A 1.00024968,1.0002165 0 0,1 123.99960515,89.00086599 M 47.99944256,17.00043299 L 47.99944256,11.0002165 M 47.99944256,11.00021648 A 1.00024968,1.0002165 0 0,1 48.29240892,10.29295662 A 1.00024968,1.0002165 0 0,1 48.99969226,10 M 48.99969225,10 L 54.99909997,10 A 1.00024968,1.0002165 0 0,1 55.70705907,10.29258685 A 1.00024968,1.0002165 0 0,1 56.00039485,11.0002165 L 56.00039485,16.99935051 M 56.00039485,16.99935052 A 1.00024968,1.0002165 0 0,1 55.70742849,17.70661039 A 1.00024968,1.0002165 0 0,1 55.00014515,17.99956701 M 55.00014517,17.99956701 L 49.00073744,17.99956701 A 1.00024968,1.0002165 0 0,1 48.29277835,17.70698015 A 1.00024968,1.0002165 0 0,1 47.99944256,16.99935051 M 47.99944256,89.00194847 L 47.99944256,83.00173198 M 47.99944256,83.00173199 A 1.00024968,1.0002165 0 0,1 48.2924089,82.29447212 A 1.00024968,1.0002165 0 0,1 48.99969223,82.00151548 M 48.99969225,82.00151548 L 54.99909997,82.00151548 A 1.00024968,1.0002165 0 0,1 55.70638331,82.29447211 A 1.00024968,1.0002165 0 0,1 55.99934966,83.00173198 L 55.99934966,89.00194847 A 1.00024968,1.0002165 0 0,1 54.99909997,90.00108249 L 48.99969225,90.00108249 M 48.99969225,90.00108249 A 1.00024968,1.0002165 0 0,1 48.29240891,89.70812586 A 1.00024968,1.0002165 0 0,1 47.99944256,89.00086599",viewW:180,viewH:100},table_dining_rounded:{d:"M 0,15.00018199 C 0,6.71552153 6.71566792,0 14.99937599,0 L 144.99957305,0 C 153.28433208,0 160,6.71552153 160,15.00018199 L 160,74.99981801 C 160,83.28447847 153.28433208,90 144.99957305,90 L 14.99937599,90 C 6.71566792,90 0,83.28447847 0,74.99981801 L 0,15.00018199 M 142.0011692,16.99955109 L 142.0011692,10.9992599 A 1.00051891,1.00023052 0 0,1 143.00063715,10.00012133 L 149.0016487,10.00012133 A 1.00051891,1.00023052 0 0,1 150.00006569,10.9992599 L 150.00006569,16.99955109 A 1.00051891,1.00023052 0 0,1 149.0016487,17.99978161 L 143.00063715,17.99978161 A 1.00051891,1.00023052 0 0,1 142.0011692,16.99955109 M 142.00011823,78.99855619 L 142.00011823,72.99826501 A 1.00051891,1.00023052 0 0,1 143.00063715,71.99912644 L 149.00059774,71.99912644 A 1.00051891,1.00023052 0 0,1 150.00006569,72.99826501 L 150.00006569,78.99855619 A 1.00051891,1.00023052 0 0,1 149.00059774,79.99878672 L 142.99958618,79.99878672 A 1.00051891,1.00023052 0 0,1 142.0011692,78.99855619 M 9.99993431,16.99955109 L 9.99993431,10.9992599 A 1.00051891,1.00023052 0 0,1 10.99940226,9.99902937 L 17.00041382,9.99902937 A 1.00051891,1.00023052 0 0,1 17.9988308,10.9992599 L 17.9988308,16.99955109 A 1.00051891,1.00023052 0 0,1 17.00041382,17.99868965 L 10.99940226,17.99868965 A 1.00051891,1.00023052 0 0,1 9.99993431,16.99955109 M 9.99888335,78.99964815 L 9.99888335,72.99935696 A 1.00051891,1.00023052 0 0,1 10.99940226,71.99912644 L 16.99936285,71.99912644 A 1.00051891,1.00023052 0 0,1 17.9988308,72.99935696 L 17.9988308,78.99964815 A 1.00051891,1.00023052 0 0,1 16.99936285,79.99878672 L 10.9983513,79.99878672 A 1.00051891,1.00023052 0 0,1 9.99993431,78.99964815",viewW:160,viewH:90},desk:{d:"M 0,2.5007596 C 0,1.11940895 1.11872146,0 2.4999244,0 L 137.5000756,0 C 138.88127854,0 140,1.11940895 140,2.5007596 L 140,67.50035981 C 140,68.88171046 138.88127854,70 137.5000756,70 L 2.4999244,70 C 1.11872146,70 0,68.88059105 0,67.50035981 L 0,2.5007596 M 6.00003024,12.99969616 L 6.00003024,6.99966418 A 1.00018144,0.99963219 0 0,1 6.2929766,6.29281747 A 1.00018144,0.99963219 0 0,1 7.00021168,6.00003198 L 13.00130031,6.00003198 A 1.00018144,0.99963219 0 0,1 14.00042336,6.99966418 L 14.00042336,12.99969616 M 14.00042336,12.99969616 A 1.00018144,0.99963219 0 0,1 13.70787328,13.70726661 A 1.00018144,0.99963219 0 0,1 13.00024192,14.00044776 M 13.00024192,14.00044776 L 7.00021168,14.00044776 A 1.00018144,0.99963219 0 0,1 6.29258032,13.70726661 A 1.00018144,0.99963219 0 0,1 6.00003024,12.99969616 M 125.99957664,13.00081557 L 125.99957664,7.00078359 M 125.99957664,7.00078359 A 1.00018144,0.99963219 0 0,1 126.29212672,6.29321313 A 1.00018144,0.99963219 0 0,1 126.99975808,6.00003198 L 133.00084671,6.00003198 M 133.00084671,6.00003198 A 1.00018144,0.99963219 0 0,1 133.70779377,6.29358707 A 1.00018144,0.99963219 0 0,1 133.99996976,7.00078359 M 133.99996976,7.00078359 L 133.99996976,13.00081557 A 1.00018144,0.99963219 0 0,1 132.99978832,14.00044776 L 126.99975808,14.00044776 A 1.00018144,0.99963219 0 0,1 125.99957664,13.00081557 M 5.99897185,63.00033582 L 5.99897185,57.00030384 M 5.99897185,57.00030384 A 1.00018144,0.99963219 0 0,1 6.29229231,56.29308288 A 1.00018144,0.99963219 0 0,1 7.00021168,56.00067165 M 7.00021168,56.00067165 L 13.00024192,56.00067165 A 1.00018144,0.99963219 0 0,1 13.707477,56.29345714 A 1.00018144,0.99963219 0 0,1 14.00042336,57.00030384 L 14.00042336,63.00033582 M 14.00042336,63.00033582 A 1.00018144,0.99963219 0 0,1 13.70787328,63.70790627 A 1.00018144,0.99963219 0 0,1 13.00024192,64.00108743 M 13.00024192,64.00108743 L 6.99915329,64.00108743 M 6.99915329,64.00108743 A 1.00018144,0.99963219 0 0,1 6.29220623,63.70753234 A 1.00018144,0.99963219 0 0,1 6.00003024,63.00033582 M 126.00063504,63.00145523 L 126.00063504,57.00142325 M 126.00063504,57.00142325 A 1.00018144,0.99963219 0 0,1 126.29318511,56.2938528 A 1.00018144,0.99963219 0 0,1 127.00081647,56.00067165 L 133.00084671,56.00067165 A 1.00018144,0.99963219 0 0,1 133.70847808,56.2938528 A 1.00018144,0.99963219 0 0,1 134.00102815,57.00142325 L 134.00102815,63.00145523 A 1.00018144,0.99963219 0 0,1 133.00084671,64.00108743 L 126.99975808,64.00108743 A 1.00018144,0.99963219 0 0,1 126.00063504,63.00145523 M 22.99993952,60.00031983 L 117.00006048,60.00031983",viewW:140,viewH:70},desk_corner:{d:"M 159.99894904,65.49825605 A 2.50129729,2.50128086 90 0,1 157.49871914,67.99955334 L 94.99927747,67.99955334 C 81.19178676,67.99955334 69.99908041,79.19233321 69.99908041,92.99886364 L 69.99908041,157.49870271 A 2.50129729,2.50128086 90 0,1 67.49885051,160 L 2.49917894,160 A 2.50129729,2.50128086 90 0,1 0,157.49870271 L 0,2.49814439 A 2.50129729,2.50128086 90 0,1 2.49917894,0 L 157.49871914,0 A 2.50129729,2.50128086 90 0,1 160,2.49919535 L 159.99894904,65.49825605 M 5.99992118,12.99938913 L 5.99992118,6.99837757 M 5.99992118,6.99837757 A 0.99841698,0.99841043 90 0,1 6.29272029,6.29201832 A 0.99841698,0.99841043 90 0,1 6.99938256,5.99996059 M 6.99938256,5.99996059 L 13.0003547,5.99996059 A 0.99841698,0.99841043 90 0,1 13.99876512,6.99837757 L 13.99876512,12.99938913 M 13.99876512,12.99938913 A 0.99841698,0.99841043 90 0,1 13.70670931,13.70605604 A 0.99841698,0.99841043 90 0,1 13.0003547,13.99885708 M 13.0003547,13.99885708 L 6.99938256,13.99885708 A 0.99841698,0.99841043 90 0,1 6.29234827,13.70642806 A 0.99841698,0.99841043 90 0,1 5.99992118,12.99938913 M 146.00018392,13.00044009 L 146.00018392,6.99942854 M 146.00018392,6.99942854 A 0.99841698,0.99841043 90 0,1 146.29261101,6.2923896 A 0.99841698,0.99841043 90 0,1 146.9996453,5.99996059 M 146.9996453,5.99996059 L 153.00061744,5.99996059 A 0.99841698,0.99841043 90 0,1 153.70697205,6.29276163 A 0.99841698,0.99841043 90 0,1 153.99902786,6.99942854 L 153.99902786,13.00044009 M 153.99902786,13.00044009 A 0.99841698,0.99841043 90 0,1 153.70697205,13.707107 A 0.99841698,0.99841043 90 0,1 153.00061744,13.99990804 L 146.9996453,13.99990804 A 0.99841698,0.99841043 90 0,1 146.29261101,13.70747903 A 0.99841698,0.99841043 90 0,1 146.00018392,13.00044009 M 146.00018392,61.0001248 L 146.00018392,54.99911325 M 146.00018392,54.99911325 A 0.99841698,0.99841043 90 0,1 146.29298209,54.29170176 A 0.99841698,0.99841043 90 0,1 147.00069626,53.9996453 M 147.00069626,53.9996453 L 153.00061744,53.9996453 M 153.00061744,53.9996453 A 0.99841698,0.99841043 90 0,1 153.70765173,54.29207431 A 0.99841698,0.99841043 90 0,1 154.00007882,54.99911325 L 154.00007882,61.0001248 M 154.00007882,61.0001248 A 0.99841698,0.99841043 90 0,1 153.70765173,61.70716374 A 0.99841698,0.99841043 90 0,1 153.00061744,61.99959275 M 153.00061744,61.99959275 L 146.9996453,61.99959275 A 0.99841698,0.99841043 90 0,1 146.29329069,61.70679171 A 0.99841698,0.99841043 90 0,1 146.00123488,61.0001248 M 5.99887022,152.9995205 L 5.99887022,147.00061087 M 5.99887022,147.00061087 A 0.99841698,0.99841043 90 0,1 6.29129565,146.29251931 A 0.99841698,0.99841043 90 0,1 6.99938256,146.00009196 M 6.99938256,146.00009196 L 12.99930374,146.00009196 A 0.99841698,0.99841043 90 0,1 13.70671058,146.29289205 A 0.99841698,0.99841043 90 0,1 13.99876512,147.00061087 L 13.99876512,153.00057146 M 13.99876512,153.00057146 A 0.99841698,0.99841043 90 0,1 13.70633803,153.7076104 A 0.99841698,0.99841043 90 0,1 12.99930374,154.00003941 M 12.99930374,154.00003941 L 6.9983316,154.00003941 A 0.99841698,0.99841043 90 0,1 6.29129731,153.7076104 A 0.99841698,0.99841043 90 0,1 5.99887022,153.00057146 M 55.99926433,153.00057146 L 55.99926433,147.00061087 M 55.99926433,147.00061087 A 0.99841698,0.99841043 90 0,1 56.2920625,146.29319939 A 0.99841698,0.99841043 90 0,1 56.99977667,146.00114292 M 56.99977667,146.00114292 L 62.99969785,146.00114292 A 0.99841698,0.99841043 90 0,1 63.70673214,146.29357194 A 0.99841698,0.99841043 90 0,1 63.99915923,147.00061087 L 63.99915923,153.00162243 M 63.99915923,153.00162243 A 0.99841698,0.99841043 90 0,1 63.70636012,153.70798168 A 0.99841698,0.99841043 90 0,1 62.99969785,154.00003941 M 62.99969785,154.00003941 L 56.99872571,154.00003941 M 56.99872571,154.00003941 A 0.99841698,0.99841043 90 0,1 56.29206344,153.70798168 A 0.99841698,0.99841043 90 0,1 55.99926433,153.00162243 M 109.99960589,57.99856806 L 96.36237044,57.99856806 A 36.36339751,36.36315866 90 0,0 70.64973437,68.6491606 A 36.36339751,36.36315866 90 0,0 59.99921178,94.36196557 L 59.99921178,107.9992906",viewW:160,viewH:160},chair:{d:"M 41.91143767,10.29325717 L 8.08739211,10.29325717 A 5.14662859,5.14662858 90 0,1 2.94076353,5.14662859 A 5.14662859,5.14662858 90 0,1 8.08739211,0 L 41.91143767,0 A 5.14662859,5.14662858 90 0,1 47.05806625,5.14662859 A 5.14662859,5.14662858 90 0,1 41.91143767,10.29325717 M 8.08739211,10.29325717 L 5.14662867,10.29325717 A 5.14896903,5.14896902 90 0,0 0.00000009,15.44105598 L 0.00000009,42.64633596 M 0.00000009,42.64633596 A 7.35249373,7.35249371 90 0,0 2.15308186,47.84609063 A 7.35249373,7.35249371 90 0,0 7.35249381,49.99999991 M 7.35249381,49.99999991 L 42.64633597,49.99999991 M 42.64633597,49.99999991 A 7.35249373,7.35249371 90 0,0 47.84650445,47.84650445 A 7.35249373,7.35249371 90 0,0 49.99999991,42.64633596 M 49.99999991,42.64633596 L 49.99999991,15.44105598 C 49.99999991,12.59742081 47.69466605,10.29325717 44.85220111,10.29325717 L 41.91143767,10.29325717",viewW:50,viewH:50},chair_bar:{d:"M 41.6420124,15.95288922 C 43.22061234,18.92793522 43.95991141,23.03717335 43.95991141,26.63643725 C 43.95991141,38.43533309 34.35259503,48 22.5011905,48 C 10.64978597,48 1.04127909,38.43533309 1.04127909,26.63643725 C 1.04127909,23.03717335 1.73891074,18.91969084 3.31751068,15.94464483 M 41.6420124,15.95288922 A 4.27388672,4.22819286 0 0,1 37.67408359,14.80338609 M 41.6420124,15.95288922 A 4.28579169,4.23997056 0 0,0 43.74324083,14.80338609 M 3.47227538,15.97644461 L 3.31751068,15.94464483 A 4.28579169,4.23997056 0 0,1 1.25675917,14.80338609 M 37.67408359,14.80338609 A 21.42895847,21.19985278 0 0,0 30.71205308,10.17239603 A 21.34562363,21.11740891 0 0,0 14.28794692,10.17239603 A 21.42895847,21.19985278 0 0,0 7.32591641,14.80338609 A 4.27388672,4.22819286 0 0,1 3.47227538,15.97644461 M 37.67408359,14.80338609 A 4.27388672,4.22819286 0 0,0 40.70866221,16.0541972 A 4.27388672,4.22819286 0 0,0 43.74324083,14.80338609 M 3.47227538,15.97644461 A 4.28579169,4.23997056 0 0,1 1.25675917,14.80338609 A 4.33817359,4.29179242 0 0,1 1.25675917,8.76142805 A 30.00054185,29.67979389 0 0,1 11.00336378,2.2778064 A 29.88149208,29.56201693 0 0,1 22.5,0 A 29.88149208,29.56201693 0 0,1 33.99663622,2.2778064 A 30.00054185,29.67979389 0 0,1 43.74324083,8.76142805 A 4.33817359,4.29179242 0 0,1 43.74324083,14.80338609",viewW:45,viewH:48},armchair:{d:"M 78.52464784,10.06903664 Q 78.5377513,9.82334385 78.5377513,9.57437515 C 78.5377513,4.28597428 74.26056466,0 68.98533141,0 L 21.01357664,0 C 15.73943534,0 11.4622487,4.28597428 11.4622487,9.57437515 Q 11.4622487,9.82334385 11.4742602,10.06903664 M 80.08614309,74.58141228 Q 80.73039638,74.68078136 81.40304049,74.68187333 C 86.15085961,74.68187333 90,70.8239505 90,66.06406212 L 90,18.19218636 C 90,13.43229799 86.15085961,9.57437515 81.40304049,9.57437515 C 80.39407433,9.57437515 79.42441853,9.74909003 78.52464784,10.06903664 A 8.61562727,8.61552274 90 0,0 72.80608097,18.19109439 L 72.80608097,18.35270565 A 9.50012133,9.50000607 90 0,1 68.98533141,19.14984227 L 21.01357664,19.14984227 A 9.50012133,9.50000607 90 0,1 17.19282707,18.35270565 M 72.80608097,18.35270565 L 72.80608097,66.06406212 A 8.61562727,8.61552274 90 0,0 80.08614309,74.58141228 M 11.4742602,10.06794467 A 8.61562727,8.61552274 90 0,1 17.19282707,18.19000243 L 17.19282707,18.35161369 L 17.19282707,66.06406212 A 8.61562727,8.61552274 90 0,1 9.91385691,74.58141228 Q 9.26960362,74.68078136 8.59695951,74.68187333 C 3.84914039,74.68187333 0,70.8239505 0,66.06406212 L 0,18.19218636 C 0,13.43229799 3.84914039,9.57437515 8.59695951,9.57437515 C 9.60592567,9.57437515 10.57448951,9.74909003 11.4742602,10.06903664 M 80.08614309,74.58141228 C 78.35539486,83.37175443 70.62217153,90 61.34383228,90 L 28.65507577,90 C 19.37782847,90 11.64460514,83.37175443 9.91385691,74.58141228",viewW:90,viewH:90},armchair_office:{d:"M 60.12480149,17.08328496 Q 60.12480149,16.66780357 60.06834946,16.27038659 M 51.18618701,11.38735127 L 13.81381391,11.38735127 A 5.69036465,5.69028856 0 0,1 9.79038036,9.71870864 A 5.69036465,5.69028856 0 0,1 8.12570733,5.69367564 M 8.12570733,5.69367564 A 5.69036465,5.69028856 0 0,1 9.79038036,1.66864264 A 5.69036465,5.69028856 0 0,1 13.81381391,0 M 13.81381391,0 L 51.18844509,0 M 51.18844509,0 A 5.69036465,5.69028856 0 0,1 55.21187864,1.66864264 A 5.69036465,5.69028856 0 0,1 56.87655166,5.69367564 M 56.87655166,5.69367564 A 5.69036465,5.69028856 0 0,1 55.21187864,9.71870864 A 5.69036465,5.69028856 0 0,1 51.18844509,11.38735127 M 13.81381391,11.38735127 L 10.56217696,11.38735127 A 5.69036465,5.69028856 0 0,0 4.9327805,16.26812854 M 51.18731605,11.38735127 L 54.43782395,11.38735127 A 5.69036465,5.69028856 0 0,1 60.06722042,16.26925757 M 60.12480149,44.29844483 A 4.87745542,4.87739019 0 0,0 63.57342145,42.86789464 A 4.87745542,4.87739019 0 0,0 64.99999882,39.41766756 M 64.99999882,39.41766756 L 64.99999882,21.15003484 M 64.99999882,21.15003484 A 4.87745542,4.87739019 0 0,0 63.55272454,17.68002711 A 4.87745542,4.87739019 0 0,0 60.06722042,16.27038659 M 60.12480149,44.29957385 A 4.87745542,4.87739019 0 0,1 56.67618152,42.86902366 A 4.87745542,4.87739019 0 0,1 55.24960415,39.41879658 M 55.24960415,39.41879658 L 55.24960415,21.15003484 A 4.87745542,4.87739019 0 0,1 60.06722042,16.27038659 M 46.69937964,58.31529651 L 52.00022529,58.31529651 C 52.83119917,58.31529651 53.632818,58.18997468 54.38814617,57.95739542 A 8.14038277,8.14027391 0 0,0 60.12480149,50.1795387 L 60.12480149,44.29957385 M 4.9327805,16.26925757 L 4.87519943,16.26925757 M 4.87519943,16.26925757 A 4.87745542,4.87739019 0 0,0 1.42657946,17.69980776 A 4.87745542,4.87739019 0 0,0 0.00000209,21.15003484 L 0.00000209,39.41766756 M 0.00000209,39.41766756 A 4.87745542,4.87739019 0 0,0 1.42617995,42.86862456 A 4.87745542,4.87739019 0 0,0 4.87519943,44.29957385 M 4.87519943,44.29957385 A 4.87745542,4.87739019 0 0,0 8.32308951,42.86862466 A 4.87745542,4.87739019 0 0,0 9.74926772,39.41879658 M 9.74926772,39.41879658 L 9.74926772,21.15003484 A 4.87745542,4.87739019 0 0,0 4.9327805,16.26925757 M 18.40788013,58.31416748 L 12.99977563,58.31416748 A 8.12909236,8.12898366 0 0,1 10.69653279,57.98223398 A 8.14038277,8.14027391 0 0,1 4.87519943,50.18066772 L 4.87519943,44.29844483 M 46.70050868,58.31416748 L 52.5455519,64.16590669 C 53.63959225,65.26106143 55.40654079,65.28025487 56.52429099,64.20880966 A 2.85195657,2.85191843 0 0,0 57.39975759,62.18274316 A 2.85195657,2.85191843 0 0,0 56.56719454,60.1386727 L 54.38814617,57.95739542 M 46.69937964,58.31416748 L 18.40900917,58.31416748 M 10.69766183,57.98223398 L 8.54232332,60.1386727 C 7.41554079,61.26769821 7.43586352,63.10462271 8.58522686,64.20880966 C 9.70297706,65.28025487 11.46992561,65.26106143 12.56396596,64.16590669 L 18.40900917,58.31416748",viewW:65,viewH:65},sofa:{d:"M 89.9994774,17.00719477 L 89.9994774,79.3698208 M 89.9994774,17.00828672 L 89.9994774,4.25097973 M 89.9994774,17.00610281 C 89.9994774,19.35489742 88.08050309,21.25817449 85.71418617,21.25817449 L 27.85648339,21.25817449 A 11.68391551,11.18356492 90 0,1 23.53356521,20.35731185 M 89.9994774,17.00719477 C 89.9994774,19.35598937 91.91845172,21.25926645 94.28476863,21.25926645 L 152.14247142,21.25926645 C 153.68099549,21.25926645 155.14322047,20.93823176 156.46643479,20.3584038 M 89.9994774,79.3698208 C 89.9994774,85.24016937 85.20204161,90 79.28624932,90 L 27.8554382,90 C 22.35145195,90 17.81635959,85.8811468 17.21014766,80.58189054 M 89.9994774,79.3698208 C 89.9994774,85.24016937 94.7969132,90 100.71270548,90 L 152.14247142,90 C 157.64645767,90 162.18155002,85.8811468 162.78776195,80.58189054 M 89.9994774,4.25207168 C 89.9994774,1.90436903 88.07945789,0 85.71314098,0 L 27.85648339,0 C 21.93964591,0 17.14325531,4.75873867 17.14325531,10.6301792 Q 17.14325531,11.08443237 17.18088226,11.53104185 M 89.9994774,4.25207168 C 89.9994774,1.90436903 91.91845172,0 94.28476863,0 L 152.14247142,0 C 158.0593089,0 162.8556995,4.75873867 162.8556995,10.6301792 Q 162.8556995,11.08443237 162.81807255,11.53104185 A 11.68391551,11.18356492 90 0,1 167.14203592,10.6301792 L 169.28468154,10.6301792 C 175.20256421,10.6301792 180,15.38891787 180,21.25926645 L 180,70.86676939 C 180,76.73711797 175.20256421,81.49585664 169.28572673,81.49585664 L 167.14308111,81.49585664 C 165.59201473,81.49585664 164.11829262,81.16827022 162.78776195,80.58189054 C 159.04074511,78.92539523 156.42880784,75.19855377 156.42880784,70.86567744 L 156.42880784,21.2603584 Q 156.42880784,20.80501329 156.46643479,20.35949576 C 156.80089654,16.40443576 159.31772125,13.06523823 162.81807255,11.5321338 M 17.18088226,11.5321338 C 20.68227875,13.06523823 23.19910346,16.40443576 23.53356521,20.35949576 Q 23.57119216,20.80501329 23.57119216,21.2603584 L 23.57119216,70.86786135 C 23.57119216,75.19964572 20.9582097,78.92648718 17.21119286,80.58298249 A 11.68391551,11.18356492 90 0,1 12.85691889,81.49694859 L 10.71427327,81.49694859 C 4.7963906,81.49694859 0,76.73820992 0,70.86676939 L 0,21.2603584 C 0,15.39000983 4.79743579,10.63127116 10.71322808,10.63127116 L 12.85587369,10.63127116 C 14.39544296,10.63127116 15.85766794,10.95230584 17.18088226,11.5321338",viewW:180,viewH:90},sofa_three_seat:{d:"M 85.42409676,16.16420572 L 85.42409676,79.89832688 M 85.42409676,16.16529768 L 85.42409676,4.04132442 M 85.42409676,16.16420572 C 85.42409676,18.39616117 83.60262573,20.20553014 81.35628263,20.20553014 L 26.44130873,20.20553014 C 24.98061715,20.20553014 23.59228821,19.89978282 22.33731328,19.34943764 M 85.42409676,16.16420572 C 85.42409676,18.39616117 87.24556779,20.20553014 89.49191089,20.20553014 L 150.50808911,20.20553014 C 152.75546596,20.20553014 154.57590324,18.39616117 154.57590324,16.16529768 M 85.42409676,79.89614297 C 85.42409676,85.47603159 80.87145294,89.99890805 75.25507831,89.99890805 L 26.44130873,89.99890805 C 21.21672611,89.99890805 16.91218277,86.08425037 16.3363829,81.04706325 M 85.42409676,79.89614297 C 85.42409676,85.47603159 89.97674058,89.99890805 95.59311521,89.99890805 L 144.40688479,89.99890805 C 150.02325942,89.99890805 154.57590324,85.47603159 154.57590324,79.89614297 M 154.57590324,16.16311377 L 154.57590324,79.89832688 M 154.57590324,16.16529768 L 154.57590324,4.04132442 M 154.57590324,16.16420572 C 154.57590324,18.39616117 156.39737427,20.20553014 158.64475112,20.20553014 L 213.55972502,20.20553014 C 215.0204166,20.20553014 216.40874554,19.89978282 217.66372047,19.34943764 M 154.57590324,79.89723493 C 154.57590324,85.47712355 159.12958081,90 164.74595545,90 L 213.55972502,90 C 218.78430764,90 223.08885098,86.08534233 223.66465085,81.0481552 M 85.42409676,4.04132442 C 85.42409676,1.80936897 83.60262573,0 81.35628263,0 L 26.44130873,0 C 20.8249341,0 16.27125653,4.52287645 16.27125653,10.10276507 Q 16.27125653,10.53517914 16.30743785,10.95885757 M 85.42409676,4.04132442 C 85.42409676,1.80936897 87.24556779,0 89.49191089,0 L 150.50808911,0 C 152.75546596,0 154.57590324,1.80936897 154.57590324,4.04023247 C 154.57590324,1.80936897 156.39737427,0 158.64475112,0 L 213.55972502,0 C 219.17609965,0 223.72977723,4.52287645 223.72977723,10.10276507 C 223.72977723,10.38448939 223.75251977,10.66730566 223.72977723,10.94357021 M 223.66465085,81.0481552 C 224.92582829,81.60723602 226.32552851,81.91735116 227.79759136,81.91735116 L 229.83098155,81.91735116 C 235.44735618,81.91735116 240,77.39447471 240,71.81458609 L 240,20.20553014 C 240,14.62564152 235.44735618,10.10276507 229.83098155,10.10276507 L 227.79759136,10.10276507 C 222.47066729,10.10276507 218.10099757,14.17029641 217.66372047,19.34943764 Q 217.6265054,19.77202412 217.62753915,20.20553014 L 217.62753915,71.81458609 C 217.62753915,75.93234734 220.10751021,79.47464845 223.66465085,81.0481552 M 16.30743785,10.95885757 A 11.24713362,10.64764563 90 0,0 12.20344239,10.10276507 L 10.1700522,10.10276507 C 4.55367757,10.10276507 0,14.62564152 0,20.20553014 L 0,71.81458609 C 0,77.39447471 4.55367757,81.91735116 10.1700522,81.91735116 L 12.20344239,81.91735116 C 13.67550525,81.91735116 15.07417171,81.60723602 16.3363829,81.0481552 C 19.89352354,79.47464845 22.3734946,75.93234734 22.3734946,71.81458609 L 22.3734946,20.20553014 A 9.82759248,9.30376803 90 0,0 22.33731328,19.34943764 C 22.01995141,15.58983754 19.63095053,12.41661712 16.30743785,10.95885757",viewW:240,viewH:90},sofa_corner_right:{d:"M 92.54139418,17.60590034 L 92.54139418,83.62724067 M 92.54139418,17.60485243 L 92.54139418,4.40121311 M 92.54139418,17.60485243 C 92.54139418,20.03599872 90.56883033,22.00606554 88.13534854,22.00606554 L 28.64290558,22.00606554 A 11.31740513,11.1362726 90 0,1 24.19767677,21.07342752 M 92.54139418,17.60485243 C 92.54139418,20.03599872 94.51498915,22.00606554 96.94847094,22.00606554 L 163.05049792,22.00606554 C 165.48397971,22.00606554 167.45757469,20.03599872 167.45757469,17.60485243 M 92.54139418,83.62933649 C 92.54139418,89.70720221 87.609469,94.63341717 81.52473339,94.63341717 L 28.64290558,94.63341717 C 22.98299815,94.63341717 18.32019956,90.3705279 17.69636207,84.88368223 M 92.54139418,83.62933649 C 92.54139418,89.70720221 97.47435048,94.63341717 103.55805496,94.63341717 L 156.4409139,94.63341717 C 162.52461838,94.63341717 167.45757469,89.70720221 167.45757469,83.6303844 M 167.45757469,17.60694825 L 167.45757469,83.62724067 M 167.45757469,17.60485243 L 167.45757469,4.40121311 M 167.45757469,17.60485243 C 167.45757469,20.03599872 169.43116967,22.00606554 171.86362032,22.00606554 L 231.35606328,22.00606554 C 232.93782644,22.00606554 234.44225438,21.67387874 235.80232323,21.07342752 M 167.45860582,83.62828858 L 167.45860582,158.99696723 C 167.45860582,165.07378504 172.38949986,170 178.47526661,170 L 231.35606328,170 C 237.01700185,170 241.67980044,165.73711073 242.30260679,160.25026506 L 242.30260679,84.88263432 M 92.54139418,4.40121311 C 92.54139418,1.97006682 90.56883033,0 88.13534854,0 L 28.64290558,0 C 22.55920111,0 17.6262448,4.92516705 17.6262448,11.00303277 Q 17.6262448,11.47459132 17.66542798,11.93567078 M 92.54139418,4.40121311 C 92.54139418,1.97006682 94.51498915,0 96.94847094,0 L 163.05049792,0 C 165.48397971,0 167.45757469,1.97006682 167.45757469,4.40121311 C 167.45757469,1.97006682 169.43116967,0 171.86362032,0 L 231.35606328,0 C 237.43976776,0 242.3737552,4.92516705 242.3737552,11.00303277 C 242.3737552,11.31006978 242.39850247,11.6181547 242.3737552,11.91890426 M 242.30157566,84.88263432 C 243.66989359,85.49042089 245.18566403,85.82994304 246.78083197,85.82994304 L 248.98333922,85.82994304 C 255.06807483,85.82994304 260,80.90268018 260,74.82586237 L 260,22.00711345 C 260,15.92924773 255.06807483,11.00408068 248.98333922,11.00408068 L 246.78083197,11.00408068 C 241.01059294,11.00408068 236.27664595,15.4335873 235.80232323,21.07447543 Q 235.76314005,21.5355549 235.76314005,22.00711345 L 235.76314005,74.82481446 C 235.76314005,79.3098602 238.44925024,83.16720911 242.30260679,84.88158641 M 17.66645912,11.93567078 A 11.31740513,11.1362726 90 0,0 13.22019917,11.00303277 L 11.01666078,11.00303277 C 4.93295631,11.00303277 0,15.92924773 0,22.00606554 L 0,74.82586237 C 0,80.90372809 4.93192517,85.82889514 11.01666078,85.82889514 L 13.22019917,85.82889514 C 14.81433597,85.82889514 16.33010641,85.4914688 17.69739321,84.88263432 C 21.55074976,83.16825702 24.23685995,79.3109081 24.23685995,74.82586237 L 24.23685995,22.00711345 Q 24.23685995,21.5355549 24.19870791,21.07447543 C 23.85430837,16.98029933 21.26615612,13.52325123 17.66645912,11.93671869",viewW:260,viewH:170},bed_single:{d:"M 0,10.53299756 C 0,16.34997607 4.71506048,21.06599513 10.53190328,21.06599513 L 79.46700477,21.06599513 C 85.28493952,21.06599513 90,16.34997607 90,10.53299756 M 65.10670824,59.36856126 L 65.10670824,44.04670232 C 65.10670824,38.75835085 60.81969401,34.4721014 55.5313573,34.4721014 L 34.46755075,34.4721014 C 29.18030599,34.4721014 24.89329176,38.75939145 24.89329176,44.04670232 L 24.89329176,59.36752066 M 0,59.36752066 L 89.99890805,59.36752066 M 89.99890805,82.34926846 L 0,82.34926846 M 9.57425899,200 L 80.42574101,200 C 85.71298577,200 90,195.71270994 90,190.42435847 L 90,9.57564153 C 90,4.28729006 85.71298577,0 80.42574101,0 L 9.57425899,0 C 4.28592228,0 0,4.28729006 0,9.57564153 L 0,190.42435847 C 0,195.71270994 4.28592228,200 9.57425899,200",viewW:90,viewH:200},bed_double:{d:"M 0,10.58300164 C 0,16.42914748 4.74612788,21.1680845 10.60206776,21.1680845 L 149.39688128,21.1680845 C 155.25177021,21.1680845 159.99894904,16.42914748 159.99894904,10.58300164 M 74.69791516,59.65815968 L 74.69791516,44.26233773 C 74.69791516,38.94794349 70.38268021,34.63981893 65.0595762,34.63981893 L 43.85438972,34.63981893 C 38.53128572,34.63981893 34.21710172,38.94794349 34.21710172,44.26233773 L 34.21710172,59.65815968 M 128.67408468,59.65815968 L 128.67408468,44.26233773 C 128.67408468,38.94794349 124.35779877,34.63981893 119.03469476,34.63981893 L 97.83055924,34.63981893 C 92.50745524,34.63981893 88.19222028,38.94794349 88.19222028,44.26233773 L 88.19222028,59.65815968 M 0,59.65815968 L 159.99894904,59.65815968 M 159.99894904,82.7513723 L 0.00105096,82.7513723 M 9.63833896,200 L 150.36166104,200 C 155.68476505,200 160,195.69187544 160,190.3774812 L 160,9.6225188 C 160,4.30812456 155.68476505,0 150.36166104,0 L 9.63833896,0 C 4.31628591,0 0.00105096,4.30812456 0.00105096,9.6225188 L 0.00105096,190.37644059 C 0.00105096,195.69083483 4.31628591,199.99895939 9.63833896,199.99895939",viewW:160,viewH:200},nightstand:{d:"M 2.49959042,0.00000027 L 47.49923936,0.00000027 M 47.49923936,0.00000027 A 2.50053206,2.49959042 90 0,1 49.26747323,0.73197514 A 2.50053206,2.49959042 90 0,1 50,2.50053233 L 50,37.49946767 M 50,37.49946767 A 2.50053206,2.49959042 90 0,1 49.26747323,39.26802486 A 2.50053206,2.49959042 90 0,1 47.49923936,39.99999973 M 47.49923936,39.99999973 L 2.49959042,39.99999973 A 2.50053206,2.49959042 90 0,1 0,37.49946767 L 0,2.50053233 A 2.50053206,2.49959042 90 0,1 2.49959042,0.00000027",viewW:50,viewH:40},cabinet_tv:{d:"M 55.99957664,17 L 61.62493574,17 L 67.25029484,17 M 61.62493574,17 L 61.62493574,27.96904762 M 72.03105628,17 L 77.65641537,28.25 L 83.28071608,17 M 2.4999244,45 L 137.5000756,45 C 138.88127854,45 140,43.88095238 140,42.5 L 140,2.5 C 140,1.11904762 138.88127854,0 137.5000756,0 L 2.4999244,0 C 1.11872146,0 0,1.11904762 0,2.5 L 0,42.5 C 0,43.88095238 1.11872146,45 2.4999244,45",viewW:140,viewH:45},cabinet_shoe:{d:"M 39.69311439,15.91375 L 41.35449151,13.91875 M 42.60631986,17.85625 L 44.2952946,15.68375 M 2.50034497,35 L 77.49965503,35 C 78.88064026,35 80,33.88125 80,32.5 L 80,2.5 C 80,1.11875 78.88064026,0 77.50075893,0 L 2.50034497,0 C 1.11935974,0 0,1.11875 0,2.5 L 0,32.5 C 0,33.88125 1.11935974,35 2.50034497,35 M 48.82682489,17.11875 L 47.63902304,17 A 4.25,3.75327722 90 0,1 45.63764316,16.1175 L 40.57844625,11.5925 C 39.18311025,10.3425 36.96094936,11.185 36.74237616,13.04375 C 36.53815372,14.78125 34.55333241,15.66875 33.12156755,14.6675 L 31.43038499,13.48375 C 30.36180488,12.8425 29.00179385,13.6125 29.00179385,14.85875 L 29.00179385,19.1875 C 29.00179385,21.13625 30.58037809,22.71625 32.52987443,22.71625 L 48.54753691,22.71625 C 50.09741962,22.71625 51.35366358,21.46 51.35366358,19.91 C 51.35366358,18.46875 50.26079757,17.2625 48.82682489,17.11875",viewW:80,viewH:35},cabinet_sink:{d:"M 0,2.49959042 C 0,1.11873055 1.11935974,0 2.50034497,0 L 77.49965503,0 C 78.88064026,0 80,1.11873055 80,2.49959042 L 80,47.49923936 C 80,48.88009923 78.88064026,50 77.50075893,50 L 2.50034497,50 C 1.11935974,50 0,48.88009923 0,47.49923936 L 0,2.49959042 M 35.68152339,33.34893627 C 38.46888368,35.54895031 42.53125431,35.54895031 45.3186146,33.34893627 C 48.10597489,31.14892223 48.81468194,27.37964285 46.9965503,24.41196433 L 40.50669242,14.99988298 L 34.00137988,24.41196433 C 32.18655996,27.37964285 32.8941631,31.14658179 35.68152339,33.34893627",viewW:80,viewH:50},bookshelf:{d:"M 57.70667129,21.235 L 45.09910046,21.235 C 44.542709,21.235 44.00796701,21.39 43.61394659,21.66625 C 43.21992618,21.9425 42.99910155,22.31625 42.99910155,22.70625 M 47.41126422,12.41125 L 53.29342614,12.41125 M 2.4994317,0 L 97.49948583,0 C 98.88072223,0 100,1.11875 100,2.5 L 100,32.5 C 100,33.88125 98.88072223,35 97.49948583,35 L 2.50051417,35 C 1.12036025,35 0,33.88125 0,32.5 L 0,2.5 C 0,1.11875 1.12036025,0 2.50051417,0 M 57.70667129,8 L 57.70667129,25.6475 L 45.10018294,25.6475 A 2.55,2.20824628 90 0,1 43.61502906,25.00125 A 2.125,1.84020524 90 0,1 43.00018402,23.44125 L 43.00018402,10.20625 C 43.00018402,9.62125 43.22100865,9.06 43.61502906,8.64625 A 2.55,2.20824628 90 0,1 45.10018294,8 L 57.70667129,8",viewW:100,viewH:35},wall_unit:{d:"M 2.49961234,45 L 237.50038766,45 A 2.5,2.49961234 90 0,0 239.2678805,44.26776695 A 2.5,2.49961234 90 0,0 240,42.5 L 240,2.5 A 2.5,2.49961234 90 0,0 239.2678805,0.73223305 A 2.5,2.49961234 90 0,0 237.50038766,0 L 2.49961234,0 A 2.5,2.49961234 90 0,0 0,2.5 L 0,42.5 M 0,42.5 A 2.5,2.49961234 90 0,0 0.7321195,44.26776695 A 2.5,2.49961234 90 0,0 2.49961234,45 M 47.72005996,38 L 47.72005996,7 M 95.71923296,38 L 95.71923296,7 M 143.71943971,38 L 143.71943971,7 M 191.71964646,38 L 191.71964646,7",viewW:240,viewH:45},wardrobe:{d:"M 94.04437425,18.88320821 A 3.7631854,3.44913684 90 0,0 92.92392737,16.13836358 A 4.33336501,3.97173334 90 0,0 90.22105832,15.00142545 C 89.20722112,15.00142545 88.23519165,15.40967405 87.51714407,16.13836358 A 3.7631854,3.44913684 90 0,0 86.39774238,18.88320821 C 86.39774238,22.11954766 87.67810379,24.70702271 90.22105832,26.64905445 L 90.20538042,26.64905445 L 105.44429412,35.24394184 C 106.04005412,35.58034781 106.53756598,36.07184263 106.88352486,36.66939086 C 107.22948373,37.26579873 107.41134731,37.94659318 107.41134731,38.63879122 L 107.41134731,40.23643448 A 3.7631854,3.44913684 90 0,1 106.29194563,42.9812791 A 4.33336501,3.97173334 90 0,1 103.58803138,44.1193576 L 76.82272946,44.1193576 A 4.33336501,3.97173334 90 0,1 74.11986041,42.9812791 A 3.7631854,3.44913684 90 0,1 72.99941353,40.23643448 L 72.99941353,38.63993158 C 72.99941353,37.94659318 73.18127711,37.26579873 73.52723599,36.66939086 A 4.04827521,3.71043509 90 0,1 74.96646673,35.24394184 L 90.20538042,26.64905445 M 2.50010162,0 L 177.49989838,0 C 178.87955312,0 180,1.11869239 180,2.4996674 L 180,57.49919225 C 180,58.88130761 178.88059831,60 177.49989838,60 L 2.50010162,60 C 1.11940169,60 0,58.88130761 0,57.5003326 L 0,2.50194811 C 0,1.11983275 1.11835649,0.00114036 2.50010162,0.00114036",viewW:180,viewH:60},kitchen_floor:{d:"M 0.00000104,2.4996673 C 0.00000104,1.1198327 1.11869337,0 2.4996683,0 L 57.49919004,0 C 58.88130533,0 59.99999766,1.11869234 59.99999766,2.4996673 L 59.99999766,57.49919 M 59.99999766,57.49919 A 2.49738658,2.49738654 90 0,1 59.26893509,59.26812834 A 2.49738658,2.49738654 90 0,1 57.5003304,59.99999766 M 57.5003304,59.99999766 L 2.50080866,59.99999766 M 2.50080866,59.99999766 A 2.49738658,2.49738654 90 0,1 0.73187035,59.26893508 A 2.49738658,2.49738654 90 0,1 0.00000104,57.50033036 M 0.00000104,57.50033036 L 0.00000104,2.4996673",viewW:60,viewH:60},kitchen_floor_corner:{d:"M 46.03081776,41.46966756 A 2.50060665,2.50060665 0 0,0 48.53142441,43.97027421 L 87.49939335,43.97027421 A 2.50060665,2.50060665 0 0,1 89.26758927,44.70268494 A 2.50060665,2.50060665 0 0,1 90,46.47088085 L 90,87.49939335 A 2.50060665,2.50060665 0 0,1 89.26758927,89.26758927 A 2.50060665,2.50060665 0 0,1 87.49939335,90 M 87.49939335,90 L 2.50060665,90 A 2.50060665,2.50060665 0 0,1 0.73241073,89.26758927 A 2.50060665,2.50060665 0 0,1 0,87.49939335 L 0,2.50060665 A 2.50060665,2.50060665 0 0,1 2.50060665,0 L 43.53239505,0 A 2.50060665,2.50060665 0 0,1 46.0330017,2.50060665 L 46.03081776,41.46966756",viewW:90,viewH:90},kitchen_wall:{d:"M 0.85755013,34.41625 L 58.7307802,0.6575 M 0.85526941,0.5825 L 58.72849948,34.3425 M 2.4996674,35 L 57.49919225,35 C 58.88130761,35 60,33.88125 60,32.5 L 60,2.5 C 60,1.11875 58.88130761,0 57.5003326,0 L 2.50080775,0 C 1.11869239,0 0,1.11875 0,2.5 L 0,32.5 C 0,33.88125 1.11869239,35 2.4996674,35",viewW:60,viewH:35},kitchen_wall_corner:{d:"M 0.09122874,29.53302228 L 29.86372655,0.78798922 M 1.00123537,58.99990268 L 58.99990394,30.00056953 M 0.55079349,0.78798922 L 30.99952431,28.00037958 M 0,29.00047456 L 58.99990394,58.99990268 M 28.18739854,0.00000104 L 2.49966735,0.00000104 C 1.11983273,0.00000104 0,1.11869337 0,2.4996683 L 0,57.49919004 C 0,58.88130533 1.11869237,59.99999766 2.49966735,59.99999766 L 57.49919125,59.99999766 M 57.49919125,59.99999766 A 2.49738663,2.49738654 0 0,0 59.26812963,59.26893509 A 2.49738663,2.49738654 0 0,0 59.99999896,57.5003304 M 59.99999896,57.5003304 L 59.99999896,31.81260022 C 59.99999896,30.43276565 58.88130659,29.31293296 57.5003316,29.31293296 L 33.1878736,29.31293296 A 2.49738663,2.49738654 0 0,1 31.41893522,28.5818704 A 2.49738663,2.49738654 0 0,1 30.68706589,26.81326571 L 30.68706589,2.50080866 M 30.68706589,2.50080866 A 2.49738663,2.49738654 0 0,0 29.9560033,0.73187035 A 2.49738663,2.49738654 0 0,0 28.18739854,0.00000104",viewW:60,viewH:60},shelf_floor:{d:"M 2.50054124,35 L 97.49945876,35 A 2.50054124,2.5 0 0,0 99.26760843,34.26776695 A 2.50054124,2.5 0 0,0 100,32.5 L 100,2.5 A 2.50054124,2.5 0 0,0 99.26760843,0.73223305 A 2.50054124,2.5 0 0,0 97.49945876,0 L 2.50054124,0 A 2.50054124,2.5 0 0,0 0,2.5 L 0,32.5 A 2.50054124,2.5 0 0,0 2.50054124,35 M 5.71444036,28.04125 C 5.17969257,28.18125 4.8744317,28.72375 5.03247456,29.25375 C 5.19051743,29.78375 5.75124486,30.0975 6.28491015,29.95875 L 6.0002165,29 L 5.71444036,28.04125 M 94.28664213,6.95875 C 94.82030743,6.81875 95.1255683,6.27625 94.96860792,5.74625 C 94.81164754,5.21625 94.24983763,4.9025 93.71508985,5.04125 L 94.00086599,6 L 94.28664213,6.95875 M 8.73024464,29.32 C 9.26390994,29.18 9.56917082,28.6375 9.41221044,28.1075 C 9.25525005,27.5775 8.69344014,27.2625 8.15869236,27.4025 L 8.4444685,28.36125 L 8.73024464,29.32 M 13.04719636,26.125 C 12.51353107,26.265 12.20827019,26.8075 12.36523057,27.33625 C 12.52219095,27.865 13.08400087,28.18125 13.61874865,28.04125 L 13.3329725,27.08375 L 13.04719636,26.125 M 18.50833514,26.76375 C 19.04200043,26.62375 19.34726131,26.0825 19.19030093,25.5525 C 19.03334055,25.0225 18.47153063,24.7075 17.93678285,24.8475 L 18.222559,25.805 L 18.50833514,26.76375 M 22.82528686,23.57 C 22.29162156,23.70875 21.98636068,24.25125 22.14332107,24.78 C 22.30136393,25.31 22.86209136,25.62625 23.39683914,25.48625 L 23.111063,24.5275 L 22.82528686,23.57 M 28.28534315,24.2075 C 28.82009093,24.06875 29.12535181,23.52625 28.96730894,22.9975 C 28.81034856,22.4675 28.24853864,22.1525 27.71487335,22.29125 L 27.99956701,23.25 L 28.28534315,24.2075 M 32.60445984,21.01375 C 32.06862957,21.15375 31.76336869,21.69625 31.92249405,22.22625 C 32.07945443,22.755 32.64018186,23.07 33.17492964,22.93 L 32.8891535,21.9725 L 32.60445984,21.01375 M 38.06343364,21.6525 C 38.59818142,21.5125 38.9034423,20.97125 38.74539944,20.44125 C 38.58735657,19.91125 38.02662914,19.59625 37.49188136,19.73625 L 37.7776575,20.695 L 38.06343364,21.6525 M 42.38146785,18.45875 C 41.84672007,18.5975 41.54145919,19.14 41.69950206,19.67 C 41.85754492,20.2 42.41827235,20.515 42.95193765,20.375 L 42.66724399,19.41625 L 42.38146785,18.45875 M 47.84152414,19.09625 C 48.37627192,18.95875 48.6815328,18.415 48.52348993,17.88625 C 48.36544707,17.35625 47.80471964,17.04125 47.26997186,17.18 L 47.555748,18.13875 L 47.84152414,19.09625 M 52.15955835,15.9025 C 51.62481057,16.0425 51.31954969,16.585 51.47759255,17.115 C 51.63455293,17.64375 52.19636285,17.95875 52.73002814,17.82 L 52.444252,16.86125 L 52.15955835,15.9025 M 57.61961464,16.54125 C 58.15327993,16.4025 58.45854081,15.86 58.30158043,15.33 C 58.14462005,14.8 57.58281013,14.485 57.04806235,14.625 L 57.33383849,15.58375 L 57.61961464,16.54125 M 61.93656636,13.3475 C 61.40290106,13.4875 61.09764018,14.02875 61.25460056,14.55875 C 61.41156094,15.08875 61.97337086,15.40375 62.50811864,15.26375 L 62.2223425,14.305 L 61.93656636,13.3475 M 67.39770513,13.985 C 67.93137043,13.8475 68.23663131,13.30375 68.07967092,12.775 C 67.92162806,12.245 67.36090063,11.93 66.82615285,12.07 L 67.11192899,13.0275 L 67.39770513,13.985 M 71.71465685,10.79125 C 71.18099156,10.93125 70.87573068,11.47375 71.03269106,12.00375 C 71.18965144,12.53375 71.75146136,12.8475 72.28620914,12.70875 L 72.00043299,11.75 L 71.71465685,10.79125 M 77.17471314,11.43 C 77.70946092,11.29125 78.0147218,10.74875 77.85667893,10.22 C 77.69971855,9.69 77.13790864,9.37375 76.60424334,9.51375 L 76.89001948,10.4725 L 77.17471314,11.43 M 81.49382983,8.23625 C 80.95908205,8.37625 80.65273869,8.9175 80.81186404,9.4475 C 80.96882442,9.97625 81.52955185,10.2925 82.06429963,10.1525 L 81.77852349,9.195 L 81.49382983,8.23625 M 86.95280364,8.875 C 87.48755142,8.735 87.7928123,8.1925 87.63476943,7.66375 C 87.47672656,7.135 86.91599913,6.81875 86.38233384,6.95875 L 86.6670275,7.91625 L 86.95280364,8.875 M 91.27083784,5.68 C 90.73609006,5.82 90.43082918,6.3625 90.58887205,6.8925 C 90.74691492,7.4225 91.30764235,7.7375 91.84239013,7.5975 L 91.55661399,6.63875 L 91.27083784,5.68 M 6.0002165,29 L 6.28491015,29.95875 L 8.73024464,29.32 L 8.4444685,28.36125 L 8.15869236,27.4025 L 5.71444036,28.04125 L 6.0002165,29 M 13.3329725,27.08375 L 13.61874865,28.04125 L 18.50833514,26.76375 L 18.222559,25.805 L 17.93678285,24.8475 L 13.04719636,26.125 L 13.3329725,27.08375 M 23.111063,24.5275 L 23.39683914,25.48625 L 28.28534315,24.20875 L 27.99956701,23.25 L 27.71487335,22.29125 L 22.82528686,23.57 L 23.111063,24.5275 M 32.8891535,21.9725 L 33.17492964,22.93 L 38.06343364,21.6525 L 37.7776575,20.695 L 37.49188136,19.73625 L 32.60337735,21.01375 L 32.8891535,21.9725 M 42.66724399,19.41625 L 42.95193765,20.375 L 47.84152414,19.0975 L 47.555748,18.13875 L 47.26997186,17.18 L 42.38146785,18.45875 L 42.66724399,19.41625 M 52.444252,16.86125 L 52.73002814,17.82 L 57.61961464,16.54125 L 57.33383849,15.58375 L 57.04806235,14.625 L 52.15955835,15.9025 L 52.444252,16.86125 M 62.2223425,14.305 L 62.50811864,15.26375 L 67.39770513,13.98625 L 67.11192899,13.0275 L 66.82615285,12.07 L 61.93656636,13.3475 L 62.2223425,14.305 M 72.00043299,11.75 L 72.28620914,12.70875 L 77.17471314,11.43 L 76.89001948,10.4725 L 76.60424334,9.51375 L 71.71465685,10.79125 L 72.00043299,11.75 M 81.77852349,9.195 L 82.06429963,10.1525 L 86.95280364,8.875 L 86.6670275,7.91625 L 86.38233384,6.95875 L 81.49274735,8.23625 L 81.77852349,9.195 M 91.55661399,6.6375 L 91.84239013,7.59625 L 94.28664213,6.9575 L 94.00086599,5.99875 L 93.71508985,5.04 L 91.27083784,5.67875 L 91.55661399,6.6375 M 5.71444036,6.95875 C 5.17969257,6.81875 4.8744317,6.27625 5.03247456,5.74625 C 5.19051743,5.21625 5.75124486,4.9025 6.28491015,5.04125 L 6.0002165,6 L 5.71444036,6.95875 M 94.28664213,28.04125 C 94.82030743,28.18125 95.1255683,28.72375 94.96860792,29.25375 C 94.81164754,29.78375 94.24983763,30.0975 93.71508985,29.95875 L 94.00086599,29 L 94.28664213,28.04125 M 8.73024464,5.68 C 9.26390994,5.82 9.56917082,6.3625 9.41221044,6.8925 C 9.25525005,7.4225 8.69344014,7.7375 8.15869236,7.5975 L 8.4444685,6.63875 L 8.73024464,5.68 M 13.04719636,8.875 C 12.51353107,8.735 12.20827019,8.1925 12.36523057,7.66375 C 12.52219095,7.135 13.08400087,6.81875 13.61874865,6.95875 L 13.3329725,7.91625 L 13.04719636,8.875 M 18.50833514,8.23625 C 19.04200043,8.37625 19.34726131,8.9175 19.19030093,9.4475 C 19.03334055,9.9775 18.47153063,10.2925 17.93678285,10.1525 L 18.222559,9.195 L 18.50833514,8.23625 M 22.82528686,11.43 C 22.29162156,11.29125 21.98636068,10.74875 22.14332107,10.22 C 22.30136393,9.69 22.86209136,9.37375 23.39683914,9.51375 L 23.111063,10.4725 L 22.82528686,11.43 M 28.28534315,10.7925 C 28.82009093,10.93125 29.12535181,11.47375 28.96730894,12.0025 C 28.81034856,12.5325 28.24853864,12.8475 27.71487335,12.70875 L 27.99956701,11.75 L 28.28534315,10.7925 M 32.60445984,13.98625 C 32.06862957,13.84625 31.76336869,13.30375 31.92249405,12.77375 C 32.07945443,12.245 32.64018186,11.93 33.17492964,12.07 L 32.8891535,13.0275 L 32.60445984,13.98625 M 38.06343364,13.3475 C 38.59818142,13.4875 38.9034423,14.02875 38.74539944,14.55875 C 38.58735657,15.08875 38.02662914,15.40375 37.49188136,15.26375 L 37.7776575,14.305 L 38.06343364,13.3475 M 42.38146785,16.54125 C 41.84672007,16.4025 41.54145919,15.86 41.69950206,15.33 C 41.85754492,14.8 42.41827235,14.485 42.95193765,14.625 L 42.66724399,15.58375 L 42.38146785,16.54125 M 47.84152414,15.90375 C 48.37627192,16.04125 48.6815328,16.585 48.52348993,17.11375 C 48.36544707,17.64375 47.80471964,17.95875 47.26997186,17.82 L 47.555748,16.86125 L 47.84152414,15.90375 M 52.15955835,19.0975 C 51.62481057,18.9575 51.31954969,18.415 51.47759255,17.885 C 51.63455293,17.35625 52.19636285,17.04125 52.73002814,17.18 L 52.444252,18.13875 L 52.15955835,19.0975 M 57.61961464,18.45875 C 58.15327993,18.5975 58.45854081,19.14 58.30158043,19.67 C 58.14462005,20.2 57.58281013,20.515 57.04806235,20.375 L 57.33383849,19.41625 L 57.61961464,18.45875 M 61.93656636,21.6525 C 61.40290106,21.5125 61.09764018,20.97125 61.25460056,20.44125 C 61.41156094,19.91125 61.97337086,19.59625 62.50811864,19.73625 L 62.2223425,20.695 L 61.93656636,21.6525 M 67.39770513,21.015 C 67.93137043,21.1525 68.23663131,21.69625 68.07967092,22.225 C 67.92162806,22.755 67.36090063,23.07 66.82615285,22.93 L 67.11192899,21.9725 L 67.39770513,21.015 M 71.71465685,24.20875 C 71.18099156,24.06875 70.87573068,23.52625 71.03269106,22.99625 C 71.18965144,22.46625 71.75146136,22.1525 72.28620914,22.29125 L 72.00043299,23.25 L 71.71465685,24.20875 M 77.17471314,23.57 C 77.70946092,23.70875 78.0147218,24.25125 77.85667893,24.78 C 77.69971855,25.31 77.13790864,25.62625 76.60424334,25.48625 L 76.89001948,24.5275 L 77.17471314,23.57 M 81.49382983,26.76375 C 80.95908205,26.62375 80.65273869,26.0825 80.81186404,25.5525 C 80.96882442,25.02375 81.52955185,24.7075 82.06429963,24.8475 L 81.77852349,25.805 L 81.49382983,26.76375 M 86.95280364,26.125 C 87.48755142,26.265 87.7928123,26.8075 87.63476943,27.33625 C 87.47672656,27.865 86.91599913,28.18125 86.38233384,28.04125 L 86.6670275,27.08375 L 86.95280364,26.125 M 91.27083784,29.32 C 90.73609006,29.18 90.43082918,28.6375 90.58887205,28.1075 C 90.74691492,27.5775 91.30764235,27.2625 91.84239013,27.4025 L 91.55661399,28.36125 L 91.27083784,29.32 M 6.0002165,6 L 6.28491015,5.04125 L 8.73024464,5.68 L 8.4444685,6.63875 L 8.15869236,7.5975 L 5.71444036,6.95875 L 6.0002165,6 M 13.3329725,7.91625 L 13.61874865,6.95875 L 18.50833514,8.23625 L 18.222559,9.195 L 17.93678285,10.1525 L 13.04719636,8.875 L 13.3329725,7.91625 M 23.111063,10.4725 L 23.39683914,9.51375 L 28.28534315,10.79125 L 27.99956701,11.75 L 27.71487335,12.70875 L 22.82528686,11.43 L 23.111063,10.4725 M 32.8891535,13.0275 L 33.17492964,12.07 L 38.06343364,13.3475 L 37.7776575,14.305 L 37.49188136,15.26375 L 32.60337735,13.98625 L 32.8891535,13.0275 M 42.66724399,15.58375 L 42.95193765,14.625 L 47.84152414,15.9025 L 47.555748,16.86125 L 47.26997186,17.82 L 42.38146785,16.54125 L 42.66724399,15.58375 M 52.444252,18.13875 L 52.73002814,17.18 L 57.61961464,18.45875 L 57.33383849,19.41625 L 57.04806235,20.375 L 52.15955835,19.0975 L 52.444252,18.13875 M 62.2223425,20.695 L 62.50811864,19.73625 L 67.39770513,21.01375 L 67.11192899,21.9725 L 66.82615285,22.93 L 61.93656636,21.6525 L 62.2223425,20.695 M 72.00043299,23.25 L 72.28620914,22.29125 L 77.17471314,23.57 L 76.89001948,24.5275 L 76.60424334,25.48625 L 71.71465685,24.20875 L 72.00043299,23.25 M 81.77852349,25.805 L 82.06429963,24.8475 L 86.95280364,26.125 L 86.6670275,27.08375 L 86.38233384,28.04125 L 81.49274735,26.76375 L 81.77852349,25.805 M 91.55661399,28.36125 L 91.84239013,27.4025 L 94.28664213,28.04125 L 94.00086599,29 L 93.71508985,29.95875 L 91.27083784,29.32 L 91.55661399,28.36125",viewW:100,viewH:35},shelf_wall:{d:"M 16.00095257,0 L 16.00095257,3.50051819 C 16.00095257,4.88054328 14.88168691,6.00010909 13.50046546,6.00010909 L 12.50027062,6.00010909 C 11.12013163,6.00010909 10.00086597,4.88190694 10.00086597,3.50051819 L 10.00086597,0 M 90.00021649,0 L 90.00021649,3.50051819 C 90.00021649,4.88054328 88.88095083,6.00010909 87.49972938,6.00010909 L 86.49953454,6.00010909 C 85.11939555,6.00010909 83.99904743,4.88190694 83.99904743,3.50051819 L 83.99904743,0 M 2.50048711,0 L 97.49951289,0 C 98.88073434,0 100,1.11820215 100,2.4995909 L 100,22.5004091 C 100,23.88043419 98.88073434,25 97.49951289,25 L 2.50048711,25 C 1.12034812,25 0,23.88179785 0,22.5004091 L 0,2.4995909 C 0,1.11956581 1.12034812,0 2.50048711,0",viewW:100,viewH:25},cooktop_two:{d:"M 14.99935186,32.00009362 L 14.99935186,29.99906385 M 18.99969753,35.99981277 L 20.99857408,35.99981277 M 14.99935186,41.9993915 L 14.99935186,39.99953192 M 9.00012963,35.99981277 L 10.99900618,35.99981277 M 3.12535108,50 L 26.87594521,50 C 28.60130493,50 30,48.60044935 30,46.8755851 L 30,3.1244149 C 30,1.39838045 28.60130493,0 26.87594521,0 L 3.12405479,0 C 1.39869507,0 0,1.39838045 0,3.1244149 L 0,46.87324471 C 0,48.59927916 1.39869507,49.99765961 3.12405479,49.99765961 M 21.99801236,14.99719154 C 21.99801236,18.86350871 18.86488355,21.99728515 14.99805557,21.99728515 C 11.13382016,21.99728515 7.99809878,18.86350871 7.99809878,14.99836173 C 7.99809878,11.13321475 11.13382016,7.99826811 14.99805557,7.99826811 C 18.86488355,7.99826811 21.99801236,11.13204456 21.99801236,14.99836173 M 20.0004321,35.99981277 C 20.0004321,38.76146789 17.76174221,41.00004681 15.00064814,41.00004681 C 12.23955408,41.00004681 10.00086419,38.76146789 10.00086419,35.99981277 C 10.00086419,33.23815765 12.23825779,30.99957873 14.99935186,30.99957873 C 17.76044592,30.99957873 19.99913581,33.23815765 19.99913581,35.99981277",viewW:30,viewH:50},stove:{d:"M 42.58125034,35.80643381 A 0.96783093,0.96783093 0 0,0 41.61341941,34.83860288 A 0.96783093,0.96783093 0 0,0 40.64558848,35.80643381 M 40.64558848,35.80643381 L 42.58125034,35.80643381 M 47.41930144,42.58014677 A 0.96783093,0.96783093 0 0,0 48.28464415,42.10618697 A 0.96783093,0.96783093 0 0,0 48.28464415,41.11954828 A 0.96783093,0.96783093 0 0,0 47.41930144,40.64558848 L 47.41930144,42.58014677 M 42.58125034,45.48363957 A 0.96783093,0.96783093 0 0,0 42.10729054,44.61829686 A 0.96783093,0.96783093 0 0,0 41.12065185,44.61829686 A 0.96783093,0.96783093 0 0,0 40.64669205,45.48363957 L 42.58125034,45.48363957 M 37.74319925,42.58125034 A 0.96783093,0.96783093 0 0,0 38.71103018,41.61341941 A 0.96783093,0.96783093 0 0,0 37.74319925,40.64558848 M 37.74319925,40.64558848 L 37.74319925,42.58125034 M 3.38796005,0.96672736 L 3.38796005,1.9345583 L 56.61314352,1.9345583 L 56.61314352,0 L 3.38796005,0 L 3.38796005,0.96672736 M 59.03216907,3.38575291 L 58.06433813,3.38575291 L 58.06433813,56.61093638 L 60,56.61093638 L 60,3.38796005 L 59.03216907,3.38575291 M 56.61314352,59.0310655 L 56.61314352,58.06323456 L 3.38796005,58.06323456 L 3.38796005,59.99889643 L 56.61314352,59.99889643 L 56.61314352,59.0310655 M 0.96783093,56.61314352 L 1.93566187,56.61314352 L 1.93566187,3.38796005 L 0,3.38796005 L 0,56.61314352 L 0.96783093,56.61314352 M 3.38685648,59.03216907 L 3.38685648,58.06433813 A 1.45119461,1.45119461 0 0,1 1.93566187,56.61314352 L 0,56.61314352 A 3.38796005,3.38796005 0 0,0 3.38796005,60 L 3.38685648,59.03216907 M 59.03216907,56.61314352 L 58.06433813,56.61314352 C 58.06433813,57.41433537 57.41433537,58.06433813 56.61314352,58.06433813 L 56.61314352,60 A 3.38796005,3.38796005 0 0,0 60,56.61203995 L 59.03216907,56.61314352 M 56.61314352,0.96783093 L 56.61314352,1.93566187 C 57.41433537,1.93566187 58.06433813,2.58566463 58.06433813,3.38685648 L 60,3.38685648 A 3.38796005,3.38796005 0 0,0 56.61203995,0 L 56.61314352,0.96783093 M 3.38796005,0.96783093 L 3.38796005,0 A 3.38796005,3.38796005 0 0,0 0,3.38796005 L 1.93566187,3.38796005 C 1.93566187,2.58566463 2.58566463,1.93566187 3.38685648,1.93566187 L 3.38796005,0.96783093 M 25.16139712,41.61231584 L 24.19356619,41.61231584 A 5.80477846,5.80477846 0 0,1 22.49338636,45.71912161 A 5.80477846,5.80477846 0 0,1 18.38658059,47.41930144 M 18.38658059,47.41930144 L 18.38658059,49.35496331 M 18.38658059,49.35496331 A 7.74154389,7.74154389 0 0,0 23.86139219,47.0879078 A 7.74154389,7.74154389 0 0,0 26.12922805,41.61341941 M 26.12922805,41.61341941 L 25.16139712,41.61231584 M 18.38658059,48.38713237 L 18.38658059,47.41930144 A 5.80477846,5.80477846 0 0,1 14.2808787,45.7191213 A 5.80477846,5.80477846 0 0,1 12.58069856,41.61341941 L 10.64503669,41.61341941 A 7.74154389,7.74154389 0 0,0 18.38658059,49.35496331 L 18.38658059,48.38713237 M 11.61286763,41.61341941 L 12.58069856,41.61341941 M 12.58069856,41.61341941 A 5.80477846,5.80477846 0 0,1 14.28048835,37.50700403 A 5.80477846,5.80477846 0 0,1 18.38658059,35.80643381 M 18.38658059,35.80643381 L 18.38658059,33.87077195 M 18.38658059,33.87077195 A 7.74154389,7.74154389 0 0,0 12.9120922,36.13860781 A 7.74154389,7.74154389 0 0,0 10.64503669,41.61341941 M 10.64503669,41.61341941 L 11.61286763,41.61341941 M 18.38658059,34.83860288 L 18.38658059,35.80643381 M 18.38658059,35.80643381 A 5.80477846,5.80477846 0 0,1 22.49338636,37.50661364 A 5.80477846,5.80477846 0 0,1 24.19356619,41.61341941 L 26.12922805,41.61341941 M 26.12922805,41.61341941 A 7.74154389,7.74154389 0 0,0 23.86178242,36.13821758 A 7.74154389,7.74154389 0 0,0 18.38658059,33.87077195 M 18.38658059,33.87077195 L 18.38658059,34.83860288 M 48.38713237,18.38658059 L 47.41930144,18.38658059 M 47.41930144,18.38658059 A 5.80477846,5.80477846 0 0,1 45.71951165,22.49299597 A 5.80477846,5.80477846 0 0,1 41.61341941,24.19356619 M 41.61341941,24.19356619 L 41.61341941,26.12922805 M 41.61341941,26.12922805 A 7.74154389,7.74154389 0 0,0 47.0879078,23.86139219 A 7.74154389,7.74154389 0 0,0 49.35496331,18.38658059 M 49.35496331,18.38658059 L 48.38713237,18.38658059 M 41.61341941,25.16139712 L 41.61341941,24.19356619 A 5.80477846,5.80477846 0 0,1 37.50661364,22.49338636 A 5.80477846,5.80477846 0 0,1 35.80643381,18.38658059 L 33.87077195,18.38658059 M 33.87077195,18.38658059 A 7.74154389,7.74154389 0 0,0 36.13821758,23.86178242 A 7.74154389,7.74154389 0 0,0 41.61341941,26.12922805 M 41.61341941,26.12922805 L 41.61341941,25.16139712 M 34.83860288,18.38658059 L 35.80643381,18.38658059 M 35.80643381,18.38658059 A 5.80477846,5.80477846 0 0,1 37.50700403,14.28048835 A 5.80477846,5.80477846 0 0,1 41.61341941,12.58069856 M 41.61341941,12.58069856 L 41.61341941,10.64503669 M 41.61341941,10.64503669 A 7.74154389,7.74154389 0 0,0 36.13860781,12.9120922 A 7.74154389,7.74154389 0 0,0 33.87077195,18.38658059 M 33.87077195,18.38658059 L 34.83860288,18.38658059 M 41.61341941,11.61286763 L 41.61341941,12.58069856 M 41.61341941,12.58069856 A 5.80477846,5.80477846 0 0,1 45.7191213,14.2808787 A 5.80477846,5.80477846 0 0,1 47.41930144,18.38658059 M 47.41930144,18.38658059 L 49.35496331,18.38658059 A 7.74154389,7.74154389 0 0,0 47.0875176,12.9124824 A 7.74154389,7.74154389 0 0,0 41.61341941,10.64503669 L 41.61341941,11.61286763 M 46.45147051,41.61341941 L 45.48363957,41.61341941 A 3.87353087,3.87353087 0 0,1 41.61341941,45.48363957 L 41.61341941,47.41930144 M 41.61341941,47.41930144 A 5.80477846,5.80477846 0 0,0 45.7191213,45.7191213 A 5.80477846,5.80477846 0 0,0 47.41930144,41.61341941 M 47.41930144,41.61341941 L 46.45147051,41.61341941 M 41.61341941,46.45147051 L 41.61341941,45.48363957 A 3.87353087,3.87353087 0 0,1 37.74209568,41.61341941 L 35.80533024,41.61341941 M 35.80533024,41.61341941 A 5.80477846,5.80477846 0 0,0 37.50590046,45.71951165 A 5.80477846,5.80477846 0 0,0 41.61231584,47.41930144 M 41.61231584,47.41930144 L 41.61341941,46.45147051 M 36.77426475,41.61341941 L 37.74209568,41.61341941 A 3.87353087,3.87353087 0 0,1 41.61341941,37.74209568 L 41.61341941,35.80533024 A 5.80477846,5.80477846 0 0,0 37.50661364,37.50551007 A 5.80477846,5.80477846 0 0,0 35.80643381,41.61231584 L 36.77426475,41.61341941 M 41.61341941,36.77426475 L 41.61341941,37.74209568 A 3.87353087,3.87353087 0 0,1 45.48363957,41.61341941 L 47.41930144,41.61341941 M 47.41930144,41.61341941 A 5.80477846,5.80477846 0 0,0 45.71951165,37.50700403 A 5.80477846,5.80477846 0 0,0 41.61341941,35.80643381 M 41.61341941,35.80643381 L 41.61341941,36.77426475 M 41.61341941,37.74209568 L 42.58014677,37.74209568 L 42.58014677,35.80533024 L 40.64558848,35.80533024 L 40.64558848,37.74099211 L 41.61341941,37.74209568 M 45.48474314,41.61341941 L 45.48474314,42.58014677 L 47.41930144,42.58014677 L 47.41930144,40.64558848 L 45.48474314,40.64558848 L 45.48474314,41.61341941 M 41.61341941,47.41930144 L 42.58014677,47.41930144 L 42.58014677,45.48363957 L 40.64558848,45.48363957 L 40.64558848,47.41930144 L 41.61341941,47.41930144 M 35.80753738,41.61341941 L 35.80753738,42.58014677 L 37.74209568,42.58014677 L 37.74209568,40.64558848 L 35.80753738,40.64558848 L 35.80753738,41.61341941 M 25.16139712,18.38658059 L 24.19356619,18.38658059 M 24.19356619,18.38658059 A 5.80477846,5.80477846 0 0,1 22.49338636,22.49338636 A 5.80477846,5.80477846 0 0,1 18.38658059,24.19356619 M 18.38658059,24.19356619 L 18.38658059,26.12922805 M 18.38658059,26.12922805 A 7.74154389,7.74154389 0 0,0 23.86178242,23.86178242 A 7.74154389,7.74154389 0 0,0 26.12922805,18.38658059 L 25.16139712,18.38658059 M 18.38658059,25.16139712 L 18.38658059,24.19356619 A 5.80477846,5.80477846 0 0,1 14.28048835,22.49299597 A 5.80477846,5.80477846 0 0,1 12.58069856,18.38658059 M 12.58069856,18.38658059 L 10.64503669,18.38658059 M 10.64503669,18.38658059 A 7.74154389,7.74154389 0 0,0 12.9120922,23.86139219 A 7.74154389,7.74154389 0 0,0 18.38658059,26.12922805 M 18.38658059,26.12922805 L 18.38658059,25.16139712 M 11.61286763,18.38658059 L 12.58069856,18.38658059 M 12.58069856,18.38658059 A 5.80477846,5.80477846 0 0,1 14.2808787,14.2808787 A 5.80477846,5.80477846 0 0,1 18.38658059,12.58069856 M 18.38658059,12.58069856 L 18.38658059,10.64503669 A 7.74154389,7.74154389 0 0,0 10.64503669,18.38658059 L 11.61286763,18.38658059 M 18.38658059,11.61286763 L 18.38658059,12.58069856 A 5.80477846,5.80477846 0 0,1 22.49299597,14.28048835 A 5.80477846,5.80477846 0 0,1 24.19356619,18.38658059 L 26.12922805,18.38658059 M 26.12922805,18.38658051 A 7.74154389,7.74154389 0 0,0 23.86139213,12.91209214 A 7.74154389,7.74154389 0 0,0 18.38658051,10.64503669 M 18.38658059,10.64503669 L 18.38658059,11.61286763",viewW:60,viewH:60},tv:{d:"M 44.11752137,9.73109561 L 2.5,9.73109561 C 1.11965812,9.73109561 0,10.850462 0,12.23118989 L 0,15.76881011 C 0,17.14821799 1.11965812,18.26758439 2.5,18.26758439 L 44.11752137,18.26758439 M 44.11752137,9.73109561 L 44.11752137,2.50009429 C 44.11752137,1.1193664 45.23717949,0 46.61752137,0 L 75.1474359,0 C 76.52777778,0 77.6474359,1.1193664 77.6474359,2.50009429 L 77.6474359,9.73109561 M 44.11752137,9.73109561 L 77.6474359,9.73109561 L 117.5,9.73109561 C 118.88141026,9.73109561 120,10.850462 120,12.23118989 L 120,15.76881011 C 120,17.14821799 118.88141026,18.26758439 117.5,18.26758439 L 77.6474359,18.26758439 M 44.11752137,18.26758439 L 44.11752137,25.49990571 C 44.11752137,26.8806336 45.23717949,28 46.61752137,28 L 75.1474359,28 C 76.52777778,28 77.6474359,26.8806336 77.6474359,25.49990571 L 77.6474359,18.26758439 M 44.11752137,18.26758439 L 77.6474359,18.26758439",viewW:120,viewH:28},tv_wall:{d:"M 34.42622951,13.23529412 C 33.88293401,13.23529412 33.44262295,13.63088235 33.44262295,14.11764706 C 33.44262295,14.60441176 33.88293401,15 34.42622951,15 L 34.42622951,13.23529412 M 86.49957966,15 C 87.04287516,15 87.48318621,14.60441176 87.48318621,14.11764706 C 87.48318621,13.63088235 87.0418243,13.23529412 86.49957966,13.23529412 L 86.49957966,15 M 3.44262295,0.88235294 L 3.44262295,1.76470588 L 116.55737705,1.76470588 L 116.55737705,0 L 3.44262295,0 L 3.44262295,0.88235294 M 119.01639344,3.08823529 L 118.03278689,3.08823529 L 118.03278689,5.73529412 L 120,5.73529412 L 120,3.08823529 L 119.01639344,3.08823529 M 116.55737705,7.94117647 L 116.55737705,7.05882353 L 3.44262295,7.05882353 L 3.44262295,8.82352941 L 116.55737705,8.82352941 L 116.55737705,7.94117647 M 0.98360656,5.73529412 L 1.96721311,5.73529412 L 1.96721311,3.08823529 L 0,3.08823529 L 0,5.73529412 L 0.98360656,5.73529412 M 3.44262295,7.94117647 L 3.44262295,7.05882353 C 2.62820513,7.05882353 1.96721311,6.46617647 1.96721311,5.73529412 L 0,5.73529412 C 0,7.44117647 1.54161412,8.82352941 3.44262295,8.82352941 L 3.44262295,7.94117647 M 119.01639344,5.73529412 L 118.03278689,5.73529412 C 118.03278689,6.46617647 117.37179487,7.05882353 116.55737705,7.05882353 L 116.55737705,8.82352941 C 118.45943674,8.82352941 120,7.44117647 120,5.73529412 L 119.01639344,5.73529412 M 116.55737705,0.88235294 L 116.55737705,1.76470588 C 117.37179487,1.76470588 118.03278689,2.35735294 118.03278689,3.08823529 L 120,3.08823529 C 120,1.38235294 118.45838588,0 116.55737705,0 L 116.55737705,0.88235294 M 3.44262295,0.88235294 L 3.44262295,0 C 1.54056326,0 0,1.38235294 0,3.08823529 L 1.96721311,3.08823529 C 1.96721311,2.35735294 2.62820513,1.76470588 3.44262295,1.76470588 L 3.44262295,0.88235294 M 67.86885246,7.05882353 L 66.8852459,7.05882353 L 66.8852459,14.11764706 L 68.85245902,14.11764706 L 68.85245902,7.05882353 L 67.86885246,7.05882353 M 52.13114754,14.11764706 L 53.1147541,14.11764706 L 53.1147541,7.05882353 L 51.14754098,7.05882353 L 51.14754098,14.11764706 L 52.13114754,14.11764706 M 34.42622951,14.11764706 L 34.42622951,15 L 86.49957966,15 L 86.49957966,13.23529412 L 34.42622951,13.23529412 L 34.42622951,14.11764706",viewW:120,viewH:15},toilet:{d:"M 0,50.64541922 C 0,61.33577471 8.66551127,70 19.35479948,70 L 20.64520052,70 C 31.33570495,70 40,61.33577471 40,50.64541922 L 40,2.49964019 C 40,1.11940895 38.88108486,0 37.49946791,0 L 2.50053209,0 C 1.12013135,0 0,1.11940895 0,2.5007596 L 0,50.64541922 M 4.99984797,50.80661411 C 4.99984797,58.645835 11.35455623,65.00071962 19.19304327,65.00071962 L 20.80695673,65.00071962 C 28.64544377,65.00071962 35.00015203,58.645835 35.00015203,50.80661411 L 35.00015203,31.50016791 C 35.00015203,30.11993667 33.88123689,29.00052772 32.49961993,29.00052772 L 7.50038007,29.00052772 C 6.11997932,29.00052772 4.99984797,30.11993667 4.99984797,31.50016791 L 4.99984797,50.80661411 M 36.77460549,0 C 38.55635623,0 40,1.44403755 40,3.2261366 L 40,16.77434315 C 40,18.5564422 38.55635623,20.00047975 36.77460549,20.00047975 L 3.22661072,20.00047975 C 1.44485998,20.00047975 0,18.5564422 0,16.77434315 L 0,3.2261366 C 0,1.44515696 1.44485998,0 3.22661072,0 L 36.77460549,0 M 24.99923987,51.99990405 C 24.99923987,54.76148594 22.76140959,57.00030384 20.00060811,57.00030384 C 17.23980662,57.00030384 15.00076013,54.76148594 15.00076013,51.99990405 C 15.00076013,49.23832217 17.23859041,47.00062367 19.99939189,47.00062367 C 22.76019338,47.00062367 25.00045608,49.23944157 25.00045608,51.99990405",viewW:40,viewH:70},toilet_built_in:{d:"M 0,35.64551996 C 0,46.33352214 8.66551127,55 19.35479948,55 L 20.64520052,55 C 31.33570495,55 40,46.33467598 40,35.64436612 L 40,2.49921329 C 40,1.11922294 38.88108486,0 37.49946791,0 L 2.50053209,0 C 1.12013135,0 0,1.11922294 0,2.49921329 L 0,35.64551996 M 4.99984797,35.80705729 C 4.99984797,43.64507941 11.35455623,49.99926574 19.19304327,49.99926574 L 20.80695673,49.99926574 C 28.64544377,49.99926574 35.00015203,43.64507941 35.00015203,35.80705729 L 35.00015203,12.49952798 C 35.00015203,11.11838379 33.88123689,9.99916085 32.49961993,9.99916085 L 7.50038007,9.99916085 C 6.11997932,9.99916085 4.99984797,11.11838379 4.99984797,12.49952798 L 4.99984797,35.80705729 M 24.99923987,36.99897204 C 24.99923987,39.76126041 22.76140959,41.9997063 20.00060811,41.9997063 C 17.23980662,41.9997063 15.00076013,39.76126041 15.00076013,36.99897204 C 15.00076013,34.23668366 17.23859041,31.99939161 19.99939189,31.99939161 C 22.76019338,31.99939161 25.00045608,34.2378375 25.00045608,36.99897204",viewW:40,viewH:55},bathtub:{d:"M 0.00104789,2.5 C 0.00104789,1.11888889 1.12019281,0 2.50130986,0 L 167.49973803,0 C 168.88085508,0 170,1.11888889 170,2.5 L 170,72.5 C 170,73.88111111 168.88085508,75 167.49973803,75 L 2.50026197,75 C 1.11914492,75 0,73.88111111 0,72.5 L 0.00104789,2.5 M 10.00104789,37.5 C 10.00104789,22.31222222 22.31373782,10 37.50078592,10 L 132.50026197,10 C 147.68731007,10 160,22.31222222 160,37.5 C 160,52.68777778 147.68731007,65 132.50026197,65 L 37.49973803,65 C 22.31268993,65 10,52.68777778 10,37.5 M 29.00136226,37.5 C 29.00136226,39.98555556 26.98627266,42 24.50068113,42 C 22.01508959,42 20.00104789,39.98555556 20.00104789,37.5 C 20.00104789,35.01444444 22.01613748,33 24.50068113,33 C 26.98627266,33 29.00136226,35.01444444 29.00136226,37.5",viewW:170,viewH:75},bathtub_corner:{d:"M 0.0000009,2.49992528 A 2.4978076,2.4978076 90 0,1 0.73159091,0.73159091 A 2.4978076,2.4978076 90 0,1 2.49992528,0.0000009 M 2.49992528,0.0000009 L 137.70540387,0.0000009 C 138.97230035,0.0000009 140,1.02664216 140,2.29459703 C 140,78.34754644 78.34754644,140 2.29459703,140 A 2.29671292,2.29671292 90 0,1 0.0000009,137.70540387 L 0.0000009,2.49992528 M 9.99969844,30.0001519 C 9.99969844,18.95370364 18.95370364,9.99969844 30.0001519,9.99969844 L 122.7450181,9.99969844 A 2.2543772,2.2543772 90 0,1 124.9993953,12.25407563 C 124.9993953,74.52251395 74.52251395,125.00045369 12.25513403,125.00045369 A 2.2543772,2.2543772 90 0,1 10.66067431,124.33978775 A 2.2543772,2.2543772 90 0,1 10.00075683,122.7450181 L 9.99969844,30.0001519 M 30.0001519,25.00030314 A 5.00037797,5.00037797 90 0,1 24.99977394,30.0006811 A 5.00037797,5.00037797 90 0,1 19.99939597,25.00030314 A 5.00037797,5.00037797 90 0,1 24.99977394,19.99992517 A 5.00037797,5.00037797 90 0,1 30.0001519,25.00030314",viewW:140,viewH:140},bidet:{d:"M 22.99978716,0 L 22.99978716,11.50052266 C 22.99978716,12.88035731 21.88087202,14.00019006 20.50047128,14.00019006 L 19.50074493,14.00019006 C 18.11912798,14.00019006 17.00021284,12.88149767 17.00021284,11.50052266 L 17.00021284,0 M 22.99978716,10.0009503 L 26.50004561,10.0009503 C 27.88044635,10.0009503 29.0005777,8.88111755 29.0005777,7.50014254 L 29.0005777,6.50004751 C 29.0005777,5.12021287 27.88166256,4.00038012 26.50004561,4.00038012 L 22.99978716,4.00038012 M 17.00021284,10.0009503 L 13.49995439,10.0009503 C 12.11955365,10.0009503 11.00063851,8.88111755 11.00063851,7.50014254 L 11.00063851,6.50004751 C 11.00063851,5.12021287 12.11955365,4.00038012 13.49995439,4.00038012 L 17.00021284,4.00038012 M 2.50053209,0 L 37.49946791,0 C 38.88108486,0 40,1.11869239 40,2.4996674 L 40,40.64468308 C 40,51.33441034 31.33448873,60 20.64520052,60 L 19.35601569,60 C 8.66551127,60 0,51.33441034 0,40.64582343 L 0,2.50080775 C 0,1.11869239 1.11891514,0 2.50053209,0 M 7.49916385,18.00057018 L 32.49961993,18.00057018 C 33.88123689,18.00057018 35.00015203,19.11926257 35.00015203,20.50023757 L 35.00015203,40.80661408 C 35.00015203,48.64544331 28.64544377,55.00066521 20.80695673,55.00066521 L 19.19304327,55.00066521 C 11.35455623,55.00066521 4.99984797,48.64544331 4.99984797,40.80661408 L 4.99984797,20.50137793 C 4.99984797,19.12154329 6.11876311,18.00171054 7.50038007,18.00171054 M 24.00072973,27.00142545 C 24.00072973,29.21030124 22.21046551,31.00180557 20.00182432,31.00180557 C 17.79196692,31.00180557 16.00048648,29.2114416 16.00048648,27.00142545 C 16.00048648,24.79140929 17.79196692,23.00218569 20.00182432,23.00218569 C 22.21168172,23.00218569 24.00072973,24.79254965 24.00072973,27.00142545",viewW:40,viewH:60},bidet_built_in:{d:"M 16.73872723,9.99953191 L 6.93605765,9.99953191 C 5.86579099,9.99953191 4.99984797,10.86549489 4.99984797,11.93507618 L 4.99984797,30.8060477 C 4.99984797,38.64418284 11.35455623,44.99964893 19.19304327,44.99964893 L 20.80695673,44.99964893 C 28.64544377,44.99964893 35.00015203,38.64535306 35.00015203,30.80487748 L 35.00015203,11.9362464 C 35.00015203,10.86666511 34.13299279,10.00070213 33.06515856,10.00070213 L 23.26005655,10.00070213 M 22.99857095,0.00117022 L 22.99857095,11.50092447 C 22.99857095,12.88178435 21.87965581,14.0005149 20.49925507,14.0005149 L 19.49952872,14.0005149 C 18.11791176,14.0005149 16.99899663,12.88178435 16.99899663,11.50092447 L 16.99899663,0 M 29.99908784,9.99953191 L 29.99908784,0 M 9.99847973,0 L 9.99847973,9.99953191 M 2.50053209,0 L 37.49946791,0 C 38.88108486,0 40,1.11873055 40,2.49959042 L 40,30.64455731 C 40,41.33451916 31.33448873,50 20.64520052,50 L 19.35601569,50 C 8.66551127,50 0,41.33451916 0,30.64455731 L 0,2.49959042 C 0,1.11873055 1.11891514,0 2.50053209,0 M 24.00072973,22.99833829 C 24.00072973,25.20771409 22.20924929,26.99815105 19.99939189,26.99815105 C 17.78953449,26.99815105 16.00048648,25.20771409 16.00048648,22.99833829 C 16.00048648,20.78896248 17.79075071,18.99852552 20.00060811,18.99852552 C 22.20924929,18.99852552 23.99951352,20.78896248 23.99951352,22.99833829",viewW:40,viewH:50},kitchen_sink:{d:"M 39.41423548,6.00088937 L 51.49976243,6.00088937 C 52.88073743,6.00088937 54.00057018,7.11961991 54.00057018,8.50047979 L 54.00057018,41.50069043 C 54.00057018,42.88155031 52.88073743,44.00028085 51.49976243,44.00028085 L 8.50137793,44.00028085 C 7.12154329,44.00028085 6.00171054,42.88155031 6.00171054,41.50069043 L 6.00171054,8.50047979 C 6.00171054,7.11961991 7.12040293,6.00088937 8.50137793,6.00088937 L 20.58804523,6.00088937 M 33.00085527,0 L 33.00085527,13.50200108 C 33.00085527,14.88286095 31.88216288,16.0015915 30.50118787,16.0015915 L 29.50109284,16.0015915 C 28.1212582,16.0015915 27.00142545,14.88169073 27.00142545,13.50200108 L 27.00142545,0 M 33.00085527,9.00016383 L 36.50175805,9.00016383 C 37.8815927,9.00016383 39.00142545,7.88143329 39.00142545,6.50057341 L 39.00142545,5.50003511 C 39.00142545,4.11917523 37.8815927,3.00044468 36.50175805,3.00044468 L 33.00085527,3.00044468 M 27.00142545,9.00016383 L 23.50052266,9.00016383 C 22.12068802,9.00016383 21.00085527,7.88143329 21.00085527,6.50057341 L 21.00085527,5.50003511 C 21.00085527,4.11917523 22.12068802,3.00044468 23.50166302,3.00044468 L 27.00142545,3.00044468 M 2.4996674,50 L 57.5003326,50 C 58.88016725,50 60,48.88126945 60,47.50040958 L 60,2.50076064 C 60,1.11990077 58.88130761,0 57.5003326,0 L 2.50080775,0 C 1.11983275,0 0,1.11990077 0,2.50076064 L 0,47.50040958 C 0,48.88126945 1.11983275,50 2.4996674,50 M 33.99980994,25.99995319 C 33.99980994,28.209329 32.20944598,29.99976596 30.00057018,29.99976596 C 27.79169438,29.99976596 26.00019006,28.209329 26.00019006,25.99995319 C 26.00019006,23.79174761 27.79055402,22.00014043 30.00057018,22.00014043 C 32.21058633,22.00014043 33.99980994,23.79057739 33.99980994,25.99995319",viewW:60,viewH:50},kitchen_sink_double:{d:"M 53.81917613,10.60756523 C 53.3184331,10.60756523 52.91291684,11.00704162 52.91291684,11.49905209 C 52.91291684,11.99106256 53.31950306,12.39053895 53.81917613,12.39053895 L 53.81917613,10.60756523 M 77.33590917,12.39053895 C 77.83558224,12.39053895 78.2410985,11.99219103 78.2410985,11.49905209 C 78.2410985,11.00704162 77.83558224,10.60756523 77.33590917,10.60756523 L 77.33590917,12.39053895 M 3.35647625,0.89148686 L 3.35647625,1.78297373 L 86.64459371,1.78297373 L 86.64459371,0 L 3.35647625,0 L 3.35647625,0.89148686 M 89.09267075,3.30414372 L 88.18641146,3.30414372 L 88.18641146,46.69811321 L 89.99893004,46.69811321 L 89.99893004,3.30301526 L 89.09267075,3.30414372 M 86.64245378,49.10851314 L 86.64245378,48.21702627 L 3.35647625,48.21702627 L 3.35647625,50 L 86.64459371,50 L 86.64245378,49.10851314 M 0.90625929,46.69698474 L 1.81251858,46.69698474 L 1.81251858,3.30301526 L 0,3.30301526 L 0,46.69698474 L 0.90625929,46.69698474 M 3.35647625,49.10738467 L 3.35647625,48.21589781 C 2.50371515,48.21589781 1.81251858,47.53543378 1.81251858,46.69698474 L 0,46.69698474 C 0,48.52058319 1.50222909,49.99887154 3.35647625,49.99887154 L 3.35647625,49.10738467 M 89.09374071,46.69698474 L 88.18748142,46.69698474 C 88.18748142,47.53543378 87.49628485,48.21589781 86.64459371,48.21589781 L 86.64459371,49.99887154 C 88.49777091,49.99887154 90,48.52058319 90,46.69698474 L 89.09374071,46.69698474 M 86.64352375,0.89261533 L 86.64352375,1.78410219 C 87.49628485,1.78410219 88.18748142,2.46343775 88.18748142,3.30301526 L 90,3.30301526 C 90,1.47828835 88.49777091,0 86.64459371,0 L 86.64352375,0.89261533 M 3.35647625,0.89261533 L 3.35647625,0.00112846 C 1.50222909,0.00112846 0,1.47941681 0,3.30301526 L 1.81251858,3.30301526 C 1.81251858,2.46343775 2.50371515,1.78297373 3.35647625,1.78297373 L 3.35647625,0.89261533 M 9.23485704,43.32174777 L 9.23485704,44.21323463 L 39.61112762,44.21323463 L 39.61112762,42.4302609 L 9.23485704,42.4302609 L 9.23485704,43.32174777 M 42.06134459,40.91134784 L 42.96653391,40.91134784 L 42.96653391,9.08865216 L 41.15401534,9.08865216 L 41.15401534,40.91134784 L 42.06134459,40.91134784 M 6.78464008,9.08865216 L 5.87945075,9.08865216 L 5.87945075,40.91134784 L 7.69196933,40.91134784 L 7.69196933,9.08865216 L 6.78464008,9.08865216 M 39.61219759,6.67825223 L 39.61219759,5.78676537 L 33.54657314,5.78676537 L 33.54657314,7.5697391 L 39.61219759,7.5697391 L 39.61219759,6.67825223 M 15.30155145,6.67825223 L 15.30155145,5.78676537 L 9.235927,5.78676537 L 9.235927,7.5697391 L 15.30155145,7.5697391 L 15.30155145,6.67825223 M 6.78678,9.08865216 L 7.69303929,9.08865216 C 7.69303929,8.24907466 8.3831659,7.5697391 9.235927,7.5697391 L 9.235927,5.78676537 C 7.38274981,5.78676537 5.88052072,7.26505371 5.88052072,9.08865216 L 6.78678,9.08865216 M 42.06134459,9.08865216 L 42.96760388,9.08865216 C 42.96760388,7.26505371 41.46537478,5.78563691 39.61219759,5.78563691 L 39.61219759,7.56861063 C 40.46495869,7.56861063 41.1550853,8.24907466 41.1550853,9.08865216 L 42.06134459,9.08865216 M 39.61112762,43.32174777 L 39.61112762,44.21323463 C 41.46537478,44.21323463 42.96760388,42.73494629 42.96760388,40.91134784 L 41.1550853,40.91134784 C 41.1550853,41.74979688 40.46495869,42.4302609 39.61219759,42.4302609 L 39.61112762,43.32174777 M 9.235927,43.32174777 L 9.235927,42.4302609 C 8.3831659,42.4302609 7.69303929,41.74979688 7.69303929,40.91134784 L 5.87945075,40.91134784 C 5.87945075,42.73494629 7.38167984,44.21323463 9.23485704,44.21323463 L 9.235927,43.32174777 M 23.9340189,16.32098041 L 23.9340189,17.21246727 L 24.91410569,17.21246727 L 24.91410569,15.42949355 L 23.9340189,15.42949355 L 23.9340189,16.32098041 M 27.36325269,13.91058048 L 28.26951198,13.91058048 L 28.26951198,0.89148686 L 26.4569934,0.89148686 L 26.4569934,13.91170895 L 27.36325269,13.91058048 M 21.48380194,0.89148686 L 20.57754265,0.89148686 L 20.57754265,13.91170895 L 22.38899126,13.91170895 L 22.38899126,0.89148686 L 21.48380194,0.89148686 M 24.91303572,16.32098041 L 24.91303572,17.21246727 C 26.76621292,17.21246727 28.26844201,15.73417893 28.26844201,13.91058048 L 26.4569934,13.91058048 C 26.4569934,14.74902952 25.76579683,15.42949355 24.91303572,15.42949355 L 24.91303572,16.32098041 M 23.93294894,16.32098041 L 23.93294894,15.42949355 C 23.08018784,15.42949355 22.38899126,14.74902952 22.38899126,13.91058048 L 20.57754265,13.91058048 C 20.57754265,15.73417893 22.07977174,17.21246727 23.93294894,17.21246727 L 23.93294894,16.32098041 M 27.36218273,9.57050645 L 27.36218273,10.46199332 L 30.79248648,10.46199332 L 30.79248648,8.67901959 L 27.36218273,8.67901959 L 27.36218273,9.57050645 M 33.24163348,7.16010653 L 34.14789277,7.16010653 L 34.14789277,6.19526948 L 32.33537419,6.19526948 L 32.33537419,7.16010653 L 33.24163348,7.16010653 M 30.79141651,3.78486955 L 30.79141651,2.89338268 L 27.36218273,2.89338268 L 27.36218273,4.67635641 L 30.79248648,4.67635641 L 30.79141651,3.78486955 M 33.24163348,6.19526948 L 34.14789277,6.19526948 C 34.14789277,4.37167103 32.64566367,2.89338268 30.79248648,2.89338268 L 30.79248648,4.67635641 C 31.64417761,4.67635641 32.33537419,5.35682044 32.33537419,6.19526948 L 33.24163348,6.19526948 M 30.79141651,9.57050645 L 30.79141651,10.46199332 C 32.64566367,10.46199332 34.14789277,8.98370497 34.14789277,7.16010653 L 32.33537419,7.16010653 C 32.33537419,7.99855557 31.64417761,8.67901959 30.79248648,8.67901959 L 30.79141651,9.57050645 M 18.05349819,9.57050645 L 18.05349819,10.46199332 L 21.48380194,10.46199332 L 21.48380194,8.67901959 L 18.05349819,8.67901959 L 18.05349819,9.57050645 M 21.48380194,3.78486955 L 21.48380194,2.89338268 L 18.05349819,2.89338268 L 18.05349819,4.67635641 L 21.48380194,4.67635641 L 21.48380194,3.78486955 M 15.60435119,6.19526948 L 14.6980919,6.19526948 L 14.6980919,7.16010653 L 16.51061047,7.16010653 L 16.51061047,6.19526948 L 15.60435119,6.19526948 M 18.05456815,3.78486955 L 18.05456815,2.89338268 C 16.20032099,2.89338268 14.6980919,4.37167103 14.6980919,6.19526948 L 16.51061047,6.19526948 C 16.51061047,5.35682044 17.20180705,4.67635641 18.05349819,4.67635641 L 18.05456815,3.78486955 M 18.05456815,9.57050645 L 18.05456815,8.67901959 C 17.20180705,8.67901959 16.51061047,7.99855557 16.51061047,7.16010653 L 14.6980919,7.16010653 C 14.6980919,8.98370497 16.20032099,10.46199332 18.05349819,10.46199332 L 18.05456815,9.57050645 M 28.34226951,25.96370859 L 27.43601022,25.96370859 C 27.43601022,27.60223887 26.08785591,28.92931299 24.42299233,28.92931299 L 24.42299233,30.71228672 C 27.08720204,30.71228672 29.2485288,28.58625982 29.2485288,25.96370859 L 28.34226951,25.96370859 M 24.4240623,29.82079986 L 24.4240623,28.92931299 C 22.76026868,28.92931299 21.4110444,27.60223887 21.4110444,25.96370859 L 19.59852583,25.96370859 C 19.59852583,28.58625982 21.75985258,30.71341518 24.4240623,30.71341518 L 24.4240623,29.82079986 M 20.50478512,25.96370859 L 21.4110444,25.96370859 C 21.4110444,24.32630676 22.75919872,22.99810418 24.4240623,22.99810418 L 24.4240623,21.21513045 C 21.75985258,21.21513045 19.59852583,23.34115735 19.59852583,25.96370859 L 20.50478512,25.96370859 M 24.4240623,22.10661732 L 24.4240623,22.99810418 C 26.08785591,22.99810418 27.43708019,24.32630676 27.43708019,25.96370859 L 29.24959876,25.96370859 C 29.24959876,23.34115735 27.08827201,21.21513045 24.4240623,21.21513045 L 24.4240623,22.10661732 M 50.38994234,43.32174777 L 50.38994234,44.21323463 L 80.76621292,44.21323463 L 80.76621292,42.4302609 L 50.38994234,42.4302609 L 50.38994234,43.32174777 M 83.21642989,40.91134784 L 84.12161921,40.91134784 L 84.12161921,9.08865216 L 82.30910064,9.08865216 L 82.30910064,40.91134784 L 83.21642989,40.91134784 M 80.764073,6.67825223 L 80.764073,5.78676537 L 50.38780241,5.78676537 L 50.38780241,7.5697391 L 80.764073,7.5697391 L 80.764073,6.67825223 M 47.93758545,9.08865216 L 47.03239612,9.08865216 L 47.03239612,40.91134784 L 48.8449147,40.91134784 L 48.8449147,9.08865216 L 47.93758545,9.08865216 M 50.38780241,6.67825223 L 50.38780241,5.78676537 C 48.53462522,5.78676537 47.03239612,7.26505371 47.03239612,9.08865216 L 48.8449147,9.08865216 C 48.8449147,8.24907466 49.53611128,7.5697391 50.38780241,7.5697391 L 50.38780241,6.67825223 M 83.21428996,9.08865216 L 84.11947928,9.08865216 C 84.11947928,7.26505371 82.61725019,5.78563691 80.764073,5.78563691 L 80.764073,7.56861063 C 81.6168341,7.56861063 82.30803067,8.24907466 82.30803067,9.08865216 L 83.21428996,9.08865216 M 80.764073,43.32174777 L 80.764073,44.21323463 C 82.61725019,44.21323463 84.11947928,42.73494629 84.11947928,40.91134784 L 82.30910064,40.91134784 C 82.30910064,41.74979688 81.61790406,42.4302609 80.76514296,42.4302609 L 80.764073,43.32174777 M 50.38780241,43.32174777 L 50.38780241,42.4302609 C 49.53611128,42.4302609 48.8449147,41.74979688 48.8449147,40.91134784 L 47.03239612,40.91134784 C 47.03239612,42.73494629 48.53462522,44.21323463 50.38780241,44.21323463 L 50.38780241,43.32174777 M 53.81810616,11.49905209 L 53.81810616,12.39053895 L 77.33483921,12.39053895 L 77.33483921,10.60756523 L 53.8170362,10.60756523 L 53.81810616,11.49905209",viewW:90,viewH:50}};export{L as FURNITURE_ART_FINGERPRINT,M as GENERATED_FURNITURE_ART};
+globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="4da0d706a85c3f1c08ab6de960deb5feb08baaf9055265234e7bd1b554332653";const L="4da0d706a85c3f1c08ab6de960deb5feb08baaf9055265234e7bd1b554332653",M={coffee_table:{d:"M 0,2.4996674 C 0,1.11983275 1.11965812,0 2.5,0 L 117.5,0 C 118.88141026,0 120,1.11869239 120,2.4996674 L 120,57.49919225 C 120,58.88130761 118.88141026,60 117.5,60 L 2.5,60 C 1.11965812,60 0,58.88130761 0,57.5003326 L 0,2.4996674 M 106,13.00123539 L 106,6.99952485 M 106,6.99952487 A 1.00009503,1 90 0,1 106.29289321,6.29235088 A 1.00009503,1 90 0,1 106.99999999,5.99942982 M 107,5.99942982 L 113,5.99942982 A 1.00009503,1 90 0,1 113.70710678,6.29235087 A 1.00009503,1 90 0,1 114,6.99952485 L 114,13.00009503 M 114,13.00009502 A 1.00009503,1 90 0,1 113.70710679,13.707269 A 1.00009503,1 90 0,1 113.00000001,14.00019006 M 113,14.00019006 L 107,14.00019006 M 107,14.00019006 A 1.00009503,1 90 0,1 106.29289322,13.70726901 A 1.00009503,1 90 0,1 106,13.00009503 M 106,53.00161551 L 106,47.00104533 M 106,47.00104534 A 1.00009503,1 90 0,1 106.29289321,46.29387136 A 1.00009503,1 90 0,1 106.99999999,46.0009503 M 107,46.0009503 L 113,46.0009503 M 113,46.0009503 A 1.00009503,1 90 0,1 113.70710678,46.29387135 A 1.00009503,1 90 0,1 114,47.00104533 M 114,47.00104533 L 114,53.00161551 M 114,53.00161549 A 1.00009503,1 90 0,1 113.70710679,53.70878948 A 1.00009503,1 90 0,1 113.00000001,54.00171054 M 113,54.00171054 L 107,54.00171054 M 107,54.00171054 A 1.00009503,1 90 0,1 106.29289322,53.70878949 A 1.00009503,1 90 0,1 106,53.00161551 M 6,13.00123539 L 6,6.99952485 M 6,6.99952487 A 1.00009503,1 90 0,1 6.29289321,6.29235088 A 1.00009503,1 90 0,1 6.99999999,5.99942982 M 7,5.99942982 L 13,5.99942982 A 1.00009503,1 90 0,1 13.70710678,6.29235087 A 1.00009503,1 90 0,1 14,6.99952485 L 14,13.00009503 M 14,13.00009502 A 1.00009503,1 90 0,1 13.70710679,13.707269 A 1.00009503,1 90 0,1 13.00000001,14.00019006 M 13,14.00019006 L 7,14.00019006 A 1.00009503,1 90 0,1 6.29289322,13.70726901 A 1.00009503,1 90 0,1 6,13.00009503 M 6,53.00161551 L 6,47.00104533 M 6,47.00104533 A 1.00009503,1 90 0,1 6.29289322,46.29387135 A 1.00009503,1 90 0,1 7,46.0009503 M 7,46.0009503 L 13,46.0009503 M 13,46.0009503 A 1.00009503,1 90 0,1 13.70710678,46.29387135 A 1.00009503,1 90 0,1 14,47.00104533 M 14,47.00104533 L 14,53.00161551 A 1.00009503,1 90 0,1 13.70710678,53.70878949 A 1.00009503,1 90 0,1 13,54.00171054 M 13,54.00171054 L 7,54.00171054 M 7,54.00171054 A 1.00009503,1 90 0,1 6.29289322,53.70878949 A 1.00009503,1 90 0,1 6,53.00161551",viewW:120,viewH:60},coffee_table_round:{d:"M 0,40 A 40,40 0 0,0 40,80 A 40,40 0 0,0 80,40 A 40,40 0 0,0 40,0 A 40,40 0 0,0 0,40 M 57.94949634,25.60507796 L 53.70718918,21.3627708 A 1.00013799,1.00013799 0 0,1 53.70718918,19.94977232 L 57.94949634,15.70636125 A 1.00013799,1.00013799 0 0,1 59.36359873,15.70636125 L 63.6070098,19.94866841 A 1.00013799,1.00013799 0 0,1 63.6070098,21.3627708 L 59.36359873,25.60618187 A 1.00013799,1.00013799 0 0,1 57.95060025,25.60618187 M 57.94949634,63.86753139 L 53.70718918,59.62522423 A 1.00013799,1.00013799 0 0,1 53.70718918,58.21112184 L 57.94949634,53.96771078 A 1.00013799,1.00013799 0 0,1 59.36359873,53.96771078 L 63.60590589,58.21112184 A 1.00013799,1.00013799 0 0,1 63.60590589,59.62412033 L 59.36359873,63.86753139 A 1.00013799,1.00013799 0 0,1 57.94949634,63.86753139 M 19.94977232,25.60618187 L 15.70746516,21.36387471 A 1.00013799,1.00013799 0 0,1 15.70746516,19.94977232 L 19.94977232,15.70636125 A 1.00013799,1.00013799 0 0,1 21.36387471,15.70636125 L 25.60728577,19.94977232 A 1.00013799,1.00013799 0 0,1 25.60728577,21.3627708 L 21.36387471,25.60618187 A 1.00013799,1.00013799 0 0,1 19.95087622,25.60618187 M 19.94977232,63.86753139 L 15.70746516,59.62522423 A 1.00013799,1.00013799 0 0,1 15.70746516,58.21112184 L 19.94977232,53.96881468 A 1.00013799,1.00013799 0 0,1 21.36387471,53.96881468 L 25.60728577,58.21112184 A 1.00013799,1.00013799 0 0,1 25.60728577,59.62522423 L 21.36387471,63.86753139 A 1.00013799,1.00013799 0 0,1 19.95087622,63.86753139",viewW:80,viewH:80},coffee_table_oval:{d:"M 0,30.00057018 C 0,13.43115081 13.43162393,0 30,0 L 90,0 C 106.56944444,0 120,13.43115081 120,30.00057018 C 120,46.56998955 106.56944444,60 90,60 L 30,60 C 13.43162393,60 0,46.56998955 0,30.00057018 M 82,13.00123539 L 82,6.99952485 M 82,6.99952487 A 1.00009503,1 90 0,1 82.29289321,6.29235088 A 1.00009503,1 90 0,1 82.99999999,5.99942982 M 83,5.99942982 L 89,5.99942982 A 1.00009503,1 90 0,1 89.70710678,6.29235087 A 1.00009503,1 90 0,1 90,6.99952485 L 90,13.00009503 M 90,13.00009502 A 1.00009503,1 90 0,1 89.70710679,13.707269 A 1.00009503,1 90 0,1 89.00000001,14.00019006 M 89,14.00019006 L 83,14.00019006 M 83,14.00019006 A 1.00009503,1 90 0,1 82.29289322,13.70726901 A 1.00009503,1 90 0,1 82,13.00009503 M 82,53.00047515 L 82,46.99990497 M 82,46.99990498 A 1.00009503,1 90 0,1 82.29289321,46.292731 A 1.00009503,1 90 0,1 82.99999999,45.99980994 M 83,45.99980994 L 89,45.99980994 M 89,45.99980994 A 1.00009503,1 90 0,1 89.70710678,46.29273099 A 1.00009503,1 90 0,1 90,46.99990497 M 90,46.99990497 L 90,53.00047515 M 90,53.00047513 A 1.00009503,1 90 0,1 89.70710679,53.70764912 A 1.00009503,1 90 0,1 89.00000001,54.00057018 M 89,54.00057018 L 83,54.00057018 M 83,54.00057018 A 1.00009503,1 90 0,1 82.29289322,53.70764913 A 1.00009503,1 90 0,1 82,53.00047515 M 30,13.00123539 L 30,6.99952485 M 30,6.99952487 A 1.00009503,1 90 0,1 30.29289321,6.29235088 A 1.00009503,1 90 0,1 30.99999999,5.99942982 M 31,5.99942982 L 37,5.99942982 M 37,5.99942982 A 1.00009503,1 90 0,1 37.70710678,6.29235087 A 1.00009503,1 90 0,1 38,6.99952485 L 38,13.00009503 A 1.00009503,1 90 0,1 37,13.9990497 L 31,13.9990497 A 1.00009503,1 90 0,1 30,13.00009503 M 30,53.00047515 L 30,46.99990497 M 30,46.99990497 A 1.00009503,1 90 0,1 30.29289322,46.29273099 A 1.00009503,1 90 0,1 31,45.99980994 M 31,45.99980994 L 37,45.99980994 M 37,45.99980994 A 1.00009503,1 90 0,1 37.70710678,46.29273099 A 1.00009503,1 90 0,1 38,46.99990497 M 38,46.99990497 L 38,53.00047515 A 1.00009503,1 90 0,1 37,53.99942982 L 31,53.99942982 A 1.00009503,1 90 0,1 30,53.00047515",viewW:120,viewH:60},coffee_table_rounded:{d:"M 0,10.00057016 C 0,4.47802041 4.47649573,0 10,0 L 110,0 C 115.52350427,0 120,4.47802041 120,10.00057016 L 120,49.99942984 C 120,55.52197959 115.52350427,60 110,60 L 10,60 C 4.47649573,60 0,55.52197959 0,49.99942984 L 0,10.00057016 M 106,13.00188152 L 106,7.00039911 M 106,7.00039913 A 1.00005702,1 90 0,1 106.29289321,6.29325202 A 1.00005702,1 90 0,1 106.99999999,6.00034209 M 107,6.00034209 L 113,6.00034209 A 1.00005702,1 90 0,1 113.70710678,6.29325201 A 1.00005702,1 90 0,1 114,7.00039911 L 114,13.00074121 M 114,13.00074119 A 1.00005702,1 90 0,1 113.70710679,13.70788829 A 1.00005702,1 90 0,1 113.00000001,14.00079822 M 113,14.00079822 L 107,14.00079822 M 107,14.00079822 A 1.00005702,1 90 0,1 106.29289322,13.7078883 A 1.00005702,1 90 0,1 106,13.00074121 M 106,53.00074121 L 106,47.00039911 M 106,47.00039913 A 1.00005702,1 90 0,1 106.29289321,46.29325202 A 1.00005702,1 90 0,1 106.99999999,46.00034209 M 107,46.00034209 L 113,46.00034209 M 113,46.00034209 A 1.00005702,1 90 0,1 113.70710678,46.29325201 A 1.00005702,1 90 0,1 114,47.00039911 M 114,47.00039911 L 114,53.00074121 M 114,53.00074119 A 1.00005702,1 90 0,1 113.70710679,53.70788829 A 1.00005702,1 90 0,1 113.00000001,54.00079822 M 113,54.00079822 L 107,54.00079822 M 107,54.00079822 A 1.00005702,1 90 0,1 106.29289322,53.7078883 A 1.00005702,1 90 0,1 106,53.00074121 M 6,13.00188152 L 6,7.00039911 M 6,7.00039913 A 1.00005702,1 90 0,1 6.29289321,6.29325202 A 1.00005702,1 90 0,1 6.99999999,6.00034209 M 7,6.00034209 L 13,6.00034209 A 1.00005702,1 90 0,1 13.70710678,6.29325201 A 1.00005702,1 90 0,1 14,7.00039911 L 14,13.00074121 M 14,13.00074119 A 1.00005702,1 90 0,1 13.70710679,13.70788829 A 1.00005702,1 90 0,1 13.00000001,14.00079822 M 13,14.00079822 L 7,14.00079822 M 7,14.00079822 A 1.00005702,1 90 0,1 6.29289322,13.7078883 A 1.00005702,1 90 0,1 6,13.00074121 M 6,53.00074121 L 6,47.00039911 M 6,47.00039911 A 1.00005702,1 90 0,1 6.29289322,46.29325201 A 1.00005702,1 90 0,1 7,46.00034209 M 7,46.00034209 L 13,46.00034209 M 13,46.00034209 A 1.00005702,1 90 0,1 13.70710678,46.29325201 A 1.00005702,1 90 0,1 14,47.00039911 M 14,47.00039911 L 14,53.00074121 M 14,53.00074121 A 1.00005702,1 90 0,1 13.70710678,53.7078883 A 1.00005702,1 90 0,1 13,54.00079822 M 13,54.00079822 L 7,54.00079822 M 7,54.00079822 A 1.00005702,1 90 0,1 6.29289322,53.7078883 A 1.00005702,1 90 0,1 6,53.00074121",viewW:120,viewH:60},table_dining:{d:"M 0,2.50060665 C 0,1.11926717 1.11927063,0 2.49917894,0 L 157.49871914,0 C 158.87967841,0 160,1.11926717 160,2.50060665 L 160,87.49939335 C 160,88.88073283 158.87967841,90 157.49871914,90 L 2.49917894,90 C 1.11927063,90 0,88.88073283 0,87.49939335 L 0,2.50060665 M 142.00023647,16.99975734 L 142.00023647,10.99939335 A 1.00051234,1.00024266 0 0,1 142.99969785,10.00024266 L 149.00066999,10.00024266 A 1.00051234,1.00024266 0 0,1 149.99908041,10.99939335 L 149.99908041,16.99975734 A 1.00051234,1.00024266 0 0,1 149.00066999,18 L 142.99969785,18 A 1.00051234,1.00024266 0 0,1 142.00023647,16.99975734 M 141.99918551,78.99951468 L 141.99918551,72.99915069 A 1.00051234,1.00024266 0 0,1 142.99969785,72 L 148.99961903,72 A 1.00051234,1.00024266 0 0,1 149.99908041,72.99915069 L 149.99908041,78.99951468 A 1.00051234,1.00024266 0 0,1 148.99961903,79.99975734 L 142.99864689,79.99975734 A 1.00051234,1.00024266 0 0,1 142.00023647,78.99951468 M 9.99986863,16.99975734 L 9.99986863,10.99939335 A 1.00051234,1.00024266 0 0,1 10.99933001,9.99915069 L 17.00030215,9.99915069 A 1.00051234,1.00024266 0 0,1 17.99871258,10.99939335 L 17.99871258,16.99975734 A 1.00051234,1.00024266 0 0,1 17.00030215,17.99890803 L 10.99933001,17.99890803 A 1.00051234,1.00024266 0 0,1 9.99986863,16.99975734 M 9.99881767,79.00060665 L 9.99881767,73.00024266 A 1.00051234,1.00024266 0 0,1 10.99933001,72 L 16.99925119,72 A 1.00051234,1.00024266 0 0,1 17.99871258,73.00024266 L 17.99871258,79.00060665 A 1.00051234,1.00024266 0 0,1 16.99925119,79.99975734 L 10.99827906,79.99975734 A 1.00051234,1.00024266 0 0,1 9.99986863,79.00060665",viewW:160,viewH:90},table_round:{d:"M 0,55 A 55,55 90 0,0 55,110 A 55,55 90 0,0 110,55 A 55,55 90 0,0 55,0 A 55,55 90 0,0 0,55 M 82.94844112,30.60630783 L 78.70638697,26.36425368 A 0.99952125,0.99952125 90 0,1 78.41321383,25.65706553 A 0.99952125,0.99952125 90 0,1 78.70638697,24.94987738 M 78.70638697,24.94987738 L 82.94844112,20.70674848 A 0.99952125,0.99952125 90 0,1 83.65562927,20.41357533 A 0.99952125,0.99952125 90 0,1 84.36281742,20.70674848 L 88.60594632,24.94987738 M 88.60594632,24.94987738 A 0.99952125,0.99952125 90 0,1 88.89911946,25.65706553 A 0.99952125,0.99952125 90 0,1 88.60594632,26.36425368 L 84.36281742,30.60630783 A 0.99952125,0.99952125 90 0,1 83.65562927,30.89948097 A 0.99952125,0.99952125 90 0,1 82.94844112,30.60630783 M 82.94844112,89.6070797 L 78.70638697,85.3639508 A 0.99952125,0.99952125 90 0,1 78.41321383,84.65676265 A 0.99952125,0.99952125 90 0,1 78.70638697,83.9495745 L 82.94844112,79.70752035 A 0.99952125,0.99952125 90 0,1 83.65562927,79.4143472 A 0.99952125,0.99952125 90 0,1 84.36281742,79.70752035 L 88.60594632,83.9495745 A 0.99952125,0.99952125 90 0,1 88.89911946,84.65676265 A 0.99952125,0.99952125 90 0,1 88.60594632,85.3639508 L 84.36174266,89.6070797 A 0.99952125,0.99952125 90 0,1 83.65455451,89.90025284 A 0.99952125,0.99952125 90 0,1 82.94736636,89.6070797 M 24.94934,30.60738258 L 20.70728586,26.36425368 A 0.99952125,0.99952125 90 0,1 20.70728586,24.95095213 L 24.95041476,20.70782323 A 0.99952125,0.99952125 90 0,1 26.3637163,20.70782323 L 30.60684521,24.95095213 A 0.99952125,0.99952125 90 0,1 30.60684521,26.36425368 L 26.3637163,30.60738258 A 0.99952125,0.99952125 90 0,1 24.95041476,30.60738258 M 24.94934,89.29325152 L 20.70728586,85.05012262 A 0.99952125,0.99952125 90 0,1 20.41411271,84.34293447 A 0.99952125,0.99952125 90 0,1 20.70728586,83.63574632 L 24.95041476,79.39369217 A 0.99952125,0.99952125 90 0,1 26.3637163,79.39369217 L 30.60684521,83.63574632 A 0.99952125,0.99952125 90 0,1 30.90001835,84.34293447 A 0.99952125,0.99952125 90 0,1 30.60684521,85.05012262 L 26.3637163,89.29325152 A 0.99952125,0.99952125 90 0,1 24.95041476,89.29325152",viewW:110,viewH:110},table_dining_oval:{d:"M 0,50 C 0,22.38579779 22.38594332,0 49.99994193,0 L 129.99901287,0 C 157.61301149,0 180,22.38579779 180,50 C 180,77.61420221 157.61301149,100 129.99901287,100 L 49.99994193,100 C 22.38594332,100 0,77.61420221 0,50 M 123.99960515,16.99935051 L 123.99960515,10.99805153 A 1.00024968,1.0002165 0 0,1 124.99880964,9.99783503 L 130.99821737,9.99783503 M 130.99821737,9.99783503 A 1.00024968,1.0002165 0 0,1 131.70617646,10.29042188 A 1.00024968,1.0002165 0 0,1 131.99951224,10.99805153 M 131.99951224,10.99805153 L 131.99951224,16.99826802 A 1.00024968,1.0002165 0 0,1 130.99926256,17.99848452 L 124.99985483,17.99848452 A 1.00024968,1.0002165 0 0,1 124.29189574,17.70589767 A 1.00024968,1.0002165 0 0,1 123.99855996,16.99826802 M 123.99960515,89.00086599 L 123.99960515,83.00064949 M 123.99960515,83.00064951 A 1.00024968,1.0002165 0 0,1 124.29257149,82.29338963 A 1.00024968,1.0002165 0 0,1 124.99985482,82.00043299 M 124.99985483,82.00043299 L 130.99926256,82.00043299 A 1.00024968,1.0002165 0 0,1 131.70654589,82.29338962 A 1.00024968,1.0002165 0 0,1 131.99951224,83.00064949 L 131.99951224,89.00086599 M 131.99951224,89.00086597 A 1.00024968,1.0002165 0 0,1 131.7065459,89.70812585 A 1.00024968,1.0002165 0 0,1 130.99926257,90.00108249 M 130.99926256,90.00108249 L 124.99985483,90.00108249 A 1.00024968,1.0002165 0 0,1 124.2925715,89.70812586 A 1.00024968,1.0002165 0 0,1 123.99960515,89.00086599 M 47.99944256,17.00043299 L 47.99944256,11.0002165 M 47.99944256,11.00021648 A 1.00024968,1.0002165 0 0,1 48.29240892,10.29295662 A 1.00024968,1.0002165 0 0,1 48.99969226,10 M 48.99969225,10 L 54.99909997,10 A 1.00024968,1.0002165 0 0,1 55.70705907,10.29258685 A 1.00024968,1.0002165 0 0,1 56.00039485,11.0002165 L 56.00039485,16.99935051 M 56.00039485,16.99935052 A 1.00024968,1.0002165 0 0,1 55.70742849,17.70661039 A 1.00024968,1.0002165 0 0,1 55.00014515,17.99956701 M 55.00014517,17.99956701 L 49.00073744,17.99956701 A 1.00024968,1.0002165 0 0,1 48.29277835,17.70698015 A 1.00024968,1.0002165 0 0,1 47.99944256,16.99935051 M 47.99944256,89.00194847 L 47.99944256,83.00173198 M 47.99944256,83.00173199 A 1.00024968,1.0002165 0 0,1 48.2924089,82.29447212 A 1.00024968,1.0002165 0 0,1 48.99969223,82.00151548 M 48.99969225,82.00151548 L 54.99909997,82.00151548 A 1.00024968,1.0002165 0 0,1 55.70638331,82.29447211 A 1.00024968,1.0002165 0 0,1 55.99934966,83.00173198 L 55.99934966,89.00194847 A 1.00024968,1.0002165 0 0,1 54.99909997,90.00108249 L 48.99969225,90.00108249 M 48.99969225,90.00108249 A 1.00024968,1.0002165 0 0,1 48.29240891,89.70812586 A 1.00024968,1.0002165 0 0,1 47.99944256,89.00086599",viewW:180,viewH:100},table_dining_rounded:{d:"M 0,15.00018199 C 0,6.71552153 6.71566792,0 14.99937599,0 L 144.99957305,0 C 153.28433208,0 160,6.71552153 160,15.00018199 L 160,74.99981801 C 160,83.28447847 153.28433208,90 144.99957305,90 L 14.99937599,90 C 6.71566792,90 0,83.28447847 0,74.99981801 L 0,15.00018199 M 142.0011692,16.99955109 L 142.0011692,10.9992599 A 1.00051891,1.00023052 0 0,1 143.00063715,10.00012133 L 149.0016487,10.00012133 A 1.00051891,1.00023052 0 0,1 150.00006569,10.9992599 L 150.00006569,16.99955109 A 1.00051891,1.00023052 0 0,1 149.0016487,17.99978161 L 143.00063715,17.99978161 A 1.00051891,1.00023052 0 0,1 142.0011692,16.99955109 M 142.00011823,78.99855619 L 142.00011823,72.99826501 A 1.00051891,1.00023052 0 0,1 143.00063715,71.99912644 L 149.00059774,71.99912644 A 1.00051891,1.00023052 0 0,1 150.00006569,72.99826501 L 150.00006569,78.99855619 A 1.00051891,1.00023052 0 0,1 149.00059774,79.99878672 L 142.99958618,79.99878672 A 1.00051891,1.00023052 0 0,1 142.0011692,78.99855619 M 9.99993431,16.99955109 L 9.99993431,10.9992599 A 1.00051891,1.00023052 0 0,1 10.99940226,9.99902937 L 17.00041382,9.99902937 A 1.00051891,1.00023052 0 0,1 17.9988308,10.9992599 L 17.9988308,16.99955109 A 1.00051891,1.00023052 0 0,1 17.00041382,17.99868965 L 10.99940226,17.99868965 A 1.00051891,1.00023052 0 0,1 9.99993431,16.99955109 M 9.99888335,78.99964815 L 9.99888335,72.99935696 A 1.00051891,1.00023052 0 0,1 10.99940226,71.99912644 L 16.99936285,71.99912644 A 1.00051891,1.00023052 0 0,1 17.9988308,72.99935696 L 17.9988308,78.99964815 A 1.00051891,1.00023052 0 0,1 16.99936285,79.99878672 L 10.9983513,79.99878672 A 1.00051891,1.00023052 0 0,1 9.99993431,78.99964815",viewW:160,viewH:90},desk:{d:"M 0,2.5007596 C 0,1.11940895 1.11872146,0 2.4999244,0 L 137.5000756,0 C 138.88127854,0 140,1.11940895 140,2.5007596 L 140,67.50035981 C 140,68.88171046 138.88127854,70 137.5000756,70 L 2.4999244,70 C 1.11872146,70 0,68.88059105 0,67.50035981 L 0,2.5007596 M 6.00003024,12.99969616 L 6.00003024,6.99966418 A 1.00018144,0.99963219 0 0,1 6.2929766,6.29281747 A 1.00018144,0.99963219 0 0,1 7.00021168,6.00003198 L 13.00130031,6.00003198 A 1.00018144,0.99963219 0 0,1 14.00042336,6.99966418 L 14.00042336,12.99969616 M 14.00042336,12.99969616 A 1.00018144,0.99963219 0 0,1 13.70787328,13.70726661 A 1.00018144,0.99963219 0 0,1 13.00024192,14.00044776 M 13.00024192,14.00044776 L 7.00021168,14.00044776 A 1.00018144,0.99963219 0 0,1 6.29258032,13.70726661 A 1.00018144,0.99963219 0 0,1 6.00003024,12.99969616 M 125.99957664,13.00081557 L 125.99957664,7.00078359 M 125.99957664,7.00078359 A 1.00018144,0.99963219 0 0,1 126.29212672,6.29321313 A 1.00018144,0.99963219 0 0,1 126.99975808,6.00003198 L 133.00084671,6.00003198 M 133.00084671,6.00003198 A 1.00018144,0.99963219 0 0,1 133.70779377,6.29358707 A 1.00018144,0.99963219 0 0,1 133.99996976,7.00078359 M 133.99996976,7.00078359 L 133.99996976,13.00081557 A 1.00018144,0.99963219 0 0,1 132.99978832,14.00044776 L 126.99975808,14.00044776 A 1.00018144,0.99963219 0 0,1 125.99957664,13.00081557 M 5.99897185,63.00033582 L 5.99897185,57.00030384 M 5.99897185,57.00030384 A 1.00018144,0.99963219 0 0,1 6.29229231,56.29308288 A 1.00018144,0.99963219 0 0,1 7.00021168,56.00067165 M 7.00021168,56.00067165 L 13.00024192,56.00067165 A 1.00018144,0.99963219 0 0,1 13.707477,56.29345714 A 1.00018144,0.99963219 0 0,1 14.00042336,57.00030384 L 14.00042336,63.00033582 M 14.00042336,63.00033582 A 1.00018144,0.99963219 0 0,1 13.70787328,63.70790627 A 1.00018144,0.99963219 0 0,1 13.00024192,64.00108743 M 13.00024192,64.00108743 L 6.99915329,64.00108743 M 6.99915329,64.00108743 A 1.00018144,0.99963219 0 0,1 6.29220623,63.70753234 A 1.00018144,0.99963219 0 0,1 6.00003024,63.00033582 M 126.00063504,63.00145523 L 126.00063504,57.00142325 M 126.00063504,57.00142325 A 1.00018144,0.99963219 0 0,1 126.29318511,56.2938528 A 1.00018144,0.99963219 0 0,1 127.00081647,56.00067165 L 133.00084671,56.00067165 A 1.00018144,0.99963219 0 0,1 133.70847808,56.2938528 A 1.00018144,0.99963219 0 0,1 134.00102815,57.00142325 L 134.00102815,63.00145523 A 1.00018144,0.99963219 0 0,1 133.00084671,64.00108743 L 126.99975808,64.00108743 A 1.00018144,0.99963219 0 0,1 126.00063504,63.00145523 M 22.99993952,60.00031983 L 117.00006048,60.00031983",viewW:140,viewH:70},desk_corner:{d:"M 159.99894904,65.49825605 A 2.50129729,2.50128086 90 0,1 157.49871914,67.99955334 L 94.99927747,67.99955334 C 81.19178676,67.99955334 69.99908041,79.19233321 69.99908041,92.99886364 L 69.99908041,157.49870271 A 2.50129729,2.50128086 90 0,1 67.49885051,160 L 2.49917894,160 A 2.50129729,2.50128086 90 0,1 0,157.49870271 L 0,2.49814439 A 2.50129729,2.50128086 90 0,1 2.49917894,0 L 157.49871914,0 A 2.50129729,2.50128086 90 0,1 160,2.49919535 L 159.99894904,65.49825605 M 5.99992118,12.99938913 L 5.99992118,6.99837757 M 5.99992118,6.99837757 A 0.99841698,0.99841043 90 0,1 6.29272029,6.29201832 A 0.99841698,0.99841043 90 0,1 6.99938256,5.99996059 M 6.99938256,5.99996059 L 13.0003547,5.99996059 A 0.99841698,0.99841043 90 0,1 13.99876512,6.99837757 L 13.99876512,12.99938913 M 13.99876512,12.99938913 A 0.99841698,0.99841043 90 0,1 13.70670931,13.70605604 A 0.99841698,0.99841043 90 0,1 13.0003547,13.99885708 M 13.0003547,13.99885708 L 6.99938256,13.99885708 A 0.99841698,0.99841043 90 0,1 6.29234827,13.70642806 A 0.99841698,0.99841043 90 0,1 5.99992118,12.99938913 M 146.00018392,13.00044009 L 146.00018392,6.99942854 M 146.00018392,6.99942854 A 0.99841698,0.99841043 90 0,1 146.29261101,6.2923896 A 0.99841698,0.99841043 90 0,1 146.9996453,5.99996059 M 146.9996453,5.99996059 L 153.00061744,5.99996059 A 0.99841698,0.99841043 90 0,1 153.70697205,6.29276163 A 0.99841698,0.99841043 90 0,1 153.99902786,6.99942854 L 153.99902786,13.00044009 M 153.99902786,13.00044009 A 0.99841698,0.99841043 90 0,1 153.70697205,13.707107 A 0.99841698,0.99841043 90 0,1 153.00061744,13.99990804 L 146.9996453,13.99990804 A 0.99841698,0.99841043 90 0,1 146.29261101,13.70747903 A 0.99841698,0.99841043 90 0,1 146.00018392,13.00044009 M 146.00018392,61.0001248 L 146.00018392,54.99911325 M 146.00018392,54.99911325 A 0.99841698,0.99841043 90 0,1 146.29298209,54.29170176 A 0.99841698,0.99841043 90 0,1 147.00069626,53.9996453 M 147.00069626,53.9996453 L 153.00061744,53.9996453 M 153.00061744,53.9996453 A 0.99841698,0.99841043 90 0,1 153.70765173,54.29207431 A 0.99841698,0.99841043 90 0,1 154.00007882,54.99911325 L 154.00007882,61.0001248 M 154.00007882,61.0001248 A 0.99841698,0.99841043 90 0,1 153.70765173,61.70716374 A 0.99841698,0.99841043 90 0,1 153.00061744,61.99959275 M 153.00061744,61.99959275 L 146.9996453,61.99959275 A 0.99841698,0.99841043 90 0,1 146.29329069,61.70679171 A 0.99841698,0.99841043 90 0,1 146.00123488,61.0001248 M 5.99887022,152.9995205 L 5.99887022,147.00061087 M 5.99887022,147.00061087 A 0.99841698,0.99841043 90 0,1 6.29129565,146.29251931 A 0.99841698,0.99841043 90 0,1 6.99938256,146.00009196 M 6.99938256,146.00009196 L 12.99930374,146.00009196 A 0.99841698,0.99841043 90 0,1 13.70671058,146.29289205 A 0.99841698,0.99841043 90 0,1 13.99876512,147.00061087 L 13.99876512,153.00057146 M 13.99876512,153.00057146 A 0.99841698,0.99841043 90 0,1 13.70633803,153.7076104 A 0.99841698,0.99841043 90 0,1 12.99930374,154.00003941 M 12.99930374,154.00003941 L 6.9983316,154.00003941 A 0.99841698,0.99841043 90 0,1 6.29129731,153.7076104 A 0.99841698,0.99841043 90 0,1 5.99887022,153.00057146 M 55.99926433,153.00057146 L 55.99926433,147.00061087 M 55.99926433,147.00061087 A 0.99841698,0.99841043 90 0,1 56.2920625,146.29319939 A 0.99841698,0.99841043 90 0,1 56.99977667,146.00114292 M 56.99977667,146.00114292 L 62.99969785,146.00114292 A 0.99841698,0.99841043 90 0,1 63.70673214,146.29357194 A 0.99841698,0.99841043 90 0,1 63.99915923,147.00061087 L 63.99915923,153.00162243 M 63.99915923,153.00162243 A 0.99841698,0.99841043 90 0,1 63.70636012,153.70798168 A 0.99841698,0.99841043 90 0,1 62.99969785,154.00003941 M 62.99969785,154.00003941 L 56.99872571,154.00003941 M 56.99872571,154.00003941 A 0.99841698,0.99841043 90 0,1 56.29206344,153.70798168 A 0.99841698,0.99841043 90 0,1 55.99926433,153.00162243 M 109.99960589,57.99856806 L 96.36237044,57.99856806 A 36.36339751,36.36315866 90 0,0 70.64973437,68.6491606 A 36.36339751,36.36315866 90 0,0 59.99921178,94.36196557 L 59.99921178,107.9992906",viewW:160,viewH:160},chair:{d:"M 41.91143767,10.29325717 L 8.08739211,10.29325717 A 5.14662859,5.14662858 90 0,1 2.94076353,5.14662859 A 5.14662859,5.14662858 90 0,1 8.08739211,0 L 41.91143767,0 A 5.14662859,5.14662858 90 0,1 47.05806625,5.14662859 A 5.14662859,5.14662858 90 0,1 41.91143767,10.29325717 M 8.08739211,10.29325717 L 5.14662867,10.29325717 A 5.14896903,5.14896902 90 0,0 0.00000009,15.44105598 L 0.00000009,42.64633596 M 0.00000009,42.64633596 A 7.35249373,7.35249371 90 0,0 2.15308186,47.84609063 A 7.35249373,7.35249371 90 0,0 7.35249381,49.99999991 M 7.35249381,49.99999991 L 42.64633597,49.99999991 M 42.64633597,49.99999991 A 7.35249373,7.35249371 90 0,0 47.84650445,47.84650445 A 7.35249373,7.35249371 90 0,0 49.99999991,42.64633596 M 49.99999991,42.64633596 L 49.99999991,15.44105598 C 49.99999991,12.59742081 47.69466605,10.29325717 44.85220111,10.29325717 L 41.91143767,10.29325717",viewW:50,viewH:50},chair_bar:{d:"M 41.6420124,15.95288922 C 43.22061234,18.92793522 43.95991141,23.03717335 43.95991141,26.63643725 C 43.95991141,38.43533309 34.35259503,48 22.5011905,48 C 10.64978597,48 1.04127909,38.43533309 1.04127909,26.63643725 C 1.04127909,23.03717335 1.73891074,18.91969084 3.31751068,15.94464483 M 41.6420124,15.95288922 A 4.27388672,4.22819286 0 0,1 37.67408359,14.80338609 M 41.6420124,15.95288922 A 4.28579169,4.23997056 0 0,0 43.74324083,14.80338609 M 3.47227538,15.97644461 L 3.31751068,15.94464483 A 4.28579169,4.23997056 0 0,1 1.25675917,14.80338609 M 37.67408359,14.80338609 A 21.42895847,21.19985278 0 0,0 30.71205308,10.17239603 A 21.34562363,21.11740891 0 0,0 14.28794692,10.17239603 A 21.42895847,21.19985278 0 0,0 7.32591641,14.80338609 A 4.27388672,4.22819286 0 0,1 3.47227538,15.97644461 M 37.67408359,14.80338609 A 4.27388672,4.22819286 0 0,0 40.70866221,16.0541972 A 4.27388672,4.22819286 0 0,0 43.74324083,14.80338609 M 3.47227538,15.97644461 A 4.28579169,4.23997056 0 0,1 1.25675917,14.80338609 A 4.33817359,4.29179242 0 0,1 1.25675917,8.76142805 A 30.00054185,29.67979389 0 0,1 11.00336378,2.2778064 A 29.88149208,29.56201693 0 0,1 22.5,0 A 29.88149208,29.56201693 0 0,1 33.99663622,2.2778064 A 30.00054185,29.67979389 0 0,1 43.74324083,8.76142805 A 4.33817359,4.29179242 0 0,1 43.74324083,14.80338609",viewW:45,viewH:48},armchair:{d:"M 78.52464784,10.06903664 Q 78.5377513,9.82334385 78.5377513,9.57437515 C 78.5377513,4.28597428 74.26056466,0 68.98533141,0 L 21.01357664,0 C 15.73943534,0 11.4622487,4.28597428 11.4622487,9.57437515 Q 11.4622487,9.82334385 11.4742602,10.06903664 M 80.08614309,74.58141228 Q 80.73039638,74.68078136 81.40304049,74.68187333 C 86.15085961,74.68187333 90,70.8239505 90,66.06406212 L 90,18.19218636 C 90,13.43229799 86.15085961,9.57437515 81.40304049,9.57437515 C 80.39407433,9.57437515 79.42441853,9.74909003 78.52464784,10.06903664 A 8.61562727,8.61552274 90 0,0 72.80608097,18.19109439 L 72.80608097,18.35270565 A 9.50012133,9.50000607 90 0,1 68.98533141,19.14984227 L 21.01357664,19.14984227 A 9.50012133,9.50000607 90 0,1 17.19282707,18.35270565 M 72.80608097,18.35270565 L 72.80608097,66.06406212 A 8.61562727,8.61552274 90 0,0 80.08614309,74.58141228 M 11.4742602,10.06794467 A 8.61562727,8.61552274 90 0,1 17.19282707,18.19000243 L 17.19282707,18.35161369 L 17.19282707,66.06406212 A 8.61562727,8.61552274 90 0,1 9.91385691,74.58141228 Q 9.26960362,74.68078136 8.59695951,74.68187333 C 3.84914039,74.68187333 0,70.8239505 0,66.06406212 L 0,18.19218636 C 0,13.43229799 3.84914039,9.57437515 8.59695951,9.57437515 C 9.60592567,9.57437515 10.57448951,9.74909003 11.4742602,10.06903664 M 80.08614309,74.58141228 C 78.35539486,83.37175443 70.62217153,90 61.34383228,90 L 28.65507577,90 C 19.37782847,90 11.64460514,83.37175443 9.91385691,74.58141228",viewW:90,viewH:90},armchair_office:{d:"M 60.12480149,17.08328496 Q 60.12480149,16.66780357 60.06834946,16.27038659 M 51.18618701,11.38735127 L 13.81381391,11.38735127 A 5.69036465,5.69028856 0 0,1 9.79038036,9.71870864 A 5.69036465,5.69028856 0 0,1 8.12570733,5.69367564 M 8.12570733,5.69367564 A 5.69036465,5.69028856 0 0,1 9.79038036,1.66864264 A 5.69036465,5.69028856 0 0,1 13.81381391,0 M 13.81381391,0 L 51.18844509,0 M 51.18844509,0 A 5.69036465,5.69028856 0 0,1 55.21187864,1.66864264 A 5.69036465,5.69028856 0 0,1 56.87655166,5.69367564 M 56.87655166,5.69367564 A 5.69036465,5.69028856 0 0,1 55.21187864,9.71870864 A 5.69036465,5.69028856 0 0,1 51.18844509,11.38735127 M 13.81381391,11.38735127 L 10.56217696,11.38735127 A 5.69036465,5.69028856 0 0,0 4.9327805,16.26812854 M 51.18731605,11.38735127 L 54.43782395,11.38735127 A 5.69036465,5.69028856 0 0,1 60.06722042,16.26925757 M 60.12480149,44.29844483 A 4.87745542,4.87739019 0 0,0 63.57342145,42.86789464 A 4.87745542,4.87739019 0 0,0 64.99999882,39.41766756 M 64.99999882,39.41766756 L 64.99999882,21.15003484 M 64.99999882,21.15003484 A 4.87745542,4.87739019 0 0,0 63.55272454,17.68002711 A 4.87745542,4.87739019 0 0,0 60.06722042,16.27038659 M 60.12480149,44.29957385 A 4.87745542,4.87739019 0 0,1 56.67618152,42.86902366 A 4.87745542,4.87739019 0 0,1 55.24960415,39.41879658 M 55.24960415,39.41879658 L 55.24960415,21.15003484 A 4.87745542,4.87739019 0 0,1 60.06722042,16.27038659 M 46.69937964,58.31529651 L 52.00022529,58.31529651 C 52.83119917,58.31529651 53.632818,58.18997468 54.38814617,57.95739542 A 8.14038277,8.14027391 0 0,0 60.12480149,50.1795387 L 60.12480149,44.29957385 M 4.9327805,16.26925757 L 4.87519943,16.26925757 M 4.87519943,16.26925757 A 4.87745542,4.87739019 0 0,0 1.42657946,17.69980776 A 4.87745542,4.87739019 0 0,0 0.00000209,21.15003484 L 0.00000209,39.41766756 M 0.00000209,39.41766756 A 4.87745542,4.87739019 0 0,0 1.42617995,42.86862456 A 4.87745542,4.87739019 0 0,0 4.87519943,44.29957385 M 4.87519943,44.29957385 A 4.87745542,4.87739019 0 0,0 8.32308951,42.86862466 A 4.87745542,4.87739019 0 0,0 9.74926772,39.41879658 M 9.74926772,39.41879658 L 9.74926772,21.15003484 A 4.87745542,4.87739019 0 0,0 4.9327805,16.26925757 M 18.40788013,58.31416748 L 12.99977563,58.31416748 A 8.12909236,8.12898366 0 0,1 10.69653279,57.98223398 A 8.14038277,8.14027391 0 0,1 4.87519943,50.18066772 L 4.87519943,44.29844483 M 46.70050868,58.31416748 L 52.5455519,64.16590669 C 53.63959225,65.26106143 55.40654079,65.28025487 56.52429099,64.20880966 A 2.85195657,2.85191843 0 0,0 57.39975759,62.18274316 A 2.85195657,2.85191843 0 0,0 56.56719454,60.1386727 L 54.38814617,57.95739542 M 46.69937964,58.31416748 L 18.40900917,58.31416748 M 10.69766183,57.98223398 L 8.54232332,60.1386727 C 7.41554079,61.26769821 7.43586352,63.10462271 8.58522686,64.20880966 C 9.70297706,65.28025487 11.46992561,65.26106143 12.56396596,64.16590669 L 18.40900917,58.31416748",viewW:65,viewH:65},sofa:{d:"M 89.9994774,17.00719477 L 89.9994774,79.3698208 M 89.9994774,17.00828672 L 89.9994774,4.25097973 M 89.9994774,17.00610281 C 89.9994774,19.35489742 88.08050309,21.25817449 85.71418617,21.25817449 L 27.85648339,21.25817449 A 11.68391551,11.18356492 90 0,1 23.53356521,20.35731185 M 89.9994774,17.00719477 C 89.9994774,19.35598937 91.91845172,21.25926645 94.28476863,21.25926645 L 152.14247142,21.25926645 C 153.68099549,21.25926645 155.14322047,20.93823176 156.46643479,20.3584038 M 89.9994774,79.3698208 C 89.9994774,85.24016937 85.20204161,90 79.28624932,90 L 27.8554382,90 C 22.35145195,90 17.81635959,85.8811468 17.21014766,80.58189054 M 89.9994774,79.3698208 C 89.9994774,85.24016937 94.7969132,90 100.71270548,90 L 152.14247142,90 C 157.64645767,90 162.18155002,85.8811468 162.78776195,80.58189054 M 89.9994774,4.25207168 C 89.9994774,1.90436903 88.07945789,0 85.71314098,0 L 27.85648339,0 C 21.93964591,0 17.14325531,4.75873867 17.14325531,10.6301792 Q 17.14325531,11.08443237 17.18088226,11.53104185 M 89.9994774,4.25207168 C 89.9994774,1.90436903 91.91845172,0 94.28476863,0 L 152.14247142,0 C 158.0593089,0 162.8556995,4.75873867 162.8556995,10.6301792 Q 162.8556995,11.08443237 162.81807255,11.53104185 A 11.68391551,11.18356492 90 0,1 167.14203592,10.6301792 L 169.28468154,10.6301792 C 175.20256421,10.6301792 180,15.38891787 180,21.25926645 L 180,70.86676939 C 180,76.73711797 175.20256421,81.49585664 169.28572673,81.49585664 L 167.14308111,81.49585664 C 165.59201473,81.49585664 164.11829262,81.16827022 162.78776195,80.58189054 C 159.04074511,78.92539523 156.42880784,75.19855377 156.42880784,70.86567744 L 156.42880784,21.2603584 Q 156.42880784,20.80501329 156.46643479,20.35949576 C 156.80089654,16.40443576 159.31772125,13.06523823 162.81807255,11.5321338 M 17.18088226,11.5321338 C 20.68227875,13.06523823 23.19910346,16.40443576 23.53356521,20.35949576 Q 23.57119216,20.80501329 23.57119216,21.2603584 L 23.57119216,70.86786135 C 23.57119216,75.19964572 20.9582097,78.92648718 17.21119286,80.58298249 A 11.68391551,11.18356492 90 0,1 12.85691889,81.49694859 L 10.71427327,81.49694859 C 4.7963906,81.49694859 0,76.73820992 0,70.86676939 L 0,21.2603584 C 0,15.39000983 4.79743579,10.63127116 10.71322808,10.63127116 L 12.85587369,10.63127116 C 14.39544296,10.63127116 15.85766794,10.95230584 17.18088226,11.5321338",viewW:180,viewH:90},sofa_three_seat:{d:"M 85.42409676,16.16420572 L 85.42409676,79.89832688 M 85.42409676,16.16529768 L 85.42409676,4.04132442 M 85.42409676,16.16420572 C 85.42409676,18.39616117 83.60262573,20.20553014 81.35628263,20.20553014 L 26.44130873,20.20553014 C 24.98061715,20.20553014 23.59228821,19.89978282 22.33731328,19.34943764 M 85.42409676,16.16420572 C 85.42409676,18.39616117 87.24556779,20.20553014 89.49191089,20.20553014 L 150.50808911,20.20553014 C 152.75546596,20.20553014 154.57590324,18.39616117 154.57590324,16.16529768 M 85.42409676,79.89614297 C 85.42409676,85.47603159 80.87145294,89.99890805 75.25507831,89.99890805 L 26.44130873,89.99890805 C 21.21672611,89.99890805 16.91218277,86.08425037 16.3363829,81.04706325 M 85.42409676,79.89614297 C 85.42409676,85.47603159 89.97674058,89.99890805 95.59311521,89.99890805 L 144.40688479,89.99890805 C 150.02325942,89.99890805 154.57590324,85.47603159 154.57590324,79.89614297 M 154.57590324,16.16311377 L 154.57590324,79.89832688 M 154.57590324,16.16529768 L 154.57590324,4.04132442 M 154.57590324,16.16420572 C 154.57590324,18.39616117 156.39737427,20.20553014 158.64475112,20.20553014 L 213.55972502,20.20553014 C 215.0204166,20.20553014 216.40874554,19.89978282 217.66372047,19.34943764 M 154.57590324,79.89723493 C 154.57590324,85.47712355 159.12958081,90 164.74595545,90 L 213.55972502,90 C 218.78430764,90 223.08885098,86.08534233 223.66465085,81.0481552 M 85.42409676,4.04132442 C 85.42409676,1.80936897 83.60262573,0 81.35628263,0 L 26.44130873,0 C 20.8249341,0 16.27125653,4.52287645 16.27125653,10.10276507 Q 16.27125653,10.53517914 16.30743785,10.95885757 M 85.42409676,4.04132442 C 85.42409676,1.80936897 87.24556779,0 89.49191089,0 L 150.50808911,0 C 152.75546596,0 154.57590324,1.80936897 154.57590324,4.04023247 C 154.57590324,1.80936897 156.39737427,0 158.64475112,0 L 213.55972502,0 C 219.17609965,0 223.72977723,4.52287645 223.72977723,10.10276507 C 223.72977723,10.38448939 223.75251977,10.66730566 223.72977723,10.94357021 M 223.66465085,81.0481552 C 224.92582829,81.60723602 226.32552851,81.91735116 227.79759136,81.91735116 L 229.83098155,81.91735116 C 235.44735618,81.91735116 240,77.39447471 240,71.81458609 L 240,20.20553014 C 240,14.62564152 235.44735618,10.10276507 229.83098155,10.10276507 L 227.79759136,10.10276507 C 222.47066729,10.10276507 218.10099757,14.17029641 217.66372047,19.34943764 Q 217.6265054,19.77202412 217.62753915,20.20553014 L 217.62753915,71.81458609 C 217.62753915,75.93234734 220.10751021,79.47464845 223.66465085,81.0481552 M 16.30743785,10.95885757 A 11.24713362,10.64764563 90 0,0 12.20344239,10.10276507 L 10.1700522,10.10276507 C 4.55367757,10.10276507 0,14.62564152 0,20.20553014 L 0,71.81458609 C 0,77.39447471 4.55367757,81.91735116 10.1700522,81.91735116 L 12.20344239,81.91735116 C 13.67550525,81.91735116 15.07417171,81.60723602 16.3363829,81.0481552 C 19.89352354,79.47464845 22.3734946,75.93234734 22.3734946,71.81458609 L 22.3734946,20.20553014 A 9.82759248,9.30376803 90 0,0 22.33731328,19.34943764 C 22.01995141,15.58983754 19.63095053,12.41661712 16.30743785,10.95885757",viewW:240,viewH:90},sofa_corner_right:{d:"M 92.54139418,17.60590034 L 92.54139418,83.62724067 M 92.54139418,17.60485243 L 92.54139418,4.40121311 M 92.54139418,17.60485243 C 92.54139418,20.03599872 90.56883033,22.00606554 88.13534854,22.00606554 L 28.64290558,22.00606554 A 11.31740513,11.1362726 90 0,1 24.19767677,21.07342752 M 92.54139418,17.60485243 C 92.54139418,20.03599872 94.51498915,22.00606554 96.94847094,22.00606554 L 163.05049792,22.00606554 C 165.48397971,22.00606554 167.45757469,20.03599872 167.45757469,17.60485243 M 92.54139418,83.62933649 C 92.54139418,89.70720221 87.609469,94.63341717 81.52473339,94.63341717 L 28.64290558,94.63341717 C 22.98299815,94.63341717 18.32019956,90.3705279 17.69636207,84.88368223 M 92.54139418,83.62933649 C 92.54139418,89.70720221 97.47435048,94.63341717 103.55805496,94.63341717 L 156.4409139,94.63341717 C 162.52461838,94.63341717 167.45757469,89.70720221 167.45757469,83.6303844 M 167.45757469,17.60694825 L 167.45757469,83.62724067 M 167.45757469,17.60485243 L 167.45757469,4.40121311 M 167.45757469,17.60485243 C 167.45757469,20.03599872 169.43116967,22.00606554 171.86362032,22.00606554 L 231.35606328,22.00606554 C 232.93782644,22.00606554 234.44225438,21.67387874 235.80232323,21.07342752 M 167.45860582,83.62828858 L 167.45860582,158.99696723 C 167.45860582,165.07378504 172.38949986,170 178.47526661,170 L 231.35606328,170 C 237.01700185,170 241.67980044,165.73711073 242.30260679,160.25026506 L 242.30260679,84.88263432 M 92.54139418,4.40121311 C 92.54139418,1.97006682 90.56883033,0 88.13534854,0 L 28.64290558,0 C 22.55920111,0 17.6262448,4.92516705 17.6262448,11.00303277 Q 17.6262448,11.47459132 17.66542798,11.93567078 M 92.54139418,4.40121311 C 92.54139418,1.97006682 94.51498915,0 96.94847094,0 L 163.05049792,0 C 165.48397971,0 167.45757469,1.97006682 167.45757469,4.40121311 C 167.45757469,1.97006682 169.43116967,0 171.86362032,0 L 231.35606328,0 C 237.43976776,0 242.3737552,4.92516705 242.3737552,11.00303277 C 242.3737552,11.31006978 242.39850247,11.6181547 242.3737552,11.91890426 M 242.30157566,84.88263432 C 243.66989359,85.49042089 245.18566403,85.82994304 246.78083197,85.82994304 L 248.98333922,85.82994304 C 255.06807483,85.82994304 260,80.90268018 260,74.82586237 L 260,22.00711345 C 260,15.92924773 255.06807483,11.00408068 248.98333922,11.00408068 L 246.78083197,11.00408068 C 241.01059294,11.00408068 236.27664595,15.4335873 235.80232323,21.07447543 Q 235.76314005,21.5355549 235.76314005,22.00711345 L 235.76314005,74.82481446 C 235.76314005,79.3098602 238.44925024,83.16720911 242.30260679,84.88158641 M 17.66645912,11.93567078 A 11.31740513,11.1362726 90 0,0 13.22019917,11.00303277 L 11.01666078,11.00303277 C 4.93295631,11.00303277 0,15.92924773 0,22.00606554 L 0,74.82586237 C 0,80.90372809 4.93192517,85.82889514 11.01666078,85.82889514 L 13.22019917,85.82889514 C 14.81433597,85.82889514 16.33010641,85.4914688 17.69739321,84.88263432 C 21.55074976,83.16825702 24.23685995,79.3109081 24.23685995,74.82586237 L 24.23685995,22.00711345 Q 24.23685995,21.5355549 24.19870791,21.07447543 C 23.85430837,16.98029933 21.26615612,13.52325123 17.66645912,11.93671869",viewW:260,viewH:170},bed_single:{d:"M 0,10.53299756 C 0,16.34997607 4.71506048,21.06599513 10.53190328,21.06599513 L 79.46700477,21.06599513 C 85.28493952,21.06599513 90,16.34997607 90,10.53299756 M 65.10670824,59.36856126 L 65.10670824,44.04670232 C 65.10670824,38.75835085 60.81969401,34.4721014 55.5313573,34.4721014 L 34.46755075,34.4721014 C 29.18030599,34.4721014 24.89329176,38.75939145 24.89329176,44.04670232 L 24.89329176,59.36752066 M 0,59.36752066 L 89.99890805,59.36752066 M 89.99890805,82.34926846 L 0,82.34926846 M 9.57425899,200 L 80.42574101,200 C 85.71298577,200 90,195.71270994 90,190.42435847 L 90,9.57564153 C 90,4.28729006 85.71298577,0 80.42574101,0 L 9.57425899,0 C 4.28592228,0 0,4.28729006 0,9.57564153 L 0,190.42435847 C 0,195.71270994 4.28592228,200 9.57425899,200",viewW:90,viewH:200},bed_double:{d:"M 0,10.58300164 C 0,16.42914748 4.74612788,21.1680845 10.60206776,21.1680845 L 149.39688128,21.1680845 C 155.25177021,21.1680845 159.99894904,16.42914748 159.99894904,10.58300164 M 74.69791516,59.65815968 L 74.69791516,44.26233773 C 74.69791516,38.94794349 70.38268021,34.63981893 65.0595762,34.63981893 L 43.85438972,34.63981893 C 38.53128572,34.63981893 34.21710172,38.94794349 34.21710172,44.26233773 L 34.21710172,59.65815968 M 128.67408468,59.65815968 L 128.67408468,44.26233773 C 128.67408468,38.94794349 124.35779877,34.63981893 119.03469476,34.63981893 L 97.83055924,34.63981893 C 92.50745524,34.63981893 88.19222028,38.94794349 88.19222028,44.26233773 L 88.19222028,59.65815968 M 0,59.65815968 L 159.99894904,59.65815968 M 159.99894904,82.7513723 L 0.00105096,82.7513723 M 9.63833896,200 L 150.36166104,200 C 155.68476505,200 160,195.69187544 160,190.3774812 L 160,9.6225188 C 160,4.30812456 155.68476505,0 150.36166104,0 L 9.63833896,0 C 4.31628591,0 0.00105096,4.30812456 0.00105096,9.6225188 L 0.00105096,190.37644059 C 0.00105096,195.69083483 4.31628591,199.99895939 9.63833896,199.99895939",viewW:160,viewH:200},nightstand:{d:"M 2.49959042,0.00000027 L 47.49923936,0.00000027 M 47.49923936,0.00000027 A 2.50053206,2.49959042 90 0,1 49.26747323,0.73197514 A 2.50053206,2.49959042 90 0,1 50,2.50053233 L 50,37.49946767 M 50,37.49946767 A 2.50053206,2.49959042 90 0,1 49.26747323,39.26802486 A 2.50053206,2.49959042 90 0,1 47.49923936,39.99999973 M 47.49923936,39.99999973 L 2.49959042,39.99999973 A 2.50053206,2.49959042 90 0,1 0,37.49946767 L 0,2.50053233 A 2.50053206,2.49959042 90 0,1 2.49959042,0.00000027",viewW:50,viewH:40},cabinet_tv:{d:"M 55.99957664,17 L 61.62493574,17 L 67.25029484,17 M 61.62493574,17 L 61.62493574,27.96904762 M 72.03105628,17 L 77.65641537,28.25 L 83.28071608,17 M 2.4999244,45 L 137.5000756,45 C 138.88127854,45 140,43.88095238 140,42.5 L 140,2.5 C 140,1.11904762 138.88127854,0 137.5000756,0 L 2.4999244,0 C 1.11872146,0 0,1.11904762 0,2.5 L 0,42.5 C 0,43.88095238 1.11872146,45 2.4999244,45",viewW:140,viewH:45},cabinet_shoe:{d:"M 39.69311439,15.91375 L 41.35449151,13.91875 M 42.60631986,17.85625 L 44.2952946,15.68375 M 2.50034497,35 L 77.49965503,35 C 78.88064026,35 80,33.88125 80,32.5 L 80,2.5 C 80,1.11875 78.88064026,0 77.50075893,0 L 2.50034497,0 C 1.11935974,0 0,1.11875 0,2.5 L 0,32.5 C 0,33.88125 1.11935974,35 2.50034497,35 M 48.82682489,17.11875 L 47.63902304,17 A 4.25,3.75327722 90 0,1 45.63764316,16.1175 L 40.57844625,11.5925 C 39.18311025,10.3425 36.96094936,11.185 36.74237616,13.04375 C 36.53815372,14.78125 34.55333241,15.66875 33.12156755,14.6675 L 31.43038499,13.48375 C 30.36180488,12.8425 29.00179385,13.6125 29.00179385,14.85875 L 29.00179385,19.1875 C 29.00179385,21.13625 30.58037809,22.71625 32.52987443,22.71625 L 48.54753691,22.71625 C 50.09741962,22.71625 51.35366358,21.46 51.35366358,19.91 C 51.35366358,18.46875 50.26079757,17.2625 48.82682489,17.11875",viewW:80,viewH:35},cabinet_sink:{d:"M 0,2.49959042 C 0,1.11873055 1.11935974,0 2.50034497,0 L 77.49965503,0 C 78.88064026,0 80,1.11873055 80,2.49959042 L 80,47.49923936 C 80,48.88009923 78.88064026,50 77.50075893,50 L 2.50034497,50 C 1.11935974,50 0,48.88009923 0,47.49923936 L 0,2.49959042 M 35.68152339,33.34893627 C 38.46888368,35.54895031 42.53125431,35.54895031 45.3186146,33.34893627 C 48.10597489,31.14892223 48.81468194,27.37964285 46.9965503,24.41196433 L 40.50669242,14.99988298 L 34.00137988,24.41196433 C 32.18655996,27.37964285 32.8941631,31.14658179 35.68152339,33.34893627",viewW:80,viewH:50},bookshelf:{d:"M 57.70667129,21.235 L 45.09910046,21.235 C 44.542709,21.235 44.00796701,21.39 43.61394659,21.66625 C 43.21992618,21.9425 42.99910155,22.31625 42.99910155,22.70625 M 47.41126422,12.41125 L 53.29342614,12.41125 M 2.4994317,0 L 97.49948583,0 C 98.88072223,0 100,1.11875 100,2.5 L 100,32.5 C 100,33.88125 98.88072223,35 97.49948583,35 L 2.50051417,35 C 1.12036025,35 0,33.88125 0,32.5 L 0,2.5 C 0,1.11875 1.12036025,0 2.50051417,0 M 57.70667129,8 L 57.70667129,25.6475 L 45.10018294,25.6475 A 2.55,2.20824628 90 0,1 43.61502906,25.00125 A 2.125,1.84020524 90 0,1 43.00018402,23.44125 L 43.00018402,10.20625 C 43.00018402,9.62125 43.22100865,9.06 43.61502906,8.64625 A 2.55,2.20824628 90 0,1 45.10018294,8 L 57.70667129,8",viewW:100,viewH:35},wall_unit:{d:"M 2.49961234,45 L 237.50038766,45 A 2.5,2.49961234 90 0,0 239.2678805,44.26776695 A 2.5,2.49961234 90 0,0 240,42.5 L 240,2.5 A 2.5,2.49961234 90 0,0 239.2678805,0.73223305 A 2.5,2.49961234 90 0,0 237.50038766,0 L 2.49961234,0 A 2.5,2.49961234 90 0,0 0,2.5 L 0,42.5 M 0,42.5 A 2.5,2.49961234 90 0,0 0.7321195,44.26776695 A 2.5,2.49961234 90 0,0 2.49961234,45 M 47.72005996,38 L 47.72005996,7 M 95.71923296,38 L 95.71923296,7 M 143.71943971,38 L 143.71943971,7 M 191.71964646,38 L 191.71964646,7",viewW:240,viewH:45},wardrobe:{d:"M 94.04437425,18.88320821 A 3.7631854,3.44913684 90 0,0 92.92392737,16.13836358 A 4.33336501,3.97173334 90 0,0 90.22105832,15.00142545 C 89.20722112,15.00142545 88.23519165,15.40967405 87.51714407,16.13836358 A 3.7631854,3.44913684 90 0,0 86.39774238,18.88320821 C 86.39774238,22.11954766 87.67810379,24.70702271 90.22105832,26.64905445 L 90.20538042,26.64905445 L 105.44429412,35.24394184 C 106.04005412,35.58034781 106.53756598,36.07184263 106.88352486,36.66939086 C 107.22948373,37.26579873 107.41134731,37.94659318 107.41134731,38.63879122 L 107.41134731,40.23643448 A 3.7631854,3.44913684 90 0,1 106.29194563,42.9812791 A 4.33336501,3.97173334 90 0,1 103.58803138,44.1193576 L 76.82272946,44.1193576 A 4.33336501,3.97173334 90 0,1 74.11986041,42.9812791 A 3.7631854,3.44913684 90 0,1 72.99941353,40.23643448 L 72.99941353,38.63993158 C 72.99941353,37.94659318 73.18127711,37.26579873 73.52723599,36.66939086 A 4.04827521,3.71043509 90 0,1 74.96646673,35.24394184 L 90.20538042,26.64905445 M 2.50010162,0 L 177.49989838,0 C 178.87955312,0 180,1.11869239 180,2.4996674 L 180,57.49919225 C 180,58.88130761 178.88059831,60 177.49989838,60 L 2.50010162,60 C 1.11940169,60 0,58.88130761 0,57.5003326 L 0,2.50194811 C 0,1.11983275 1.11835649,0.00114036 2.50010162,0.00114036",viewW:180,viewH:60},kitchen_floor:{d:"M 0.00000104,2.4996673 C 0.00000104,1.1198327 1.11869337,0 2.4996683,0 L 57.49919004,0 C 58.88130533,0 59.99999766,1.11869234 59.99999766,2.4996673 L 59.99999766,57.49919 M 59.99999766,57.49919 A 2.49738658,2.49738654 90 0,1 59.26893509,59.26812834 A 2.49738658,2.49738654 90 0,1 57.5003304,59.99999766 M 57.5003304,59.99999766 L 2.50080866,59.99999766 M 2.50080866,59.99999766 A 2.49738658,2.49738654 90 0,1 0.73187035,59.26893508 A 2.49738658,2.49738654 90 0,1 0.00000104,57.50033036 M 0.00000104,57.50033036 L 0.00000104,2.4996673",viewW:60,viewH:60},kitchen_floor_corner:{d:"M 46.03081776,41.46966756 A 2.50060665,2.50060665 0 0,0 48.53142441,43.97027421 L 87.49939335,43.97027421 A 2.50060665,2.50060665 0 0,1 89.26758927,44.70268494 A 2.50060665,2.50060665 0 0,1 90,46.47088085 L 90,87.49939335 A 2.50060665,2.50060665 0 0,1 89.26758927,89.26758927 A 2.50060665,2.50060665 0 0,1 87.49939335,90 M 87.49939335,90 L 2.50060665,90 A 2.50060665,2.50060665 0 0,1 0.73241073,89.26758927 A 2.50060665,2.50060665 0 0,1 0,87.49939335 L 0,2.50060665 A 2.50060665,2.50060665 0 0,1 2.50060665,0 L 43.53239505,0 A 2.50060665,2.50060665 0 0,1 46.0330017,2.50060665 L 46.03081776,41.46966756",viewW:90,viewH:90},kitchen_wall:{d:"M 0.85755013,34.41625 L 58.7307802,0.6575 M 0.85526941,0.5825 L 58.72849948,34.3425 M 2.4996674,35 L 57.49919225,35 C 58.88130761,35 60,33.88125 60,32.5 L 60,2.5 C 60,1.11875 58.88130761,0 57.5003326,0 L 2.50080775,0 C 1.11869239,0 0,1.11875 0,2.5 L 0,32.5 C 0,33.88125 1.11869239,35 2.4996674,35",viewW:60,viewH:35},kitchen_wall_corner:{d:"M 0.09122874,29.53302228 L 29.86372655,0.78798922 M 1.00123537,58.99990268 L 58.99990394,30.00056953 M 0.55079349,0.78798922 L 30.99952431,28.00037958 M 0,29.00047456 L 58.99990394,58.99990268 M 28.18739854,0.00000104 L 2.49966735,0.00000104 C 1.11983273,0.00000104 0,1.11869337 0,2.4996683 L 0,57.49919004 C 0,58.88130533 1.11869237,59.99999766 2.49966735,59.99999766 L 57.49919125,59.99999766 M 57.49919125,59.99999766 A 2.49738663,2.49738654 0 0,0 59.26812963,59.26893509 A 2.49738663,2.49738654 0 0,0 59.99999896,57.5003304 M 59.99999896,57.5003304 L 59.99999896,31.81260022 C 59.99999896,30.43276565 58.88130659,29.31293296 57.5003316,29.31293296 L 33.1878736,29.31293296 A 2.49738663,2.49738654 0 0,1 31.41893522,28.5818704 A 2.49738663,2.49738654 0 0,1 30.68706589,26.81326571 L 30.68706589,2.50080866 M 30.68706589,2.50080866 A 2.49738663,2.49738654 0 0,0 29.9560033,0.73187035 A 2.49738663,2.49738654 0 0,0 28.18739854,0.00000104",viewW:60,viewH:60},shelf_floor:{d:"M 2.50054124,35 L 97.49945876,35 A 2.50054124,2.5 0 0,0 99.26760843,34.26776695 A 2.50054124,2.5 0 0,0 100,32.5 L 100,2.5 A 2.50054124,2.5 0 0,0 99.26760843,0.73223305 A 2.50054124,2.5 0 0,0 97.49945876,0 L 2.50054124,0 A 2.50054124,2.5 0 0,0 0,2.5 L 0,32.5 A 2.50054124,2.5 0 0,0 2.50054124,35 M 5.71444036,28.04125 C 5.17969257,28.18125 4.8744317,28.72375 5.03247456,29.25375 C 5.19051743,29.78375 5.75124486,30.0975 6.28491015,29.95875 L 6.0002165,29 L 5.71444036,28.04125 M 94.28664213,6.95875 C 94.82030743,6.81875 95.1255683,6.27625 94.96860792,5.74625 C 94.81164754,5.21625 94.24983763,4.9025 93.71508985,5.04125 L 94.00086599,6 L 94.28664213,6.95875 M 8.73024464,29.32 C 9.26390994,29.18 9.56917082,28.6375 9.41221044,28.1075 C 9.25525005,27.5775 8.69344014,27.2625 8.15869236,27.4025 L 8.4444685,28.36125 L 8.73024464,29.32 M 13.04719636,26.125 C 12.51353107,26.265 12.20827019,26.8075 12.36523057,27.33625 C 12.52219095,27.865 13.08400087,28.18125 13.61874865,28.04125 L 13.3329725,27.08375 L 13.04719636,26.125 M 18.50833514,26.76375 C 19.04200043,26.62375 19.34726131,26.0825 19.19030093,25.5525 C 19.03334055,25.0225 18.47153063,24.7075 17.93678285,24.8475 L 18.222559,25.805 L 18.50833514,26.76375 M 22.82528686,23.57 C 22.29162156,23.70875 21.98636068,24.25125 22.14332107,24.78 C 22.30136393,25.31 22.86209136,25.62625 23.39683914,25.48625 L 23.111063,24.5275 L 22.82528686,23.57 M 28.28534315,24.2075 C 28.82009093,24.06875 29.12535181,23.52625 28.96730894,22.9975 C 28.81034856,22.4675 28.24853864,22.1525 27.71487335,22.29125 L 27.99956701,23.25 L 28.28534315,24.2075 M 32.60445984,21.01375 C 32.06862957,21.15375 31.76336869,21.69625 31.92249405,22.22625 C 32.07945443,22.755 32.64018186,23.07 33.17492964,22.93 L 32.8891535,21.9725 L 32.60445984,21.01375 M 38.06343364,21.6525 C 38.59818142,21.5125 38.9034423,20.97125 38.74539944,20.44125 C 38.58735657,19.91125 38.02662914,19.59625 37.49188136,19.73625 L 37.7776575,20.695 L 38.06343364,21.6525 M 42.38146785,18.45875 C 41.84672007,18.5975 41.54145919,19.14 41.69950206,19.67 C 41.85754492,20.2 42.41827235,20.515 42.95193765,20.375 L 42.66724399,19.41625 L 42.38146785,18.45875 M 47.84152414,19.09625 C 48.37627192,18.95875 48.6815328,18.415 48.52348993,17.88625 C 48.36544707,17.35625 47.80471964,17.04125 47.26997186,17.18 L 47.555748,18.13875 L 47.84152414,19.09625 M 52.15955835,15.9025 C 51.62481057,16.0425 51.31954969,16.585 51.47759255,17.115 C 51.63455293,17.64375 52.19636285,17.95875 52.73002814,17.82 L 52.444252,16.86125 L 52.15955835,15.9025 M 57.61961464,16.54125 C 58.15327993,16.4025 58.45854081,15.86 58.30158043,15.33 C 58.14462005,14.8 57.58281013,14.485 57.04806235,14.625 L 57.33383849,15.58375 L 57.61961464,16.54125 M 61.93656636,13.3475 C 61.40290106,13.4875 61.09764018,14.02875 61.25460056,14.55875 C 61.41156094,15.08875 61.97337086,15.40375 62.50811864,15.26375 L 62.2223425,14.305 L 61.93656636,13.3475 M 67.39770513,13.985 C 67.93137043,13.8475 68.23663131,13.30375 68.07967092,12.775 C 67.92162806,12.245 67.36090063,11.93 66.82615285,12.07 L 67.11192899,13.0275 L 67.39770513,13.985 M 71.71465685,10.79125 C 71.18099156,10.93125 70.87573068,11.47375 71.03269106,12.00375 C 71.18965144,12.53375 71.75146136,12.8475 72.28620914,12.70875 L 72.00043299,11.75 L 71.71465685,10.79125 M 77.17471314,11.43 C 77.70946092,11.29125 78.0147218,10.74875 77.85667893,10.22 C 77.69971855,9.69 77.13790864,9.37375 76.60424334,9.51375 L 76.89001948,10.4725 L 77.17471314,11.43 M 81.49382983,8.23625 C 80.95908205,8.37625 80.65273869,8.9175 80.81186404,9.4475 C 80.96882442,9.97625 81.52955185,10.2925 82.06429963,10.1525 L 81.77852349,9.195 L 81.49382983,8.23625 M 86.95280364,8.875 C 87.48755142,8.735 87.7928123,8.1925 87.63476943,7.66375 C 87.47672656,7.135 86.91599913,6.81875 86.38233384,6.95875 L 86.6670275,7.91625 L 86.95280364,8.875 M 91.27083784,5.68 C 90.73609006,5.82 90.43082918,6.3625 90.58887205,6.8925 C 90.74691492,7.4225 91.30764235,7.7375 91.84239013,7.5975 L 91.55661399,6.63875 L 91.27083784,5.68 M 6.0002165,29 L 6.28491015,29.95875 L 8.73024464,29.32 L 8.4444685,28.36125 L 8.15869236,27.4025 L 5.71444036,28.04125 L 6.0002165,29 M 13.3329725,27.08375 L 13.61874865,28.04125 L 18.50833514,26.76375 L 18.222559,25.805 L 17.93678285,24.8475 L 13.04719636,26.125 L 13.3329725,27.08375 M 23.111063,24.5275 L 23.39683914,25.48625 L 28.28534315,24.20875 L 27.99956701,23.25 L 27.71487335,22.29125 L 22.82528686,23.57 L 23.111063,24.5275 M 32.8891535,21.9725 L 33.17492964,22.93 L 38.06343364,21.6525 L 37.7776575,20.695 L 37.49188136,19.73625 L 32.60337735,21.01375 L 32.8891535,21.9725 M 42.66724399,19.41625 L 42.95193765,20.375 L 47.84152414,19.0975 L 47.555748,18.13875 L 47.26997186,17.18 L 42.38146785,18.45875 L 42.66724399,19.41625 M 52.444252,16.86125 L 52.73002814,17.82 L 57.61961464,16.54125 L 57.33383849,15.58375 L 57.04806235,14.625 L 52.15955835,15.9025 L 52.444252,16.86125 M 62.2223425,14.305 L 62.50811864,15.26375 L 67.39770513,13.98625 L 67.11192899,13.0275 L 66.82615285,12.07 L 61.93656636,13.3475 L 62.2223425,14.305 M 72.00043299,11.75 L 72.28620914,12.70875 L 77.17471314,11.43 L 76.89001948,10.4725 L 76.60424334,9.51375 L 71.71465685,10.79125 L 72.00043299,11.75 M 81.77852349,9.195 L 82.06429963,10.1525 L 86.95280364,8.875 L 86.6670275,7.91625 L 86.38233384,6.95875 L 81.49274735,8.23625 L 81.77852349,9.195 M 91.55661399,6.6375 L 91.84239013,7.59625 L 94.28664213,6.9575 L 94.00086599,5.99875 L 93.71508985,5.04 L 91.27083784,5.67875 L 91.55661399,6.6375 M 5.71444036,6.95875 C 5.17969257,6.81875 4.8744317,6.27625 5.03247456,5.74625 C 5.19051743,5.21625 5.75124486,4.9025 6.28491015,5.04125 L 6.0002165,6 L 5.71444036,6.95875 M 94.28664213,28.04125 C 94.82030743,28.18125 95.1255683,28.72375 94.96860792,29.25375 C 94.81164754,29.78375 94.24983763,30.0975 93.71508985,29.95875 L 94.00086599,29 L 94.28664213,28.04125 M 8.73024464,5.68 C 9.26390994,5.82 9.56917082,6.3625 9.41221044,6.8925 C 9.25525005,7.4225 8.69344014,7.7375 8.15869236,7.5975 L 8.4444685,6.63875 L 8.73024464,5.68 M 13.04719636,8.875 C 12.51353107,8.735 12.20827019,8.1925 12.36523057,7.66375 C 12.52219095,7.135 13.08400087,6.81875 13.61874865,6.95875 L 13.3329725,7.91625 L 13.04719636,8.875 M 18.50833514,8.23625 C 19.04200043,8.37625 19.34726131,8.9175 19.19030093,9.4475 C 19.03334055,9.9775 18.47153063,10.2925 17.93678285,10.1525 L 18.222559,9.195 L 18.50833514,8.23625 M 22.82528686,11.43 C 22.29162156,11.29125 21.98636068,10.74875 22.14332107,10.22 C 22.30136393,9.69 22.86209136,9.37375 23.39683914,9.51375 L 23.111063,10.4725 L 22.82528686,11.43 M 28.28534315,10.7925 C 28.82009093,10.93125 29.12535181,11.47375 28.96730894,12.0025 C 28.81034856,12.5325 28.24853864,12.8475 27.71487335,12.70875 L 27.99956701,11.75 L 28.28534315,10.7925 M 32.60445984,13.98625 C 32.06862957,13.84625 31.76336869,13.30375 31.92249405,12.77375 C 32.07945443,12.245 32.64018186,11.93 33.17492964,12.07 L 32.8891535,13.0275 L 32.60445984,13.98625 M 38.06343364,13.3475 C 38.59818142,13.4875 38.9034423,14.02875 38.74539944,14.55875 C 38.58735657,15.08875 38.02662914,15.40375 37.49188136,15.26375 L 37.7776575,14.305 L 38.06343364,13.3475 M 42.38146785,16.54125 C 41.84672007,16.4025 41.54145919,15.86 41.69950206,15.33 C 41.85754492,14.8 42.41827235,14.485 42.95193765,14.625 L 42.66724399,15.58375 L 42.38146785,16.54125 M 47.84152414,15.90375 C 48.37627192,16.04125 48.6815328,16.585 48.52348993,17.11375 C 48.36544707,17.64375 47.80471964,17.95875 47.26997186,17.82 L 47.555748,16.86125 L 47.84152414,15.90375 M 52.15955835,19.0975 C 51.62481057,18.9575 51.31954969,18.415 51.47759255,17.885 C 51.63455293,17.35625 52.19636285,17.04125 52.73002814,17.18 L 52.444252,18.13875 L 52.15955835,19.0975 M 57.61961464,18.45875 C 58.15327993,18.5975 58.45854081,19.14 58.30158043,19.67 C 58.14462005,20.2 57.58281013,20.515 57.04806235,20.375 L 57.33383849,19.41625 L 57.61961464,18.45875 M 61.93656636,21.6525 C 61.40290106,21.5125 61.09764018,20.97125 61.25460056,20.44125 C 61.41156094,19.91125 61.97337086,19.59625 62.50811864,19.73625 L 62.2223425,20.695 L 61.93656636,21.6525 M 67.39770513,21.015 C 67.93137043,21.1525 68.23663131,21.69625 68.07967092,22.225 C 67.92162806,22.755 67.36090063,23.07 66.82615285,22.93 L 67.11192899,21.9725 L 67.39770513,21.015 M 71.71465685,24.20875 C 71.18099156,24.06875 70.87573068,23.52625 71.03269106,22.99625 C 71.18965144,22.46625 71.75146136,22.1525 72.28620914,22.29125 L 72.00043299,23.25 L 71.71465685,24.20875 M 77.17471314,23.57 C 77.70946092,23.70875 78.0147218,24.25125 77.85667893,24.78 C 77.69971855,25.31 77.13790864,25.62625 76.60424334,25.48625 L 76.89001948,24.5275 L 77.17471314,23.57 M 81.49382983,26.76375 C 80.95908205,26.62375 80.65273869,26.0825 80.81186404,25.5525 C 80.96882442,25.02375 81.52955185,24.7075 82.06429963,24.8475 L 81.77852349,25.805 L 81.49382983,26.76375 M 86.95280364,26.125 C 87.48755142,26.265 87.7928123,26.8075 87.63476943,27.33625 C 87.47672656,27.865 86.91599913,28.18125 86.38233384,28.04125 L 86.6670275,27.08375 L 86.95280364,26.125 M 91.27083784,29.32 C 90.73609006,29.18 90.43082918,28.6375 90.58887205,28.1075 C 90.74691492,27.5775 91.30764235,27.2625 91.84239013,27.4025 L 91.55661399,28.36125 L 91.27083784,29.32 M 6.0002165,6 L 6.28491015,5.04125 L 8.73024464,5.68 L 8.4444685,6.63875 L 8.15869236,7.5975 L 5.71444036,6.95875 L 6.0002165,6 M 13.3329725,7.91625 L 13.61874865,6.95875 L 18.50833514,8.23625 L 18.222559,9.195 L 17.93678285,10.1525 L 13.04719636,8.875 L 13.3329725,7.91625 M 23.111063,10.4725 L 23.39683914,9.51375 L 28.28534315,10.79125 L 27.99956701,11.75 L 27.71487335,12.70875 L 22.82528686,11.43 L 23.111063,10.4725 M 32.8891535,13.0275 L 33.17492964,12.07 L 38.06343364,13.3475 L 37.7776575,14.305 L 37.49188136,15.26375 L 32.60337735,13.98625 L 32.8891535,13.0275 M 42.66724399,15.58375 L 42.95193765,14.625 L 47.84152414,15.9025 L 47.555748,16.86125 L 47.26997186,17.82 L 42.38146785,16.54125 L 42.66724399,15.58375 M 52.444252,18.13875 L 52.73002814,17.18 L 57.61961464,18.45875 L 57.33383849,19.41625 L 57.04806235,20.375 L 52.15955835,19.0975 L 52.444252,18.13875 M 62.2223425,20.695 L 62.50811864,19.73625 L 67.39770513,21.01375 L 67.11192899,21.9725 L 66.82615285,22.93 L 61.93656636,21.6525 L 62.2223425,20.695 M 72.00043299,23.25 L 72.28620914,22.29125 L 77.17471314,23.57 L 76.89001948,24.5275 L 76.60424334,25.48625 L 71.71465685,24.20875 L 72.00043299,23.25 M 81.77852349,25.805 L 82.06429963,24.8475 L 86.95280364,26.125 L 86.6670275,27.08375 L 86.38233384,28.04125 L 81.49274735,26.76375 L 81.77852349,25.805 M 91.55661399,28.36125 L 91.84239013,27.4025 L 94.28664213,28.04125 L 94.00086599,29 L 93.71508985,29.95875 L 91.27083784,29.32 L 91.55661399,28.36125",viewW:100,viewH:35},shelf_wall:{d:"M 16.00095257,0 L 16.00095257,3.50051819 C 16.00095257,4.88054328 14.88168691,6.00010909 13.50046546,6.00010909 L 12.50027062,6.00010909 C 11.12013163,6.00010909 10.00086597,4.88190694 10.00086597,3.50051819 L 10.00086597,0 M 90.00021649,0 L 90.00021649,3.50051819 C 90.00021649,4.88054328 88.88095083,6.00010909 87.49972938,6.00010909 L 86.49953454,6.00010909 C 85.11939555,6.00010909 83.99904743,4.88190694 83.99904743,3.50051819 L 83.99904743,0 M 2.50048711,0 L 97.49951289,0 C 98.88073434,0 100,1.11820215 100,2.4995909 L 100,22.5004091 C 100,23.88043419 98.88073434,25 97.49951289,25 L 2.50048711,25 C 1.12034812,25 0,23.88179785 0,22.5004091 L 0,2.4995909 C 0,1.11956581 1.12034812,0 2.50048711,0",viewW:100,viewH:25},cooktop_two:{d:"M 14.99935186,32.00009362 L 14.99935186,29.99906385 M 18.99969753,35.99981277 L 20.99857408,35.99981277 M 14.99935186,41.9993915 L 14.99935186,39.99953192 M 9.00012963,35.99981277 L 10.99900618,35.99981277 M 3.12535108,50 L 26.87594521,50 C 28.60130493,50 30,48.60044935 30,46.8755851 L 30,3.1244149 C 30,1.39838045 28.60130493,0 26.87594521,0 L 3.12405479,0 C 1.39869507,0 0,1.39838045 0,3.1244149 L 0,46.87324471 C 0,48.59927916 1.39869507,49.99765961 3.12405479,49.99765961 M 21.99801236,14.99719154 C 21.99801236,18.86350871 18.86488355,21.99728515 14.99805557,21.99728515 C 11.13382016,21.99728515 7.99809878,18.86350871 7.99809878,14.99836173 C 7.99809878,11.13321475 11.13382016,7.99826811 14.99805557,7.99826811 C 18.86488355,7.99826811 21.99801236,11.13204456 21.99801236,14.99836173 M 20.0004321,35.99981277 C 20.0004321,38.76146789 17.76174221,41.00004681 15.00064814,41.00004681 C 12.23955408,41.00004681 10.00086419,38.76146789 10.00086419,35.99981277 C 10.00086419,33.23815765 12.23825779,30.99957873 14.99935186,30.99957873 C 17.76044592,30.99957873 19.99913581,33.23815765 19.99913581,35.99981277",viewW:30,viewH:50},stove:{d:"M 42.58125034,35.80643381 A 0.96783093,0.96783093 0 0,0 41.61341941,34.83860288 A 0.96783093,0.96783093 0 0,0 40.64558848,35.80643381 M 40.64558848,35.80643381 L 42.58125034,35.80643381 M 47.41930144,42.58014677 A 0.96783093,0.96783093 0 0,0 48.28464415,42.10618697 A 0.96783093,0.96783093 0 0,0 48.28464415,41.11954828 A 0.96783093,0.96783093 0 0,0 47.41930144,40.64558848 L 47.41930144,42.58014677 M 42.58125034,45.48363957 A 0.96783093,0.96783093 0 0,0 42.10729054,44.61829686 A 0.96783093,0.96783093 0 0,0 41.12065185,44.61829686 A 0.96783093,0.96783093 0 0,0 40.64669205,45.48363957 L 42.58125034,45.48363957 M 37.74319925,42.58125034 A 0.96783093,0.96783093 0 0,0 38.71103018,41.61341941 A 0.96783093,0.96783093 0 0,0 37.74319925,40.64558848 M 37.74319925,40.64558848 L 37.74319925,42.58125034 M 3.38796005,0.96672736 L 3.38796005,1.9345583 L 56.61314352,1.9345583 L 56.61314352,0 L 3.38796005,0 L 3.38796005,0.96672736 M 59.03216907,3.38575291 L 58.06433813,3.38575291 L 58.06433813,56.61093638 L 60,56.61093638 L 60,3.38796005 L 59.03216907,3.38575291 M 56.61314352,59.0310655 L 56.61314352,58.06323456 L 3.38796005,58.06323456 L 3.38796005,59.99889643 L 56.61314352,59.99889643 L 56.61314352,59.0310655 M 0.96783093,56.61314352 L 1.93566187,56.61314352 L 1.93566187,3.38796005 L 0,3.38796005 L 0,56.61314352 L 0.96783093,56.61314352 M 3.38685648,59.03216907 L 3.38685648,58.06433813 A 1.45119461,1.45119461 0 0,1 1.93566187,56.61314352 L 0,56.61314352 A 3.38796005,3.38796005 0 0,0 3.38796005,60 L 3.38685648,59.03216907 M 59.03216907,56.61314352 L 58.06433813,56.61314352 C 58.06433813,57.41433537 57.41433537,58.06433813 56.61314352,58.06433813 L 56.61314352,60 A 3.38796005,3.38796005 0 0,0 60,56.61203995 L 59.03216907,56.61314352 M 56.61314352,0.96783093 L 56.61314352,1.93566187 C 57.41433537,1.93566187 58.06433813,2.58566463 58.06433813,3.38685648 L 60,3.38685648 A 3.38796005,3.38796005 0 0,0 56.61203995,0 L 56.61314352,0.96783093 M 3.38796005,0.96783093 L 3.38796005,0 A 3.38796005,3.38796005 0 0,0 0,3.38796005 L 1.93566187,3.38796005 C 1.93566187,2.58566463 2.58566463,1.93566187 3.38685648,1.93566187 L 3.38796005,0.96783093 M 25.16139712,41.61231584 L 24.19356619,41.61231584 A 5.80477846,5.80477846 0 0,1 22.49338636,45.71912161 A 5.80477846,5.80477846 0 0,1 18.38658059,47.41930144 M 18.38658059,47.41930144 L 18.38658059,49.35496331 M 18.38658059,49.35496331 A 7.74154389,7.74154389 0 0,0 23.86139219,47.0879078 A 7.74154389,7.74154389 0 0,0 26.12922805,41.61341941 M 26.12922805,41.61341941 L 25.16139712,41.61231584 M 18.38658059,48.38713237 L 18.38658059,47.41930144 A 5.80477846,5.80477846 0 0,1 14.2808787,45.7191213 A 5.80477846,5.80477846 0 0,1 12.58069856,41.61341941 L 10.64503669,41.61341941 A 7.74154389,7.74154389 0 0,0 18.38658059,49.35496331 L 18.38658059,48.38713237 M 11.61286763,41.61341941 L 12.58069856,41.61341941 M 12.58069856,41.61341941 A 5.80477846,5.80477846 0 0,1 14.28048835,37.50700403 A 5.80477846,5.80477846 0 0,1 18.38658059,35.80643381 M 18.38658059,35.80643381 L 18.38658059,33.87077195 M 18.38658059,33.87077195 A 7.74154389,7.74154389 0 0,0 12.9120922,36.13860781 A 7.74154389,7.74154389 0 0,0 10.64503669,41.61341941 M 10.64503669,41.61341941 L 11.61286763,41.61341941 M 18.38658059,34.83860288 L 18.38658059,35.80643381 M 18.38658059,35.80643381 A 5.80477846,5.80477846 0 0,1 22.49338636,37.50661364 A 5.80477846,5.80477846 0 0,1 24.19356619,41.61341941 L 26.12922805,41.61341941 M 26.12922805,41.61341941 A 7.74154389,7.74154389 0 0,0 23.86178242,36.13821758 A 7.74154389,7.74154389 0 0,0 18.38658059,33.87077195 M 18.38658059,33.87077195 L 18.38658059,34.83860288 M 48.38713237,18.38658059 L 47.41930144,18.38658059 M 47.41930144,18.38658059 A 5.80477846,5.80477846 0 0,1 45.71951165,22.49299597 A 5.80477846,5.80477846 0 0,1 41.61341941,24.19356619 M 41.61341941,24.19356619 L 41.61341941,26.12922805 M 41.61341941,26.12922805 A 7.74154389,7.74154389 0 0,0 47.0879078,23.86139219 A 7.74154389,7.74154389 0 0,0 49.35496331,18.38658059 M 49.35496331,18.38658059 L 48.38713237,18.38658059 M 41.61341941,25.16139712 L 41.61341941,24.19356619 A 5.80477846,5.80477846 0 0,1 37.50661364,22.49338636 A 5.80477846,5.80477846 0 0,1 35.80643381,18.38658059 L 33.87077195,18.38658059 M 33.87077195,18.38658059 A 7.74154389,7.74154389 0 0,0 36.13821758,23.86178242 A 7.74154389,7.74154389 0 0,0 41.61341941,26.12922805 M 41.61341941,26.12922805 L 41.61341941,25.16139712 M 34.83860288,18.38658059 L 35.80643381,18.38658059 M 35.80643381,18.38658059 A 5.80477846,5.80477846 0 0,1 37.50700403,14.28048835 A 5.80477846,5.80477846 0 0,1 41.61341941,12.58069856 M 41.61341941,12.58069856 L 41.61341941,10.64503669 M 41.61341941,10.64503669 A 7.74154389,7.74154389 0 0,0 36.13860781,12.9120922 A 7.74154389,7.74154389 0 0,0 33.87077195,18.38658059 M 33.87077195,18.38658059 L 34.83860288,18.38658059 M 41.61341941,11.61286763 L 41.61341941,12.58069856 M 41.61341941,12.58069856 A 5.80477846,5.80477846 0 0,1 45.7191213,14.2808787 A 5.80477846,5.80477846 0 0,1 47.41930144,18.38658059 M 47.41930144,18.38658059 L 49.35496331,18.38658059 A 7.74154389,7.74154389 0 0,0 47.0875176,12.9124824 A 7.74154389,7.74154389 0 0,0 41.61341941,10.64503669 L 41.61341941,11.61286763 M 46.45147051,41.61341941 L 45.48363957,41.61341941 A 3.87353087,3.87353087 0 0,1 41.61341941,45.48363957 L 41.61341941,47.41930144 M 41.61341941,47.41930144 A 5.80477846,5.80477846 0 0,0 45.7191213,45.7191213 A 5.80477846,5.80477846 0 0,0 47.41930144,41.61341941 M 47.41930144,41.61341941 L 46.45147051,41.61341941 M 41.61341941,46.45147051 L 41.61341941,45.48363957 A 3.87353087,3.87353087 0 0,1 37.74209568,41.61341941 L 35.80533024,41.61341941 M 35.80533024,41.61341941 A 5.80477846,5.80477846 0 0,0 37.50590046,45.71951165 A 5.80477846,5.80477846 0 0,0 41.61231584,47.41930144 M 41.61231584,47.41930144 L 41.61341941,46.45147051 M 36.77426475,41.61341941 L 37.74209568,41.61341941 A 3.87353087,3.87353087 0 0,1 41.61341941,37.74209568 L 41.61341941,35.80533024 A 5.80477846,5.80477846 0 0,0 37.50661364,37.50551007 A 5.80477846,5.80477846 0 0,0 35.80643381,41.61231584 L 36.77426475,41.61341941 M 41.61341941,36.77426475 L 41.61341941,37.74209568 A 3.87353087,3.87353087 0 0,1 45.48363957,41.61341941 L 47.41930144,41.61341941 M 47.41930144,41.61341941 A 5.80477846,5.80477846 0 0,0 45.71951165,37.50700403 A 5.80477846,5.80477846 0 0,0 41.61341941,35.80643381 M 41.61341941,35.80643381 L 41.61341941,36.77426475 M 41.61341941,37.74209568 L 42.58014677,37.74209568 L 42.58014677,35.80533024 L 40.64558848,35.80533024 L 40.64558848,37.74099211 L 41.61341941,37.74209568 M 45.48474314,41.61341941 L 45.48474314,42.58014677 L 47.41930144,42.58014677 L 47.41930144,40.64558848 L 45.48474314,40.64558848 L 45.48474314,41.61341941 M 41.61341941,47.41930144 L 42.58014677,47.41930144 L 42.58014677,45.48363957 L 40.64558848,45.48363957 L 40.64558848,47.41930144 L 41.61341941,47.41930144 M 35.80753738,41.61341941 L 35.80753738,42.58014677 L 37.74209568,42.58014677 L 37.74209568,40.64558848 L 35.80753738,40.64558848 L 35.80753738,41.61341941 M 25.16139712,18.38658059 L 24.19356619,18.38658059 M 24.19356619,18.38658059 A 5.80477846,5.80477846 0 0,1 22.49338636,22.49338636 A 5.80477846,5.80477846 0 0,1 18.38658059,24.19356619 M 18.38658059,24.19356619 L 18.38658059,26.12922805 M 18.38658059,26.12922805 A 7.74154389,7.74154389 0 0,0 23.86178242,23.86178242 A 7.74154389,7.74154389 0 0,0 26.12922805,18.38658059 L 25.16139712,18.38658059 M 18.38658059,25.16139712 L 18.38658059,24.19356619 A 5.80477846,5.80477846 0 0,1 14.28048835,22.49299597 A 5.80477846,5.80477846 0 0,1 12.58069856,18.38658059 M 12.58069856,18.38658059 L 10.64503669,18.38658059 M 10.64503669,18.38658059 A 7.74154389,7.74154389 0 0,0 12.9120922,23.86139219 A 7.74154389,7.74154389 0 0,0 18.38658059,26.12922805 M 18.38658059,26.12922805 L 18.38658059,25.16139712 M 11.61286763,18.38658059 L 12.58069856,18.38658059 M 12.58069856,18.38658059 A 5.80477846,5.80477846 0 0,1 14.2808787,14.2808787 A 5.80477846,5.80477846 0 0,1 18.38658059,12.58069856 M 18.38658059,12.58069856 L 18.38658059,10.64503669 A 7.74154389,7.74154389 0 0,0 10.64503669,18.38658059 L 11.61286763,18.38658059 M 18.38658059,11.61286763 L 18.38658059,12.58069856 A 5.80477846,5.80477846 0 0,1 22.49299597,14.28048835 A 5.80477846,5.80477846 0 0,1 24.19356619,18.38658059 L 26.12922805,18.38658059 M 26.12922805,18.38658051 A 7.74154389,7.74154389 0 0,0 23.86139213,12.91209214 A 7.74154389,7.74154389 0 0,0 18.38658051,10.64503669 M 18.38658059,10.64503669 L 18.38658059,11.61286763",viewW:60,viewH:60},tv:{d:"M 44.11752137,9.73109561 L 2.5,9.73109561 C 1.11965812,9.73109561 0,10.850462 0,12.23118989 L 0,15.76881011 C 0,17.14821799 1.11965812,18.26758439 2.5,18.26758439 L 44.11752137,18.26758439 M 44.11752137,9.73109561 L 44.11752137,2.50009429 C 44.11752137,1.1193664 45.23717949,0 46.61752137,0 L 75.1474359,0 C 76.52777778,0 77.6474359,1.1193664 77.6474359,2.50009429 L 77.6474359,9.73109561 M 44.11752137,9.73109561 L 77.6474359,9.73109561 L 117.5,9.73109561 C 118.88141026,9.73109561 120,10.850462 120,12.23118989 L 120,15.76881011 C 120,17.14821799 118.88141026,18.26758439 117.5,18.26758439 L 77.6474359,18.26758439 M 44.11752137,18.26758439 L 44.11752137,25.49990571 C 44.11752137,26.8806336 45.23717949,28 46.61752137,28 L 75.1474359,28 C 76.52777778,28 77.6474359,26.8806336 77.6474359,25.49990571 L 77.6474359,18.26758439 M 44.11752137,18.26758439 L 77.6474359,18.26758439",viewW:120,viewH:28},tv_wall:{d:"M 34.42622951,13.23529412 C 33.88293401,13.23529412 33.44262295,13.63088235 33.44262295,14.11764706 C 33.44262295,14.60441176 33.88293401,15 34.42622951,15 L 34.42622951,13.23529412 M 86.49957966,15 C 87.04287516,15 87.48318621,14.60441176 87.48318621,14.11764706 C 87.48318621,13.63088235 87.0418243,13.23529412 86.49957966,13.23529412 L 86.49957966,15 M 3.44262295,0.88235294 L 3.44262295,1.76470588 L 116.55737705,1.76470588 L 116.55737705,0 L 3.44262295,0 L 3.44262295,0.88235294 M 119.01639344,3.08823529 L 118.03278689,3.08823529 L 118.03278689,5.73529412 L 120,5.73529412 L 120,3.08823529 L 119.01639344,3.08823529 M 116.55737705,7.94117647 L 116.55737705,7.05882353 L 3.44262295,7.05882353 L 3.44262295,8.82352941 L 116.55737705,8.82352941 L 116.55737705,7.94117647 M 0.98360656,5.73529412 L 1.96721311,5.73529412 L 1.96721311,3.08823529 L 0,3.08823529 L 0,5.73529412 L 0.98360656,5.73529412 M 3.44262295,7.94117647 L 3.44262295,7.05882353 C 2.62820513,7.05882353 1.96721311,6.46617647 1.96721311,5.73529412 L 0,5.73529412 C 0,7.44117647 1.54161412,8.82352941 3.44262295,8.82352941 L 3.44262295,7.94117647 M 119.01639344,5.73529412 L 118.03278689,5.73529412 C 118.03278689,6.46617647 117.37179487,7.05882353 116.55737705,7.05882353 L 116.55737705,8.82352941 C 118.45943674,8.82352941 120,7.44117647 120,5.73529412 L 119.01639344,5.73529412 M 116.55737705,0.88235294 L 116.55737705,1.76470588 C 117.37179487,1.76470588 118.03278689,2.35735294 118.03278689,3.08823529 L 120,3.08823529 C 120,1.38235294 118.45838588,0 116.55737705,0 L 116.55737705,0.88235294 M 3.44262295,0.88235294 L 3.44262295,0 C 1.54056326,0 0,1.38235294 0,3.08823529 L 1.96721311,3.08823529 C 1.96721311,2.35735294 2.62820513,1.76470588 3.44262295,1.76470588 L 3.44262295,0.88235294 M 67.86885246,7.05882353 L 66.8852459,7.05882353 L 66.8852459,14.11764706 L 68.85245902,14.11764706 L 68.85245902,7.05882353 L 67.86885246,7.05882353 M 52.13114754,14.11764706 L 53.1147541,14.11764706 L 53.1147541,7.05882353 L 51.14754098,7.05882353 L 51.14754098,14.11764706 L 52.13114754,14.11764706 M 34.42622951,14.11764706 L 34.42622951,15 L 86.49957966,15 L 86.49957966,13.23529412 L 34.42622951,13.23529412 L 34.42622951,14.11764706",viewW:120,viewH:15},toilet:{d:"M 0,50.64541922 C 0,61.33577471 8.66551127,70 19.35479948,70 L 20.64520052,70 C 31.33570495,70 40,61.33577471 40,50.64541922 L 40,2.49964019 C 40,1.11940895 38.88108486,0 37.49946791,0 L 2.50053209,0 C 1.12013135,0 0,1.11940895 0,2.5007596 L 0,50.64541922 M 4.99984797,50.80661411 C 4.99984797,58.645835 11.35455623,65.00071962 19.19304327,65.00071962 L 20.80695673,65.00071962 C 28.64544377,65.00071962 35.00015203,58.645835 35.00015203,50.80661411 L 35.00015203,31.50016791 C 35.00015203,30.11993667 33.88123689,29.00052772 32.49961993,29.00052772 L 7.50038007,29.00052772 C 6.11997932,29.00052772 4.99984797,30.11993667 4.99984797,31.50016791 L 4.99984797,50.80661411 M 36.77460549,0 C 38.55635623,0 40,1.44403755 40,3.2261366 L 40,16.77434315 C 40,18.5564422 38.55635623,20.00047975 36.77460549,20.00047975 L 3.22661072,20.00047975 C 1.44485998,20.00047975 0,18.5564422 0,16.77434315 L 0,3.2261366 C 0,1.44515696 1.44485998,0 3.22661072,0 L 36.77460549,0 M 24.99923987,51.99990405 C 24.99923987,54.76148594 22.76140959,57.00030384 20.00060811,57.00030384 C 17.23980662,57.00030384 15.00076013,54.76148594 15.00076013,51.99990405 C 15.00076013,49.23832217 17.23859041,47.00062367 19.99939189,47.00062367 C 22.76019338,47.00062367 25.00045608,49.23944157 25.00045608,51.99990405",viewW:40,viewH:70},toilet_built_in:{d:"M 0,35.64551996 C 0,46.33352214 8.66551127,55 19.35479948,55 L 20.64520052,55 C 31.33570495,55 40,46.33467598 40,35.64436612 L 40,2.49921329 C 40,1.11922294 38.88108486,0 37.49946791,0 L 2.50053209,0 C 1.12013135,0 0,1.11922294 0,2.49921329 L 0,35.64551996 M 4.99984797,35.80705729 C 4.99984797,43.64507941 11.35455623,49.99926574 19.19304327,49.99926574 L 20.80695673,49.99926574 C 28.64544377,49.99926574 35.00015203,43.64507941 35.00015203,35.80705729 L 35.00015203,12.49952798 C 35.00015203,11.11838379 33.88123689,9.99916085 32.49961993,9.99916085 L 7.50038007,9.99916085 C 6.11997932,9.99916085 4.99984797,11.11838379 4.99984797,12.49952798 L 4.99984797,35.80705729 M 24.99923987,36.99897204 C 24.99923987,39.76126041 22.76140959,41.9997063 20.00060811,41.9997063 C 17.23980662,41.9997063 15.00076013,39.76126041 15.00076013,36.99897204 C 15.00076013,34.23668366 17.23859041,31.99939161 19.99939189,31.99939161 C 22.76019338,31.99939161 25.00045608,34.2378375 25.00045608,36.99897204",viewW:40,viewH:55},bathtub:{d:"M 0.00104789,2.5 C 0.00104789,1.11888889 1.12019281,0 2.50130986,0 L 167.49973803,0 C 168.88085508,0 170,1.11888889 170,2.5 L 170,72.5 C 170,73.88111111 168.88085508,75 167.49973803,75 L 2.50026197,75 C 1.11914492,75 0,73.88111111 0,72.5 L 0.00104789,2.5 M 10.00104789,37.5 C 10.00104789,22.31222222 22.31373782,10 37.50078592,10 L 132.50026197,10 C 147.68731007,10 160,22.31222222 160,37.5 C 160,52.68777778 147.68731007,65 132.50026197,65 L 37.49973803,65 C 22.31268993,65 10,52.68777778 10,37.5 M 29.00136226,37.5 C 29.00136226,39.98555556 26.98627266,42 24.50068113,42 C 22.01508959,42 20.00104789,39.98555556 20.00104789,37.5 C 20.00104789,35.01444444 22.01613748,33 24.50068113,33 C 26.98627266,33 29.00136226,35.01444444 29.00136226,37.5",viewW:170,viewH:75},bathtub_corner:{d:"M 0.0000009,2.49992528 A 2.4978076,2.4978076 90 0,1 0.73159091,0.73159091 A 2.4978076,2.4978076 90 0,1 2.49992528,0.0000009 M 2.49992528,0.0000009 L 137.70540387,0.0000009 C 138.97230035,0.0000009 140,1.02664216 140,2.29459703 C 140,78.34754644 78.34754644,140 2.29459703,140 A 2.29671292,2.29671292 90 0,1 0.0000009,137.70540387 L 0.0000009,2.49992528 M 9.99969844,30.0001519 C 9.99969844,18.95370364 18.95370364,9.99969844 30.0001519,9.99969844 L 122.7450181,9.99969844 A 2.2543772,2.2543772 90 0,1 124.9993953,12.25407563 C 124.9993953,74.52251395 74.52251395,125.00045369 12.25513403,125.00045369 A 2.2543772,2.2543772 90 0,1 10.66067431,124.33978775 A 2.2543772,2.2543772 90 0,1 10.00075683,122.7450181 L 9.99969844,30.0001519 M 30.0001519,25.00030314 A 5.00037797,5.00037797 90 0,1 24.99977394,30.0006811 A 5.00037797,5.00037797 90 0,1 19.99939597,25.00030314 A 5.00037797,5.00037797 90 0,1 24.99977394,19.99992517 A 5.00037797,5.00037797 90 0,1 30.0001519,25.00030314",viewW:140,viewH:140},bidet:{d:"M 22.99978716,0 L 22.99978716,11.50052266 C 22.99978716,12.88035731 21.88087202,14.00019006 20.50047128,14.00019006 L 19.50074493,14.00019006 C 18.11912798,14.00019006 17.00021284,12.88149767 17.00021284,11.50052266 L 17.00021284,0 M 22.99978716,10.0009503 L 26.50004561,10.0009503 C 27.88044635,10.0009503 29.0005777,8.88111755 29.0005777,7.50014254 L 29.0005777,6.50004751 C 29.0005777,5.12021287 27.88166256,4.00038012 26.50004561,4.00038012 L 22.99978716,4.00038012 M 17.00021284,10.0009503 L 13.49995439,10.0009503 C 12.11955365,10.0009503 11.00063851,8.88111755 11.00063851,7.50014254 L 11.00063851,6.50004751 C 11.00063851,5.12021287 12.11955365,4.00038012 13.49995439,4.00038012 L 17.00021284,4.00038012 M 2.50053209,0 L 37.49946791,0 C 38.88108486,0 40,1.11869239 40,2.4996674 L 40,40.64468308 C 40,51.33441034 31.33448873,60 20.64520052,60 L 19.35601569,60 C 8.66551127,60 0,51.33441034 0,40.64582343 L 0,2.50080775 C 0,1.11869239 1.11891514,0 2.50053209,0 M 7.49916385,18.00057018 L 32.49961993,18.00057018 C 33.88123689,18.00057018 35.00015203,19.11926257 35.00015203,20.50023757 L 35.00015203,40.80661408 C 35.00015203,48.64544331 28.64544377,55.00066521 20.80695673,55.00066521 L 19.19304327,55.00066521 C 11.35455623,55.00066521 4.99984797,48.64544331 4.99984797,40.80661408 L 4.99984797,20.50137793 C 4.99984797,19.12154329 6.11876311,18.00171054 7.50038007,18.00171054 M 24.00072973,27.00142545 C 24.00072973,29.21030124 22.21046551,31.00180557 20.00182432,31.00180557 C 17.79196692,31.00180557 16.00048648,29.2114416 16.00048648,27.00142545 C 16.00048648,24.79140929 17.79196692,23.00218569 20.00182432,23.00218569 C 22.21168172,23.00218569 24.00072973,24.79254965 24.00072973,27.00142545",viewW:40,viewH:60},bidet_built_in:{d:"M 16.73872723,9.99953191 L 6.93605765,9.99953191 C 5.86579099,9.99953191 4.99984797,10.86549489 4.99984797,11.93507618 L 4.99984797,30.8060477 C 4.99984797,38.64418284 11.35455623,44.99964893 19.19304327,44.99964893 L 20.80695673,44.99964893 C 28.64544377,44.99964893 35.00015203,38.64535306 35.00015203,30.80487748 L 35.00015203,11.9362464 C 35.00015203,10.86666511 34.13299279,10.00070213 33.06515856,10.00070213 L 23.26005655,10.00070213 M 22.99857095,0.00117022 L 22.99857095,11.50092447 C 22.99857095,12.88178435 21.87965581,14.0005149 20.49925507,14.0005149 L 19.49952872,14.0005149 C 18.11791176,14.0005149 16.99899663,12.88178435 16.99899663,11.50092447 L 16.99899663,0 M 29.99908784,9.99953191 L 29.99908784,0 M 9.99847973,0 L 9.99847973,9.99953191 M 2.50053209,0 L 37.49946791,0 C 38.88108486,0 40,1.11873055 40,2.49959042 L 40,30.64455731 C 40,41.33451916 31.33448873,50 20.64520052,50 L 19.35601569,50 C 8.66551127,50 0,41.33451916 0,30.64455731 L 0,2.49959042 C 0,1.11873055 1.11891514,0 2.50053209,0 M 24.00072973,22.99833829 C 24.00072973,25.20771409 22.20924929,26.99815105 19.99939189,26.99815105 C 17.78953449,26.99815105 16.00048648,25.20771409 16.00048648,22.99833829 C 16.00048648,20.78896248 17.79075071,18.99852552 20.00060811,18.99852552 C 22.20924929,18.99852552 23.99951352,20.78896248 23.99951352,22.99833829",viewW:40,viewH:50},kitchen_sink:{d:"M 39.41423548,6.00088937 L 51.49976243,6.00088937 C 52.88073743,6.00088937 54.00057018,7.11961991 54.00057018,8.50047979 L 54.00057018,41.50069043 C 54.00057018,42.88155031 52.88073743,44.00028085 51.49976243,44.00028085 L 8.50137793,44.00028085 C 7.12154329,44.00028085 6.00171054,42.88155031 6.00171054,41.50069043 L 6.00171054,8.50047979 C 6.00171054,7.11961991 7.12040293,6.00088937 8.50137793,6.00088937 L 20.58804523,6.00088937 M 33.00085527,0 L 33.00085527,13.50200108 C 33.00085527,14.88286095 31.88216288,16.0015915 30.50118787,16.0015915 L 29.50109284,16.0015915 C 28.1212582,16.0015915 27.00142545,14.88169073 27.00142545,13.50200108 L 27.00142545,0 M 33.00085527,9.00016383 L 36.50175805,9.00016383 C 37.8815927,9.00016383 39.00142545,7.88143329 39.00142545,6.50057341 L 39.00142545,5.50003511 C 39.00142545,4.11917523 37.8815927,3.00044468 36.50175805,3.00044468 L 33.00085527,3.00044468 M 27.00142545,9.00016383 L 23.50052266,9.00016383 C 22.12068802,9.00016383 21.00085527,7.88143329 21.00085527,6.50057341 L 21.00085527,5.50003511 C 21.00085527,4.11917523 22.12068802,3.00044468 23.50166302,3.00044468 L 27.00142545,3.00044468 M 2.4996674,50 L 57.5003326,50 C 58.88016725,50 60,48.88126945 60,47.50040958 L 60,2.50076064 C 60,1.11990077 58.88130761,0 57.5003326,0 L 2.50080775,0 C 1.11983275,0 0,1.11990077 0,2.50076064 L 0,47.50040958 C 0,48.88126945 1.11983275,50 2.4996674,50 M 33.99980994,25.99995319 C 33.99980994,28.209329 32.20944598,29.99976596 30.00057018,29.99976596 C 27.79169438,29.99976596 26.00019006,28.209329 26.00019006,25.99995319 C 26.00019006,23.79174761 27.79055402,22.00014043 30.00057018,22.00014043 C 32.21058633,22.00014043 33.99980994,23.79057739 33.99980994,25.99995319",viewW:60,viewH:50},kitchen_sink_double:{d:"M 53.81917613,10.60756523 C 53.3184331,10.60756523 52.91291684,11.00704162 52.91291684,11.49905209 C 52.91291684,11.99106256 53.31950306,12.39053895 53.81917613,12.39053895 L 53.81917613,10.60756523 M 77.33590917,12.39053895 C 77.83558224,12.39053895 78.2410985,11.99219103 78.2410985,11.49905209 C 78.2410985,11.00704162 77.83558224,10.60756523 77.33590917,10.60756523 L 77.33590917,12.39053895 M 3.35647625,0.89148686 L 3.35647625,1.78297373 L 86.64459371,1.78297373 L 86.64459371,0 L 3.35647625,0 L 3.35647625,0.89148686 M 89.09267075,3.30414372 L 88.18641146,3.30414372 L 88.18641146,46.69811321 L 89.99893004,46.69811321 L 89.99893004,3.30301526 L 89.09267075,3.30414372 M 86.64245378,49.10851314 L 86.64245378,48.21702627 L 3.35647625,48.21702627 L 3.35647625,50 L 86.64459371,50 L 86.64245378,49.10851314 M 0.90625929,46.69698474 L 1.81251858,46.69698474 L 1.81251858,3.30301526 L 0,3.30301526 L 0,46.69698474 L 0.90625929,46.69698474 M 3.35647625,49.10738467 L 3.35647625,48.21589781 C 2.50371515,48.21589781 1.81251858,47.53543378 1.81251858,46.69698474 L 0,46.69698474 C 0,48.52058319 1.50222909,49.99887154 3.35647625,49.99887154 L 3.35647625,49.10738467 M 89.09374071,46.69698474 L 88.18748142,46.69698474 C 88.18748142,47.53543378 87.49628485,48.21589781 86.64459371,48.21589781 L 86.64459371,49.99887154 C 88.49777091,49.99887154 90,48.52058319 90,46.69698474 L 89.09374071,46.69698474 M 86.64352375,0.89261533 L 86.64352375,1.78410219 C 87.49628485,1.78410219 88.18748142,2.46343775 88.18748142,3.30301526 L 90,3.30301526 C 90,1.47828835 88.49777091,0 86.64459371,0 L 86.64352375,0.89261533 M 3.35647625,0.89261533 L 3.35647625,0.00112846 C 1.50222909,0.00112846 0,1.47941681 0,3.30301526 L 1.81251858,3.30301526 C 1.81251858,2.46343775 2.50371515,1.78297373 3.35647625,1.78297373 L 3.35647625,0.89261533 M 9.23485704,43.32174777 L 9.23485704,44.21323463 L 39.61112762,44.21323463 L 39.61112762,42.4302609 L 9.23485704,42.4302609 L 9.23485704,43.32174777 M 42.06134459,40.91134784 L 42.96653391,40.91134784 L 42.96653391,9.08865216 L 41.15401534,9.08865216 L 41.15401534,40.91134784 L 42.06134459,40.91134784 M 6.78464008,9.08865216 L 5.87945075,9.08865216 L 5.87945075,40.91134784 L 7.69196933,40.91134784 L 7.69196933,9.08865216 L 6.78464008,9.08865216 M 39.61219759,6.67825223 L 39.61219759,5.78676537 L 33.54657314,5.78676537 L 33.54657314,7.5697391 L 39.61219759,7.5697391 L 39.61219759,6.67825223 M 15.30155145,6.67825223 L 15.30155145,5.78676537 L 9.235927,5.78676537 L 9.235927,7.5697391 L 15.30155145,7.5697391 L 15.30155145,6.67825223 M 6.78678,9.08865216 L 7.69303929,9.08865216 C 7.69303929,8.24907466 8.3831659,7.5697391 9.235927,7.5697391 L 9.235927,5.78676537 C 7.38274981,5.78676537 5.88052072,7.26505371 5.88052072,9.08865216 L 6.78678,9.08865216 M 42.06134459,9.08865216 L 42.96760388,9.08865216 C 42.96760388,7.26505371 41.46537478,5.78563691 39.61219759,5.78563691 L 39.61219759,7.56861063 C 40.46495869,7.56861063 41.1550853,8.24907466 41.1550853,9.08865216 L 42.06134459,9.08865216 M 39.61112762,43.32174777 L 39.61112762,44.21323463 C 41.46537478,44.21323463 42.96760388,42.73494629 42.96760388,40.91134784 L 41.1550853,40.91134784 C 41.1550853,41.74979688 40.46495869,42.4302609 39.61219759,42.4302609 L 39.61112762,43.32174777 M 9.235927,43.32174777 L 9.235927,42.4302609 C 8.3831659,42.4302609 7.69303929,41.74979688 7.69303929,40.91134784 L 5.87945075,40.91134784 C 5.87945075,42.73494629 7.38167984,44.21323463 9.23485704,44.21323463 L 9.235927,43.32174777 M 23.9340189,16.32098041 L 23.9340189,17.21246727 L 24.91410569,17.21246727 L 24.91410569,15.42949355 L 23.9340189,15.42949355 L 23.9340189,16.32098041 M 27.36325269,13.91058048 L 28.26951198,13.91058048 L 28.26951198,0.89148686 L 26.4569934,0.89148686 L 26.4569934,13.91170895 L 27.36325269,13.91058048 M 21.48380194,0.89148686 L 20.57754265,0.89148686 L 20.57754265,13.91170895 L 22.38899126,13.91170895 L 22.38899126,0.89148686 L 21.48380194,0.89148686 M 24.91303572,16.32098041 L 24.91303572,17.21246727 C 26.76621292,17.21246727 28.26844201,15.73417893 28.26844201,13.91058048 L 26.4569934,13.91058048 C 26.4569934,14.74902952 25.76579683,15.42949355 24.91303572,15.42949355 L 24.91303572,16.32098041 M 23.93294894,16.32098041 L 23.93294894,15.42949355 C 23.08018784,15.42949355 22.38899126,14.74902952 22.38899126,13.91058048 L 20.57754265,13.91058048 C 20.57754265,15.73417893 22.07977174,17.21246727 23.93294894,17.21246727 L 23.93294894,16.32098041 M 27.36218273,9.57050645 L 27.36218273,10.46199332 L 30.79248648,10.46199332 L 30.79248648,8.67901959 L 27.36218273,8.67901959 L 27.36218273,9.57050645 M 33.24163348,7.16010653 L 34.14789277,7.16010653 L 34.14789277,6.19526948 L 32.33537419,6.19526948 L 32.33537419,7.16010653 L 33.24163348,7.16010653 M 30.79141651,3.78486955 L 30.79141651,2.89338268 L 27.36218273,2.89338268 L 27.36218273,4.67635641 L 30.79248648,4.67635641 L 30.79141651,3.78486955 M 33.24163348,6.19526948 L 34.14789277,6.19526948 C 34.14789277,4.37167103 32.64566367,2.89338268 30.79248648,2.89338268 L 30.79248648,4.67635641 C 31.64417761,4.67635641 32.33537419,5.35682044 32.33537419,6.19526948 L 33.24163348,6.19526948 M 30.79141651,9.57050645 L 30.79141651,10.46199332 C 32.64566367,10.46199332 34.14789277,8.98370497 34.14789277,7.16010653 L 32.33537419,7.16010653 C 32.33537419,7.99855557 31.64417761,8.67901959 30.79248648,8.67901959 L 30.79141651,9.57050645 M 18.05349819,9.57050645 L 18.05349819,10.46199332 L 21.48380194,10.46199332 L 21.48380194,8.67901959 L 18.05349819,8.67901959 L 18.05349819,9.57050645 M 21.48380194,3.78486955 L 21.48380194,2.89338268 L 18.05349819,2.89338268 L 18.05349819,4.67635641 L 21.48380194,4.67635641 L 21.48380194,3.78486955 M 15.60435119,6.19526948 L 14.6980919,6.19526948 L 14.6980919,7.16010653 L 16.51061047,7.16010653 L 16.51061047,6.19526948 L 15.60435119,6.19526948 M 18.05456815,3.78486955 L 18.05456815,2.89338268 C 16.20032099,2.89338268 14.6980919,4.37167103 14.6980919,6.19526948 L 16.51061047,6.19526948 C 16.51061047,5.35682044 17.20180705,4.67635641 18.05349819,4.67635641 L 18.05456815,3.78486955 M 18.05456815,9.57050645 L 18.05456815,8.67901959 C 17.20180705,8.67901959 16.51061047,7.99855557 16.51061047,7.16010653 L 14.6980919,7.16010653 C 14.6980919,8.98370497 16.20032099,10.46199332 18.05349819,10.46199332 L 18.05456815,9.57050645 M 28.34226951,25.96370859 L 27.43601022,25.96370859 C 27.43601022,27.60223887 26.08785591,28.92931299 24.42299233,28.92931299 L 24.42299233,30.71228672 C 27.08720204,30.71228672 29.2485288,28.58625982 29.2485288,25.96370859 L 28.34226951,25.96370859 M 24.4240623,29.82079986 L 24.4240623,28.92931299 C 22.76026868,28.92931299 21.4110444,27.60223887 21.4110444,25.96370859 L 19.59852583,25.96370859 C 19.59852583,28.58625982 21.75985258,30.71341518 24.4240623,30.71341518 L 24.4240623,29.82079986 M 20.50478512,25.96370859 L 21.4110444,25.96370859 C 21.4110444,24.32630676 22.75919872,22.99810418 24.4240623,22.99810418 L 24.4240623,21.21513045 C 21.75985258,21.21513045 19.59852583,23.34115735 19.59852583,25.96370859 L 20.50478512,25.96370859 M 24.4240623,22.10661732 L 24.4240623,22.99810418 C 26.08785591,22.99810418 27.43708019,24.32630676 27.43708019,25.96370859 L 29.24959876,25.96370859 C 29.24959876,23.34115735 27.08827201,21.21513045 24.4240623,21.21513045 L 24.4240623,22.10661732 M 50.38994234,43.32174777 L 50.38994234,44.21323463 L 80.76621292,44.21323463 L 80.76621292,42.4302609 L 50.38994234,42.4302609 L 50.38994234,43.32174777 M 83.21642989,40.91134784 L 84.12161921,40.91134784 L 84.12161921,9.08865216 L 82.30910064,9.08865216 L 82.30910064,40.91134784 L 83.21642989,40.91134784 M 80.764073,6.67825223 L 80.764073,5.78676537 L 50.38780241,5.78676537 L 50.38780241,7.5697391 L 80.764073,7.5697391 L 80.764073,6.67825223 M 47.93758545,9.08865216 L 47.03239612,9.08865216 L 47.03239612,40.91134784 L 48.8449147,40.91134784 L 48.8449147,9.08865216 L 47.93758545,9.08865216 M 50.38780241,6.67825223 L 50.38780241,5.78676537 C 48.53462522,5.78676537 47.03239612,7.26505371 47.03239612,9.08865216 L 48.8449147,9.08865216 C 48.8449147,8.24907466 49.53611128,7.5697391 50.38780241,7.5697391 L 50.38780241,6.67825223 M 83.21428996,9.08865216 L 84.11947928,9.08865216 C 84.11947928,7.26505371 82.61725019,5.78563691 80.764073,5.78563691 L 80.764073,7.56861063 C 81.6168341,7.56861063 82.30803067,8.24907466 82.30803067,9.08865216 L 83.21428996,9.08865216 M 80.764073,43.32174777 L 80.764073,44.21323463 C 82.61725019,44.21323463 84.11947928,42.73494629 84.11947928,40.91134784 L 82.30910064,40.91134784 C 82.30910064,41.74979688 81.61790406,42.4302609 80.76514296,42.4302609 L 80.764073,43.32174777 M 50.38780241,43.32174777 L 50.38780241,42.4302609 C 49.53611128,42.4302609 48.8449147,41.74979688 48.8449147,40.91134784 L 47.03239612,40.91134784 C 47.03239612,42.73494629 48.53462522,44.21323463 50.38780241,44.21323463 L 50.38780241,43.32174777 M 53.81810616,11.49905209 L 53.81810616,12.39053895 L 77.33483921,12.39053895 L 77.33483921,10.60756523 L 53.8170362,10.60756523 L 53.81810616,11.49905209",viewW:90,viewH:50}};export{L as FURNITURE_ART_FINGERPRINT,M as GENERATED_FURNITURE_ART};
diff --git a/dist/houseplan-assets/houseplan-card-BKJrmMEj.js b/dist/houseplan-assets/houseplan-card-CAm75-22.js
similarity index 99%
rename from dist/houseplan-assets/houseplan-card-BKJrmMEj.js
rename to dist/houseplan-assets/houseplan-card-CAm75-22.js
index 67e85d97..5a02bc21 100644
--- a/dist/houseplan-assets/houseplan-card-BKJrmMEj.js
+++ b/dist/houseplan-assets/houseplan-card-CAm75-22.js
@@ -1,4 +1,4 @@
-globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="34d1dbfc181acaf58842dfced0e6aa3a899aef6b8d1eeba53732ef729a63137e";const e=globalThis,t=e.ShadowRoot&&(void 0===e.ShadyCSS||e.ShadyCSS.nativeShadow)&&"adoptedStyleSheets"in Document.prototype&&"replace"in CSSStyleSheet.prototype,i=Symbol(),n=new WeakMap;let r=class{constructor(e,t,n){if(this._$cssResult$=!0,n!==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=n.get(i)),void 0===e&&((this.o=e=new CSSStyleSheet).replaceSync(this.cssText),t&&n.set(i,e))}return e}toString(){return this.cssText}};const o=(e,...t)=>{const n=1===e.length?e[0]:t.reduce((t,i,n)=>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[n+1],e[0]);return new r(n,e,i)},s=t?e=>e:e=>e instanceof CSSStyleSheet?(e=>{let t="";for(const i of e.cssRules)t+=i.cssText;return(e=>new r("string"==typeof e?e:e+"",void 0,i))(t)})(e):e,{is:a,defineProperty:l,getOwnPropertyDescriptor:c,getOwnPropertyNames:h,getOwnPropertySymbols:d,getPrototypeOf:u}=Object,p=globalThis,_=p.trustedTypes,m=_?_.emptyScript:"",g=p.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}},y=(e,t)=>!a(e,t),b={attribute:!0,type:String,converter:v,reflect:!1,useDefault:!1,hasChanged:y};Symbol.metadata??=Symbol("metadata"),p.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=b){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(),n=this.getPropertyDescriptor(e,i,t);void 0!==n&&l(this.prototype,e,n)}}static getPropertyDescriptor(e,t,i){const{get:n,set:r}=c(this.prototype,e)??{get(){return this[t]},set(e){this[t]=e}};return{get:n,set(t){const o=n?.call(this);r?.call(this,t),this.requestUpdate(e,o,i)},configurable:!0,enumerable:!0}}static getPropertyOptions(e){return this.elementProperties.get(e)??b}static _$Ei(){if(this.hasOwnProperty(f("elementProperties")))return;const e=u(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(s(e))}else void 0!==e&&t.push(s(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,n)=>{if(t)i.adoptedStyleSheets=n.map(e=>e instanceof CSSStyleSheet?e:e.styleSheet);else for(const t of n){const n=document.createElement("style"),r=e.litNonce;void 0!==r&&n.setAttribute("nonce",r),n.textContent=t.cssText,i.appendChild(n)}})(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),n=this.constructor._$Eu(e,i);if(void 0!==n&&!0===i.reflect){const r=(void 0!==i.converter?.toAttribute?i.converter:v).toAttribute(t,i.type);this._$Em=e,null==r?this.removeAttribute(n):this.setAttribute(n,r),this._$Em=null}}_$AK(e,t){const i=this.constructor,n=i._$Eh.get(e);if(void 0!==n&&this._$Em!==n){const e=i.getPropertyOptions(n),r="function"==typeof e.converter?{fromAttribute:e.converter}:void 0!==e.converter?.fromAttribute?e.converter:v;this._$Em=n;const o=r.fromAttribute(t,e.type);this[n]=o??this._$Ej?.get(n)??o,this._$Em=null}}requestUpdate(e,t,i,n=!1,r){if(void 0!==e){const o=this.constructor;if(!1===n&&(r=this[e]),i??=o.getPropertyOptions(e),!((i.hasChanged??y)(r,t)||i.useDefault&&i.reflect&&r===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:n,wrapped:r},o){i&&!(this._$Ej??=new Map).has(e)&&(this._$Ej.set(e,o??t??this[e]),!0!==r||void 0!==o)||(this._$AL.has(e)||(this.hasUpdated||i||(t=void 0),this._$AL.set(e,t)),!0===n&&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,n=this[t];!0!==e||this._$AL.has(t)||void 0===n||this.C(t,void 0,i,n)}}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}),(p.reactiveElementVersions??=[]).push("2.1.2");const k=globalThis,x=e=>e,S=k.trustedTypes,$=S?S.createPolicy("lit-html",{createHTML:e=>e}):void 0,M="$lit$",R=`lit$${Math.random().toFixed(9).slice(2)}$`,C="?"+R,T=`<${C}>`,D=document,A=()=>D.createComment(""),P=e=>null===e||"object"!=typeof e&&"function"!=typeof e,F=Array.isArray,z="[ \t\n\f\r]",I=/<(?:(!--|\/[^a-zA-Z])|(\/?[a-zA-Z][^>\s]*)|(\/?$))/g,O=/-->/g,E=/>/g,N=RegExp(`>|${z}(?:([^\\s"'>=/]+)(${z}*=${z}*(?:[^ \t\n\f\r"'\`<>=]|("|')|))|$)`,"g"),H=/'/g,L=/"/g,B=/^(?:script|style|textarea|title)$/i,q=e=>(t,...i)=>({_$litType$:e,strings:t,values:i}),j=q(1),W=q(2),U=Symbol.for("lit-noChange"),G=Symbol.for("lit-nothing"),V=new WeakMap,K=D.createTreeWalker(D,129);function Y(e,t){if(!F(e)||!e.hasOwnProperty("raw"))throw Error("invalid template strings array");return void 0!==$?$.createHTML(t):t}const X=(e,t)=>{const i=e.length-1,n=[];let r,o=2===t?"":3===t?"":"")),n]};class Z{constructor({strings:e,_$litType$:t},i){let n;this.parts=[];let r=0,o=0;const s=e.length-1,a=this.parts,[l,c]=X(e,t);if(this.el=Z.createElement(l,i),K.currentNode=this.el.content,2===t||3===t){const e=this.el.content.firstChild;e.replaceWith(...e.childNodes)}for(;null!==(n=K.nextNode())&&a.length0){n.textContent=S?S.emptyScript:"";for(let i=0;iF(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&&P(this._$AH)?this._$AA.nextSibling.data=e:this.T(D.createTextNode(e)),this._$AH=e}$(e){const{values:t,_$litType$:i}=e,n="number"==typeof i?this._$AC(e):(void 0===i.el&&(i.el=Z.createElement(Y(i.h,i.h[0]),this.options)),i);if(this._$AH?._$AD===n)this._$AH.p(t);else{const e=new Q(n,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 Z(e)),t}k(e){F(this._$AH)||(this._$AH=[],this._$AR());const t=this._$AH;let i,n=0;for(const r of e)n===t.length?t.push(i=new ee(this.O(A()),this.O(A()),this,this.options)):i=t[n],i._$AI(r),n++;n2||""!==i[0]||""!==i[1]?(this._$AH=Array(i.length-1).fill(new String),this.strings=i):this._$AH=G}_$AI(e,t=this,i,n){const r=this.strings;let o=!1;if(void 0===r)e=J(this,e,t,0),o=!P(e)||e!==this._$AH&&e!==U,o&&(this._$AH=e);else{const n=e;let s,a;for(e=r[0],s=0;s{const n=i?.renderBefore??t;let r=n._$litPart$;if(void 0===r){const e=i?.renderBefore??null;n._$litPart$=r=new ee(t.insertBefore(A(),e),e,void 0,i??{})}return r._$AI(e),r},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 ue=2,pe=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{I:me}=se,ge=e=>e,fe=(e,t)=>void 0!==e?._$litType$,ve=()=>document.createComment(""),ye=(e,t,i)=>{const n=e._$AA.parentNode,r=void 0===t?e._$AB:t._$AA;if(void 0===i){const t=n.insertBefore(ve(),r),o=n.insertBefore(ve(),r);i=new me(t,o,e,e.options)}else{const t=i._$AB.nextSibling,o=i._$AM,s=o!==e;if(s){let t;i._$AQ?.(e),i._$AM=e,void 0!==i._$AP&&(t=e._$AU)!==o._$AU&&i._$AP(t)}if(t!==r||s){let e=i._$AA;for(;e!==t;){const t=ge(e).nextSibling;ge(n).insertBefore(e,r),e=t}}}return i},be=(e,t,i=e)=>(e._$AI(t,i),e),we={},ke=(e,t=we)=>e._$AH=t,xe=e=>e._$AH,Se=e=>{e._$AR(),e._$AA.remove()},$e=e=>(e=>null!=e?._$litType$?.h)(e)?e._$litType$.h:e.strings,Me=pe(class extends _e{constructor(e){super(e),this.et=new WeakMap}render(e){return[e]}update(e,[t]){const i=fe(this.it)?$e(this.it):null,n=fe(t)?$e(t):null;if(null!==i&&(null===n||i!==n)){const t=xe(e).pop();let n=this.et.get(i);if(void 0===n){const e=document.createDocumentFragment();n=le(G,e),n.setConnected(!1),this.et.set(i,n)}ke(n,[t]),ye(n,void 0,t)}if(null!==n){if(null===i||i!==n){const t=this.et.get(n);if(void 0!==t){const i=xe(t).pop();(e=>{e._$AR()})(e),ye(e,void 0,i),ke(e,[i])}}this.it=t}else this.it=void 0;return this.render(t)}}),Re=pe(class extends _e{constructor(){super(...arguments),this.key=G}render(e,t){return this.key=e,t}update(e,[t,i]){return t!==this.key&&(ke(e),this.key=t),i}}),Ce=(e,t,i)=>{const n=new Map;for(let r=t;r<=i;r++)n.set(e[r],r);return n},Te=pe(class extends _e{constructor(e){if(super(e),e.type!==ue)throw Error("repeat() can only be used in text expressions")}dt(e,t,i){let n;void 0===i?i=t:void 0!==t&&(n=t);const r=[],o=[];let s=0;for(const t of e)r[s]=n?n(t,s):s,o[s]=i(t,s),s++;return{values:o,keys:r}}render(e,t,i){return this.dt(e,t,i).values}update(e,[t,i,n]){const r=xe(e),{values:o,keys:s}=this.dt(t,i,n);if(!Array.isArray(r))return this.ut=s,o;const a=this.ut??=[],l=[];let c,h,d=0,u=r.length-1,p=0,_=o.length-1;for(;d<=u&&p<=_;)if(null===r[d])d++;else if(null===r[u])u--;else if(a[d]===s[p])l[p]=be(r[d],o[p]),d++,p++;else if(a[u]===s[_])l[_]=be(r[u],o[_]),u--,_--;else if(a[d]===s[_])l[_]=be(r[d],o[_]),ye(e,l[_+1],r[d]),d++,_--;else if(a[u]===s[p])l[p]=be(r[u],o[p]),ye(e,r[d],r[u]),u--,p++;else if(void 0===c&&(c=Ce(s,p,_),h=Ce(a,d,u)),c.has(a[d]))if(c.has(a[u])){const t=h.get(s[p]),i=void 0!==t?r[t]:null;if(null===i){const t=ye(e,r[d]);be(t,o[p]),l[p]=t}else l[p]=be(i,o[p]),ye(e,r[d],i),r[t]=null;p++}else Se(r[u]),u--;else Se(r[d]),d++;for(;p<=_;){const t=ye(e,l[_+1]);be(t,o[p]),l[p++]=t}for(;d<=u;){const e=r[d++];null!==e&&Se(e)}return this.ut=s,ke(e,l),U}}),De=new WeakMap;let Ae=0;class Pe extends he{constructor(){super(...arguments),this.title="",this.icon="",this.wide=!1,this.alert=!1,this.describedBy="",this.dismissOnScrim=!1,this.flexContent=!1,this.hass=null,this._opener=null,this._focusRoot=null,this._useHaDialog=null,this._closing=!1,this._overlays=[],this._titleId="hp-dialog-title-"+ ++Ae,this._focusInitial=()=>{const e=this._focusableElements(),t=e.find(e=>e.hasAttribute("autofocus"))||e[0]||(this._usesHaDialog()?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._usesHaDialog())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 n=this._deepActiveElement(),r=i[0],o=i[i.length-1];!e.shiftKey||n!==r&&i.includes(n)?e.shiftKey||n!==o||(e.preventDefault(),r.focus()):(e.preventDefault(),o.focus())},this._onFallbackCancel=e=>{e.preventDefault(),this._requestClose()},this._onFallbackClick=e=>{this.dismissOnScrim&&e.target===e.currentTarget&&this._requestClose()}}_usesHaDialog(){return!0===this._useHaDialog&&!this.alert}connectedCallback(){this.setAttribute("data-hp","dialog"),super.connectedCallback(),this._opener=this._deepActiveElement();const e=this.getRootNode();this._focusRoot=e;const t=De.get(e)||{dialogs:new Set,opener:this._opener};t.dialogs.add(this),De.set(e,t),null===this._useHaDialog&&(this._useHaDialog=!!customElements.get("ha-dialog")),this.addEventListener("keydown",this._onKeyDown,!0),queueMicrotask(()=>{this._ensureNativeModal()&&this._focusInitial()})}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 n=t?De.get(t):void 0;n?.dialogs.delete(this),super.disconnectedCallback(),t&&n&&requestAnimationFrame(()=>{const e=De.get(t);if(!e)return;if(!e.dialogs.size)return e.opener?.isConnected&&e.opener.focus({preventScroll:!0}),void De.delete(t);const n=i?.closest("hp-dialog");i?.isConnected&&n&&e.dialogs.has(n)&&i.focus({preventScroll:!0})})}firstUpdated(e){super.firstUpdated(e),this._ensureNativeModal(),queueMicrotask(()=>this._focusInitial())}updated(e){super.updated(e),this._ensureNativeModal()}_ensureNativeModal(){if(this._usesHaDialog()||!this.isConnected)return!1;const e=this.renderRoot.querySelector("dialog");if(!e?.isConnected)return!1;try{return!e.matches(":modal")&&(e.open&&e.close(),e.showModal(),!0)}catch{return!1}}_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,n=r=>{if(!i.has(r)){if(i.add(r),r instanceof HTMLElement){if(r.matches(e)&&t.push(r),r instanceof HTMLSlotElement){for(const e of r.assignedNodes({flatten:!0}))n(e);return}if(r.shadowRoot){for(const e of r.shadowRoot.childNodes)n(e);return}}for(const e of r.childNodes)n(e)}};for(const e of this.childNodes)n(e);const r=this.overlayPortal();return r&&n(r),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})}rejectClose(){this._closing=!1,this.requestUpdate()}_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 n={...e,group:i,token:Symbol("hp-overlay")};this._overlays.push(n);let r=!1;return()=>{if(r)return;r=!0;const e=this._overlays.findIndex(e=>e.token===n.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=j`
+globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="4da0d706a85c3f1c08ab6de960deb5feb08baaf9055265234e7bd1b554332653";const e=globalThis,t=e.ShadowRoot&&(void 0===e.ShadyCSS||e.ShadyCSS.nativeShadow)&&"adoptedStyleSheets"in Document.prototype&&"replace"in CSSStyleSheet.prototype,i=Symbol(),n=new WeakMap;let r=class{constructor(e,t,n){if(this._$cssResult$=!0,n!==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=n.get(i)),void 0===e&&((this.o=e=new CSSStyleSheet).replaceSync(this.cssText),t&&n.set(i,e))}return e}toString(){return this.cssText}};const o=(e,...t)=>{const n=1===e.length?e[0]:t.reduce((t,i,n)=>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[n+1],e[0]);return new r(n,e,i)},s=t?e=>e:e=>e instanceof CSSStyleSheet?(e=>{let t="";for(const i of e.cssRules)t+=i.cssText;return(e=>new r("string"==typeof e?e:e+"",void 0,i))(t)})(e):e,{is:a,defineProperty:l,getOwnPropertyDescriptor:c,getOwnPropertyNames:h,getOwnPropertySymbols:d,getPrototypeOf:u}=Object,p=globalThis,_=p.trustedTypes,m=_?_.emptyScript:"",g=p.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}},y=(e,t)=>!a(e,t),b={attribute:!0,type:String,converter:v,reflect:!1,useDefault:!1,hasChanged:y};Symbol.metadata??=Symbol("metadata"),p.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=b){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(),n=this.getPropertyDescriptor(e,i,t);void 0!==n&&l(this.prototype,e,n)}}static getPropertyDescriptor(e,t,i){const{get:n,set:r}=c(this.prototype,e)??{get(){return this[t]},set(e){this[t]=e}};return{get:n,set(t){const o=n?.call(this);r?.call(this,t),this.requestUpdate(e,o,i)},configurable:!0,enumerable:!0}}static getPropertyOptions(e){return this.elementProperties.get(e)??b}static _$Ei(){if(this.hasOwnProperty(f("elementProperties")))return;const e=u(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(s(e))}else void 0!==e&&t.push(s(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,n)=>{if(t)i.adoptedStyleSheets=n.map(e=>e instanceof CSSStyleSheet?e:e.styleSheet);else for(const t of n){const n=document.createElement("style"),r=e.litNonce;void 0!==r&&n.setAttribute("nonce",r),n.textContent=t.cssText,i.appendChild(n)}})(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),n=this.constructor._$Eu(e,i);if(void 0!==n&&!0===i.reflect){const r=(void 0!==i.converter?.toAttribute?i.converter:v).toAttribute(t,i.type);this._$Em=e,null==r?this.removeAttribute(n):this.setAttribute(n,r),this._$Em=null}}_$AK(e,t){const i=this.constructor,n=i._$Eh.get(e);if(void 0!==n&&this._$Em!==n){const e=i.getPropertyOptions(n),r="function"==typeof e.converter?{fromAttribute:e.converter}:void 0!==e.converter?.fromAttribute?e.converter:v;this._$Em=n;const o=r.fromAttribute(t,e.type);this[n]=o??this._$Ej?.get(n)??o,this._$Em=null}}requestUpdate(e,t,i,n=!1,r){if(void 0!==e){const o=this.constructor;if(!1===n&&(r=this[e]),i??=o.getPropertyOptions(e),!((i.hasChanged??y)(r,t)||i.useDefault&&i.reflect&&r===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:n,wrapped:r},o){i&&!(this._$Ej??=new Map).has(e)&&(this._$Ej.set(e,o??t??this[e]),!0!==r||void 0!==o)||(this._$AL.has(e)||(this.hasUpdated||i||(t=void 0),this._$AL.set(e,t)),!0===n&&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,n=this[t];!0!==e||this._$AL.has(t)||void 0===n||this.C(t,void 0,i,n)}}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}),(p.reactiveElementVersions??=[]).push("2.1.2");const k=globalThis,x=e=>e,S=k.trustedTypes,$=S?S.createPolicy("lit-html",{createHTML:e=>e}):void 0,M="$lit$",R=`lit$${Math.random().toFixed(9).slice(2)}$`,C="?"+R,T=`<${C}>`,D=document,A=()=>D.createComment(""),P=e=>null===e||"object"!=typeof e&&"function"!=typeof e,F=Array.isArray,z="[ \t\n\f\r]",I=/<(?:(!--|\/[^a-zA-Z])|(\/?[a-zA-Z][^>\s]*)|(\/?$))/g,O=/-->/g,E=/>/g,N=RegExp(`>|${z}(?:([^\\s"'>=/]+)(${z}*=${z}*(?:[^ \t\n\f\r"'\`<>=]|("|')|))|$)`,"g"),H=/'/g,L=/"/g,B=/^(?:script|style|textarea|title)$/i,q=e=>(t,...i)=>({_$litType$:e,strings:t,values:i}),j=q(1),W=q(2),U=Symbol.for("lit-noChange"),G=Symbol.for("lit-nothing"),V=new WeakMap,K=D.createTreeWalker(D,129);function Y(e,t){if(!F(e)||!e.hasOwnProperty("raw"))throw Error("invalid template strings array");return void 0!==$?$.createHTML(t):t}const X=(e,t)=>{const i=e.length-1,n=[];let r,o=2===t?"":3===t?"":"")),n]};class Z{constructor({strings:e,_$litType$:t},i){let n;this.parts=[];let r=0,o=0;const s=e.length-1,a=this.parts,[l,c]=X(e,t);if(this.el=Z.createElement(l,i),K.currentNode=this.el.content,2===t||3===t){const e=this.el.content.firstChild;e.replaceWith(...e.childNodes)}for(;null!==(n=K.nextNode())&&a.length0){n.textContent=S?S.emptyScript:"";for(let i=0;iF(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&&P(this._$AH)?this._$AA.nextSibling.data=e:this.T(D.createTextNode(e)),this._$AH=e}$(e){const{values:t,_$litType$:i}=e,n="number"==typeof i?this._$AC(e):(void 0===i.el&&(i.el=Z.createElement(Y(i.h,i.h[0]),this.options)),i);if(this._$AH?._$AD===n)this._$AH.p(t);else{const e=new Q(n,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 Z(e)),t}k(e){F(this._$AH)||(this._$AH=[],this._$AR());const t=this._$AH;let i,n=0;for(const r of e)n===t.length?t.push(i=new ee(this.O(A()),this.O(A()),this,this.options)):i=t[n],i._$AI(r),n++;n2||""!==i[0]||""!==i[1]?(this._$AH=Array(i.length-1).fill(new String),this.strings=i):this._$AH=G}_$AI(e,t=this,i,n){const r=this.strings;let o=!1;if(void 0===r)e=J(this,e,t,0),o=!P(e)||e!==this._$AH&&e!==U,o&&(this._$AH=e);else{const n=e;let s,a;for(e=r[0],s=0;s{const n=i?.renderBefore??t;let r=n._$litPart$;if(void 0===r){const e=i?.renderBefore??null;n._$litPart$=r=new ee(t.insertBefore(A(),e),e,void 0,i??{})}return r._$AI(e),r},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 ue=2,pe=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{I:me}=se,ge=e=>e,fe=(e,t)=>void 0!==e?._$litType$,ve=()=>document.createComment(""),ye=(e,t,i)=>{const n=e._$AA.parentNode,r=void 0===t?e._$AB:t._$AA;if(void 0===i){const t=n.insertBefore(ve(),r),o=n.insertBefore(ve(),r);i=new me(t,o,e,e.options)}else{const t=i._$AB.nextSibling,o=i._$AM,s=o!==e;if(s){let t;i._$AQ?.(e),i._$AM=e,void 0!==i._$AP&&(t=e._$AU)!==o._$AU&&i._$AP(t)}if(t!==r||s){let e=i._$AA;for(;e!==t;){const t=ge(e).nextSibling;ge(n).insertBefore(e,r),e=t}}}return i},be=(e,t,i=e)=>(e._$AI(t,i),e),we={},ke=(e,t=we)=>e._$AH=t,xe=e=>e._$AH,Se=e=>{e._$AR(),e._$AA.remove()},$e=e=>(e=>null!=e?._$litType$?.h)(e)?e._$litType$.h:e.strings,Me=pe(class extends _e{constructor(e){super(e),this.et=new WeakMap}render(e){return[e]}update(e,[t]){const i=fe(this.it)?$e(this.it):null,n=fe(t)?$e(t):null;if(null!==i&&(null===n||i!==n)){const t=xe(e).pop();let n=this.et.get(i);if(void 0===n){const e=document.createDocumentFragment();n=le(G,e),n.setConnected(!1),this.et.set(i,n)}ke(n,[t]),ye(n,void 0,t)}if(null!==n){if(null===i||i!==n){const t=this.et.get(n);if(void 0!==t){const i=xe(t).pop();(e=>{e._$AR()})(e),ye(e,void 0,i),ke(e,[i])}}this.it=t}else this.it=void 0;return this.render(t)}}),Re=pe(class extends _e{constructor(){super(...arguments),this.key=G}render(e,t){return this.key=e,t}update(e,[t,i]){return t!==this.key&&(ke(e),this.key=t),i}}),Ce=(e,t,i)=>{const n=new Map;for(let r=t;r<=i;r++)n.set(e[r],r);return n},Te=pe(class extends _e{constructor(e){if(super(e),e.type!==ue)throw Error("repeat() can only be used in text expressions")}dt(e,t,i){let n;void 0===i?i=t:void 0!==t&&(n=t);const r=[],o=[];let s=0;for(const t of e)r[s]=n?n(t,s):s,o[s]=i(t,s),s++;return{values:o,keys:r}}render(e,t,i){return this.dt(e,t,i).values}update(e,[t,i,n]){const r=xe(e),{values:o,keys:s}=this.dt(t,i,n);if(!Array.isArray(r))return this.ut=s,o;const a=this.ut??=[],l=[];let c,h,d=0,u=r.length-1,p=0,_=o.length-1;for(;d<=u&&p<=_;)if(null===r[d])d++;else if(null===r[u])u--;else if(a[d]===s[p])l[p]=be(r[d],o[p]),d++,p++;else if(a[u]===s[_])l[_]=be(r[u],o[_]),u--,_--;else if(a[d]===s[_])l[_]=be(r[d],o[_]),ye(e,l[_+1],r[d]),d++,_--;else if(a[u]===s[p])l[p]=be(r[u],o[p]),ye(e,r[d],r[u]),u--,p++;else if(void 0===c&&(c=Ce(s,p,_),h=Ce(a,d,u)),c.has(a[d]))if(c.has(a[u])){const t=h.get(s[p]),i=void 0!==t?r[t]:null;if(null===i){const t=ye(e,r[d]);be(t,o[p]),l[p]=t}else l[p]=be(i,o[p]),ye(e,r[d],i),r[t]=null;p++}else Se(r[u]),u--;else Se(r[d]),d++;for(;p<=_;){const t=ye(e,l[_+1]);be(t,o[p]),l[p++]=t}for(;d<=u;){const e=r[d++];null!==e&&Se(e)}return this.ut=s,ke(e,l),U}}),De=new WeakMap;let Ae=0;class Pe extends he{constructor(){super(...arguments),this.title="",this.icon="",this.wide=!1,this.alert=!1,this.describedBy="",this.dismissOnScrim=!1,this.flexContent=!1,this.hass=null,this._opener=null,this._focusRoot=null,this._useHaDialog=null,this._closing=!1,this._overlays=[],this._titleId="hp-dialog-title-"+ ++Ae,this._focusInitial=()=>{const e=this._focusableElements(),t=e.find(e=>e.hasAttribute("autofocus"))||e[0]||(this._usesHaDialog()?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._usesHaDialog())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 n=this._deepActiveElement(),r=i[0],o=i[i.length-1];!e.shiftKey||n!==r&&i.includes(n)?e.shiftKey||n!==o||(e.preventDefault(),r.focus()):(e.preventDefault(),o.focus())},this._onFallbackCancel=e=>{e.preventDefault(),this._requestClose()},this._onFallbackClick=e=>{this.dismissOnScrim&&e.target===e.currentTarget&&this._requestClose()}}_usesHaDialog(){return!0===this._useHaDialog&&!this.alert}connectedCallback(){this.setAttribute("data-hp","dialog"),super.connectedCallback(),this._opener=this._deepActiveElement();const e=this.getRootNode();this._focusRoot=e;const t=De.get(e)||{dialogs:new Set,opener:this._opener};t.dialogs.add(this),De.set(e,t),null===this._useHaDialog&&(this._useHaDialog=!!customElements.get("ha-dialog")),this.addEventListener("keydown",this._onKeyDown,!0),queueMicrotask(()=>{this._ensureNativeModal()&&this._focusInitial()})}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 n=t?De.get(t):void 0;n?.dialogs.delete(this),super.disconnectedCallback(),t&&n&&requestAnimationFrame(()=>{const e=De.get(t);if(!e)return;if(!e.dialogs.size)return e.opener?.isConnected&&e.opener.focus({preventScroll:!0}),void De.delete(t);const n=i?.closest("hp-dialog");i?.isConnected&&n&&e.dialogs.has(n)&&i.focus({preventScroll:!0})})}firstUpdated(e){super.firstUpdated(e),this._ensureNativeModal(),queueMicrotask(()=>this._focusInitial())}updated(e){super.updated(e),this._ensureNativeModal()}_ensureNativeModal(){if(this._usesHaDialog()||!this.isConnected)return!1;const e=this.renderRoot.querySelector("dialog");if(!e?.isConnected)return!1;try{return!e.matches(":modal")&&(e.open&&e.close(),e.showModal(),!0)}catch{return!1}}_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,n=r=>{if(!i.has(r)){if(i.add(r),r instanceof HTMLElement){if(r.matches(e)&&t.push(r),r instanceof HTMLSlotElement){for(const e of r.assignedNodes({flatten:!0}))n(e);return}if(r.shadowRoot){for(const e of r.shadowRoot.childNodes)n(e);return}}for(const e of r.childNodes)n(e)}};for(const e of this.childNodes)n(e);const r=this.overlayPortal();return r&&n(r),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})}rejectClose(){this._closing=!1,this.requestUpdate()}_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 n={...e,group:i,token:Symbol("hp-overlay")};this._overlays.push(n);let r=!1;return()=>{if(r)return;r=!0;const e=this._overlays.findIndex(e=>e.token===n.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=j`
${this.icon?j``:G}
${this.title}`;return this._usesHaDialog()?this.describedBy?j`${e.map(e=>"path"in e?W``:"poly"in e?W``:W``)}`}const Cr={color:"#607d8b",opacity:1,widthCm:3.6,fill:!1,fillColor:"#607d8b",fillOpacity:.25},Tr=(e,t=1)=>{const i=Number(e);return Number.isFinite(i)?Math.min(1,Math.max(0,i)):t},Dr=e=>{let t=Number(e);return Number.isFinite(t)?(t=(t%360+360)%360,t>180?t-360:t):0};function Ar(e,t,i){return Dr(t)?[e.x,e.y]:i([e.x,e.y])}function Pr(e,t,i,n){const r=Math.abs(i[0]-t[0]),o=Math.abs(i[1]-t[1]);return"line"===e?Math.hypot(r,o)>=n:r>=n&&o>=n}const Fr=(e,t,i)=>{const n=Number(e),r=Number.isFinite(t)&&t>0?t:5;return Number.isFinite(n)&&n>0?n/r*i:0},zr=(e,t,i)=>{const n=Number(e),r=Number.isFinite(t)&&t>0?t:5;return Number.isFinite(n)&&i>0?n/i*r:0},Ir=(e,t,i,n=Cr.widthCm)=>{const r=Number(e?.width_cm);if(Number.isFinite(r)&&r>0)return r;const o=Number(e?.width);return Number.isFinite(o)&&o>0?zr(o,t,i):n};function Or(e){const t=Cr;return e.color===t.color&&e.opacity===t.opacity&&e.widthCm===t.widthCm&&e.fill===t.fill&&e.fillColor===t.fillColor&&e.fillOpacity===t.fillOpacity?null:{color:e.color,opacity:Tr(e.opacity),width_cm:Math.max(.1,Math.min(100,Number(e.widthCm)||.1)),fill:!!e.fill,fill_color:e.fillColor,fill_opacity:Tr(e.fillOpacity,.25)}}function Er(e,t){return{color:e.color,opacity:Tr(e.opacity),width_cm:Math.max(.1,Math.min(100,Number(e.widthCm)||.1)),...t?{fill:e.fill,fill_color:e.fillColor,fill_opacity:Tr(e.fillOpacity,.25)}:{}}}function Nr(e){const t=e.x+e.w/2,i=e.y+e.h/2,n=Dr(e.angle)*Math.PI/180,r=Math.cos(n),o=Math.sin(n),s=(e,n)=>{const s=e-t,a=n-i;return[t+s*r-a*o,i+s*o+a*r]};return[s(e.x,e.y),s(e.x+e.w,e.y),s(e.x+e.w,e.y+e.h),s(e.x,e.y+e.h)]}function Hr(e){const t=Nr(e),i=(e,t)=>[(e[0]+t[0])/2,(e[1]+t[1])/2],n=[(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]),n],segments:t.map((e,i)=>({a:e,b:t[(i+1)%4]}))}}function Lr(e,t,i,n,r,o,s,a){const l=Dr(e.angle)*Math.PI/180,c=Math.cos(l),h=Math.sin(l),d=-Math.sin(l),u=Math.cos(l),p=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=p+m*c+g*d,v=_+m*h+g*u,y=n-f,b=r-v;let w=(y*c+b*h)*(t>0?1:-1),k=(y*d+b*u)*(i>0?1:-1),x=null;if(o){const t=w/Math.max(e.w,a),i=k/Math.max(e.h,a);x=Math.max(a/Math.max(e.w,a),a/Math.max(e.h,a),t,i),w=e.w*x,k=e.h*x}if(s>0)if(o){const t=Math.max(1,Math.round(e.w/s)),i=Math.max(1,Math.round(e.h/s));if(Math.abs(e.w-t*s)<1e-6&&Math.abs(e.h-i*s)<1e-6){const n=(e,t)=>{let i=Math.abs(e),n=Math.abs(t);for(;n;)[i,n]=[n,i%n];return Math.max(1,i)},r=1/n(t,i),o=Math.max(a/e.w,a/e.h),s=Math.max(o,Math.round((x??1)/r)*r);w=e.w*s,k=e.h*s}else{e.w>=e.h?(w=Math.round(w/s)*s,k=w*(e.h/Math.max(e.w,a))):(k=Math.round(k/s)*s,w=k*(e.w/Math.max(e.h,a)))}}else w=Math.round(w/s)*s,k=Math.round(k/s)*s;w=Math.max(a,w),k=Math.max(a,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)*u-k/2,w:w,h:k,angle:Dr(e.angle)||void 0}}const Br=(e,t,i)=>{const n=i[0]-t[0],r=i[1]-t[1],o=n*n+r*r;if(o<1e-12)return[...t];const s=Math.max(0,Math.min(1,((e[0]-t[0])*n+(e[1]-t[1])*r)/o));return[t[0]+n*s,t[1]+r*s]};function qr(e,t,i,n){const r=n(e);let o=null;for(const r of t.points){const t=n(r),s=Math.hypot(t[0]-e[0],t[1]-e[1]);s<=i&&(!o||se.points),segments:e.flatMap(e=>e.segments)}}const Wr=Math.tan(.25*Math.PI/180);function Ur(e,t){const i=Math.abs(Number(t[0])-Number(e[0])),n=Math.abs(Number(t[1])-Number(e[1]));if(!([i,n].every(Number.isFinite)&&i>0&&n>0))return null;const r=i>=n?"horizontal":"vertical",o=Math.max(i,n),s=Math.min(i,n);return s/o>Wr?null:{axis:r,major:o,minor:s,angleDegrees:180*Math.atan2(s,o)/Math.PI}}function Gr(e,t){const i=Ur(e,t);return i?"horizontal"===i.axis?[Number(t[0]),Number(e[1])]:[Number(e[0]),Number(t[1])]:[Number(t[0]),Number(t[1])]}const Vr=e=>`${e[0]},${e[1]}`,Kr=(e,t)=>e[0]===t[0]&&e[1]===t[1],Yr=(e,t)=>{const i=Vr(e),n=Vr(t);return i{let t=0;for(let i=0;i{if(e.length<3)return!1;for(let t=0;t1e-12},Jr=(e,t)=>Kr(e,t.from)?[...t.to]:[...e],Qr=(e,t)=>e.map(e=>Array.isArray(e?.poly)?{...e,poly:e.poly.map(e=>Jr(e,t))}:e),eo=(e,t,i)=>{const n=e.flatMap((e,t)=>ni(e)?.some(e=>Kr(e,i.from))?[t]:[]);if(!n.length)return!1;for(const i of n){const n=ni(e[i]),r=ni(t[i]);if(!n||!r)continue;if(!Zr(r))return!1;const o=Math.sign(Xr(n)),s=Math.sign(Xr(r));if(o&&s&&o!==s)return!1}const r=new Set;for(const e of n){const i=ni(t[e]);if(i)for(let n=0;n{let i=0;for(const n of e){const e=ni(n);if(e)for(let n=0;n{const{a:i,b:n,axis:r}=e,o="horizontal"===r?{from:n,to:[n[0],i[1]]}:{from:n,to:[i[0],n[1]]},s="horizontal"===r?{from:i,to:[i[0],n[1]]}:{from:i,to:[n[0],i[1]]};return[{move:o,preservedDegree:to(t,i)},{move:s,preservedDegree:to(t,n)}].sort((e,t)=>t.preservedDegree-e.preservedDegree||Vr(e.move.to).localeCompare(Vr(t.move.to))||Vr(e.move.from).localeCompare(Vr(t.move.from))).map(e=>e.move)};function no(e){const t=JSON.parse(JSON.stringify(e||{}));let i=Array.isArray(t.rooms)?t.rooms:[];const n=new Map;for(const e of i){const t=ni(e);if(t)for(let e=0;ee.key.localeCompare(t.key))){let t=null;for(const n of io(e,i)){const e=a.get(Vr(n.from));if(e&&e!==Vr(n.to))continue;const r=Qr(i,n);if(eo(i,r,n)){t=n,i=r;break}}t?(a.set(Vr(t.from),Vr(t.to)),r++,s=Math.max(s,Math.hypot(t.to[0]-t.from[0],t.to[1]-t.from[1]))):o++}t.rooms=i;for(const e of t.partitions||[]){if(!Array.isArray(e?.a)||!Array.isArray(e?.b))continue;const i=Ur(e.a,e.b);if(!i)continue;const n={key:String(e.id||Yr(e.a,e.b)),a:[...e.a],b:[...e.b],axis:i.axis};let a=null;for(const i of io(n,[{poly:[e.a,e.b]}])){const n=Jr(e.a,i),r=Jr(e.b,i),o=Math.hypot(r[0]-n[0],r[1]-n[1]);if(!(o>0))continue;const s=(t.openings||[]).filter(t=>"partition"===t?.host?.kind&&t.host.id===e.id).every(e=>{const t=Number(e.host.t),i=Number(e.length);return Number.isFinite(t)&&t>=0&&t<=1&&Number.isFinite(i)&&i>0&&t*o-i/2>=-1e-12&&t*o+i/2<=o+1e-12});if(s){a=i,e.a=n,e.b=r;break}}a?(r++,s=Math.max(s,Math.hypot(a.to[0]-a.from[0],a.to[1]-a.from[1]))):o++}return{space:t,report:{wallsStraightened:r,wallsStraightenSkipped:o,maxStraightenShift:s},changed:r>0}}const ro=["rect","ellipse","furniture","image"],oo=10**9,so=240,ao=1e-4;function lo(e){if(Array.isArray(e))return e.map(e=>lo(e));if(null!==e&&"object"==typeof e){const t={};for(const[i,n]of Object.entries(e))t[i]=lo(n);return t}return e}function co(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)*oo+.5)/oo);return 0===t?0:t}function ho(e){if("number"!=typeof e||!Number.isFinite(e))return e;const t=e*so,i=Math.round(t);if(Math.abs(t-i)null!==po(e)):[]}function mo(e){return"string"==typeof e&&ro.includes(e)}function go(e,t){for(const i of t)Object.prototype.hasOwnProperty.call(e,i)&&(e[i]=co(e[i]))}function fo(e,t){for(const i of t)Object.prototype.hasOwnProperty.call(e,i)&&(e[i]=ho(e[i]))}function vo(e){if(Array.isArray(e))for(let t=0;t{for(const r of n){const n=t[r];"number"==typeof n&&Number.isFinite(n)&&i(n,e)}},n=t=>{if(Array.isArray(t))for(let n=0;n{if(Array.isArray(e))for(const t of e)n(t)};for(const i of _o(e.rooms))t(i,["x","y","w","h"]),r(i.poly);for(const t of _o(e.walls))n(t.a),n(t.b);for(const t of _o(e.wall_segments))n(t.a),n(t.b);for(const i of _o(e.openings))t(i,["x","y"]);for(const i of _o(e.decor))"line"===i.kind?t(i,["x1","y1","x2","y2"]):mo(i.kind)?t(i,["x","y","w","h"]):"text"===i.kind&&t(i,["x","y"]);for(const t of _o(e.room_drafts))r(t.points);for(const t of _o(e.partitions))n(t.a),n(t.b);for(const t of _o(e.wall_columns))n(t.center);for(const t of _o(e.open_spans))n(t.a),n(t.b)}const r=po(t);if(!r)return;const o=new Map;if(n)for(const e of _o(n.spaces))null!=e.id&&o.set(String(e.id),e);for(const e of Object.values(r)){const t=po(e);if(!t)continue;const n=null!=t.s&&o.get(String(t.s))||null;for(const e of["x","y"]){const r=t[e];"number"==typeof r&&Number.isFinite(r)&&i(r,n)}}}function wo(e){const t=Number(e?.cell_cm);return t>0?t:5}function ko(e,t={}){const i={canonicalized:0,far:0,maxShift:0,maxShiftCm:0,spaces:[],bySpace:new Map},n=_o(po(e)?.spaces);let r=5;for(const e of n)r=Math.max(r,wo(e));bo(e,t,(e,t)=>{const n=e*so,o=Math.abs(n-Math.round(n)),s=ho(e),a=o>0&&o=ao))return;const l=a&&"number"==typeof s?Math.abs(s-e):0;if(a?i.canonicalized++:i.far++,i.maxShift=Math.max(i.maxShift,l),i.maxShiftCm=Math.max(i.maxShiftCm,l*so*(t?wo(t):r)),!t?.id||!a)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*so*wo(t))}),i.bySpace.size&&bo(e,t,(e,t)=>{if(!t?.id)return;const n=i.bySpace.get(String(t.id));if(!n)return;const r=e*so;Math.abs(r-Math.round(r))>=ao&&n.far++}),i.spaces=[...i.bySpace.values()];const{bySpace:o,...s}=i;return s}function xo(e){return function(e){const t=e,i=po(t);i&&fo(i,["x","y"]);return t}(lo(e))}function So(e){const t=e,i=po(t);if(!i)return t;for(const e of Object.values(i)){const t=po(e);t&&fo(t,["x","y"])}return t}function $o(e){return Mo(lo(e))}function Mo(e){const t=e,i=po(t);if(!i)return t;for(const e of _o(i.spaces)){go(e,["plan_x","plan_y","plan_scale","plan_scale_x","plan_scale_y","plan_angle"]);for(const t of _o(e.rooms))fo(t,["x","y","w","h"]),yo(t.poly);for(const t of _o(e.walls))vo(t.a),vo(t.b);for(const t of _o(e.wall_segments))vo(t.a),vo(t.b);for(const t of _o(e.openings)){fo(t,["x","y"]),go(t,["angle","length"]);const e=po(t.host);e&&go(e,["t"])}for(const t of _o(e.decor))"line"===t.kind?fo(t,["x1","y1","x2","y2"]):mo(t.kind)?(fo(t,["x","y","w","h"]),go(t,["angle"])):"text"===t.kind&&(fo(t,["x","y"]),go(t,["scale","angle"]));for(const t of _o(e.room_drafts))yo(t.points);for(const t of _o(e.partitions))vo(t.a),vo(t.b);for(const t of _o(e.wall_columns))vo(t.center),"square"===t.shape&&go(t,["angle"]);for(const t of _o(e.open_spans))vo(t.a),vo(t.b)}for(const e of _o(i.markers))go(e,["angle"]);return t}const Ro=15,Co=8;function To(e,t,i,n,r){const o=i[0]-e[0],s=i[1]-e[1],a=Math.hypot(o,s);if(!(a>0)||a<=r+1e-9)return null;const l=o/a,c=s/a,h=t=>{const n=(t[0]-e[0])*l+(t[1]-e[1])*c,o=(r-n)/(a-n);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),u=h(n);return d&&u?[[e[0],e[1]],t,d,u,n]:null}const Do=Math.sin(.25*Math.PI/180);function Ao(e,t){return Number.isFinite(e)&&e>0&&Number.isFinite(t)&&t>0&&e*t<3}function Po(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 Fo(e,t){return Number.isFinite(e)&&e>0&&Number.isFinite(t)&&t>0&&e*t<2}function zo(e){return Number.isFinite(e)?Math.max(1,Math.min(100,e)):1}function Io(e,t){return!Number.isFinite(e)||e<0?"":String(t?Math.round(e/2.54*100)/100:Math.round(100*e)/100)}function Oo(e,t,i){if(!Number.isFinite(e)||e<=0)return 0;const n=Number(t)>0?Number(t):5;return zo(e)/n*i}function Eo(e,t){return t>0&&Number.isFinite(e)?Math.round(e/t)*t:e}function No(e){return Math.max(1e-6*Math.abs(e),1e-9)}function Ho(e,t){if(!(t>0&&Number.isFinite(e)))return e;const i=Eo(e,t);return Math.abs(i-e)<=No(t)?i:e}function Lo(e,t){let i=t[0]-e[0],n=t[1]-e[1];const r=Math.hypot(i,n);return r<1e-12?[1,0]:(i/=r,n/=r,(i<-1e-12||Math.abs(i)<=1e-12&&n<0)&&(i=-i,n=-n),[i,n])}function Bo(e,t,i){const n=[Ho(e[0],i),Ho(e[1],i)],r=[Ho(t[0],i),Ho(t[1],i)],o=Eo((n[0]+r[0])/2,i),s=Eo((n[1]+r[1])/2,i),[a,l]=Lo(n,r);let c=Math.atan2(l,a);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)},${s.toFixed(d)}@${h.toFixed(4)}`}function qo(e,t,i,n){return 1===n?Bo(e,t,i):Bo([e[0]/n,e[1]/n],[t[0]/n,t[1]/n],i)}function jo(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 n=t>0?t:1;return[[i[0]*n,i[1]*n],[i[2]*n,i[3]*n]]}function Wo(e,t,i,n,r){const o=r>0?r:1;return{key:qo(e,t,n,o),cm:zo(i),a:[e[0]/o,e[1]/o],b:[t[0]/o,t[1]/o]}}function Uo(e,t){const i=t>0?t:1,n=[];for(const t of e){const e=t.key.lastIndexOf("@");if(e<0)continue;const[r,o]=t.key.slice(0,e).split(",").map(Number),s=Number(t.key.slice(e+1));[r,o,s].every(Number.isFinite)&&n.push({w:t,x:r*i,y:o*i,ang:s})}return n}function Go(e,t){const[i,n]=Lo(e,t);let r=Math.atan2(n,i);return r<0&&(r+=Math.PI),r}function Vo(e,t){let i=Math.abs(e-t);return i>Math.PI/2&&(i=Math.PI-i),i<.02}function Ko(e,t,i,n,r=1){if(!e?.length)return null;const o=qo(t,i,n,r),s=e.find(e=>e.key===o);if(s)return s;const a=r>0?r:1,l=No(n)*a,c=(e,t)=>Math.abs(e[0]-t[0])<=l&&Math.abs(e[1]-t[1])<=l;for(const n of e){const e=jo(n,a);if(e&&(c(e[0],t)&&c(e[1],i)||c(e[0],i)&&c(e[1],t)))return n}const h=(t[0]+i[0])/2,d=(t[1]+i[1])/2,u=Go(t,i),p=Math.max(.5*n,1e-9)*a;for(const t of Uo(e,a))if(Vo(t.ang,u)&&Math.hypot(t.x-h,t.y-d)<=p)return t.w;return null}function Yo(e,t,i,n,r=1){const o=Ko(e,t,i,n,r);if(o&&o.cm>0)return zo(o.cm);const s=function(e,t,i,n,r){if(!e?.length)return null;const o=r>0?r:1,s=Math.hypot(i[0]-t[0],i[1]-t[1]);if(s<1e-12)return null;const a=Go(t,i),l=Math.max(.5*n,1e-9)*o;let c=null;for(const n of e){if(!(n.cm>0))continue;const e=jo(n,o);if(!e)continue;const r=Math.hypot(e[1][0]-e[0][0],e[1][1]-e[0][1]);if(r<1e-12||!Vo(Go(e[0],e[1]),a))continue;if(Ns(t[0],t[1],e[0][0],e[0][1],e[1][0],e[1][1])>l||Ns(i[0],i[1],e[0][0],e[0][1],e[1][0],e[1][1])>l)continue;if(r+l(o.has(e.key)||(e=>{const t=jo(e,n);if(!t)return!1;const[i,o]=t,a=o[0]-i[0],c=o[1]-i[1],h=Math.hypot(a,c);if(h<=l)return!1;if(!s.some(e=>{const t=[e[0],e[1]],n=[e[2],e[3]];return Vo(Go(i,o),Go(t,n))&&Ns(i[0],i[1],t[0],t[1],n[0],n[1])<=l&&Ns(o[0],o[1],t[0],t[1],n[0],n[1])<=l}))return!1;const d=(r||[]).some(e=>{const t=[e[0],e[1]],n=[e[2],e[3]];if(!Vo(Go(i,o),Go(t,n)))return!1;const r=e=>Math.abs((e[0]-i[0])*c-(e[1]-i[1])*a)/h;if(r(t)>l||r(n)>l)return!1;const s=h*h,d=((t[0]-i[0])*a+(t[1]-i[1])*c)/s,u=((n[0]-i[0])*a+(n[1]-i[1])*c)/s;return Math.min(1,Math.max(d,u))-Math.max(0,Math.min(d,u))>l/h});return!d})(e))&&e.cm>=1&&e.cm<=100)}function Zo(e,t,i,n=8){const[r,o]=Lo(e,t);let s=Math.atan2(o,r);s<0&&(s+=Math.PI);let a=i*Math.PI/180%Math.PI;a<0&&(a+=Math.PI);let l=Math.abs(s-a);return l>Math.PI/2&&(l=Math.PI-l),l<=n*Math.PI/180}function Jo(e,t,i,n,r=1,o="affine",s){if(!e?.length)return[];if(t.length!==i.length)return"fixed-topology"===o&&s?.(),e.slice();const a=r>0?r:1,l=Math.max(.5*n,1e-9)*a,c=Math.max(n*a*1e-6,1e-9),h=[],d=new Map,u=new Map,p=(e,t,i)=>{const n=e.get(t)||new Set;n.add(i),e.set(t,n)};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],n=t.na[1]-t.oa[1],r=t.nb[0]-t.ob[0],o=t.nb[1]-t.ob[1];return Math.hypot(i-r,n-o)<=c?[e[0]+i,e[1]+n]: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,n]=Lo(e,t);return(t[0]-e[0])*i+(t[1]-e[1])*n>=0?[[...e],[...t]]:[[...t],[...e]]},v=[],y=[],b=(e,t,i)=>{if(Math.hypot(t[0]-e[0],t[1]-e[1])<=c)return;const[r,o]=f(e,t),s=zo(i);if(y.some(e=>e.entry.cm===s&&m(e.span[0],r)&&m(e.span[1],o)))return;const l=Wo(r,o,s,n,a);v.push(l),y.push({entry:l,span:[r,o]})};for(const t of e){const e=jo(t,a);if(e){const[i,n]=f(e[0],e[1]),r=n[0]-i[0],s=n[1]-i[1],a=r*r+s*s,d=Math.sqrt(a);if(d<=c){v.push({...t,cm:zo(t.cm)});continue}const u=[];for(const e of h){if(!Vo(Go(i,n),Go(e.oa,e.ob)))continue;const t=e=>Math.abs((e[0]-i[0])*s-(e[1]-i[1])*r)/d;if(t(e.oa)>l||t(e.ob)>l)continue;const o=((e.oa[0]-i[0])*r+(e.oa[1]-i[1])*s)/a,h=((e.ob[0]-i[0])*r+(e.ob[1]-i[1])*s)/a,p=Math.max(0,Math.min(o,h)),_=Math.min(1,Math.max(o,h));(_-p)*d>c&&u.push({lo:p,hi:_,move:e})}if(!u.length){"fixed-topology"===o?v.push({...t}):b(i,n,t.cm);continue}const p=[0,1,...u.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),y=[];for(let e=0;e+1a>=e.lo-1e-12&&a<=e.hi+1e-12);if(!l.length){y.push([o,s]);continue}const h=[g(o,l[0].move),g(s,l[0].move)],f=l.slice(1).some(e=>{const t=g(o,e.move),i=g(s,e.move);return!m(h[0],t)||!m(h[1],i)});y.push(f?[o,s]:h)}const w=(e,t)=>{const i=e[1][0]-e[0][0],n=e[1][1]-e[0][1],r=t[1][0]-t[0][0],o=t[1][1]-t[0][1],s=Math.hypot(i,n);return!(s<=c||i*r+n*o<=0)&&Math.abs(i*o-n*r)/s<=c},k=[];for(const e of y){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,n]=k[0];if(m(i,e[0])&&m(n,e[1])||m(i,e[1])&&m(n,e[0])){v.push({...t});continue}}for(const[e,i]of k)b(e,i,t.cm);continue}if("fixed-topology"===o){const e=u.get(t.key);if(1===e?.size){const i=[...e][0];v.push(i===t.key?{...t}:{...t,key:i});continue}const i=[Uo([t],a)[0]];1!==a&&i.push(Uo([t],1)[0]);const n=i.filter(Boolean).some(e=>h.some(t=>{if(!Vo(e.ang,Go(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&&Ns(e.x,e.y,t.oa[0],t.oa[1],t.ob[0],t.ob[1])<=l}));((e?.size||0)>1||n)&&s?.(),v.push({...t});continue}let i="";const r=d.get(t.key);if(1===r?.size&&(i=[...r][0]),!i){const e=Uo([t],a)[0];if(e){const t=new Set;for(const i of h){if(!Vo(e.ang,Go(i.oa,i.ob)))continue;const r=((e.x-i.oa[0])*i.dx+(e.y-i.oa[1])*i.dy)/i.len2;if(r<-1e-6||r>1.000001)continue;if(Ns(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),[s,c]=Lo(i.na,i.nb),h=Math.max(n*a,1e-6);t.add(qo([o[0]-s*h,o[1]-c*h],[o[0]+s*h,o[1]+c*h],n,a))}1===t.size&&(i=[...t][0])}}v.push({...t,key:i||t.key,cm:zo(t.cm)})}return v}function Qo(e,t,i,n,r=1,o="affine"){return Jo(e,t,i,n,r,o)}function es(e,t,i,n,r=1,o="fixed-topology"){let s=!1;const a=Jo(e,t,i,n,r,o,()=>{s=!0});return{walls:s?(e||[]).map(e=>({...e})):a,rejected:s}}function ts(e,t,i,n=1,r=[]){const o=n>0?n:1,s=Math.abs(i),a=Math.max(s*o*ao,1e-9),l=(r||[]).flatMap(e=>{const t=jo(e,o);return t?t.map(e=>[...e]):[]}),c=e=>e.every((e,t)=>(e=>{if(!(s>0))return!0;const t=e/o/s;return Math.abs(t-Math.round(t))Math.abs(e-i[t])<=a)),h=[],d=e=>JSON.stringify([e.key,e.cm,e.a,e.b]);for(const i of e||[]){const e=jo(i,o);if(!e)continue;const[n,r]=e;if(![n[0],n[1],r[0],r[1]].every(Number.isFinite)||!c(n)||!c(r)){h.push(d(i));continue}const s=r[0]-n[0],l=r[1]-n[1],u=Math.hypot(s,l);if(u<=a){h.push(d(i));continue}const p=s/u,_=l/u,m=[];for(const e of t){const[t,i]=e;if(![t?.[0],t?.[1],i?.[0],i?.[1]].every(Number.isFinite))continue;const r=e=>Math.abs((e[0]-n[0])*_-(e[1]-n[1])*p);if(r(t)>a||r(i)>a)continue;const o=(t[0]-n[0])*p+(t[1]-n[1])*_,s=(i[0]-n[0])*p+(i[1]-n[1])*_,l=Math.max(0,Math.min(o,s)),c=Math.min(u,Math.max(o,s));c-l>a&&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+a)break;if(g=Math.max(g,t),g>=u-a)break}ge.key!==s);return null==n||n<1?a:[...a,Wo(t,i,n,r,o)]}function ns(e,t,i,n,r,o=[],s=1){let a=e?e.slice():[];for(const e of function(e,t,i,n,r=1,o=[]){const s=Ss(e,t,i,n,r,o);if(!s)return[];const a=[];for(let e=0;e0||(c=is(c,t,i,n,r,s)))}return c}function os(e){const{a:t,b:i,halfDepth:n}=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 r=i[0]-t[0],o=i[1]-t[1],s=Math.hypot(r,o);if(!(s>1e-9&&n>0&&Number.isFinite(n)))return null;const a=-o/s*n,l=r/s*n;return[[t[0]+a,t[1]+l],[i[0]+a,i[1]+l],[i[0]-a,i[1]-l],[t[0]-a,t[1]-l]]}function ss(e,t,i){return Math.hypot(e[0]-t[0],e[1]-t[1])<=i}function as(e,t,i){const n=t.b[0]-t.a[0],r=t.b[1]-t.a[1],o=n*n+r*r;if(!(o>i*i))return!1;const s=((e[0]-t.a[0])*n+(e[1]-t.a[1])*r)/o;if(!(s>0&&s<1))return!1;const a=[t.a[0]+n*s,t.a[1]+r*s];return Math.hypot(e[0]-a[0],e[1]-a[1])<=i}function ls(e,t,i,n){const r=Math.hypot(t,i);if(!(r>1e-9&&n>0))return;const o=[t/r,i/r],s=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);s?s.halfDepth=Math.max(s.halfDepth,n):e.push({u:o,halfDepth:n})}function cs(e,t){try{const i=Gt(Bs(e),Bs(t));let n=null,r=0;for(const e of i||[]){const t=e?.[0]||[],i=Math.abs(ms(t));t.length>=4&&i>r&&(r=i,n=t.slice(0,-1).map(e=>[e[0],e[1]]))}return n}catch{return null}}function hs(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 n=Math.max(Number.isFinite(t)?t:0,1e-9),r=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 r)o.some(t=>ss(t,e,n))||o.push(e);const s=[];for(const e of o){const t=[];let r=!1;for(const{segment:o,index:s}of i){const i=Math.hypot(o.b[0]-o.a[0],o.b[1]-o.a[1]);ss(e,o.a,n)?t.push({u:[(o.b[0]-o.a[0])/i,(o.b[1]-o.a[1])/i],halfDepth:o.halfDepth,length:i,index:s}):ss(e,o.b,n)?t.push({u:[(o.a[0]-o.b[0])/i,(o.a[1]-o.b[1])/i],halfDepth:o.halfDepth,length:i,index:s}):as(e,o,n)&&(r=!0)}if(r||2!==t.length)continue;const[o,a]=t,l=o.u[0]*a.u[1]-o.u[1]*a.u[0];if(Math.abs(l)<1e-9)continue;const c=l<0?1:-1,h=[-o.u[1],o.u[0]],d=[-a.u[1],a.u[0]],u=[e[0]+h[0]*o.halfDepth*c,e[1]+h[1]*o.halfDepth*c],p=[e[0]-d[0]*a.halfDepth*c,e[1]-d[1]*a.halfDepth*c];if(!vs(u,o.u,p,a.u))continue;const _=[[o,a,p,[d[0]*-c,d[1]*-c]],[a,o,u,[h[0]*c,h[1]*c]]];for(const[t,,i,r]of _){const o=Math.min(2*t.halfDepth,t.length),a=[-t.u[1]*t.halfDepth,t.u[0]*t.halfDepth],l=[[e[0]+a[0],e[1]+a[1]],[e[0]+t.u[0]*o+a[0],e[1]+t.u[1]*o+a[1]],[e[0]+t.u[0]*o-a[0],e[1]+t.u[1]*o-a[1]],[e[0]-a[0],e[1]-a[1]]],c=e=>(e[0]-i[0])*r[0]+(e[1]-i[1])*r[1],h=[];for(let e=0;e=-1e-12&&h.push(t),n>1e-12&&r<-1e-12||n<-1e-12&&r>1e-12){const e=n/(n-r);h.push([t[0]+(i[0]-t[0])*e,t[1]+(i[1]-t[1])*e])}}h.length>=3&&Math.abs(ms(h))>n*n&&s.push({segmentIndex:t.index,wedge:h})}}return s}function ds(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 n=Math.max(Number.isFinite(t)?t:0,1e-9),r=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 r)o.some(t=>ss(t,e,n))||o.push(e);const s=[],a=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=Ts(a,n);for(const e of Ds(l).fans)s.push(e);const c=e=>!!As(l,e);for(const e of o){if(c(e))continue;const t=[];for(const r of i)ss(e,r.a,n)?ls(t,r.b[0]-r.a[0],r.b[1]-r.a[1],r.halfDepth):ss(e,r.b,n)?ls(t,r.a[0]-r.b[0],r.a[1]-r.b[1],r.halfDepth):as(e,r,n)&&(ls(t,r.a[0]-e[0],r.a[1]-e[1],r.halfDepth),ls(t,r.b[0]-e[0],r.b[1]-e[1],r.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;in*n&&s.push(m)}}}return s}function us(e,t,i,n){if(!(t>0)||!e||e.length<2)return"";if(i&&e.length>=3){let i=e;const r=e[e.length-1];if(e.length>=4&&Math.hypot(e[0][0]-r[0],e[0][1]-r[1])<1e-9&&(i=e.slice(0,-1)),i.length>=3){const e=i.map((e,i)=>n?.[i]||t),r=aa(i,e),o=ws(i,e);if(r&&o)return`${ks(r)} ${ks(xs(o))}`}}const r=[];for(let i=0;i=1e-9&&a>0&&r.push({a:o,b:s,halfDepth:a})}const o=r.map(os);for(const{segmentIndex:e,wedge:t}of hs(r)){const i=o[e];if(!i)continue;const n=cs(i,t);n&&(o[e]=n)}const s=[...o.filter(e=>!!e),...ds(r)],a=function(e){let t=null;try{for(const i of e){if(i.length<3)continue;const e=Bs(i);t=t?Wt(t,e):[e]}return t}catch{return null}}(s);return a?Qs(a):s.map(e=>ks(e)).join(" ")}function ps(e,t,i,n,r=1){if(!i.length)return!1;const o=_s(n,r),s=(e[0]+t[0])/2,a=(e[1]+t[1])/2,[l,c]=Lo(e,t);for(const e of i){const[t,i]=Lo([e[0],e[1]],[e[2],e[3]]);if(!(Math.abs(l*i-c*t)>.05)&&Ns(s,a,e[0],e[1],e[2],e[3])<=o)return!0}return!1}function _s(e,t){return Math.max(e*(t>0?t:1)*.04,1e-9)}function ms(e){let t=0;for(let i=0;ie[1]!=l>e[1]&&e[0]<(a-o)*(e[1]-s)/(l-s+0)+o&&(i=!i)}return i}([c[0]+.001*a,c[1]+.001*l],e)||(a=-a,l=-l),[a,l]}function fs(e,t){const i=e[0]*t[1]-e[1]*t[0],n=e[0]*t[0]+e[1]*t[1];return Math.abs(i)<1e-9&&n>0}function vs(e,t,i,n){const r=t[0]*n[1]-t[1]*n[0];if(Math.abs(r)<1e-12)return null;const o=[i[0]-e[0],i[1]-e[1]],s=(o[0]*n[1]-o[1]*n[0])/r;return[e[0]+s*t[0],e[1]+s*t[1]]}function ys(e,t,i){const n=e?.length||0;if(n<3||!Array.isArray(i)||i.length!==n)return 0;const r=(Math.trunc(t)%n+n)%n,o=e[r],s=e[(r+1)%n],a=s[0]-o[0],l=s[1]-o[1],c=Math.hypot(a,l);if(!(c>0))return 0;const h=Math.max(0,Number(i[r])||0);if(!(h>0))return c;const d=[a/c,l/c],u=gs(e,r),p=[o[0]+u[0]*h,o[1]+u[1]*h],_=t=>{const r=Math.max(0,Number(i[t])||0);if(!(r>0))return null;const s=e[t],a=e[(t+1)%n],l=a[0]-s[0],c=a[1]-s[1],h=Math.hypot(l,c);if(!(h>0))return null;const u=gs(e,t),_=vs(p,d,[s[0]+u[0]*r,s[1]+u[1]*r],[l/h,c/h]);return _?(_[0]-o[0])*d[0]+(_[1]-o[1])*d[1]:null},m=_((r-1+n)%n)??0,g=(_((r+1)%n)??c)-m;return g>0?g:0}function bs(e,t,i,n,r,o,s,a=1){const l=(e||[]).find(e=>e?.id===t),c=ni(l);if(!c||c.length<3)return null;const h=Fs(e,t,i,n,r,o,s,a);if(!h)return c.map(()=>0);const d=4*_s(r,a);return c.map((e,t)=>{const i=c[(t+1)%c.length],n=[(e[0]+i[0])/2,(e[1]+i[1])/2];for(let e=0;e!(e>0)))return e.map(e=>[e[0],e[1]]);const r=[];for(let o=0;o0||u>0)){r.push([e[o][0],e[o][1]]);continue}if(d>0!=u>0){const t=e[o],i=d>0?[t[0]+p*d,t[1]+_*d]:[t[0],t[1]],n=u>0?[t[0]+m*u,t[1]+g*u]:[t[0],t[1]];r.push(i),Math.hypot(n[0]-i[0],n[1]-i[1])>1e-9&&r.push(n);continue}if(fs(w,k)){const t=e[o],i=[t[0]+p*d,t[1]+_*d],n=[t[0]+m*u,t[1]+g*u];r.push(i),Math.hypot(n[0]-i[0],n[1]-i[1])>1e-9&&r.push(n);continue}const $=vs(x,w,S,k),M=Math.max(d,u,1e-9),R=As(i,e[o])?.limit??4*M;if($){const i=Math.hypot($[0]-e[o][0],$[1]-e[o][1]);if(Number.isFinite(i)&&i<=R){r.push($);continue}if(ta(e,t,o)){r.push($);continue}}d>0&&r.push([e[o][0]+p*d,e[o][1]+_*d]),u>0&&r.push([e[o][0]+m*u,e[o][1]+g*u]),d>0||u>0||r.push([e[o][0],e[o][1]])}return r.length>=3?r:null}function ks(e,t=!0){if(!e.length)return"";let i=`M ${e[0][0]} ${e[0][1]}`;for(let t=1;te?.id===t),a=ni(s);if(!a||a.length<3)return null;const l=_s(n,r),c=[];for(const i of e||[]){if(!i||i.id===t)continue;const e=ni(i);if(e)for(const t of Fn(a,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=jo(e,r);t&&c.push(t[0],t[1])}const h=[],d=[];for(let e=0;el)continue;const s=((e[0]-t[0])*(i[0]-t[0])+(e[1]-t[1])*(i[1]-t[1]))/(n*n);s<=r||s>=1-r||(o.some(e=>Math.abs(e-s)*n<=2*l)||o.push(s))}o.sort((e,t)=>e-t);for(const n of o)h.push([t[0]+(i[0]-t[0])*n,t[1]+(i[1]-t[1])*n]),d.push(e)}return{poly:h,parent:d,orig:a}}function $s(e,t,i,n){const r=t.poly.length,o=new Array(r).fill(0);if(!e?.length)return o;const s=new Set,a=[];for(let l=0;l0?(o[l]=zo(c.cm),s.add(c.key)):a.push(l)}if(!a.length)return o;const l=n>0?n:1,c=Math.max(.5*i,1e-9)*l,h=Uo(e,l).filter(e=>e.w.cm>0);for(let e=a.length-1;e>=0;e--){const i=a[e],n=t.poly[i],s=t.poly[(i+1)%r],d=Go(n,s);let u=null;for(const e of h){const t=jo(e.w,l);if(!t||!Vo(Go(t[0],t[1]),d))continue;if(Ns(n[0],n[1],t[0][0],t[0][1],t[1][0],t[1][1])>c||Ns(s[0],s[1],t[0][0],t[0][1],t[1][0],t[1][1])>c)continue;const i=Math.hypot(s[0]-n[0],s[1]-n[1]),r=Math.hypot(t[1][0]-t[0][0],t[1][1]-t[0][1]),o=Math.max(0,r-i);(!u||oc||Ns(r[0],r[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(Ns(e.x,e.y,n[0],n[1],r[0],r[1])>c)continue;o=Math.hypot(e.x-d,e.y-u)}(!p||i&&!p.exact||i===p.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])>n).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),s=new Map;for(const e of o){const t=s.get(e.key);t?e.half>t.half&&s.set(e.key,{...t,half:e.half}):s.set(e.key,e)}const a=[...s.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 a){const[t,i]=Ms(e.point,n),r=Rs(t,i),o=l.get(r)||[];o.push(e),l.set(r,o)}const c=[],h=new Map;for(const e of a){const t=Cs(h,e.point,n).filter(t=>Math.hypot(t.point[0]-e.point[0],t.point[1]-e.point[1])<=n).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,r]=Ms(i.point,n),o=Rs(t,r),s=h.get(o)||[];s.push(i),h.set(o,s)}const r=e.other[0]-e.point[0],o=e.other[1]-e.point[1],s=Math.hypot(r,o);if(!(s>n))continue;const a=[r/s,o/s];let l=Math.atan2(a[1],a[0]);l<0&&(l+=2*Math.PI),i.rays.push({u:a,halfDepth:e.halfDepth,length:s,angle:l})}const d=[],u=e=>{const t=1e-9*Math.max(1,r),i=e.filter(e=>Number.isFinite(e.halfDepth)&&e.halfDepth>0&&Number.isFinite(e.length)&&e.length>n);return i.filter((e,n)=>!i.some((i,r)=>r!==n&&i.halfDepth>=e.halfDepth-t&&i.length>=e.length-t&&(i.halfDepth>e.halfDepth+t||i.length>e.length+t||re.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 r=i.map(t=>{const i=u(t.supports),r=new Set,o=[];for(const s of i){const i=[e.point[0]+t.u[0]*s.length,e.point[1]+t.u[1]*s.length];for(const t of Cs(l,i,n)){if("shared"!==t.kind||Math.hypot(t.point[0]-i[0],t.point[1]-i[1])>n)continue;const s=t.other[0]-t.point[0],a=t.other[1]-t.point[1],l=Math.hypot(s,a);if(!(l>n))continue;const c=s/l,h=a/l;if(Math.hypot(t.other[0]-e.point[0],t.other[1]-e.point[1])<=n)continue;const d=`${t.key}|${t.point[0]}|${t.point[1]}|${t.other[0]}|${t.other[1]}|${t.halfDepth}`;r.has(d)||(r.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>n);if(r.length<3)continue;const o=Math.max(...r.map(e=>e.halfDepth));o>0&&Number.isFinite(o)&&d.push({point:[...e.point],rays:r,halfDepth:o,limit:1.25*o})}d.sort((e,t)=>e.point[0]-t.point[0]||e.point[1]-t.point[1]);const p=new Map;for(const e of d){const[t,i]=Ms(e.point,n),r=Rs(t,i),o=p.get(r)||[];o.push(e),p.set(r,o)}return{epsilon:n,coordinateScale:r,nodes:d,index:p}}function Ds(e){const t={fans:[],supports:[]};if(!e?.nodes?.length)return t;const i=Math.max(e.epsilon,1e-9)**2;for(const n of e.nodes){const e=n.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 r=n.point;for(const i of e)for(const e of i.supports){if(!(e.halfDepth>0&&e.length>0))continue;const n=-i.u[1]*e.halfDepth,o=i.u[0]*e.halfDepth,s=[r[0]+i.u[0]*e.length,r[1]+i.u[1]*e.length];t.supports.push([[r[0]+n,r[1]+o],[s[0]+n,s[1]+o],[s[0]-n,s[1]-o],[r[0]-n,r[1]-o]])}for(let n=0;n{const e=s.angle-o.angle;return e>0?e:e+2*Math.PI})();if(a<1e-9)continue;const l=a>Math.PI+1e-9,c=4*Math.max(o.halfDepth,s.halfDepth),h=[r[0]-o.u[1]*o.halfDepth,r[1]+o.u[0]*o.halfDepth],d=[r[0]+s.u[1]*s.halfDepth,r[1]-s.u[0]*s.halfDepth],u=o.u[0]*s.u[1]-o.u[1]*s.u[0],p=e=>{let t=Math.atan2(e[1]-r[1],e[0]-r[0])-o.angle;for(;t<0;)t+=2*Math.PI;return t<=a+1e-9};let _=null;if(Math.abs(u)>1e-9){const e=((d[0]-h[0])*s.u[1]-(d[1]-h[1])*s.u[0])/u,t=((d[0]-h[0])*o.u[1]-(d[1]-h[1])*o.u[0])/u,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<=s.thickLength)&&Math.hypot(i[0]-r[0],i[1]-r[1])<=c&&p(i)&&(_=i)}const m=e=>{Math.abs(ms(e))>i&&t.fans.push(e)};if(_){const e=1.5*Math.max(o.halfDepth,s.halfDepth);m(To([r[0],r[1]],h,_,d,e)??[[r[0],r[1]],h,_,d]);continue}if(l){m([[r[0],r[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,s.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]+s.u[0]*g(s.halfDepth,s.thickLength),d[1]+s.u[1]*g(s.halfDepth,s.thickLength)];m([[r[0],r[1]],h,f,v,d])}}return t}function As(e,t){return!e||!Array.isArray(t)||t.length<2||!t.slice(0,2).every(Number.isFinite)?null:Cs(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 Ps(e,t,i,n,r,o,s){return Ts(zs(e,t,i,n,r,o,s),4*_s(n,s),s)}function Fs(e,t,i,n,r,o,s,a=1){const l=Ss(e,t,n,r,a,i);if(!l)return null;const c=function(e,t,i){const n=(e||[]).find(e=>e?.id===t),r=ni(n);if(!r)return[];const o=[];for(const n of e||[]){if(!n||n.id===t)continue;const e=ni(n);if(e)for(const t of Fn(r,e,i))o.push(t)}return o}(e,t,_s(r,a)),h=function(e,t,i,n,r){const o=_s(n,r),s=[];for(let a=0;aNs(h,d,e[0],e[1],e[2],e[3])<=o);s.push(u?"shared":"outer")}return s}(l.poly,c,n,r,a),d=$s(i,l,r,a),u=d.map((e,t)=>h[t]&&e>0?Oo(e,o,s)/2:0);return{...l,kinds:h,cms:d,offsets:u}}function zs(e,t,i,n,r,o,s=1){const a=[];for(const l of e||[]){if(!l?.id)continue;const c=Fs(e,l.id,t,i,n,r,o,s);if(c)for(let e=0;e0&&(a=is(a,e.a,e.b,e.cm,n,s));return a}function Os(e,t,i,n,r,o,s=1){if(!t?.length)return[];const a=zs(e,t,i,n,r,o,s),l=new Map;for(const e of a){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 a)!e.open&&e.cm>0&&!d.has(e.key)&&(d.add(e.key),h.push({...e,ownerSignature:c(e.key)}));const u=[];for(const a of e||[]){if(!a?.id)continue;const l=Fs(e,a.id,t,i,n,r,o,s);if(l)for(let e=0;e0)||null===l.kinds[i]){e++;continue}const o=c(qo(l.poly[i],l.poly[(i+1)%l.poly.length],n,s));let a=e;for(;a+10&&u.push({a:[d[0],d[1]],b:[p[0],p[1]],key:qo(d,p,n,s),cm:r,len:_,ownerSignature:o}),e=a+1}}}u.sort((e,t)=>t.len-e.len||e.key.localeCompare(t.key));const p=[],_=new Set,m=new Set,g=4*_s(n,s);for(const e of u){const t=h.filter(t=>!m.has(t.key)&&t.cm===e.cm&&t.ownerSignature===e.ownerSignature&&Vo(Go(t.a,t.b),Go(e.a,e.b))&&Ns(t.a[0],t.a[1],e.a[0],e.a[1],e.b[0],e.b[1])<=g&&Ns(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),p.push(Wo(e.a,e.b,e.cm,n,s)))}}for(const e of h)m.has(e.key)||_.has(e.key)||(_.add(e.key),p.push(Wo(e.a,e.b,e.cm,n,s)));return p}function Es(e,t,i,n,r,o,s,a=1){const l=_s(r,a),c=(n[0]+n[2])/2,h=(n[1]+n[3])/2,d=Go([n[0],n[1]],[n[2],n[3]]);let u=null;for(const n of zs(e,t,i,r,o,s,a)){if(!Vo(Go(n.a,n.b),d))continue;const e=Ns(c,h,n.a[0],n.a[1],n.b[0],n.b[1]);e>4*l||(!u||e[e[0],e[1]]),o=Math.abs(ms(r));r.length>=3&&o>i&&(t=r,i=o)}return t}function Ls(e,t,i,n,r,o,s,a=1,l,c){const h=(e||[]).find(e=>e?.id===t),d=ni(h);if(!d||d.length<3)return null;if(!i?.length)return d.map(e=>[e[0],e[1]]);const u=Fs(e,t,i,n,r,o,s,a);if(!u||!u.offsets.some(e=>e>0))return d.map(e=>[e[0],e[1]]);const p=c||Ps(e,i,n,r,o,s,a),_=ws(u.poly,u.offsets,p);if(!_)return d.map(e=>[e[0],e[1]]);if(!p.nodes.length)return _;const m=void 0===l?ia(e,i,n,[],r,o,s,a):null,g=l??("ok"===m?.status||"degraded-extra"===m?.status?m.roomGeom:void 0);if(g)try{const e=Hs(Gt(Bs(u.poly),g));if(e)return e}catch{}return function(e,t){try{return Hs(Ut(Bs(e),Bs(t)))}catch{return null}}(_,u.poly)||d.map(e=>[e[0],e[1]])}function Bs(e){const t=e.map(e=>[e[0],e[1]]);return t.push([e[0][0],e[0][1]]),[t]}function qs(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(Ci(e[0]))>1e-9)}function js(e,t,i,n){const r=n?new Set(n):null;let o=null;for(let n=0;nt.epsilon))continue;const l=Ks([[e.point[0]+a[0]*n.halfDepth,e.point[1]+a[1]*n.halfDepth],[e.point[0]+s.u[0]*r+a[0]*n.halfDepth,e.point[1]+s.u[1]*r+a[1]*n.halfDepth],[e.point[0]+s.u[0]*r-a[0]*n.halfDepth,e.point[1]+s.u[1]*r-a[1]*n.halfDepth],[e.point[0]-a[0]*n.halfDepth,e.point[1]-a[1]*n.halfDepth]],t.coordinateScale);if(!l)continue;const c=Bs(l);o=o?Wt(o,c):c}}return o}function Ws(e,t,i){let n=null;for(const r of e.rays)for(const e of r.continuations){const r=[-e.u[1],e.u[0]],o=[e.start[0]+e.u[0]*e.length,e.start[1]+e.u[1]*e.length],s=Ks([[e.start[0]+r[0]*e.halfDepth,e.start[1]+r[1]*e.halfDepth],[o[0]+r[0]*e.halfDepth,o[1]+r[1]*e.halfDepth],[o[0]-r[0]*e.halfDepth,o[1]-r[1]*e.halfDepth],[e.start[0]-r[0]*e.halfDepth,e.start[1]-r[1]*e.halfDepth]],t.coordinateScale);if(!s)continue;const a=Ut(Bs(s),i);Array.isArray(a)&&0!==a.length&&(n=n?Wt(n,a):a)}return n}function Us(e,t,i=2*(4*e.halfDepth+2*t.epsilon)){const n=function(e,t=Do){const i=new Set,n=Number.isFinite(t)&&t>=0?t:Do;for(let t=0;te-t)}(e);return n.length?js(e,t,i,n):null}function Gs(e,t,i,n,r){const o=function(e){let t=null;for(const i of e){const e=Bs(i);try{t=t?Wt(t,e):e}catch{}}return t}(function(e,t,i=!1){if(!e)return[];const n=[];for(const r of e.nodes)for(let o=0;o1e-9)||h>=Math.PI-1e-9)continue;const d=[-s.u[1],s.u[0]],u=[-a.u[1],a.u[0]],p=[r.point[0]+d[0]*s.halfDepth,r.point[1]+d[1]*s.halfDepth],_=[r.point[0]-u[0]*a.halfDepth,r.point[1]-u[1]*a.halfDepth],m=vs(p,s.u,_,a.u);if(!m)continue;const g=Math.hypot(m[0]-r.point[0],m[1]-r.point[1]);if(!Number.isFinite(g)||g<=r.limit)continue;const f=t?Math.sqrt(Math.max(0,r.limit*r.limit-s.halfDepth*s.halfDepth)):0,v=t?Math.sqrt(Math.max(0,r.limit*r.limit-a.halfDepth*a.halfDepth)):0,y=Ks([[p[0]+s.u[0]*f,p[1]+s.u[1]*f],[_[0]+a.u[0]*v,_[1]+a.u[1]*v],m],e.coordinateScale);if(y&&n.push(y),i){const t=m[0]-r.point[0],i=m[1]-r.point[1],o=Math.hypot(t,i),s=g-r.limit;if(o>e.epsilon&&s>e.epsilon){const a=Math.min(Math.max(8*e.epsilon,.05*r.halfDepth),.25*s),l=t/o,c=i/o,h=-c,d=l,u=Ks([[m[0]-l*a+h*a,m[1]-c*a+d*a],[m[0]-l*a-h*a,m[1]-c*a-d*a],[m[0]+l*a,m[1]+c*a]],e.coordinateScale);u&&n.push(u)}}}return n}({...t,nodes:[e]},i,n));return o&&r?Gt(o,r):o}function Vs(e,t,i,n){if(!e||!t.nodes.length)return e;let r=null;try{r=function(e){let t=null;for(const i of e.nodes){const n=Us(i,e);n&&(t=t?Wt(t,n):n)}return t}(t)}catch{return e}let o=e;for(const e of t.nodes){const s=4*e.halfDepth+2*t.epsilon,a=2*s,l=[[e.point[0]-s,e.point[1]-s],[e.point[0]+s,e.point[1]-s],[e.point[0]+s,e.point[1]+s],[e.point[0]-s,e.point[1]+s]];try{let s=o;const c=Gs(e,t,!1,!0,r);c&&(s=Gt(s,c));let h=js(e,t,a);const d=Gs(e,t,!0,!0,r);d&&(h=Gt(h,d)),r&&(h=Wt(h,r));const u=.02*Math.min(...e.rays.map(e=>e.halfDepth));if(h=Wt(h,Bs([[e.point[0]-u,e.point[1]-u],[e.point[0]+u,e.point[1]-u],[e.point[0]+u,e.point[1]+u],[e.point[0]-u,e.point[1]+u]])),!h)continue;let p=Ut(h,Bs(l));n?p=Ut(p,n):i&&(p=Ut(p,i));const _=Bs(l),m=Gt(s,_),g=i?Gt(Ut(s,_),i):null,f=Ws(e,t,_);o=Wt(m,...g?[g]:[],...f?[f]:[],p)}catch{}}if(r)try{let e=r;n?e=Ut(e,n):i&&(e=Ut(e,i)),o=Wt(o,e)}catch{}return o}function Ks(e,t=1){if(!Array.isArray(e)||e.length<3)return null;const i=Number.isFinite(t)&&t>0?t:1,n=1e-12*Math.max(1,i),r=[];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/n)*n,s=Math.round(i/n)*n;if(!Number.isFinite(o)||!Number.isFinite(s))return null;r.push([Object.is(o,-0)?0:o,Object.is(s,-0)?0:s])}return Math.abs(ms(r))>n*n?r:null}function Ys(e,t,i,n){if(Ns(e[0],e[1],t[0],t[1],i[0],i[1])>n)return!1;const r=i[0]-t[0],o=i[1]-t[1],s=(e[0]-t[0])*r+(e[1]-t[1])*o,a=r*r+o*o,l=n*Math.sqrt(a);return s>=-l&&s<=a+l}function Xs(e,t,i){const n=[],r=[];for(let o=0;oi*i))continue;const d=i/Math.sqrt(h),u=[0,1];for(const e of t)for(const t of[e.a,e.b]){if(!Ys(t,s,a,i))continue;const e=((t[0]-s[0])*l+(t[1]-s[1])*c)/h;e>d&&e<1-d&&u.push(e)}u.sort((e,t)=>e-t);const p=u.filter((e,t)=>0===t||Math.abs(e-u[t-1])>d);for(let e=0;e=3&&r.length===n.length?{poly:n,offsets:r}:null}function Zs(e,t,i,n,r,o,s,a){const l=(e||[]).map(ni).filter(e=>!!e&&e.length>=3);if(!l.length)return null;let c=Wt(Bs(l[0]));for(let e=1;e"outer"===e.kind&&e.half>0),u=4*_s(n,s),p=a||Ts(h,u,s);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=Xs(e,d,u);if(!t||!t.offsets.some(e=>e>0))continue;const i=aa(t.poly,t.offsets,p),n=ws(t.poly,t.offsets,p);if(!i||!n)continue;const r=Gt(Bs(i),Bs(n));_=_?Wt(_,r):r}return{centre:c,shell:_||[]}}function Js(e,t,i,n,r,o,s=1){try{const a=Zs(e,t,i,n,r,o,s,Ps(e,t,i,n,r,o,s));if(!a)return[];return a.shell?.length?Wt(a.centre,a.shell):a.centre}catch{return null}}function Qs(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?" ":"")+ks(i.map(e=>[e[0],e[1]])))}return t}const ea=15;function ta(e,t,i){const n=e?.length||0;if(n<3||t?.length!==n)return!1;const r=e[(i-1+n)%n],o=e[i],s=e[(i+1)%n],a=[r[0]-o[0],r[1]-o[1]],l=[s[0]-o[0],s[1]-o[1]],c=Math.hypot(a[0],a[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,(a[0]*l[0]+a[1]*l[1])/(c*h))),u=Math.acos(d);if(!(u>1e-9))return!1;if(u>=ea*Math.PI/180)return!1;const p=Math.max(0,t[(i-1+n)%n]),_=Math.max(0,t[i]);if(!(p>0||_>0))return!1;const m=Math.sin(u);if(!(m>1e-12))return!1;const g=(_+p*d)/m,f=(p+_*d)/m;return Number.isFinite(g)&&Number.isFinite(f)&&g>0&&f>0&&ge>0))continue;for(const e of l.offsets)e>0&&(u=Math.max(u,2*e));const c=aa(l.poly,l.offsets,d),p=ws(l.poly,l.offsets,d);c&&h.push({outset:c,inset:p})}for(const e of l){const t=e.map(e=>e[0]),i=e.map(e=>e[1]);if(t.length){const n=Math.min(Math.max(...t)-Math.min(...t),Math.max(...i)-Math.min(...i)),r=Math.min(...e.map((t,i)=>{const n=e[(i+1)%e.length];return Math.hypot(n[0]-t[0],n[1]-t[1])}));u=Math.max(u,e.length>16?n:r)}}const p=function(e,t,i,n,r,o,s,a){if(!t?.length||!i?.length)return[];const l=4*_s(n,s),c=new Map;for(const a of zs(e,t,i,n,r,o,s))!a.open&&a.half>0&&!c.has(a.key)&&c.set(a.key,a);const h=[...c.values()];if(h.length<2)return[];const d=a||Ts(h,l),u=[];for(const e of i)for(const t of[[e[0],e[1]],[e[2],e[3]]])u.some(e=>Math.hypot(e[0]-t[0],e[1]-t[1])<=l)||u.push(t);const p=[],_=(e,t)=>{let i=0,n=0;if(Math.hypot(e.a[0]-t[0],e.a[1]-t[1])<=l)i=e.b[0]-e.a[0],n=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],n=e.a[1]-e.b[1]}const r=Math.hypot(i,n);return r>l?[i/r,n/r]:null};for(const e of u){const t=h.map(t=>({iv:t,u:_(t,e)})).filter(e=>!!e.u);for(let i=0;i0?[e.slice(),u,m,_]:[e.slice(),_,m,u];else{if(!f)continue;{const t=[-r.u[1],r.u[0]],i=[-o.u[1],o.u[0]],n=s<0?1:-1,a=[e[0]+t[0]*r.iv.half*n,e[1]+t[1]*r.iv.half*n],l=[e[0]-i[0]*o.iv.half*n,e[1]-i[1]*o.iv.half*n];y=s>0?[e.slice(),a,l]:[e.slice(),l,a]}}Math.abs(ms(y))>l*l&&p.push(y)}}return p}(e,t,i,r,o,s,a,d),_=n.length?la(e,t,i,r,o,s,a):null;let m="exterior";try{const v=Zs(e,t,i,r,o,s,a,d);m="paper";const y=v?v.shell?.length?Wt(v.centre,v.shell):v.centre:[],b=e=>{const t=Bs(e.outset);if(!e.inset)return t;const i=Bs(e.inset);return Gt(t,i)};m="room-rings";let w=null;for(const e of h)try{const t=b(e);w=w?Wt(w,t):t}catch{}if(m="edge-bodies",v)for(const n of oa(e,t,i,r,o,s,a))try{const e=Ut(Bs(n.quad),v.centre);w=w?Wt(w,e):e}catch{}m="junctions",w=function(e,t,i=1,n=Wt){let r=e;for(const e of t||[]){const t=Ks(e,i);if(t)try{const e=Bs(t);r=r?n(r,e):e}catch{}}return r}(w,p,a),m="facade-clip",w&&v&&(w=Ut(w,v.centre)),m="exterior-shell";const k=[];let x=0;if(v?.shell?.length)if(w)try{const e=Wt(w,v.shell);if(!qs(e))throw new Error("invalid shell union");w=e}catch{if(!qs(w)||!qs(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=Vs(w,{...d,nodes:t},v?.centre,y)}}if(m="junction-corners",d.nodes.length){const n=Ds(d),l=function(e,t,i,n,r,o,s,a){try{const l=Zs(e,t,i,n,r,o,s,{epsilon:a.epsilon,coordinateScale:a.coordinateScale,nodes:[],index:new Map});return l?l.shell?.length?Wt(l.centre,l.shell):l.centre:null}catch{return null}}(e,t,i,r,o,s,a,d);for(const e of n.fans)try{let t=[Bs(e)];if(l&&(t=Ut(t,l)),!t?.length)continue;w=w?Wt(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(ms(t||[]))<=f?null:[t,...i.filter(e=>Math.abs(ms(e||[]))>f)]}).filter(e=>!!e):g}const S=w||[],$=[...qs(S)?[{id:"room-primary",geom:S}]:[],...k.map((e,t)=>({id:`room-isolated-${t}`,geom:e.geom}))];m="openings";for(const e of n){if(!(e.length>0))continue;const t=da(_,e,!0);if(!t.negative&&!t.positive)continue;const i=e.angle*Math.PI/180,n=Math.cos(i),o=Math.sin(i),s=-o,l=n,c=e.length/2,h=1.25*Math.max(u,r*a),d=[[e.x-n*c-s*h,e.y-o*c-l*h],[e.x+n*c-s*h,e.y+o*c-l*h],[e.x+n*c+s*h,e.y+o*c+l*h],[e.x-n*c+s*h,e.y-o*c+l*h]];w&&(w=Gt(w,Bs(d)));for(const e of k)e.geom=Gt(e.geom,Bs(d))}m="extras";const M=[];let R=0;const C=c.mergeExtra||((e,t)=>e?Wt(e,t):t);for(let e=0;ee.length>=2&&Number.isFinite(e[0])&&Number.isFinite(e[1]))||Math.abs(Ci(t))<=1e-9){R++;continue}const i=[Bs(t)];try{const t=C(w,i,e);if(!qs(t))throw new Error("invalid extra union");w=t}catch{R++,qs(i)&&M.push({id:`extra-${e}`,geom:i})}}M.push(...k),M.sort((e,t)=>Qs(e.geom).localeCompare(Qs(t.geom)));const T=w||[];return{status:R||x?"degraded-extra":"ok",geom:T,components:[...qs(T)?[{id:"primary",geom:T}]:[],...M.map((e,t)=>({...e,id:`isolated-${t}`}))],roomGeom:S,roomComponents:$,paperGeom:y,depthUnits:u,openingPadUnits:1.25*Math.max(u,r*a),openingIndex:_,multiWallNodes:d,degradedExtraCount:R+x}}catch{return c.onCoreFailure?.(m),{status:"failed-core",geom:[],components:[],roomGeom:[],paperGeom:[],roomComponents:[],depthUnits:u,openingIndex:null,multiWallNodes:d,degradedExtraCount:0}}var g,f}function na(e,t,i,n=[],r,o,s,a=1,l=[],c={}){if(!t?.length&&!l.length)return null;return ra(ia(e,t,i,n,r,o,s,a,l,c))}function ra(e){if("failed-core"===e.status||"not-applicable"===e.status)return null;const t=e.components.map(e=>({id:e.id,d:Qs(e.geom),fillRule:"evenodd"})).filter(e=>!!e.d),i=t[0]?.d||"",n=Qs(e.paperGeom);if(t.length){const r={status:e.status,d:i,paths:t,components:e.components,roomGeom:e.roomGeom,multiWallNodes:e.multiWallNodes,paperD:n,depthUnits:e.depthUnits,fillRule:"evenodd"};return Object.defineProperties(r,{roomComponents:{value:e.roomComponents||[],enumerable:!1},openingIndex:{value:e.openingIndex,enumerable:!1},openingPadUnits:{value:e.openingPadUnits,enumerable:!1}}),r}return null}function oa(e,t,i,n,r,o,s=1){if(!t?.length)return[];const a=new Set,l=[];for(const c of e||[]){if(!c?.id)continue;const h=Fs(e,c.id,t,i,n,r,o,s);if(!h)continue;const d=h.poly;for(let e=0;e0))continue;const p=qo(t,i,n,s);if(a.has(p))continue;a.add(p);const _=Oo(u,r,o),[m,g]=gs(d,e),f=-m,v=-g,y=_/2,b=[[t[0]+f*y,t[1]+v*y],[i[0]+f*y,i[1]+v*y],[i[0]+m*y,i[1]+g*y],[t[0]+m*y,t[1]+g*y]];l.push({key:p,kind:c,cm:u,quad:b,a:[t[0],t[1]],b:[i[0],i[1]],depthUnits:_})}}return l}function sa(e,t=[]){let i=ks(e.quad);const[n,r]=Lo(e.a,e.b),o=n,s=r,a=-s,l=o;for(const n of t){if(!Zo(e.a,e.b,n.angle))continue;if(Ns(n.x,n.y,e.a[0],e.a[1],e.b[0],e.b[1])>Math.max(.55*e.depthUnits,.001))continue;const t=n.length/2,r=e.depthUnits,c=n.x,h=n.y;i+=` ${ks(xs([[c-o*t-a*r,h-s*t-l*r],[c+o*t-a*r,h+s*t-l*r],[c+o*t+a*r,h+s*t+l*r],[c-o*t+a*r,h-s*t+l*r]]))}`}return i}function aa(e,t,i){const n=e?.length||0;if(n<3||t.length!==n)return null;if(t.every(e=>!(e>0)))return e.map(e=>[e[0],e[1]]);xs(e),t.slice().reverse();const r=[];for(let o=0;o0||l>0)){r.push([e[o][0],e[o][1]]);continue}if(a>0!=l>0){const t=e[o],i=a>0?[t[0]-c*a,t[1]-h*a]:[t[0],t[1]],n=l>0?[t[0]-d*l,t[1]-u*l]:[t[0],t[1]];r.push(i),Math.hypot(n[0]-i[0],n[1]-i[1])>1e-9&&r.push(n);continue}if(fs(w,k)){const t=e[o],i=[t[0]-c*a,t[1]-h*a],n=[t[0]-d*l,t[1]-u*l];r.push(i),Math.hypot(n[0]-i[0],n[1]-i[1])>1e-9&&r.push(n);continue}const $=vs(x,w,S,k),M=Math.max(a,l,1e-9),R=As(i,e[o])?.limit??4*M;if($){const i=Math.hypot($[0]-e[o][0],$[1]-e[o][1]);if(Number.isFinite(i)&&i<=R){r.push($);continue}if(ta(e,t,o)){r.push([e[o][0],e[o][1]]);continue}}a>0&&r.push([e[o][0]-c*a,e[o][1]-h*a]),l>0&&r.push([e[o][0]-d*l,e[o][1]-u*l])}return r.length>=3?r:null}function la(e,t,i,n,r,o,s=1){const a=[];for(const l of e||[]){if(!l?.id)continue;const c=Fs(e,l.id,t,i,n,r,o,s);if(!c)continue;const h=Math.abs(Ci(c.poly));for(let e=0;e[Math.max(t,e.x0),Math.min(i,e.x1)]).filter(e=>e[1]-e[0]>n).sort((e,t)=>e[0]-t[0]||e[1]-t[1]);if(!r.length)return{coverage:0,full:!1};let o=r[0][0],s=r[0][1],a=0,l=o<=t+n;for(let e=1;e=i-n,{coverage:a,full:l}}function ha(e,t){return Number(t.full)-Number(e.full)||e.faceDistance-t.faceDistance||e.area-t.area||e.roomId.localeCompare(t.roomId)}function da(e,t,i=!1){const n=Number(t?.x),r=Number(t?.y),o=Number(t?.angle),s=Number(t?.length);if(!([n,r,o,s].every(Number.isFinite)&&s>0))return{negative:null,positive:null};const a=o*Math.PI/180,l=Math.cos(a),c=Math.sin(a),h=-c,d=l,u=s/2,p=Math.max(1e-9,e.adjacencyEps),_=new Map;let m=0;for(const t of e.edges){if(i&&!(t.half>0))continue;if(!Zo(t.a,t.b,o))continue;const[e,s]=Lo(t.a,t.b);if(Math.abs((n-t.a[0])*s-(r-t.a[1])*e)>p)continue;const a=(t.a[0]-n)*l+(t.a[1]-r)*c,g=(t.b[0]-n)*l+(t.b[1]-r)*c,f=Math.max(-u,Math.min(a,g)),v=Math.min(u,Math.max(a,g));if(v-f<=p)continue;const y=t.inward[0]*h+t.inward[1]*d>=0?1:-1,b=((t.a[0]+t.b[0])/2-n)*h+((t.a[1]+t.b[1])/2-r)*d,w=Math.abs(b+y*t.half),k=`${y}|${t.roomId}`,x={x0:f,x1:v,half:t.half,cm:t.cm,key:t.key,axis:[e,s]},S=_.get(k);S?(S.pieces.push(x),S.faceDistance=Math.min(S.faceDistance,w)):_.set(k,{roomId:t.roomId,side:y,order:m++,pieces:[x],faceDistance:w,area:t.area,coverage:0,full:!1})}for(const e of _.values()){const t=ca(e.pieces,-u,u,p);e.coverage=t.coverage,e.full=t.full}const g=e=>{const t=[..._.values()].filter(t=>t.side===e&&t.coverage>p);return t.sort(ha),t[0]||null};return{negative:g(-1),positive:g(1)}}function ua(e,t,i,n,r,o,s=1,a=[]){return pa(la(e,i,a,n,r,o,s),t)}function pa(e,t){const i=da(e,t),n=[i.negative,i.positive].filter(e=>!!e);if(!n.length)return{ox:0,oy:0,cm:0,side:-1};const r=i.negative&&i.positive?-1:n[0].side,o=t.flip_v?-r:r,s=(-1===o?i.negative:i.positive)||n[0],a=[...s.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(!(a.half>0&&a.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*a.half,oy:h*o*a.half,cm:a.cm,side:o}}function _a(e,t){const i=1e-9,n=t.filter(e=>Number.isFinite(e.x0)&&Number.isFinite(e.x1)&&Number.isFinite(e.half)&&e.x1>e.x0&&e.half>0);if(!n.length)return"";const r=n.flatMap(e=>[e.x0,e.x1]).sort((e,t)=>e-t),o=[];for(const e of r){const t=o[o.length-1];(void 0===t||e>t+i)&&o.push(e)}const s=[];for(let e=0;e+1t+i))continue;const a=(t+r)/2,l=n.reduce((e,t)=>a>=t.x0-i&&a<=t.x1+i?Math.max(e,t.half):e,0);if(!(l>0))continue;const c=s[s.length-1];c&&t<=c.x1+i&&Math.abs(l-c.half)<=i?c.x1=r:s.push({x0:t,x1:r,half:l})}const a=[];for(const e of s){const t=a[a.length-1],n=t?.[t.length-1];n&&e.x0<=n.x1+i?(e.x0=n.x1,t.push(e)):a.push([e])}return a.map(t=>{const i=t[0],n=t[t.length-1],r=Math.min(.25*Math.min(...t.map(e=>e.half)),.75),o=-e*r,s=[];if(1===e){s.push(`M ${i.x0} ${o} L ${n.x1} ${o}`);for(let e=t.length-1;e>=0;e--){const i=t[e];s.push(`L ${i.x1} ${i.half} L ${i.x0} ${i.half}`)}}else{s.push(`M ${n.x1} ${o} L ${i.x0} ${o}`);for(const e of t)s.push(`L ${e.x0} ${-e.half} L ${e.x1} ${-e.half}`)}return s.push("Z"),s.join(" ")}).join(" ")}function ma(e,t,i,n){if(!n)return i;const r=e.angle*Math.PI/180,o=Math.cos(r),s=Math.sin(r),a=[],l=1e-9;for(const r of i){const[i,c]=r.axis,h=o*i+s*c;if(Math.abs(h)<=l)continue;const d=e.x*i+e.y*c,u=d+h*r.x0,p=d+h*r.x1,_=Math.min(u,p),m=Math.max(u,p),g=`${r.key}|${t}`,f=n.get(g)||[];let v=[[_,m]];for(const[e,t]of f){const i=[];for(const[n,r]of v)t<=n+l||e>=r-l?i.push([n,r]):(e>n+l&&i.push([n,Math.min(r,e)]),te[0]-t[0]||e[1]-t[1]),b=[];for(const e of y){const t=b[b.length-1];t&&e[0]<=t[1]+l?t[1]=Math.max(t[1],e[1]):b.push([e[0],e[1]])}n.set(g,b)}return a}function ga(e,t){const i=new Map;return t.map(t=>function(e,t,i){const n=da(e,t,!0),r=n.negative,o=n.positive;if(!r&&!o)return null;let s;if(r&&o)s=[{candidate:r,side:-1},{candidate:o,side:1}];else{const e=r||o;s=[{candidate:e,side:-1},{candidate:e,side:1}]}const a=s.map(({candidate:e,side:n})=>({candidate:e,side:n,pieces:ma(t,n,e.pieces,i)})),l=a.map(({candidate:e,side:t,pieces:i})=>({side:t,roomId:e.roomId,d:_a(t,i)})),c=a.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 fa=150,va=1e-6;function ya(e){return Number.isFinite(e)?Math.max(1,Math.min(fa,e)):1}function ba(e){return((Number.isFinite(Number(e))?Number(e):0)%90+90)%90}const wa=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]},ka=(e,t)=>e[0]===t[0]&&e[1]===t[1];function xa(e,t=1e-6){const i=Number.isFinite(t)&&t>0?t:va,n=[];for(const t of e||[]){if(!Array.isArray(t)||t.length<2)return null;const e=Number(t[0]),r=Number(t[1]);if(!Number.isFinite(e)||!Number.isFinite(r))return null;const o=Math.round(e/i)*i,s=Math.round(r/i)*i;if(!Number.isFinite(o)||!Number.isFinite(s))return null;const a=[Object.is(o,-0)?0:o,Object.is(s,-0)?0:s];n.length&&ka(n[n.length-1],a)||n.push(a)}return n.length>1&&ka(n[0],n[n.length-1])&&n.pop(),n.length<3||new Set(n.map(e=>`${e[0]},${e[1]}`)).size<3?null:Ci(n)>i*i?n:null}function Sa(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 $a(e,t,i,n,r){return os({a:e,b:t,halfDepth:Oo(i,n,r)/2})}function Ma(e,t,i){const n=Number(t)>0?Number(t):5,r=ya(e.cm)/n*i,o=e.center[0],s=e.center[1];if("circle"===e.shape){const e=r/2;return Array.from({length:96},(t,i)=>{const n=i/96*Math.PI*2;return[o+Math.cos(n)*e,s+Math.sin(n)*e]})}const a=r/2,l=ba(e.angle)*Math.PI/180,c=Math.cos(l),h=Math.sin(l);return[[-a,-a],[a,-a],[a,a],[-a,a]].map(([e,t])=>[o+e*c-t*h,s+e*h+t*c])}function Ra(e,t){const i=Number.isFinite(t)?Math.max(0,Math.min(1,t)):0,n=(e.a[0]+e.b[0])/2,r=(e.a[1]+e.b[1])/2,o=(e.b[0]-e.a[0])*i/2,s=(e.b[1]-e.a[1])*i/2;return{...e,a:[n-o,r-s],b:[n+o,r+s]}}function Ca(e,t,i=1e-9){if(!t.length)return[e];let n=[wa(e)];try{for(const e of t){const t=e.b[0]-e.a[0],r=e.b[1]-e.a[1],o=Math.hypot(t,r);if(!(o>i))continue;const s=t/o,a=r/o,l=-a,c=s,h=1.25*Math.max(Number(e.depth)||0,4*i),d=Math.max(2*i,1e-9*o),u=[[e.a[0]-s*d-l*h,e.a[1]-a*d-c*h],[e.b[0]+s*d-l*h,e.b[1]+a*d-c*h],[e.b[0]+s*d+l*h,e.b[1]+a*d+c*h],[e.a[0]-s*d+l*h,e.a[1]-a*d+c*h]];n=Gt(n,wa(u))}return Na(n)}catch{return[e]}}function Ta(e,t){try{const i=Gt([[...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 n=null,r=0;for(const e of i||[]){const t=e?.[0]||[],i=Math.abs(Ci(t));t.length>=4&&i>r&&(r=i,n=t.slice(0,-1).map(e=>[e[0],e[1]]))}return n}catch{return null}}function Da(e,t,i,n=Math.max(2e-4*i,1e-9),r=[]){const o=[],s=new Map;for(const e of r){const t=s.get(e.hostId)||[];t.push(e),s.set(e.hostId,t)}const a=[],l=[],c=[];for(const n of e.partitions||[]){const e={a:n.a,b:n.b,halfDepth:Oo(n.cm,t,i)/2};if(!(e.halfDepth>0))continue;const r=os(e);r&&(o.push(e),a.push(r),c.push({id:n.id,body:r}))}const h=o;for(const{segmentIndex:e,wedge:t}of hs(h,n)){const i={list:a,at:e},n=Ta(i.list[i.at],t);n&&(i.list[i.at]=n,c[i.at].body=n)}for(const e of c)l.push(...Ca(e.body,s.get(e.id)||[],n));const d=(e.wall_columns||[]).map(e=>Ma(e,t,i)),u=ds(o,n).flatMap(e=>Ca(e,r,n));return{partitions:a,columns:d,patches:u,all:[...l,...u,...d]}}function Aa(e){try{const t=e.map(e=>xa(e)).filter(e=>!!e).map(e=>wa(e));return t.length?Wt(t[0],...t.slice(1)):null}catch{return null}}const Pa=e=>`M ${e.map(e=>`${e[0]} ${e[1]}`).join(" L ")} Z`;function Fa(e){const t=[];for(const i of e||[]){if(Oa([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(Pa(i.slice(0,-1)))}e.length&&t.push(e.join(" "))}return t}function za(e,t,i={}){const n=Aa(e.filter(e=>e.length>=3)),r=t.some(e=>!xa(e))?null:Aa(t);if(!n)return[];if(r)try{return Fa(Ut(n,r))}catch{}return function(e,t,i){let n=null;for(let r=0;r=4&&t.push(e.slice(0,-1).map(e=>[e[0],e[1]]));return t}function Na(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 Ha(e,t){let i=!1;for(let n=0,r=t.length-1;ne[1]!=l>e[1]&&e[0]<(a-o)*(e[1]-s)/(l-s||1e-12)+o&&(i=!i)}return i}function La(e,t){for(const i of t||[]){const t=i?.[0];if(!t?.length||!Ha(e,t))continue;let n=!1;for(let t=1;ti)return!1;if(Math.abs(ya(e.cm)-ya(t.cm))>1e-6)return!1;if(e.shape!==t.shape)return!0;if("circle"===e.shape||"circle"===t.shape)return!0;const n=Math.abs(ba(e.angle)-ba(t.angle));return Math.min(n,90-n)<=1e-6}const qa=2.54;function ja(e){const t="number"==typeof e?e:NaN;return!Number.isFinite(t)||t<=0||5===t?1:5/t}function Wa(e,t){return e*ja(t)}function Ua(e){return e?qa:1}function Ga(e,t){if(!t)return String(e);const i=e/qa;return String(Math.round(1e6*i)/1e6)}function Va(e,t){return t?e*qa:e}const Ka=1e3;function Ya(e,t){const i=Number(e),n=Number.isFinite(i)&&i>0?i:1,r=n>=1?t:t*n,o=n>=1?t/n:t;return{x:(t-r)/2,y:(t-o)/2,w:r,h:o}}const Xa=.01,Za=100;function Ja(e,t=1e3){const i=Ya(e?.plan_aspect,t),n=Number(e?.plan_scale),r=Number.isFinite(n)&&n>0?Math.min(Za,Math.max(Xa,n)):1,o=Number(e?.plan_scale_x),s=Number(e?.plan_scale_y),a=Number.isFinite(o)&&o>0?Math.min(Za,Math.max(Xa,o)):r,l=Number.isFinite(s)&&s>0?Math.min(Za,Math.max(Xa,s)):r,c=Number(e?.plan_x),h=Number(e?.plan_y),d=Dr(e?.plan_angle);return{x:i.x+(Number.isFinite(c)?cl(c):0)*t,y:i.y+(Number.isFinite(h)?cl(h):0)*t,w:i.w*a,h:i.h*l,...d?{angle:d}:{}}}function Qa(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 el(e){return e&&Array.isArray(e.spaces)?e.spaces.map(e=>{const t=Ka,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]*Ka,i[1]*t,i[2]*Ka,i[3]*t],bg:e.plan_url?{href:Hn(e.plan_url),...Ja(e,Ka)}:null,rooms:(e.rooms||[]).map(e=>{const i={...e,...Qa(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*Ka:void 0,y:null!=i.y?i.y*t:void 0,w:null!=i.w?i.w*Ka:void 0,h:null!=i.h?i.h*t:void 0,poly:i.poly?i.poly.map(e=>[e[0]*Ka,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])*Ka,Number(e.a?.[1])*t],b:[Number(e.b?.[0])*Ka,Number(e.b?.[1])*t],cm:Number(e.cm)})),partitions:(e.partitions||[]).map(e=>({id:e.id,a:[e.a[0]*Ka,e.a[1]*t],b:[e.b[0]*Ka,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]*Ka,e.center[1]*t],cm:Number(e.cm),..."circle"===e.shape?{}:{angle:ba(e.angle)}}))}}):[]}const tl=5e3,il=tl*Ka,nl=240,rl=Ka/nl,ol=1/nl;function sl(e){if(!Number.isFinite(e))return e;const t=Math.round(e*nl/Ka)*Ka/nl;return Math.abs(t-e)<=1e-9*rl?e:t}function al(e){return{x:sl(e.x),y:sl(e.y)}}function ll(e){return Number.isFinite(e)?Math.min(il,Math.max(-il,e)):0}function cl(e){return Number.isFinite(e)?Math.min(tl,Math.max(-tl,e)):0}const hl=1/3,dl=200;function ul(e){return"house"===e?"house":"content"}function pl(e){let t=1/0,i=1/0,n=-1/0,r=-1/0;for(const o of e){const e=Number(o[0]),s=Number(o[1]);Number.isFinite(e)&&Number.isFinite(s)&&(en&&(n=e),s>r&&(r=s))}return t>n?null:{minX:t,minY:i,maxX:n,maxY:r}}function _l(e){const t=[],i=e=>{if(Array.isArray(e))if(e.length>=2&&Number.isFinite(Number(e[0]))&&Number.isFinite(Number(e[1])))t.push([Number(e[0]),Number(e[1])]);else for(const t of e)i(t)};return i(e),pl(t)}function ml(e,t){const i=Number.isFinite(t)&&t>0?t:0;return{minX:e.minX-i,minY:e.minY-i,maxX:e.maxX+i,maxY:e.maxY+i}}function gl(e){return e.poly&&e.poly.length?pl(e.poly):null==e.x||null==e.y?null:pl([[e.x,e.y],[e.x+(e.w||0),e.y+(e.h||0)]])}function fl(e,t=1e3,i=1e3){const n=Number(e.x)*t,r=Number(e.y)*i,o=Number(e.w)*t,s=Number(e.h)*i;return![n,r,o,s].every(Number.isFinite)||o<=0||s<=0?null:pl(Nr({x:n,y:r,w:o,h:s,angle:Dr(e.angle)||void 0}))}function vl(e,t){const i=[];for(const t of e.rooms||[]){const e=gl(t);e&&i.push(e)}if(e.bg){const t=pl(Nr(e.bg));t&&i.push(t)}for(const e of t||[])if(Array.isArray(e)){const t=pl([e]);t&&i.push(t)}else i.push(e);return i}const yl=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},bl=e=>{let t=1/0,i=1/0,n=-1/0,r=-1/0;for(const o of e)o.minXn&&(n=o.maxX),o.maxY>r&&(r=o.maxY);return t>n||i>r?null:{x:t,y:i,w:n-t,h:r-i}};function wl(e,t){let{x:i,y:n,w:r,h:o}=e;r<30&&(i=i+r/2-100,r=dl),o<30&&(n=n+o/2-100,o=dl);const s="number"==typeof t?{top:t,right:t,bottom:t,left:t}:t,a=Math.max(r,o),l=a*s.top,c=a*s.right,h=a*s.bottom,d=a*s.left;return{x:i-d,y:n-l,w:r+d+c,h:o+l+h}}function kl(e,t={}){const i=t.pad??.05,n=t.k??10,r=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)<=il&&Math.abs(e.maxX)<=il&&Math.abs(e.minY)<=il&&Math.abs(e.maxY)<=il);if(!o.length)return{core:null,all:null,outliers:0};const s=bl(o);if(o.length<4){const e=wl(s,i);return{core:e,all:e,outliers:0}}const a=o.map(e=>(e.minX+e.maxX)/2),l=o.map(e=>(e.minY+e.maxY)/2),c=yl(a),h=yl(l),d=o.map((e,t)=>Math.max(Math.abs(a[t]-c),Math.abs(l[t]-h))),u=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),r),p=d.map(e=>e>n*u),_=p.filter(Boolean).length,m=_&&_<=o.length*hl?o.filter((e,t)=>!p[t]):o;return{core:wl(bl(m)||s,i),all:wl(s,i),outliers:m===o?0:_}}function xl(e){return kl(e,{pad:0}).all}function Sl(e,t,i=.05){const n=kl(vl(e,t),{pad:i});if(n.core)return n.core;const r=e.vb&&4===e.vb.length&&e.vb[2]>0&&e.vb[3]>0?e.vb:[0,0,Ka,Ka];return{x:r[0],y:r[1],w:r[2],h:r[3]}}function $l(e){const t=Sl(e);return{x:t.x+t.w/2,y:t.y+t.h/2}}function Ml(e){const t=[];for(const i of e.rooms||[]){const e=gl(i);e&&t.push(e)}const i=kl(t,{pad:0}).core,n=Ka*ja(e.cellCm??5);return i?Math.max(n,Math.min(il,Math.max(i.w,i.h))):n}function Rl(e,t,i,n=1){const r=Number(i),o=Number.isFinite(n)&&n>0?n:1;return!Number.isFinite(r)||r<=0?e*o:e*Ml(t)*o/r}const Cl=[1,2,5,10,20,50,100,200,500,1e3];function Tl(e,t,i=7){if(!(e>0&&t>0&&Number.isFinite(t)))return null;const n=Cl.find(n=>e*n*t>=i);if(void 0===n)return null;const r=Cl.find(e=>e>=5*n)??5*n;return{fine:n,coarse:r}}function Dl(e){if(e.poly&&e.poly.length){const t=e.poly.map(e=>e[0]),i=e.poly.map(e=>e[1]),n=Math.min(...t),r=Math.min(...i);return{x:n,y:r,w:Math.max(...t)-n,h:Math.max(...i)-r}}return{x:e.x??0,y:e.y??0,w:e.w??0,h:e.h??0}}function Al(e,t,i,n,r,o=new Set){const s=t[e.id];return!o.has(e.id)&&s&&s.s===e.space?{x:s.x*Ka,y:s.y*Ka}:n[e.id]?n[e.id]:al($l(r))}function Pl(e,t,i,n){const r=i["rl_"+(e.id||"")];if(r&&r.s===t)return{x:r.x*Ka,y:r.y*Ka};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 al({x:o[0],y:o[1]})}function Fl(e,t){for(const i of e?.spaces??[])for(const e of i?.decor??[])if("furniture"===e?.kind&&"string"==typeof e.symbol&&t(e.symbol))return!0;return!1}let zl=0;const Il=new Set;const Ol=new class{constructor(e){this.options=e,this._art=null,this._failed=!1,this._terminal=!1,this._inFlight=null,this._hosts=new Set,this._settled=[]}state(){return this._art?"ready":this._failed?"fallback":"pending"}get terminal(){return this._terminal}art(e,t){if(this._art)return this._art[e];t&&!this._failed&&this._hosts.add(t)}adopt(e,t){return!!this._art||(t!==this.options.expectedFingerprint?((this.options.warn??console.warn)("[houseplan] furniture artwork from another build ignored",{fingerprint:t}),!1):(this._install(e),!0))}ensure(){return"pending"!==this.state()?Promise.resolve():(this._inFlight||(this._inFlight=this._loadWithRetry().finally(()=>{this._inFlight=null})),this._inFlight)}onSettled(e){"pending"===this.state()?this._settled.push(e):Promise.resolve().then(e)}async _loadWithRetry(){let e=new Error("furniture artwork did not load");for(const t of[0,1])try{const i=await this.options.load(t);if(i.FURNITURE_ART_FINGERPRINT!==this.options.expectedFingerprint){this._terminal=!0,e=new Error(`furniture artwork fingerprint mismatch: expected ${this.options.expectedFingerprint}, got ${i.FURNITURE_ART_FINGERPRINT}`);break}if(this._art)return;return void this._install(i.GENERATED_FURNITURE_ART)}catch(t){e=t}this._art||(this._failed=!0,(this.options.warn??console.warn)("[houseplan] furniture artwork unavailable",e),this.options.loadFailed?.(this._terminal),this._flush())}_install(e){this._art=e,this._failed=!1,this._flush()}_flush(){const e=[...this._hosts];this._hosts.clear();for(const t of e)t.isConnected&&t.requestUpdate();const t=this._settled.splice(0);for(const e of t)e()}}({expectedFingerprint:"34d1dbfc181acaf58842dfced0e6aa3a899aef6b8d1eeba53732ef729a63137e",load:async e=>0===e?await import("./furniture-plan-art.generated-BfO1XOcD.js"):await import((()=>{const e=new URL("./furniture-plan-art.generated-BfO1XOcD.js",import.meta.url);return e.searchParams.set("hp_retry","art-"+ ++zl),e.href})()),loadFailed:e=>{for(const t of Il)t(e)}}),El=["furniture","appliance","sanitary","other"],Nl=[{id:"sofa",group:"furniture",category:"sofa",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",category:"armchair",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",category:"coffee_table",w:110,h:60,g:[["r",0,0,1,1],["r",.08,.14,.84,.72]]},{id:"table_dining",group:"furniture",category:"dining_table",w:140,h:80,g:[["r",0,0,1,1],["r",.06,.11,.88,.78]]},{id:"table_round",group:"furniture",category:"dining_table",w:120,h:120,g:[["e",.5,.5,.5,.5],["e",.5,.5,.41,.41]]},{id:"chair",group:"furniture",category:"chair",w:45,h:45,g:[["r",0,0,1,.18],["r",.06,.18,.88,.8]]},{id:"desk",group:"furniture",category:"work_table",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",category:"bed",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",category:"bed",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",category:"nightstand",w:45,h:40,g:[["r",0,0,1,1],["r",.12,.14,.76,.33],["r",.12,.53,.76,.33]]},{id:"wardrobe",group:"furniture",category:"wardrobe",w:100,h:60,g:[["r",0,0,1,1],["l",0,.72,1,.72],["l",.5,.72,.5,1]]},{id:"bookshelf",group:"furniture",category:"wardrobe",w:80,h:30,g:[["r",0,0,1,1],["l",.34,0,.34,1],["l",.67,0,.67,1]]},{id:"fridge",group:"appliance",category:"fridge",w:60,h:65,g:[["r",0,0,1,1],["l",0,.36,1,.36],["l",.83,.44,.83,.64]]},{id:"stove",group:"appliance",category:"cooktop",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",category:"dishwasher",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",category:"washer",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",category:"dryer",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",category:"tv",w:120,h:30,g:[["r",0,0,1,.42],["l",.5,.42,.5,.72],["l",.3,.72,.7,.72]]},{id:"ac",group:"appliance",category:"air_conditioner",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",category:"boiler",w:45,h:45,g:[["e",.5,.5,.5,.5],["e",.5,.5,.31,.31]]},{id:"toilet",group:"sanitary",category:"toilet",w:40,h:70,g:[["r",.06,0,.88,.2],["e",.5,.58,.37,.35],["e",.5,.58,.22,.2]]},{id:"bathtub",group:"sanitary",category:"bathtub",w:170,h:75,g:[["r",0,0,1,1],["r",.05,.11,.77,.78],["e",.89,.5,.045,.1]]},{id:"shower",group:"sanitary",category:"shower",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",category:"sink",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",category:"kitchen_sink",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",category:"bidet",w:40,h:55,g:[["e",.5,.5,.44,.5],["e",.5,.5,.26,.3]]},{id:"stairs",group:"other",category:"stairs",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",category:"fireplace",w:120,h:40,g:[["r",0,0,1,1],["p",.22,1,.22,.42,.78,.42,.78,1]]},{id:"plant",group:"other",category:"plant",w:40,h:40,g:[["e",.5,.5,.22916667,.22916667],["l",.5,.27083333,.5,0],["l",.5,.72916667,.5,1],["l",.27083333,.5,0,.5],["l",.72916667,.5,1,.5],["l",.33333333,.33333333,.11458333,.11458333],["l",.66666667,.66666667,.88541667,.88541667],["l",.66666667,.33333333,.88541667,.11458333],["l",.33333333,.66666667,.11458333,.88541667]]},{id:"rug",group:"other",category:"rug",w:200,h:140,g:[["r",0,0,1,1],["r",.06,.09,.88,.82]]}],Hl=new Set(["fridge","dishwasher","washer","dryer","ac","water_heater","shower","sink","stairs","fireplace","plant","rug"]),Ll=[...[{id:"coffee_table",group:"furniture",category:"coffee_table",w:120,h:60},{id:"coffee_table_round",group:"furniture",category:"coffee_table",w:80,h:80},{id:"coffee_table_oval",group:"furniture",category:"coffee_table",w:120,h:60},{id:"coffee_table_rounded",group:"furniture",category:"coffee_table",w:120,h:60},{id:"table_dining",group:"furniture",category:"dining_table",w:160,h:90},{id:"table_round",group:"furniture",category:"dining_table",w:110,h:110},{id:"table_dining_oval",group:"furniture",category:"dining_table",w:180,h:100},{id:"table_dining_rounded",group:"furniture",category:"dining_table",w:160,h:90},{id:"desk",group:"furniture",category:"work_table",w:140,h:70},{id:"desk_corner",group:"furniture",category:"work_table",w:160,h:160},{id:"chair",group:"furniture",category:"chair",w:50,h:50},{id:"chair_bar",group:"furniture",category:"chair",w:45,h:48},{id:"armchair",group:"furniture",category:"armchair",w:90,h:90},{id:"armchair_office",group:"furniture",category:"armchair",w:65,h:65},{id:"sofa",group:"furniture",category:"sofa",w:180,h:90},{id:"sofa_three_seat",group:"furniture",category:"sofa",w:240,h:90},{id:"sofa_corner_right",group:"furniture",category:"sofa",w:260,h:170},{id:"bed_single",group:"furniture",category:"bed",w:90,h:200},{id:"bed_double",group:"furniture",category:"bed",w:160,h:200},{id:"nightstand",group:"furniture",category:"nightstand",w:50,h:40},{id:"cabinet_tv",group:"furniture",category:"nightstand",w:140,h:45},{id:"cabinet_shoe",group:"furniture",category:"nightstand",w:80,h:35},{id:"cabinet_sink",group:"furniture",category:"nightstand",w:80,h:50},{id:"bookshelf",group:"furniture",category:"wardrobe",w:100,h:35},{id:"wall_unit",group:"furniture",category:"wardrobe",w:240,h:45},{id:"wardrobe",group:"furniture",category:"wardrobe",w:180,h:60},{id:"kitchen_floor",group:"furniture",category:"kitchen_cabinet",w:60,h:60},{id:"kitchen_floor_corner",group:"furniture",category:"kitchen_cabinet",w:90,h:90},{id:"kitchen_wall",group:"furniture",category:"kitchen_cabinet",w:60,h:35},{id:"kitchen_wall_corner",group:"furniture",category:"kitchen_cabinet",w:60,h:60},{id:"shelf_floor",group:"furniture",category:"shelving",w:100,h:35},{id:"shelf_wall",group:"furniture",category:"shelving",w:100,h:25},{id:"cooktop_two",group:"appliance",category:"cooktop",w:30,h:50},{id:"stove",group:"appliance",category:"cooktop",w:60,h:60},{id:"tv",group:"appliance",category:"tv",w:120,h:28},{id:"tv_wall",group:"appliance",category:"tv",w:120,h:15},{id:"toilet",group:"sanitary",category:"toilet",w:40,h:70},{id:"toilet_built_in",group:"sanitary",category:"toilet",w:40,h:55},{id:"bathtub",group:"sanitary",category:"bathtub",w:170,h:75},{id:"bathtub_corner",group:"sanitary",category:"bathtub",w:140,h:140},{id:"bidet",group:"sanitary",category:"bidet",w:40,h:60},{id:"bidet_built_in",group:"sanitary",category:"bidet",w:40,h:50},{id:"kitchen_sink",group:"sanitary",category:"kitchen_sink",w:60,h:50},{id:"kitchen_sink_double",group:"sanitary",category:"kitchen_sink",w:90,h:50}].map(e=>({id:e.id,group:e.group,category:e.category,w:e.w,h:e.h,designer:!0})),...Nl.filter(e=>Hl.has(e.id))],Bl=new Map(Ll.map(e=>[e.id,e]));function ql(e){return e&&Bl.get(e)||null}function jl(e){return!0===Bl.get(e)?.designer}function Wl(e){return Ll.filter(t=>t.group===e)}function Ul(e){const t=ql(e);return t?{w:t.w,h:t.h}:{w:60,h:60}}function Gl(e,t,i=rl,n=1e3){const r=Number(t)>0?Number(t):5;return(Number(e)||0)/r*i/n}const Vl=5e-4,Kl=tl;function Yl(e){return Number.isFinite(e)?Math.max(Vl,Math.min(Kl,e)):Vl}function Xl(e){return Number.isFinite(e)?Math.max(1,Math.min(1e4,e)):1}const Zl=e=>{const t=Math.round(1e3*e)/1e3;return Object.is(t,-0)?"0":String(t)};function Jl(e,t){const i=ql(e);if(!i)return null;if(i.designer)return Ol.art(e,t)??null;const n=function(e,t,i){if(!e.g)return"";const n=e=>Zl(e*t),r=e=>Zl(e*i),o=[];for(const s of e.g)if("r"===s[0]){const[,e,t,i,a]=s;o.push(`M${n(e)} ${r(t)}H${n(e+i)}V${r(t+a)}H${n(e)}Z`)}else if("l"===s[0]){const[,e,t,i,a]=s;o.push(`M${n(e)} ${r(t)}L${n(i)} ${r(a)}`)}else if("e"===s[0]){const[,e,a,l,c]=s;o.push(`M${n(e-l)} ${r(a)}A${Zl(l*t)} ${Zl(c*i)} 0 0 1 ${n(e+l)} ${r(a)}A${Zl(l*t)} ${Zl(c*i)} 0 0 1 ${n(e-l)} ${r(a)}Z`)}else{const e=s.slice(1);if(e.length<4)continue;let t=`M${n(e[0])} ${r(e[1])}`;for(let i=2;i+10?n:Number.isFinite(r)&&r>0?r:1,s=Number(t),a=o*(Number.isFinite(s)&&s>0?s:1);return Number.isFinite(a)&&a>0?a:o}function ec(e,t,i,n,r){const o=e+i/2,s=t+n/2,a=(Number(r)||0)*Math.PI/180,l=Math.cos(a),c=Math.sin(a),h=(e,t)=>{const i=e-o,n=t-s;return[o+i*l-n*c,s+i*c+n*l]};return[h(e,t),h(e+i,t),h(e+i,t+n),h(e,t+n)]}function tc(e,t,i,n,r,o,s){const a=Number.isFinite(s)&&s>0?s:1e-6,l=(Number(e.angle)||0)*Math.PI/180,c=Math.cos(l),h=Math.sin(l),d=-Math.sin(l),u=Math.cos(l),p=e.x+e.w/2,_=e.y+e.h/2,m=t>0?-e.w/2:t<0?e.w/2:0,g=i>0?-e.h/2:i<0?e.h/2:0,f=p+m*c+g*d,v=_+m*h+g*u,y=n-f,b=r-v,w=t?(y*c+b*h)*(t>0?1:-1):e.w,k=i?(y*d+b*u)*(i>0?1:-1):e.h;let x=t?Math.abs(w):e.w,S=i?Math.abs(k):e.h;if(o&&t&&i){const t=x/Math.max(e.w,a),i=S/Math.max(e.h,a),n=Math.abs(t-1)>=Math.abs(i-1)?t:i,r=Math.max(a/e.w,a/e.h),o=Math.max(r,Number.isFinite(n)?n:r);x=e.w*o,S=e.h*o}x=Math.max(a,Number.isFinite(x)?x:a),S=Math.max(a,Number.isFinite(S)?S:a);const $=!!t&&w<0,M=!!i&&k<0,R=t?(t>0?1:-1)*($?-1:1):0,C=i?(i>0?1:-1)*(M?-1:1):0,T=f+R*(x/2)*c+C*(S/2)*d,D=v+R*(x/2)*h+C*(S/2)*u,A=!!e.flip_h!==$,P=!!e.flip_v!==M;return{x:T-x/2,y:D-S/2,w:x,h:S,...Number(e.angle)?{angle:Number(e.angle)}:{},...A?{flip_h:!0}:{},...P?{flip_v:!0}:{}}}function ic(e,t,i,n){let r=Number(e)+(Number(i)-Number(t));if([r,t,i].every(Number.isFinite)||(r=0),n){const e=r/45;r=45*(e<0?-Math.round(Math.abs(e)):Math.round(e))}return r=(r%360+360)%360,r>180?r-360:r}function nc(e,t,i,n,r){const o=e.x*t,s=e.y*i,a=e.w*t,l=e.h*i,c=o+a/2,h=s+l/2,d=o+(e.flip_h?a:0),u=s+(e.flip_v?l:0),p=(e.flip_h?-1:1)*a/n,_=(e.flip_v?-1:1)*l/r,m=Number(e.angle)||0;return(m?`rotate(${m} ${c} ${h}) `:"")+`translate(${d} ${u}) scale(${p} ${_})`}function rc(e,t,i,n=.1){if("string"==typeof e&&!e.trim())return null;const r=Number(e);if(!Number.isFinite(r)||0===r)return null;const o=r*(t?30.48:100),s=Math.abs(o);return si?null:o}function oc(e,t,i){const n=Math.abs(Number(e))/(i?30.48:100),r=Number(n.toFixed(6));return String(t?-r:r)}const sc=15e3,ac=2e3,lc=new WeakMap;function cc(e,t){let i=lc.get(e);if(!i){const t=new Set;i={hiddenAt:"hidden"===e.visibilityState?Date.now():0,token:0,subscribers:t,onVisibility:()=>{const t=lc.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 n=t.hiddenAt?Math.max(0,i-t.hiddenAt):0;t.hiddenAt=0,t.token++;const r={kind:"visible",token:t.token,at:i,hiddenFor:n,long:n>=sc};for(const e of[...t.subscribers])e(r)},onPageShow:t=>{const i=lc.get(e);if(!i)return;const n=Date.now();i.token++;const r={kind:"pageshow",token:i.token,at:n,hiddenFor:0,long:!!t.persisted,persisted:!!t.persisted};for(const e of[...i.subscribers])e(r)}},lc.set(e,i),e.addEventListener("visibilitychange",i.onVisibility),e.defaultView?.addEventListener("pageshow",i.onPageShow)}return i.subscribers.add(t),()=>{const i=lc.get(e);i&&(i.subscribers.delete(t),i.subscribers.size||(e.removeEventListener("visibilitychange",i.onVisibility),e.defaultView?.removeEventListener("pageshow",i.onPageShow),lc.delete(e)))}}const hc={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 dc{constructor(e,t=hc){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 n=(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 r=0;const o=new Promise(e=>{r=this.clock.setTimeout(()=>e({ready:!1,timedOut:!0}),ac)}),s=await Promise.race([n.then(e=>({ready:e,timedOut:!1})),o]);return i=!1,this.clock.clearTimeout(r),!this._disposed&&e===this._token&&(!(!s.ready&&!s.timedOut)&&(s.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 uc(e){let t=2166136261,i=2654435769;const n=new WeakSet,r=e=>{for(let n=0;n>>0)+(i>>>2)}},o=e=>{if(null===e)return void r("n");const t=typeof e;if("string"===t)return void r(`s${e.length}:${e}`);if("number"===t)return void r(`d${Number.isNaN(e)?"NaN":String(e)}`);if("boolean"===t)return void r(e?"t":"f");if("undefined"===t)return void r("u");if("object"!==t)return void r(`${t}:${String(e)}`);const i=e;if(n.has(i))r("[cycle]");else{if(n.add(i),Array.isArray(e)){r("[");for(const t of e)o(t);return r("]"),void n.delete(i)}r("{");for(const t of Object.keys(e).sort())r(t),o(e[t]);r("}"),n.delete(i)}};return o(e),`${(t>>>0).toString(16).padStart(8,"0")}${(i>>>0).toString(16).padStart(8,"0")}`}function pc(e){return uc(e)}const _c=new WeakMap;class mc{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=_c.get(e);return t||(t={signed:{},queued:new Set,inFlight:new Map,retry:new Map,listeners:new Set,settlers:new Set,references:new Map},_c.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=Hn(t);if(!i.startsWith("/api/houseplan/content/"))return i;const n=this.bind(e);this.referenced.add(i),n.references.set(this.referenceOwner,new Set(this.referenced));const r=n.signed[i],o=r?this.now()-r.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 n of function(e,t){const i=Math.max(1,Math.floor(t)),n=[];for(let t=0;t{const n=i.inFlight.get(e);return!(void 0!==n&&t-n<15e3)&&(i.inFlight.set(e,t),!0)});r.length&&e.callWS({type:"houseplan/content/sign",paths:r}).then(e=>{const t=this.now();let n=0,o=!1;for(const s of r){const r=e?.urls?.[s];if("string"==typeof r&&r){const e=i.signed[s];e?.loaded&&e.url!==r?(e.pending={url:r,at:t},this.preloadReplacement(i,s,r,t)):(i.signed[s]={url:r,at:t,loaded:e?.url===r&&!!e.loaded},o=!0),i.retry.delete(s),n++}else this.backOff(i,s)}if(n&&(this.trimShared(i),o))for(const e of[...i.listeners])e()}).catch(()=>{for(const e of r)this.backOff(i,e)}).finally(()=>{for(const e of r)i.inFlight.get(e)===t&&i.inFlight.delete(e);for(const e of[...i.settlers])e()})}}preloadReplacement(e,t,i,n){const r=()=>{const r=e.signed[t];if(r?.pending?.url===i){e.signed[t]={url:i,at:n,loaded:!0},e.retry.delete(t),this.trimShared(e);for(const t of[...e.listeners])t()}},o=()=>{const n=e.signed[t];n?.pending?.url===i&&(delete n.pending,this.backOff(e,t))};if("undefined"==typeof Image)return void r();const s=new Image;s.onload=()=>{("function"==typeof s.decode?s.decode():Promise.resolve()).then(r).catch(o)},s.onerror=o,s.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 n=i.url;return i.preload=new Promise(r=>{const o=new Image;let s=!1;const a=o=>{if(s)return;s=!0,clearTimeout(l);const a=e.signed[t];if(a===i&&delete a.preload,o&&a===i&&a.url===n){a.loaded=!0;for(const t of[...e.listeners])t();r(!0)}else o||a!==i||this.backOff(e,t),r(!1)};o.onload=()=>{("function"==typeof o.decode?o.decode():Promise.resolve()).then(()=>a(!0)).catch(()=>a(!1))},o.onerror=()=>a(!1);const l=setTimeout(()=>a(!1),ac);o.src=n}),i.preload}prepareImage(e,t){const i=Hn(t);if(!i.startsWith("/api/houseplan/content/"))return Promise.resolve(!0);const n=this.bind(e),r=()=>{const t=n.signed[i];if(t&&this.now()-t.at