master 9461eaf7818e cached
170 files
6.3 MB
1.7M tokens
6672 symbols
1 requests
Download .txt
Showing preview only (6,658K chars total). Download the full file or copy to clipboard to get everything.
Repository: JuanMTech/Home_Assistant_files
Branch: master
Commit: 9461eaf7818e
Files: 170
Total size: 6.3 MB

Directory structure:
gitextract_4o_zm6x8/

├── .vscode/
│   └── settings.json
├── README.md
├── automations.yaml
├── cloud_config.yaml
├── configuration.yaml
├── custom_components/
│   ├── alarmo/
│   │   ├── __init__.py
│   │   ├── alarm_control_panel.py
│   │   ├── automations.py
│   │   ├── card.py
│   │   ├── config_flow.py
│   │   ├── const.py
│   │   ├── event.py
│   │   ├── frontend/
│   │   │   └── dist/
│   │   │       └── alarm-panel.js
│   │   ├── helpers.py
│   │   ├── manifest.json
│   │   ├── mqtt.py
│   │   ├── panel.py
│   │   ├── sensors.py
│   │   ├── services.yaml
│   │   ├── store.py
│   │   └── websockets.py
│   └── hacs/
│       ├── __init__.py
│       ├── base.py
│       ├── config_flow.py
│       ├── const.py
│       ├── diagnostics.py
│       ├── entity.py
│       ├── enums.py
│       ├── exceptions.py
│       ├── frontend.py
│       ├── hacs_frontend/
│       │   ├── __init__.py
│       │   ├── c.004a7b01.js
│       │   ├── c.01f18260.js
│       │   ├── c.063631e8.js
│       │   ├── c.0681dd5f.js
│       │   ├── c.07e1d870.js
│       │   ├── c.18158037.js
│       │   ├── c.21c042d4.js
│       │   ├── c.2442b973.js
│       │   ├── c.24bd2446.js
│       │   ├── c.262db200.js
│       │   ├── c.2a7cd87a.js
│       │   ├── c.2aa297ae.js
│       │   ├── c.3507790e.js
│       │   ├── c.38b86040.js
│       │   ├── c.46ab4f2a.js
│       │   ├── c.487362b0.js
│       │   ├── c.4a97632a.js
│       │   ├── c.4d3573a6.js
│       │   ├── c.50bfd408.js
│       │   ├── c.55084342.js
│       │   ├── c.5d9598b2.js
│       │   ├── c.5ec2d281.js
│       │   ├── c.656daa82.js
│       │   ├── c.6711bf6c.js
│       │   ├── c.6764b15a.js
│       │   ├── c.67735e63.js
│       │   ├── c.743a15a1.js
│       │   ├── c.80122d23.js
│       │   ├── c.8e28b461.js
│       │   ├── c.90083196.js
│       │   ├── c.91b5f3b9.js
│       │   ├── c.9475214f.js
│       │   ├── c.962e71e3.js
│       │   ├── c.99c1c4ba.js
│       │   ├── c.9a1f96ed.js
│       │   ├── c.a1d7c963.js
│       │   ├── c.a9ee435e.js
│       │   ├── c.abbcb4be.js
│       │   ├── c.ad739743.js
│       │   ├── c.b27925d9.js
│       │   ├── c.bad50d60.js
│       │   ├── c.bc53dda1.js
│       │   ├── c.bd21ff9b.js
│       │   ├── c.c28253df.js
│       │   ├── c.c4f30bcd.js
│       │   ├── c.cf66b923.js
│       │   ├── c.d5d0a5c5.js
│       │   ├── c.d9dcade0.js
│       │   ├── c.da8de431.js
│       │   ├── c.e0e56ec4.js
│       │   ├── c.e23b0d0b.js
│       │   ├── c.e431cd4c.js
│       │   ├── c.e4d174e7.js
│       │   ├── c.e6921cf4.js
│       │   ├── c.eb4f9da9.js
│       │   ├── c.ecb39554.js
│       │   ├── c.f4178207.js
│       │   ├── c.f6d57c77.js
│       │   ├── c.fb6ed4e2.js
│       │   ├── c.fb76e5d5.js
│       │   ├── c.fc1fab2b.js
│       │   ├── c.fe747ba2.js
│       │   ├── c.ff22e505.js
│       │   ├── entrypoint.js
│       │   ├── main-7bc9a818.js
│       │   ├── manifest.json
│       │   └── version.py
│       ├── iconset.js
│       ├── manifest.json
│       ├── repositories/
│       │   ├── __init__.py
│       │   ├── appdaemon.py
│       │   ├── base.py
│       │   ├── integration.py
│       │   ├── netdaemon.py
│       │   ├── plugin.py
│       │   ├── python_script.py
│       │   └── theme.py
│       ├── sensor.py
│       ├── system_health.py
│       ├── translations/
│       │   └── en.json
│       ├── update.py
│       ├── utils/
│       │   ├── __init__.py
│       │   ├── backup.py
│       │   ├── configuration_schema.py
│       │   ├── data.py
│       │   ├── decode.py
│       │   ├── decorator.py
│       │   ├── default.repositories
│       │   ├── filters.py
│       │   ├── json.py
│       │   ├── logger.py
│       │   ├── path.py
│       │   ├── platform_setup.py
│       │   ├── queue_manager.py
│       │   ├── regex.py
│       │   ├── store.py
│       │   ├── template.py
│       │   ├── validate.py
│       │   ├── version.py
│       │   └── workarounds.py
│       ├── validate/
│       │   ├── README.md
│       │   ├── __init__.py
│       │   ├── archived.py
│       │   ├── base.py
│       │   ├── brands.py
│       │   ├── description.py
│       │   ├── hacsjson.py
│       │   ├── images.py
│       │   ├── information.py
│       │   ├── integration_manifest.py
│       │   ├── issues.py
│       │   ├── manager.py
│       │   └── topics.py
│       └── websocket/
│           ├── __init__.py
│           ├── critical.py
│           ├── repositories.py
│           └── repository.py
├── lovelace_ui_raw_config_file.yaml
├── scenes.yaml
├── scripts.yaml
├── switches/
│   ├── antonettes_work_laptop.yaml
│   ├── br_fireplace.yaml
│   ├── br_tv.yaml
│   ├── juans_work_laptop.yaml
│   ├── lr_fireplace.yaml
│   ├── lr_tv.yaml
│   └── mac_studio_wol.yaml
├── themes/
│   ├── google_dark_theme.yaml
│   ├── google_light_theme.yaml
│   ├── google_theme.yaml
│   ├── ios_dark_mode.yaml
│   ├── ios_light_mode.yaml
│   ├── ios_theme.yaml
│   └── macos.yaml
└── www/
    └── community/
        ├── alarmo-card/
        │   └── alarmo-card.js
        ├── kiosk-mode/
        │   └── kiosk-mode.js
        ├── lovelace-mushroom/
        │   └── mushroom.js
        ├── mini-graph-card/
        │   └── mini-graph-card-bundle.js
        └── vertical-stack-in-card/
            └── vertical-stack-in-card.js

================================================
FILE CONTENTS
================================================

================================================
FILE: .vscode/settings.json
================================================
{
    "files.associations": {
        "*.yaml": "home-assistant"
    }
}

================================================
FILE: README.md
================================================
<p align="center">
  <img src="https://raw.githubusercontent.com/JuanMTech/Home_Assistant_files/master/images/Logo/JMT_Banner.png">
</p>
<br />

![GitHub Watchers][watchers]
![GitHub Stars][stars]
![GitHub Forks][forks]
<br />

[![Subscribe to YouTube channel][youtube-sub-shield]][youtubesubscribe]

[![Become a Patron][become-a-patron-shield]][becomeapatron]

[![Buy me a coffee][buymeacoffee-shield]][buymeacoffee]
<br />

# About

Hey guys, Juan here from [juanmtech.com](https://www.juanmtech.com). These are the Home Assistant configuration files I use in my personal Home Assistant set up. Hopefully, this repository can help you get started with Home Assistant and give you some ideas for your own configuration.

If you are new to Home Assistant, I recommend visiting my [YouTube channel](https://www.youtube.com/JuanMTech) and [website](https://www.juanmtech.com) where you can find easy to follow tutorials on how to get started.<br />
<br />

## Lovelace set up

<br />
<p align="center">
<img src="https://raw.githubusercontent.com/JuanMTech/Home_Assistant_files/master/images/Home_Assistant_Images/HA_Dashboard.png"</p>
<br />

## Home Assistant tutorials

Here are some of the tutorials that can get you started with Home Assistant:<br />
<br />

<TABLE>
<TR>
    <TD>
    <a href="https://youtu.be/F57zx3qQXuY"><img src="https://raw.githubusercontent.com/JuanMTech/Home_Assistant_files/master/images/Thumbnails/Getting_started_with_Home_Assistant.png" /></a><br/>
    </TD>
    <TD>
    <a href="https://youtu.be/6-HgmFnZ95A"><img src="https://raw.githubusercontent.com/JuanMTech/Home_Assistant_files/master/images/Thumbnails/How_to_set_up_Home_Assistant_on_Unraid.png" /></a><br/>
    </TD>
</TR>
</TABLE>

<TABLE>
<TR>
    <TD>
    <a href="https://youtu.be/2CbObOuOEuA"><img src="https://raw.githubusercontent.com/JuanMTech/Home_Assistant_files/master/images/Thumbnails/How_to_set_up_Unraid_2021_Guide.png" /></a><br/>
    </TD>
    <TD>
    <a href="https://youtu.be/i4Jgr3tR4Ps"><img src="https://raw.githubusercontent.com/JuanMTech/Home_Assistant_files/master/images/Thumbnails/Install HACS in Home_Assistant_for_themes_and_custom_cards.png" /></a><br/>
    </TD>
</TR>
</TABLE>

<TABLE>
<TR>
    <TD>
    <a href="https://youtu.be/62uhVq_76K8"><img src="https://raw.githubusercontent.com/JuanMTech/Home_Assistant_files/master/images/Thumbnails/Intergrate_Z-Wave_with_Home_Assistant.png" /></a><br/>
    </TD>
    <TD>
    <a href="https://youtu.be/VsjTzm2JFJ0"><img src="https://raw.githubusercontent.com/JuanMTech/Home_Assistant_files/master/images/Thumbnails/How_to_use_NFC_tags_with_Home_Assistant.png" /></a><br/>
    </TD>
</TR>
</TABLE>

<TABLE>
<TR>
    <TD>
    <a href="https://youtu.be/bGqajHcgHMw"><img src="https://raw.githubusercontent.com/JuanMTech/Home_Assistant_files/master/images/Thumbnails/How_to_automatically_backup_Home_Assistant_to_Google_Drive.png" /></a><br/>
    </TD>
    <TD>
    <a href="https://youtu.be/xVvYN5uHaxg"><img src="https://raw.githubusercontent.com/JuanMTech/Home_Assistant_files/master/images/Thumbnails/Integrate_HomeKit_with_Home_Assistant_and_control_devices_with_Siri.png" /></a><br/>
    </TD>
</TR>
</TABLE>
<br />

## Video tutorials and written guides
* [YouTube Playlist](https://www.youtube.com/playlist?list=PLLydq6ff7NvJ1ioQSVRCt2FJK9EFzRKWr) - Easy to follow tutorials to get you started with Home Assistant
* [Written guides](https://www.juanmtech.com/tags/home-assistant/) - Companion writtent guides for all video tutorials

## Themes I made for Home Assistant *(Available via HACS)*
* [macOS-Theme](https://github.com/JuanMTech/macOS-Theme) (Dark/Light) - ⭐
* [iOS Theme](https://github.com/JuanMTech/ios-theme) (Dark/Light) - ⭐
* [Google Theme](https://github.com/JuanMTech/google-theme) (Dark/Light) - ⭐
* [Google Dark Theme](https://github.com/JuanMTech/google_dark_theme)
* [Google Light Theme](https://github.com/JuanMTech/google_light_theme)
* [iOS Dark Mode Theme](https://github.com/JuanMTech/ios_dark_mode_theme)
* [iOS Light Mode Theme](https://github.com/JuanMTech/ios_light_mode_theme)
* [AMOLED Blue Theme](https://github.com/JuanMTech/amoled_blue)
* [Green Dark mode Theme](https://github.com/JuanMTech/green_dark_mode)
* [Green Light mode Theme](https://github.com/JuanMTech/green_light_mode)
* [Orange Dark Theme](https://github.com/JuanMTech/orange_dark)
* [Orange Light Theme](https://github.com/JuanMTech/orange_light)

## Devices running Home Assistant
* Server running [Unraid](https://unraid.net) with Home Assistant  in a virtual machine

## Common equipment to run Home Assistant
* [Raspberry Pi 4](https://amzn.to/2Q3UwVi)
* [Raspberry Pi 4 case](https://amzn.to/2Q5HSoI) - *Best case for the Raspberry Pi 4*
* [Samsung microSD card 32GB](https://amzn.to/313ZUhu)
* [Intel NUC](https://amzn.to/34busQD) - *For extra performance*

## Devices to use with Home Assistant to automate your home

1. **Smart Speakers**
* [Google Home](https://store.google.com/us/product/google_home?hl=en-US)
* [Google Home Mini](https://store.google.com/product/google_home_mini?43700033967804248&gclid=Cj0KCQjwquTbBRCSARIsADzW88zhzmT6J3-arWJHTvvj4tbvnhIOjxhwb2yICOB36OtowI4cXF59k0kaAuF-EALw_wcB&gclsrc=aw.ds&dclid=CM7vqqfd-dwCFcS7swodddECDA)
* [Amazon Echo](https://amzn.to/2XzITuC)
* [Amazon Echo Dot](https://amzn.to/2N7nHYW)<br />

2. **InfraRed Remote**
* [BroadLink RM4 pro](https://amzn.to/3QdzgJS)
* [BroadLink RM4 Mini](https://amzn.to/3zuwBVt)<br />

3. **Zigbee Devices**
* [ConBee II - Zigbee USB Gateway](https://amzn.to/324zSdd)
* [Aqara Door and Window Sensor](https://amzn.to/313ZYxO)
* [Aqara Smart Plug](https://amzn.to/3h8odkb)
* [Aqara Wireless Mini Switch](https://amzn.to/3g2n5wV)
* [Aqara Temperature and Humidity Sensor](https://amzn.to/2Eg6fgN)
* [Philips Hue Play Black & Color Smart Light](https://amzn.to/3iR9Ktj)
* [Philips Hue Smart Dimmer Switch](https://amzn.to/3aBKd4c)<br />

4. **Z-Wave Devices**
* [Aeotec Z-Stick 7 Plus](https://amzn.to/3BEMawk)
* [First Alert Z-Wave Smoke Detector & Carbon Monoxide Alarm](https://amzn.to/3oPbNmL)
<br />
<br />

> ⚠️ ***DISCLOSURE:** Some of the links here, are **affiliate links**, meaning, at no additional cost to you, I will earn a commission if you click through and make a purchase.***


[watchers]: https://img.shields.io/github/watchers/JuanMTech/Home_Assistant_files.svg?style=social&label=Watchers
[stars]: https://img.shields.io/github/stars/JuanMTech/Home_Assistant_files.svg?style=social&label=Stars
[forks]: https://img.shields.io/github/forks/JuanMTech/Home_Assistant_files.svg?style=social&label=Forks

[buymeacoffee-shield]: https://raw.githubusercontent.com/JuanMTech/Home_Assistant_files/master/images/Support_buttons/Buy_me_a_coffee.png
[buymeacoffee]: https://www.buymeacoffee.com/JuanMTech

[become-a-patron-shield]: https://raw.githubusercontent.com/JuanMTech/Home_Assistant_files/master/images/Support_buttons/Patreon.png
[becomeapatron]: https://www.patreon.com/JuanMTech

[youtube-sub-shield]: https://raw.githubusercontent.com/JuanMTech/Home_Assistant_files/master/images/Support_buttons/YouTube_Subscribe.png
[youtubesubscribe]: https://www.youtube.com/c/JuanMTech?sub_confirmation=1


================================================
FILE: automations.yaml
================================================
- id: '1609360640751'
  alias: Ofc Desk light toggle
  description: ''
  trigger:
  - device_id: 9a4868dc7e530466fc51a82a
    domain: zha
    platform: device
    type: remote_button_double_press
    subtype: remote_button_double_press
  condition: []
  action:
  - type: toggle
    device_id: 98a6f3f2f6065c6593d7a4e8ccc38fca
    entity_id: light.ofc_desk_light
    domain: light
  mode: single
- id: '1609360756657'
  alias: Lr light toggle
  description: Toggle living room light with living room switch
  trigger:
  - device_id: 3966ae998ca93d88e8dc1fa3
    domain: zha
    platform: device
    type: remote_button_short_press
    subtype: remote_button_short_press
  condition: []
  action:
  - service: light.toggle
    data: {}
    target:
      entity_id: light.lr_light
  mode: single
- id: '1609360846832'
  alias: Br light toggle with bed switch
  description: ''
  trigger:
  - device_id: 1a9d25890f90f9adfd8001a68
    domain: zha
    platform: device
    type: remote_button_short_press
    subtype: remote_button_short_press
  condition: []
  action:
  - service: light.toggle
    data: {}
    target:
      entity_id: light.br_light
  mode: single
- id: '1609361264184'
  alias: Lr TV lights toggle
  description: ''
  trigger:
  - device_id: 3966ae998ca93d88e8dc1fa3
    domain: zha
    platform: device
    type: remote_button_double_press
    subtype: remote_button_double_press
  condition: []
  action:
  - service: light.toggle
    target:
      entity_id: light.lr_tv_lights
    data: {}
  mode: single
- id: '1609361366516'
  alias: Lr Toggle Fireplace light with living room switch
  description: ''
  trigger:
  - device_id: 3966ae998ca93d88e8dc1fa3
    domain: zha
    platform: device
    type: remote_button_long_press
    subtype: remote_button_long_press
  condition: []
  action:
  - service: switch.toggle
    data: {}
    target:
      entity_id: switch.lr_fireplace
  mode: single
- id: '1609361438749'
  alias: Br Toggle bedroom AC/Fan with bed switch
  description: ''
  trigger:
  - device_id: 1a9d25890f90f9adfd8001a68
    domain: zha
    platform: device
    type: remote_button_long_press
    subtype: remote_button_long_press
  condition: []
  action:
  - service: script.br_air_conditioner
    data: {}
  - service: script.br_fan
    data: {}
    enabled: false
  mode: single
- id: '1609712886475'
  alias: Ofc Monitor light modes
  description: ''
  trigger:
  - platform: state
    entity_id: input_select.ofc_monitor_light_mode
    to: Soft light
  - platform: state
    entity_id: input_select.ofc_monitor_light_mode
    to: YouTube light
  condition: []
  action:
  - choose:
    - conditions:
      - condition: state
        entity_id: input_select.ofc_monitor_light_mode
        state: Soft light
      sequence:
      - scene: scene.soft_light
    - conditions:
      - condition: state
        entity_id: input_select.ofc_monitor_light_mode
        state: YouTube light
      sequence:
      - scene: scene.youtube_light
    default:
    - service: light.toggle
      data: {}
      target:
        entity_id: light.ofc_monitor_lights
  mode: single
- id: '1609717531423'
  alias: Ofc Monitors lights toggle
  description: ''
  trigger:
  - device_id: 9a4868dc7e530466fc51a82a
    domain: zha
    platform: device
    type: remote_button_short_press
    subtype: remote_button_short_press
  condition: []
  action:
  - service: light.toggle
    data: {}
    target:
      entity_id: light.ofc_monitor_lights
  mode: single
- id: '1609728017637'
  alias: Lr TV lights mode dropdown set to Selec
  description: ''
  trigger:
  - platform: state
    entity_id: input_select.lr_tv_light_mode
    from: Select
  condition: []
  action:
  - service: input_select.select_option
    data:
      option: Select
    target:
      entity_id: input_select.lr_tv_light_mode
  mode: single
- id: '1609783393518'
  alias: Ofc Turn off monitor lights when Mac Studio turns off
  description: ''
  trigger:
  - platform: state
    entity_id:
    - switch.mac_studio
    to: 'off'
  condition:
  - condition: state
    entity_id: light.ofc_monitor_lights
    state: 'on'
  action:
  - service: light.turn_off
    target:
      entity_id: light.ofc_monitor_lights
    data: {}
  mode: single
- id: '1623453911792'
  alias: Lr TV light modes
  description: Change TV lights to different scenes
  trigger:
  - platform: state
    to: White
    entity_id: input_select.lr_tv_light_mode
  - platform: state
    entity_id: input_select.lr_tv_light_mode
    to: Warm
  - platform: state
    to: Blue
    entity_id: input_select.lr_tv_light_mode
  - platform: state
    entity_id: input_select.lr_tv_light_mode
    to: Purple
  condition:
  - condition: state
    entity_id: light.lr_tv_lights
    state: 'on'
  action:
  - choose:
    - conditions:
      - condition: state
        entity_id: input_select.lr_tv_light_mode
        state: White
      sequence:
      - scene: scene.tv_light_white
    - conditions:
      - condition: state
        entity_id: input_select.lr_tv_light_mode
        state: Warm
      sequence:
      - scene: scene.tv_light_warm
    - conditions:
      - condition: state
        entity_id: input_select.lr_tv_light_mode
        state: Blue
      sequence:
      - scene: scene.tv_light_blue
    - conditions:
      - condition: state
        entity_id: input_select.lr_tv_light_mode
        state: Purple
      sequence:
      - scene: scene.tv_light_purple
    default:
    - service: light.toggle
      data: {}
      target:
        entity_id:
        - light.lr_tv_light_left
        - light.lr_tv_light_right
  mode: single
- id: '1623454516597'
  alias: Ofc Monitor light mode dropdown set to Select
  description: ''
  trigger:
  - platform: state
    entity_id: input_select.ofc_monitor_light_mode
    from: Select
  condition: []
  action:
  - service: input_select.select_option
    data:
      option: Select
    target:
      entity_id: input_select.ofc_monitor_light_mode
  mode: single
- id: '1626477608097'
  alias: Ofc Set monitors lights to soft white when turn on during day light
  description: ''
  trigger:
  - platform: state
    entity_id: light.ofc_monitor_lights
    from: 'off'
    to: 'on'
  condition:
  - condition: time
    after: 08:00:00
    before: '23:00:00'
  action:
  - scene: scene.soft_light
  mode: single
- id: '1628409747827'
  alias: Br Fireplace toggle with bed switch
  description: ''
  trigger:
  - device_id: 1a9d25890f90f9adfd8001a68
    domain: zha
    platform: device
    type: remote_button_double_press
    subtype: remote_button_double_press
  condition: []
  action:
  - service: switch.toggle
    target:
      entity_id: switch.br_fireplace
    data: {}
  mode: single
- id: '1628833569186'
  alias: Ofc Turn off living room light with office switch
  description: ''
  trigger:
  - device_id: 9a4868dc7e530466fc51a82a
    domain: zha
    platform: device
    type: remote_button_long_press
    subtype: remote_button_long_press
  condition: []
  action:
  - service: light.toggle
    data: {}
    target:
      entity_id: light.lr_light
  mode: single
- id: '1631293897934'
  alias: Lr Cam Privacy Mode
  description: ''
  trigger:
  - platform: state
    entity_id: switch.lr_camera_privacy_mode
    to: 'on'
  - platform: state
    entity_id: switch.lr_camera_privacy_mode
    to: 'off'
  condition: []
  action:
  - delay:
      hours: 0
      minutes: 0
      seconds: 0
      milliseconds: 500
  - if:
    - condition: state
      entity_id: switch.lr_camera_privacy_mode
      state: 'on'
    then:
    - service: switch.turn_on
      data: {}
      target:
        entity_id: switch.lr_camera_status_led
    else:
    - service: switch.turn_off
      data: {}
      target:
        entity_id: switch.lr_camera_status_led
  mode: single
- id: '1632442030624'
  alias: Br Turn off bedroom fireplace at 3:00 AM
  description: ''
  trigger:
  - platform: time
    at: 03:00:00
  condition:
  - condition: state
    entity_id: switch.br_fireplace
    state: 'on'
  action:
  - service: switch.turn_off
    data: {}
    target:
      entity_id: switch.br_fireplace
  mode: single
- id: '1634356553136'
  alias: Kit Motion detected in litter box
  description: ''
  trigger:
  - platform: state
    entity_id: binary_sensor.kit_litter_sensor_zone
    from: 'off'
    to: 'on'
  condition: []
  action:
  - service: notify.mobile_app_juans_iphone
    data:
      message: Einstein is using the litter box
      data:
        group: cat-litter-box
  - service: notify.mobile_app_antonettes_iphone
    data:
      message: Einstein is using the litter box
      data:
        group: cat-litter-box
  mode: single
- id: '1643825385976'
  alias: Home Assistant Backups Issue Notification
  description: Send a mobile notification when there is an issue with the automatic
    backups from the HA Google Drive backups add-on
  trigger:
  - platform: state
    entity_id: binary_sensor.backups_stale
    from: 'off'
    to: 'on'
  condition: []
  action:
  - service: notify.mobile_app_juans_iphone
    data:
      title: There is an issue with the backups
      message: Access the Home Assistant Google Drive Backup add-on for details
      data:
        url: /cebe7a76_hassio_google_drive_backup/dashboard
        group: backups-alerts
  mode: single
- id: '1643863189258'
  alias: Br Cam Privacy Mode
  description: ''
  trigger:
  - platform: state
    entity_id:
    - switch.br_camera_privacy_mode
    to: 'on'
  - platform: state
    entity_id:
    - switch.br_camera_privacy_mode
    to: 'off'
  condition: []
  action:
  - delay:
      hours: 0
      minutes: 0
      seconds: 0
      milliseconds: 500
  - if:
    - condition: state
      entity_id: switch.br_camera_privacy_mode
      state: 'on'
    then:
    - service: switch.turn_on
      data: {}
      target:
        entity_id: switch.br_camera_status_led
    else:
    - service: switch.turn_off
      data: {}
      target:
        entity_id: switch.br_camera_status_led
  mode: single
- id: '1643863274039'
  alias: Kit Cam Privacy Mode
  description: ''
  trigger:
  - platform: state
    entity_id: switch.kit_camera_privacy_mode
    to: 'on'
  - platform: state
    entity_id: switch.kit_camera_privacy_mode
    to: 'off'
  condition: []
  action:
  - delay:
      hours: 0
      minutes: 0
      seconds: 0
      milliseconds: 500
  - if:
    - condition: state
      entity_id: switch.kit_camera_privacy_mode
      state: 'on'
    then:
    - service: switch.turn_on
      data: {}
      target:
        entity_id: switch.kit_camera_status_led
    else:
    - service: switch.turn_off
      data: {}
      target:
        entity_id: switch.kit_camera_status_led
  mode: single
- id: '1644549482846'
  alias: Sensors Low Battery Notification
  description: ''
  trigger:
  - platform: numeric_state
    entity_id:
    - sensor.br_weather_sensor_battery
    - sensor.entrance_door_sensor_battery
    - sensor.lr_door_sensor_battery
    - sensor.lr_weather_sensor_battery
    - sensor.kit_weather_sensor_battery
    - sensor.ofc_switch_battery
    - sensor.lr_switch_battery
    - sensor.kit_litter_sensor_battery
    - sensor.br_switch_battery
    below: '10'
  condition: []
  action:
  - service: notify.mobile_app_juans_iphone
    data:
      message: '{{ trigger.from_state.attributes.friendly_name }} sensor is low in
        battery'
      title: Low Battery alert
      data:
        group: sensors_battery_alert
  mode: single
- id: '1647454398605'
  alias: Notify when there is smoke or CO detected
  description: ''
  trigger:
  - platform: state
    entity_id:
    - binary_sensor.lr_smoke_detected
    - binary_sensor.br_smoke_detected
    - binary_sensor.lr_co_detected
    - binary_sensor.br_co_detected
    from: 'off'
    to: 'on'
  condition: []
  action:
  - choose:
    - conditions:
      - condition: state
        entity_id: binary_sensor.lr_smoke_detected
        state: 'on'
      sequence:
      - service: camera.snapshot
        data:
          filename: /config/www/living_room_image_smoke_alarm.jpg
        target:
          entity_id: camera.lr_camera
      - service: notify.mobile_app_juans_iphone
        data:
          message: Smoke detected in the living room
          title: Smoke Alert
          data:
            image: /local/living_room_image_smoke_alarm.jpg
            url: shortcuts://run-shortcut?name=UniFiProtect
            group: smoke-alarm
    - conditions:
      - condition: state
        entity_id: binary_sensor.br_smoke_detected
        state: 'on'
      sequence:
      - service: camera.snapshot
        data:
          filename: /config/www/bedroom_image_smoke_alarm.jpg
        target:
          entity_id: camera.br_camera
      - service: notify.mobile_app_juans_iphone
        data:
          message: Smoke detected in the bedroom
          title: Smoke Alert
          data:
            image: /local/bedroom_image_smoke_alarm.jpg
            url: shortcuts://run-shortcut?name=UniFiProtect
            group: smoke-alarm
    - conditions:
      - condition: state
        entity_id: binary_sensor.lr_co_detected
        state: 'on'
      sequence:
      - service: camera.snapshot
        data:
          filename: /config/www/living_room_image_co_alarm.jpg
        target:
          entity_id: camera.lr_camera
      - service: notify.mobile_app_juans_iphone
        data:
          message: Carbon monoxide detected in the living room
          title: CO Alert
          data:
            image: /local/living_room_image_co_alarm.jpg
            url: shortcuts://run-shortcut?name=UniFiProtect
            group: co-alarm
    - conditions:
      - condition: state
        entity_id: binary_sensor.br_co_detected
        state: 'on'
      sequence:
      - service: camera.snapshot
        data:
          filename: /config/www/bedroom_image_co_alarm.jpg
        target:
          entity_id: camera.br_camera
      - service: notify.mobile_app_juans_iphone
        data:
          message: Carbon monoxide detected in the bedroom
          title: CO Alert
          data:
            image: /local/bedroom_image_co_alarm.jpg
            url: shortcuts://run-shortcut?name=UniFiProtect
            group: co-alarm
    default: []
  mode: single
- id: '1649984320476'
  alias: Notify when updates are available
  description: ''
  trigger:
  - platform: state
    entity_id:
    - update.home_assistant_core_update
    - update.home_assistant_operating_system_update
    - update.home_assistant_supervisor_update
    - update.home_assistant_google_drive_backup_update
    - update.studio_code_server_update
    - update.z_wave_js_update
    - update.samba_share_update
    - update.esphome_update
    from: 'off'
    to: 'on'
  condition: []
  action:
  - service: notify.mobile_app_juans_iphone
    data:
      title: Update available
      data:
        group: updates
      message: "{% if is_state('update.home_assistant_core_update', 'on') %}\n  H.A.
        Core Update {{ state_attr('update.home_assistant_core_update', 'latest_version')
        }} available\n{% elif is_state('update.home_assistant_operating_system_update',
        'on') %}\n  H.A. OS Update {{ state_attr('update.home_assistant_operating_system_update',
        'latest_version') }} available\n{% elif is_state('update.home_assistant_supervisor_update',
        'on') %}\n  H.A. Supervisor Update {{ state_attr('update.home_assistant_supervisor_update',
        'latest_version') }} available\n{% elif is_state('update.home_assistant_google_drive_backup_update',
        'on') %}\n  Google Drive Backup Update {{ state_attr('update.home_assistant_google_drive_backup_update',
        'latest_version') }} available\n{% elif is_state('update.studio_code_server_update',
        'on') %}\n  Studio Code Server Update {{ state_attr('update.studio_code_server_update',
        'latest_version') }} available\n{% elif is_state('update.z_wave_js_update',
        'on') %}\n  Z-Wave JS Update {{ state_attr('update.z_wave_js_update', 'latest_version')
        }} available\n{% elif is_state('update.samba_share_update', 'on') %}\n  Samba
        Share Update {{ state_attr('update.samba_share_update', 'latest_version')
        }} available\n{% elif is_state('update.esphome_update', 'on') %}\n  ESPHome
        Update {{ state_attr('update.esphome_update', 'latest_version') }} available\n{%
        endif %}"
  mode: single
- id: '1649990587776'
  alias: Ofc Turn off monitor lights when Mac is idle
  description: ''
  trigger:
  - platform: state
    entity_id: binary_sensor.mac_studio_active
    attribute: Screensaver
    from: false
    to: true
  - platform: state
    entity_id: binary_sensor.mac_studio_active
    attribute: Screensaver
    from: true
    to: false
  condition: []
  action:
  - choose:
    - conditions:
      - condition: state
        entity_id: binary_sensor.mac_studio_active
        state: true
        attribute: Screensaver
      - condition: state
        entity_id: light.ofc_monitor_lights
        state: 'on'
      sequence:
      - service: light.turn_off
        data: {}
        target:
          entity_id: light.ofc_monitor_lights
    - conditions:
      - condition: state
        entity_id: binary_sensor.mac_studio_active
        attribute: Screensaver
        state: false
      - condition: state
        entity_id: light.ofc_monitor_lights
        state: 'off'
      sequence:
      - service: light.turn_on
        data: {}
        target:
          entity_id: light.ofc_monitor_lights
    default: []
  mode: single
- id: '1651718902759'
  alias: Home Assistant Remote access
  description: ''
  trigger:
  - platform: state
    entity_id:
    - device_tracker.juans_iphone
    to: not_home
  - platform: state
    entity_id:
    - device_tracker.juans_iphone
    to: home
  condition: []
  action:
  - if:
    - condition: state
      entity_id: device_tracker.juans_iphone
      state: not_home
    then:
    - service: cloud.remote_connect
      data: {}
    else:
    - service: cloud.remote_disconnect
      data: {}
  mode: single
- id: '1651720688481'
  alias: 'Ofc Toggle automation: Turn off monitor lights when Mac is idle'
  description: ''
  trigger:
  - platform: state
    entity_id:
    - light.ofc_monitor_lights
    to: 'on'
  - platform: state
    entity_id:
    - light.ofc_monitor_lights
    - switch.mac_studio
    to: 'off'
  condition: []
  action:
  - choose:
    - conditions:
      - condition: state
        entity_id: light.ofc_monitor_lights
        state: 'on'
      - condition: state
        entity_id: automation.turn_off_monitor_lights_when_mac_is_idle
        state: 'off'
      sequence:
      - service: automation.turn_on
        data: {}
        target:
          entity_id: automation.turn_off_monitor_lights_when_mac_is_idle
    - conditions:
      - condition: state
        entity_id: light.ofc_monitor_lights
        state: 'off'
      - condition: and
        conditions:
        - condition: state
          entity_id: switch.mac_studio
          state: 'off'
      sequence:
      - service: automation.turn_off
        data: {}
        target:
          entity_id: automation.turn_off_monitor_lights_when_mac_is_idle
    default: []
  mode: single
- id: '1652138178341'
  alias: Turn off cable boxes at 2AM if on
  description: ''
  trigger:
  - platform: time
    at: 02:00:00
  condition:
  - condition: state
    entity_id: switch.all_cable_boxes
    state: 'on'
  action:
  - service: switch.turn_off
    data: {}
    target:
      entity_id: switch.all_cable_boxes
  mode: single
- id: '1652220700080'
  alias: Air purifiers power on schedule 1AM
  description: ''
  trigger:
  - platform: time
    at: 01:00:00
  condition: []
  action:
  - choose:
    - conditions:
      - condition: state
        entity_id: switch.lr_air_purifier
        state: 'on'
      sequence:
      - service: switch.turn_off
        data: {}
        target:
          entity_id: switch.lr_air_purifier
    default: []
  - choose:
    - conditions:
      - condition: state
        entity_id: switch.br_air_purifier
        state: 'off'
      sequence:
      - service: switch.turn_on
        data: {}
        target:
          entity_id: switch.br_air_purifier
    default: []
  mode: single
- id: '1652221595750'
  alias: Air purifiers power on schedule 8AM
  description: ''
  trigger:
  - platform: time
    at: 08:00:00
  condition: []
  action:
  - choose:
    - conditions:
      - condition: state
        entity_id: switch.br_air_purifier
        state: 'on'
      sequence:
      - service: switch.turn_off
        data: {}
        target:
          entity_id: switch.br_air_purifier
    default: []
  - choose:
    - conditions:
      - condition: state
        entity_id: switch.lr_air_purifier
        state: 'off'
      sequence:
      - service: switch.turn_on
        data: {}
        target:
          entity_id: switch.lr_air_purifier
    default: []
  mode: single
- id: '1652839830104'
  alias: 'Ofc Tag 1: Toggle monitor lights'
  description: ''
  trigger:
  - platform: event
    event_type: monitor_lights
  condition: []
  action:
  - service: light.toggle
    data: {}
    target:
      entity_id: light.ofc_monitor_lights
  mode: single
- id: '1652839887141'
  alias: 'Ofc Tag 2: Toggle desk light'
  description: ''
  trigger:
  - platform: event
    event_type: desk_light
  condition: []
  action:
  - service: light.toggle
    data: {}
    target:
      entity_id: light.ofc_desk_light
  mode: single
- id: '1652839998997'
  alias: 'Kit Tag 3: Toggle kitchen cable box plug'
  description: ''
  trigger:
  - platform: event
    event_type: kit_cable_box_plug_toggle
  condition: []
  action:
  - service: switch.toggle
    data: {}
    target:
      entity_id: switch.kit_cable_box_plug
  mode: single
- id: '1652840047433'
  alias: 'Lr Tag 4: Toggle living room cable box plug'
  description: ''
  trigger:
  - platform: event
    event_type: lr_cable_box_plug_toggle
  condition: []
  action:
  - service: switch.toggle
    data: {}
    target:
      entity_id: switch.lr_cable_box_plug
  mode: single
- id: '1652840074185'
  alias: 'Br Tag 5: Toggle bedroom cable box plug'
  description: ''
  trigger:
  - platform: event
    event_type: br_cable_box_plug_toggle
  condition: []
  action:
  - service: switch.toggle
    data: {}
    target:
      entity_id: switch.br_cable_box_plug
  mode: single
- id: '1657847851936'
  alias: Enable recording on cameras after privacy mode disable
  description: ''
  trigger:
  - platform: state
    entity_id:
    - switch.lr_camera_privacy_mode
    - switch.br_camera_privacy_mode
    - switch.kit_camera_privacy_mode
    to: 'off'
  condition: []
  action:
  - delay:
      hours: 0
      minutes: 1
      seconds: 0
      milliseconds: 0
  - choose:
    - conditions:
      - condition: state
        entity_id: switch.lr_camera_privacy_mode
        state: 'off'
      sequence:
      - service: select.select_option
        data:
          option: Always
        target:
          entity_id: select.lr_camera_recording_mode
    - conditions:
      - condition: state
        entity_id: switch.br_camera_privacy_mode
        state: 'off'
      sequence:
      - service: select.select_option
        data:
          option: Always
        target:
          entity_id: select.br_camera_recording_mode
    - conditions:
      - condition: state
        entity_id: switch.kit_camera_privacy_mode
        state: 'off'
      sequence:
      - service: select.select_option
        data:
          option: Always
        target:
          entity_id: select.kit_camera_recording_mode
    default: []
  mode: single
- id: '1657898788107'
  alias: Br light toggle
  description: ''
  trigger:
  - device_id: 665cf85a1d2acea4db834
    domain: zha
    platform: device
    type: remote_button_short_press
    subtype: remote_button_short_press
  condition: []
  action:
  - service: light.toggle
    data: {}
    target:
      entity_id: light.br_light
  mode: single
- id: '1659476740186'
  alias: Br Fireplace toggle with bedroom switch
  description: ''
  trigger:
  - device_id: 665cf85a1d2acea4db834
    domain: zha
    platform: device
    type: remote_button_double_press
    subtype: remote_button_double_press
  condition: []
  action:
  - service: switch.toggle
    target:
      entity_id: switch.br_fireplace
    data: {}
  mode: single
- id: '1659476820610'
  alias: Br Toggle bedroom AC/Fan with bedroom switch
  description: ''
  trigger:
  - device_id: 665cf85a1d2acea4db834
    domain: zha
    platform: device
    type: remote_button_long_press
    subtype: remote_button_long_press
  condition: []
  action:
  - service: script.br_air_conditioner
    data: {}
  - service: script.br_fan
    data: {}
    enabled: false
  mode: single
- id: '1659489805267'
  alias: Notify when entrance lock is left unlocked for over 5 minutes
  description: ''
  trigger:
  - platform: state
    entity_id:
    - lock.entrance_door_lock
    to: unlocked
    for:
      hours: 0
      minutes: 5
      seconds: 0
  condition: []
  action:
  - if:
    - condition: state
      entity_id: lock.entrance_door_lock
      state: unlocked
      for:
        hours: 0
        minutes: 0
        seconds: 0
    then:
    - service: notify.mobile_app_juans_iphone
      data:
        title: Entrance Unlocked
        message: The entrance door was left unlocked
        data:
          actions:
          - action: lock
            title: Lock door
  mode: single
- id: '1659491009388'
  alias: Lock entrance door with notification event
  description: ''
  trigger:
  - platform: event
    event_type: mobile_app_notification_action
    event_data:
      action: lock
  condition: []
  action:
  - service: lock.lock
    data: {}
    target:
      entity_id: lock.entrance_door_lock
  mode: single


================================================
FILE: cloud_config.yaml
================================================
google_actions:
  entity_config:
    script.lr_air_conditioner:
      room: Living room
      aliases:
        - Living room air conditioner
        - Living room air
        - Air
        - AC
        - Air conditioner
    script.br_air_conditioner:
      room: Bedroom
      aliases:
        - Bedroom air conditioner
        - Bedroom air
        - Air
        - AC
        - Air conditioner
    switch.lr_air_purifier_plug:
      aliases:
        - Purifier
        - Air purifier
        - AP

================================================
FILE: configuration.yaml
================================================
# Configure a default setup of Home Assistant (frontend, api, etc)
default_config:

frontend:
  themes: !include_dir_merge_named themes

tts:
  - platform: google_translate

sun:
cloud: !include cloud_config.yaml
scene: !include scenes.yaml
group: !include groups.yaml
script: !include scripts.yaml
switch: !include_dir_list switches
stream:
automation: !include automations.yaml
wake_on_lan:


================================================
FILE: custom_components/alarmo/__init__.py
================================================
"""The Alarmo Integration."""
import logging
import bcrypt
import base64

from homeassistant.core import (
    callback,
)
from homeassistant.components.alarm_control_panel import DOMAIN as PLATFORM
from homeassistant.config_entries import ConfigEntry
from homeassistant.const import (
    ATTR_CODE,
    ATTR_NAME,
)
from homeassistant.core import HomeAssistant, asyncio
from homeassistant.helpers import device_registry as dr
from homeassistant.helpers.aiohttp_client import async_get_clientsession
from homeassistant.helpers.update_coordinator import DataUpdateCoordinator
from homeassistant.helpers.dispatcher import (
    async_dispatcher_connect,
    async_dispatcher_send,
)
from homeassistant.helpers.service import (
    async_register_admin_service,
)
from . import const
from .store import async_get_registry
from .panel import (
    async_register_panel,
    async_unregister_panel,
)
from .card import async_register_card
from .websockets import async_register_websockets
from .sensors import (
    SensorHandler,
    ATTR_GROUP,
    ATTR_ENTITIES
)
from .automations import AutomationHandler
from .mqtt import MqttHandler
from .event import EventHandler

_LOGGER = logging.getLogger(__name__)


async def async_setup(hass, config):
    """Track states and offer events for sensors."""
    return True


async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry):
    """Set up Alarmo integration from a config entry."""
    session = async_get_clientsession(hass)

    store = await async_get_registry(hass)
    coordinator = AlarmoCoordinator(hass, session, entry, store)

    device_registry = dr.async_get(hass)
    device_registry.async_get_or_create(
        config_entry_id=entry.entry_id,
        identifiers={(const.DOMAIN, coordinator.id)},
        name=const.NAME,
        model=const.NAME,
        sw_version=const.VERSION,
        manufacturer=const.MANUFACTURER,
    )

    hass.data.setdefault(const.DOMAIN, {})
    hass.data[const.DOMAIN] = {
        "coordinator": coordinator,
        "areas": {},
        "master": None
    }

    if entry.unique_id is None:
        hass.config_entries.async_update_entry(entry, unique_id=coordinator.id, data={})

    hass.async_create_task(
        hass.config_entries.async_forward_entry_setup(entry, PLATFORM)
    )

    # Register the panel (frontend)
    await async_register_panel(hass)
    await async_register_card(hass)

    # Websocket support
    await async_register_websockets(hass)

    # Register custom services
    register_services(hass)

    return True


async def async_unload_entry(hass, entry):
    """Unload Alarmo config entry."""
    unload_ok = all(
        await asyncio.gather(
            *[hass.config_entries.async_forward_entry_unload(entry, PLATFORM)]
        )
    )
    if not unload_ok:
        return False

    async_unregister_panel(hass)
    coordinator = hass.data[const.DOMAIN]["coordinator"]
    await coordinator.async_unload()
    return True


async def async_remove_entry(hass, entry):
    """Remove Alarmo config entry."""
    async_unregister_panel(hass)
    coordinator = hass.data[const.DOMAIN]["coordinator"]
    await coordinator.async_delete_config()
    del hass.data[const.DOMAIN]


class AlarmoCoordinator(DataUpdateCoordinator):
    """Define an object to hold Alarmo device."""

    def __init__(self, hass, session, entry, store):
        """Initialize."""
        self.id = entry.unique_id
        self.hass = hass
        self.entry = entry
        self.store = store
        self._subscriptions = []

        self._subscriptions.append(
            async_dispatcher_connect(
                hass, "alarmo_platform_loaded", self.setup_alarm_entities
            )
        )
        self.register_events()

        super().__init__(hass, _LOGGER, name=const.DOMAIN)

    @callback
    def setup_alarm_entities(self):
        self.hass.data[const.DOMAIN]["sensor_handler"] = SensorHandler(self.hass)
        self.hass.data[const.DOMAIN]["automation_handler"] = AutomationHandler(self.hass)
        self.hass.data[const.DOMAIN]["mqtt_handler"] = MqttHandler(self.hass)
        self.hass.data[const.DOMAIN]["event_handler"] = EventHandler(self.hass)

        areas = self.store.async_get_areas()
        config = self.store.async_get_config()

        for item in areas.values():
            async_dispatcher_send(self.hass, "alarmo_register_entity", item)

        if len(areas) > 1 and config["master"]["enabled"]:
            async_dispatcher_send(self.hass, "alarmo_register_master", config["master"])

    async def async_update_config(self, data):
        if "master" in data:
            old_config = self.store.async_get_config()
            if old_config[const.ATTR_MASTER] != data["master"]:
                if self.hass.data[const.DOMAIN]["master"]:
                    await self.async_remove_entity("master")
                if data["master"]["enabled"]:
                    async_dispatcher_send(self.hass, "alarmo_register_master", data["master"])
                else:
                    automations = self.hass.data[const.DOMAIN]["automation_handler"].get_automations_by_area(None)
                    if len(automations):
                        for el in automations:
                            self.store.async_delete_automation(el)
                        async_dispatcher_send(self.hass, "alarmo_automations_updated")

        self.store.async_update_config(data)
        async_dispatcher_send(self.hass, "alarmo_config_updated")

    async def async_update_area_config(self, area_id: str = None, data: dict = {}):
        if const.ATTR_REMOVE in data:
            # delete an area
            res = self.store.async_get_area(area_id)
            if not res:
                return
            sensors = self.store.async_get_sensors()
            sensors = dict(filter(lambda el: el[1]["area"] == area_id, sensors.items()))
            if sensors:
                for el in sensors.keys():
                    self.store.async_delete_sensor(el)
                async_dispatcher_send(self.hass, "alarmo_sensors_updated")

            automations = self.hass.data[const.DOMAIN]["automation_handler"].get_automations_by_area(area_id)
            if len(automations):
                for el in automations:
                    self.store.async_delete_automation(el)
                async_dispatcher_send(self.hass, "alarmo_automations_updated")

            self.store.async_delete_area(area_id)
            await self.async_remove_entity(area_id)

            if len(self.store.async_get_areas()) == 1 and self.hass.data[const.DOMAIN]["master"]:
                await self.async_remove_entity("master")

        elif self.store.async_get_area(area_id):
            # modify an area
            entry = self.store.async_update_area(area_id, data)
            if "name" not in data:
                async_dispatcher_send(self.hass, "alarmo_config_updated", area_id)
            else:
                await self.async_remove_entity(area_id)
                async_dispatcher_send(self.hass, "alarmo_register_entity", entry)
        else:
            # create an area
            entry = self.store.async_create_area(data)
            async_dispatcher_send(self.hass, "alarmo_register_entity", entry)

            config = self.store.async_get_config()

            if len(self.store.async_get_areas()) == 2 and config["master"]["enabled"]:
                async_dispatcher_send(self.hass, "alarmo_register_master", config["master"])

    def async_update_sensor_config(self, entity_id: str, data: dict):
        group = None
        if ATTR_GROUP in data:
            group = data[ATTR_GROUP]
            del data[ATTR_GROUP]
        if const.ATTR_REMOVE in data:
            self.store.async_delete_sensor(entity_id)
            self.assign_sensor_to_group(entity_id, None)
        elif self.store.async_get_sensor(entity_id):
            self.store.async_update_sensor(entity_id, data)
            self.assign_sensor_to_group(entity_id, group)
        else:
            self.store.async_create_sensor(entity_id, data)
            self.assign_sensor_to_group(entity_id, group)

        async_dispatcher_send(self.hass, "alarmo_sensors_updated")

    def async_update_user_config(self, user_id: str = None, data: dict = {}):

        if const.ATTR_REMOVE in data:
            self.store.async_delete_user(user_id)
            return

        if ATTR_CODE in data and data[ATTR_CODE]:
            data[const.ATTR_CODE_FORMAT] = "number" if data[ATTR_CODE].isdigit() else "text"
            data[const.ATTR_CODE_LENGTH] = len(data[ATTR_CODE])
            hashed = bcrypt.hashpw(
                data[ATTR_CODE].encode("utf-8"), bcrypt.gensalt(rounds=12)
            )
            hashed = base64.b64encode(hashed)
            data[ATTR_CODE] = hashed.decode()

        if not user_id:
            self.store.async_create_user(data)
        else:
            if ATTR_CODE in data:
                if const.ATTR_OLD_CODE not in data:
                    return False
                elif not self.async_authenticate_user(data[const.ATTR_OLD_CODE], user_id):
                    return False
                else:
                    del data[const.ATTR_OLD_CODE]
                    self.store.async_update_user(user_id, data)
            else:
                self.store.async_update_user(user_id, data)

    def async_authenticate_user(self, code: str, user_id: str = None):
        if not user_id:
            users = self.store.async_get_users()
        else:
            users = {
                user_id: self.store.async_get_user(user_id)
            }

        for (user_id, user) in users.items():
            if not user[const.ATTR_ENABLED]:
                continue
            elif not user[ATTR_CODE] and not code:
                return user
            elif user[ATTR_CODE]:
                hash = base64.b64decode(user[ATTR_CODE])
                if bcrypt.checkpw(code.encode("utf-8"), hash):
                    return user

        return

    def async_update_automation_config(self, automation_id: str = None, data: dict = {}):
        if const.ATTR_REMOVE in data:
            self.store.async_delete_automation(automation_id)
        elif not automation_id:
            self.store.async_create_automation(data)
        else:
            self.store.async_update_automation(automation_id, data)

        async_dispatcher_send(self.hass, "alarmo_automations_updated")

    def register_events(self):
        # handle push notifications with action buttons
        @callback
        async def async_handle_push_event(event):
            if not event.data:
                return
            action = event.data.get("actionName") if "actionName" in event.data else event.data.get("action")

            if action not in [
                const.EVENT_ACTION_FORCE_ARM,
                const.EVENT_ACTION_RETRY_ARM,
                const.EVENT_ACTION_DISARM
            ]:
                return

            if self.hass.data[const.DOMAIN]["master"]:
                alarm_entity = self.hass.data[const.DOMAIN]["master"]
            elif len(self.hass.data[const.DOMAIN]["areas"]) == 1:
                alarm_entity = list(self.hass.data[const.DOMAIN]["areas"].values())[0]
            else:
                _LOGGER.info("Cannot process the push action, since there are multiple areas.")
                return

            arm_mode = alarm_entity._arm_mode
            if not arm_mode:
                _LOGGER.info("Cannot process the push action, since the arm mode is not known.")
                return

            if action == const.EVENT_ACTION_FORCE_ARM:
                _LOGGER.info("Received request for force arming")
                await alarm_entity.async_handle_arm_request(arm_mode, skip_code=True, bypass_open_sensors=True)
            elif action == const.EVENT_ACTION_RETRY_ARM:
                _LOGGER.info("Received request for retry arming")
                await alarm_entity.async_handle_arm_request(arm_mode, skip_code=True)
            elif action == const.EVENT_ACTION_DISARM:
                _LOGGER.info("Received request for disarming")
                await alarm_entity.async_alarm_disarm(code=None, skip_code=True)

        self._subscriptions.append(
            self.hass.bus.async_listen(const.PUSH_EVENT, async_handle_push_event)
        )

    async def async_remove_entity(self, area_id: str):
        entity_registry = self.hass.helpers.entity_registry.async_get(self.hass)
        if area_id == "master":
            entity = self.hass.data[const.DOMAIN]["master"]
            entity_registry.async_remove(entity.entity_id)
            self.hass.data[const.DOMAIN]["master"] = None
        else:
            entity = self.hass.data[const.DOMAIN]["areas"][area_id]
            entity_registry.async_remove(entity.entity_id)
            self.hass.data[const.DOMAIN]["areas"].pop(area_id, None)

    def async_get_sensor_groups(self):
        """fetch a list of sensor groups (websocket API hook)"""
        groups = self.store.async_get_sensor_groups()
        return list(groups.values())

    def async_get_group_for_sensor(self, entity_id: str):
        groups = self.async_get_sensor_groups()
        result = next((el for el in groups if entity_id in el[ATTR_ENTITIES]), None)
        return result["group_id"] if result else None

    def assign_sensor_to_group(self, entity_id: str, group_id: str):
        old_group = self.async_get_group_for_sensor(entity_id)
        if old_group and group_id != old_group:
            # remove sensor from group
            el = self.store.async_get_sensor_group(old_group)
            if len(el[ATTR_ENTITIES]) > 2:
                self.store.async_update_sensor_group(old_group, {
                    ATTR_ENTITIES: [x for x in el[ATTR_ENTITIES] if x != entity_id]
                })
            else:
                self.store.async_delete_sensor_group(old_group)
        if group_id:
            # add sensor to group
            el = self.store.async_get_sensor_group(group_id)
            if not el:
                _LOGGER.error("Failed to assign entity {} to group {}".format(entity_id, group_id))
                return
            self.store.async_update_sensor_group(group_id, {
                ATTR_ENTITIES: el[ATTR_ENTITIES] + [entity_id]
            })

        async_dispatcher_send(self.hass, "alarmo_sensors_updated")

    def async_update_sensor_group_config(self, group_id: str = None, data: dict = {}):
        if const.ATTR_REMOVE in data:
            self.store.async_delete_sensor_group(group_id)
        elif not group_id:
            self.store.async_create_sensor_group(data)
        else:
            self.store.async_update_sensor_group(group_id, data)

        async_dispatcher_send(self.hass, "alarmo_sensors_updated")

    async def async_unload(self):
        """remove all alarmo objects"""

        # remove alarm_control_panel entities
        areas = list(self.hass.data[const.DOMAIN]["areas"].keys())
        for area in areas:
            await self.async_remove_entity(area)
        if self.hass.data[const.DOMAIN]["master"]:
            await self.async_remove_entity("master")

        del self.hass.data[const.DOMAIN]["sensor_handler"]
        del self.hass.data[const.DOMAIN]["automation_handler"]
        del self.hass.data[const.DOMAIN]["mqtt_handler"]
        del self.hass.data[const.DOMAIN]["event_handler"]

        # remove subscriptions for coordinator
        while len(self._subscriptions):
            self._subscriptions.pop()()

    async def async_delete_config(self):
        """wipe alarmo storage"""
        await self.store.async_delete()


@callback
def register_services(hass):
    """Register services used by alarmo component."""

    coordinator = hass.data[const.DOMAIN]["coordinator"]

    async def async_srv_toggle_user(call):
        """Enable a user by service call"""
        name = call.data.get(ATTR_NAME)
        enable = True if call.service == const.SERVICE_ENABLE_USER else False
        users = coordinator.store.async_get_users()
        user = next((item for item in list(users.values()) if item[ATTR_NAME] == name), None)
        if user is None:
            _LOGGER.warning("Failed to {} user, no match for name '{}'".format("enable" if enable else "disable", name))
            return

        coordinator.store.async_update_user(user[const.ATTR_USER_ID], {const.ATTR_ENABLED: enable})
        _LOGGER.debug("User user '{}' was {}".format(name, "enabled" if enable else "disabled"))

    async_register_admin_service(
        hass, const.DOMAIN, const.SERVICE_ENABLE_USER, async_srv_toggle_user, schema=const.SERVICE_TOGGLE_USER_SCHEMA
    )
    async_register_admin_service(
        hass, const.DOMAIN, const.SERVICE_DISABLE_USER, async_srv_toggle_user, schema=const.SERVICE_TOGGLE_USER_SCHEMA
    )


================================================
FILE: custom_components/alarmo/alarm_control_panel.py
================================================
"""Initialization of Alarmo alarm_control_panel platform."""
import datetime
import logging
import functools
import operator

# from homeassistant.components.alarm_control_panel import DOMAIN as PLATFORM
from homeassistant.core import (
    HomeAssistant,
    callback,
)
from homeassistant.helpers.event import (
    async_track_point_in_time,
    async_call_later,
)
from homeassistant.helpers.dispatcher import (
    async_dispatcher_connect,
    async_dispatcher_send,
)
from homeassistant.helpers import entity_platform
from homeassistant.helpers.restore_state import RestoreEntity
from homeassistant.util import slugify
import homeassistant.util.dt as dt_util
from homeassistant.components.alarm_control_panel import (
    AlarmControlPanelEntity,
    ATTR_CODE_ARM_REQUIRED,
    DOMAIN as PLATFORM,
    AlarmControlPanelEntityFeature,
)

from homeassistant.const import (
    ATTR_CODE_FORMAT,
    STATE_ALARM_ARMED_AWAY,
    STATE_ALARM_ARMED_HOME,
    STATE_ALARM_ARMED_NIGHT,
    STATE_ALARM_ARMED_CUSTOM_BYPASS,
    STATE_ALARM_ARMED_VACATION,
    STATE_ALARM_DISARMED,
    STATE_ALARM_TRIGGERED,
    STATE_ALARM_PENDING,
    STATE_ALARM_ARMING,
    ATTR_NAME,
)
from . import const

_LOGGER = logging.getLogger(__name__)


async def async_setup(hass, config):
    """Track states and offer events for alarm_control_panel."""
    return True


async def async_setup_platform(hass, config, async_add_entities, discovery_info=None):
    """Set up the platform from config."""
    return True


async def async_setup_entry(hass, config_entry, async_add_devices):
    """Set up the Alarmo entities. """

    @callback
    def async_add_alarm_entity(config: dict):
        """Add each entity as Alarm Control Panel."""
        entity_id = "{}.{}".format(PLATFORM, slugify(config["name"]))

        alarm_entity = AlarmoAreaEntity(
            hass=hass,
            entity_id=entity_id,
            name=config["name"],
            area_id=config["area_id"],
        )
        hass.data[const.DOMAIN]["areas"][config["area_id"]] = alarm_entity
        async_add_devices([alarm_entity])

    async_dispatcher_connect(hass, "alarmo_register_entity", async_add_alarm_entity)

    @callback
    def async_add_alarm_master(config: dict):
        """Add each entity as Alarm Control Panel."""
        entity_id = "{}.{}".format(PLATFORM, slugify(config["name"]))

        alarm_entity = AlarmoMasterEntity(
            hass=hass,
            entity_id=entity_id,
            name=config["name"],
        )
        hass.data[const.DOMAIN]["master"] = alarm_entity
        async_add_devices([alarm_entity])

    async_dispatcher_connect(hass, "alarmo_register_master", async_add_alarm_master)
    async_dispatcher_send(hass, "alarmo_platform_loaded")

    # Register services
    platform = entity_platform.current_platform.get()
    platform.async_register_entity_service(
        const.SERVICE_ARM,
        const.SERVICE_ARM_SCHEMA,
        "async_service_arm_handler",
    )
    platform.async_register_entity_service(
        const.SERVICE_DISARM,
        const.SERVICE_DISARM_SCHEMA,
        "async_service_disarm_handler",
    )


class AlarmoBaseEntity(AlarmControlPanelEntity, RestoreEntity):
    def __init__(self, hass: HomeAssistant, name: str, entity_id: str) -> None:
        """Initialize the alarm_control_panel entity."""
        self.entity_id = entity_id
        self._name = name
        self._state = None
        self.hass = hass
        self._config = {}
        self._arm_mode = None
        self._changed_by = None
        self._open_sensors = {}
        self._bypassed_sensors = []
        self._delay = None
        self.expiration = None
        self.area_id = None
        self._revert_state = None

    @property
    def device_info(self) -> dict:
        """Return info for device registry."""
        return {
            "identifiers": {(const.DOMAIN, self.hass.data[const.DOMAIN]["coordinator"].id)},
            "name": const.NAME,
            "model": const.NAME,
            "sw_version": const.VERSION,
            "manufacturer": const.MANUFACTURER,
        }

    @property
    def unique_id(self):
        """Return a unique ID to use for this entity."""
        return f"{self.entity_id}"

    @property
    def icon(self):
        """Return icon."""
        return "mdi:shield-home"

    @property
    def name(self):
        """Return the friendly name to use for this entity."""
        return self._name

    @property
    def should_poll(self) -> bool:
        """Return the polling state."""
        return False

    @property
    def code_format(self):
        """Return whether code consists of digits or characters."""

        if (
            self._state == STATE_ALARM_DISARMED and
            self.code_arm_required
        ):
            return self._config[ATTR_CODE_FORMAT]

        elif (
            self._state != STATE_ALARM_DISARMED and
            self._config and
            const.ATTR_CODE_DISARM_REQUIRED in self._config and
            self._config[const.ATTR_CODE_DISARM_REQUIRED]
        ):
            return self._config[ATTR_CODE_FORMAT]

        else:
            return None

    @property
    def changed_by(self):
        """Last change triggered by."""
        return self._changed_by

    @property
    def state(self):
        """Return the state of the device."""
        return self._state

    @property
    def supported_features(self) -> int:
        """Return the list of supported features."""
        return 0

    @property
    def code_arm_required(self):
        """Whether the code is required for arm actions."""
        if not self._config or ATTR_CODE_ARM_REQUIRED not in self._config:
            return True  # assume code is needed (conservative approach)
        else:
            return self._config[ATTR_CODE_ARM_REQUIRED]

    @property
    def arm_mode(self):
        """Return the arm mode."""
        return self._arm_mode if self._state != STATE_ALARM_DISARMED else None

    @property
    def open_sensors(self):
        """Get open sensors."""
        if not self._open_sensors:
            return None
        else:
            return self._open_sensors

    @open_sensors.setter
    def open_sensors(self, value):
        """Set open_sensors sensors."""
        if type(value) is dict:
            self._open_sensors = value
        else:
            self._open_sensors = {}

    @property
    def bypassed_sensors(self):
        """Get bypassed sensors."""
        if not self._bypassed_sensors:
            return None
        else:
            return self._bypassed_sensors

    @bypassed_sensors.setter
    def bypassed_sensors(self, value):
        """Set bypassed sensors."""
        if type(value) is list:
            self._bypassed_sensors = value
        elif not value:
            self._bypassed_sensors = None

    @property
    def delay(self):
        """Get delay."""
        return self._delay

    @delay.setter
    def delay(self, value):
        """Set delay."""
        if type(value) is int:
            self._delay = value
            self.expiration = (dt_util.utcnow() + datetime.timedelta(seconds=value)).replace(microsecond=0)
        else:
            self._delay = None
            self.expiration = None

    @property
    def extra_state_attributes(self):
        """Return the data of the entity."""

        return {
            "arm_mode": self.arm_mode,
            "open_sensors": self.open_sensors,
            "bypassed_sensors": self.bypassed_sensors,
            "delay": self.delay,
        }

    def _validate_code(self, code, state):
        """Validate given code."""

        if state == STATE_ALARM_DISARMED and not self._config[const.ATTR_CODE_DISARM_REQUIRED]:
            self._changed_by = None
            return (True, None)
        elif state != STATE_ALARM_DISARMED and not self._config[ATTR_CODE_ARM_REQUIRED]:
            self._changed_by = None
            return (True, None)
        elif not code or len(code) < 1:
            return (False, const.EVENT_NO_CODE_PROVIDED)

        res = self.hass.data[const.DOMAIN]["coordinator"].async_authenticate_user(code)
        if not res:
            # wrong code was entered
            return (False, const.EVENT_INVALID_CODE_PROVIDED)
        elif (
            res[const.ATTR_AREA_LIMIT] and
            not
            all(area in res[const.ATTR_AREA_LIMIT]
                for area in ([self.area_id] if self.area_id else list(self.hass.data[const.DOMAIN]["areas"].keys())))
        ):
            # user is not allowed to operate this area
            _LOGGER.debug("User {} has no permission to arm/disarm this area.".format(res[ATTR_NAME]))
            return (False, const.EVENT_INVALID_CODE_PROVIDED)
        elif state == STATE_ALARM_DISARMED and not res["can_disarm"]:
            # user is not allowed to disarm the alarm
            _LOGGER.debug("User {} has no permission to disarm the alarm.".format(res[ATTR_NAME]))
            return (False, const.EVENT_INVALID_CODE_PROVIDED)
        elif state in const.ARM_MODES and not res["can_arm"]:
            # user is not allowed to arm the alarm
            _LOGGER.debug("User {} has no permission to arm the alarm.".format(res[ATTR_NAME]))
            return (False, const.EVENT_INVALID_CODE_PROVIDED)
        else:
            self._changed_by = res[ATTR_NAME]
            return (True, res)

    async def async_service_disarm_handler(self, code, context_id=None):
        """handle external disarm request from alarmo.disarm service"""
        _LOGGER.debug("Service alarmo.disarm was called")

        await self.async_alarm_disarm(
            code=code,
            context_id=context_id
        )

    async def async_alarm_disarm(self, **kwargs):
        """Send disarm command."""
        _LOGGER.debug("alarm_disarm")
        code = kwargs.get("code", None)
        skip_code = kwargs.get("skip_code", False)
        context_id = kwargs.get("context_id", None)

        if self._state == STATE_ALARM_DISARMED or not self._config:
            if not self._config:
                _LOGGER.warning("Cannot process disarm command, alarm is not initialized yet.")
            else:
                _LOGGER.warning("Cannot go to state {} from state {}.".format(STATE_ALARM_DISARMED, self._state))
            async_dispatcher_send(
                self.hass, "alarmo_event",
                const.EVENT_COMMAND_NOT_ALLOWED,
                self.area_id,
                {
                    "state": self._state,
                    "command": const.COMMAND_DISARM,
                    const.ATTR_CONTEXT_ID: context_id
                }
            )
            return
        (res, info) = self._validate_code(code, STATE_ALARM_DISARMED)
        if not res and not skip_code:
            async_dispatcher_send(self.hass, "alarmo_event", info, self.area_id, {
                const.ATTR_CONTEXT_ID: context_id,
                "command": const.COMMAND_DISARM,
            })
            _LOGGER.warning("Wrong code provided.")
            return
        else:
            self.open_sensors = None
            self.bypassed_sensors = None
            await self.async_update_state(STATE_ALARM_DISARMED)
            if self.changed_by:
                _LOGGER.info("Alarm '{}' is disarmed by {}.".format(self.name, self.changed_by))
            else:
                _LOGGER.info("Alarm '{}' is disarmed.".format(self.name))

            async_dispatcher_send(self.hass, "alarmo_event", const.EVENT_DISARM, self.area_id, {
                const.ATTR_CONTEXT_ID: context_id
            })
            return True

    async def async_service_arm_handler(self, code, mode, skip_delay, force, context_id=None):
        """handle external arm request from alarmo.arm service"""
        _LOGGER.debug("Service alarmo.arm was called")

        if mode in const.ARM_MODE_TO_STATE:
            mode = const.ARM_MODE_TO_STATE[mode]

        await self.async_handle_arm_request(
            mode,
            code=code,
            skip_delay=skip_delay,
            bypass_open_sensors=force,
            context_id=context_id
        )

    async def async_handle_arm_request(self, arm_mode, **kwargs):
        """check if conditions are met for starting arm procedure"""
        code = kwargs.get(const.CONF_CODE, "")
        skip_code = kwargs.get("skip_code", False)
        skip_delay = kwargs.get(const.ATTR_SKIP_DELAY, False)
        bypass_open_sensors = kwargs.get("bypass_open_sensors", False)
        context_id = kwargs.get("context_id", None)

        if (
            not (const.MODES_TO_SUPPORTED_FEATURES[arm_mode] & self.supported_features) or
            (self._state != STATE_ALARM_DISARMED and self._state not in const.ARM_MODES) or
            not self._config
        ):
            if not self._config or not self._state:
                _LOGGER.warning("Cannot process arm command, alarm is not initialized yet.")
            elif not (const.MODES_TO_SUPPORTED_FEATURES[arm_mode] & self.supported_features):
                _LOGGER.warning("Mode {} is not supported, ignoring.".format(arm_mode))
            else:
                _LOGGER.warning("Cannot go to state {} from state {}.".format(arm_mode, self._state))
            async_dispatcher_send(
                self.hass, "alarmo_event",
                const.EVENT_COMMAND_NOT_ALLOWED,
                self.area_id,
                {
                    "state": self._state,
                    "command": arm_mode.replace("armed", "arm"),
                    const.ATTR_CONTEXT_ID: context_id
                }
            )
            return False
        elif self._state in const.ARM_MODES and self._arm_mode == arm_mode:
            _LOGGER.debug("Alarm is already set to {}, ignoring command.".format(arm_mode))
            return False

        if not skip_code:
            (res, info) = self._validate_code(code, arm_mode)
            if not res:
                async_dispatcher_send(self.hass, "alarmo_event", info, self.area_id, {
                    "command": arm_mode.replace("armed", "arm"),
                    const.ATTR_CONTEXT_ID: context_id,
                })
                _LOGGER.warning("Wrong code provided.")
                if self.open_sensors:
                    self.open_sensors = None
                    self.async_write_ha_state()
                return False
            elif info and info[const.ATTR_IS_OVERRIDE_CODE]:
                bypass_open_sensors = True
        else:
            self._changed_by = None

        if self._state in const.ARM_MODES:
            # we are switching between arm modes
            self._revert_state = self._state
        else:
            self._revert_state = STATE_ALARM_DISARMED
            self.open_sensors = None
            self.bypassed_sensors = None

        await self.async_arm(
            arm_mode,
            skip_delay=skip_delay,
            bypass_open_sensors=bypass_open_sensors,
            context_id=context_id
        )

    async def async_alarm_arm_away(self, code=None, skip_code=False):
        """Send arm away command."""
        _LOGGER.debug("alarm_arm_away")
        await self.async_handle_arm_request(STATE_ALARM_ARMED_AWAY, code=code, skip_code=skip_code)

    async def async_alarm_arm_home(self, code=None, skip_code=False):
        """Send arm home command."""
        _LOGGER.debug("alarm_arm_home")
        await self.async_handle_arm_request(STATE_ALARM_ARMED_HOME, code=code, skip_code=skip_code)

    async def async_alarm_arm_night(self, code=None, skip_code=False):
        """Send arm night command."""
        _LOGGER.debug("alarm_arm_night")
        await self.async_handle_arm_request(STATE_ALARM_ARMED_NIGHT, code=code, skip_code=skip_code)

    async def async_alarm_arm_custom_bypass(self, code=None, skip_code=False):
        """Send arm custom_bypass command."""
        _LOGGER.debug("alarm_arm_custom_bypass")
        await self.async_handle_arm_request(STATE_ALARM_ARMED_CUSTOM_BYPASS, code=code, skip_code=skip_code)

    async def async_alarm_arm_vacation(self, code=None, skip_code=False):
        """Send arm vacation command."""
        _LOGGER.debug("alarm_arm_vacation")
        await self.async_handle_arm_request(STATE_ALARM_ARMED_VACATION, code=code, skip_code=skip_code)

    async def async_alarm_trigger(self, code=None) -> None:
        """Send alarm trigger command."""
        _LOGGER.debug("async_alarm_trigger")
        await self.async_trigger(skip_delay=False)

    async def async_added_to_hass(self):
        """Connect to dispatcher listening for entity data notifications."""
        _LOGGER.debug("{} is added to hass".format(self.entity_id))
        await super().async_added_to_hass()

        state = await self.async_get_last_state()

        # restore previous state
        if state:
            # restore attributes
            if "arm_mode" in state.attributes:
                self._arm_mode = state.attributes["arm_mode"]
            if "changed_by" in state.attributes:
                self._changed_by = state.attributes["changed_by"]
            if "open_sensors" in state.attributes:
                self.open_sensors = state.attributes["open_sensors"]
            if "bypassed_sensors" in state.attributes:
                self._bypassed_sensors = state.attributes["bypassed_sensors"]

    async def async_will_remove_from_hass(self):
        await super().async_will_remove_from_hass()
        _LOGGER.debug("{} is removed from hass".format(self.entity_id))


class AlarmoAreaEntity(AlarmoBaseEntity):
    """Defines a base alarm_control_panel entity."""

    def __init__(self, hass: HomeAssistant, name: str, entity_id: str, area_id: str) -> None:
        """Initialize the alarm_control_panel entity."""
        super().__init__(hass, name, entity_id)

        self.area_id = area_id
        self._timer = None
        coordinator = self.hass.data[const.DOMAIN]["coordinator"]
        self._config = coordinator.store.async_get_config()
        self._config.update(coordinator.store.async_get_area(self.area_id))

    @property
    def supported_features(self) -> int:
        """Return the list of supported features."""
        if not self._config or const.ATTR_MODES not in self._config:
            return 0
        else:
            supported_features = AlarmControlPanelEntityFeature.TRIGGER
            for (mode, mode_config) in self._config[const.ATTR_MODES].items():
                if mode_config[const.ATTR_ENABLED]:
                    supported_features = supported_features | const.MODES_TO_SUPPORTED_FEATURES[mode]

            return supported_features

    async def async_added_to_hass(self):
        """Connect to dispatcher listening for entity data notifications."""
        await super().async_added_to_hass()

        # make sure that the config is reloaded on changes
        @callback
        async def async_update_config(area_id: str = None):
            _LOGGER.debug("async_update_config")
            coordinator = self.hass.data[const.DOMAIN]["coordinator"]
            self._config = coordinator.store.async_get_config()
            self._config.update(coordinator.store.async_get_area(self.area_id))
            self.async_write_ha_state()

        self.async_on_remove(
            async_dispatcher_connect(self.hass, "alarmo_config_updated", async_update_config)
        )

        # restore previous state
        state = await self.async_get_last_state()
        if state:
            initial_state = state.state
            _LOGGER.debug("Initial state for {} is {}".format(self.entity_id, initial_state))
            if initial_state == STATE_ALARM_ARMING:
                await self.async_arm(self.arm_mode)
            elif initial_state == STATE_ALARM_PENDING:
                await self.async_trigger()
            elif initial_state == STATE_ALARM_TRIGGERED:
                await self.async_trigger(skip_delay=True)
            else:
                await self.async_update_state(initial_state)
        else:
            await self.async_update_state(STATE_ALARM_DISARMED)

        self.async_write_ha_state()

    async def async_update_state(self, state: str = None):
        """update the state or refresh state attributes"""

        if state == self._state:
            return

        old_state = self._state
        self._state = state

        _LOGGER.debug("entity {} was updated from {} to {}".format(self.entity_id, old_state, state))

        if self._timer:
            self._timer()

        if self.state not in [STATE_ALARM_ARMING, STATE_ALARM_PENDING]:
            self.delay = None

        if state in const.ARM_MODES:
            self._arm_mode = state
        elif old_state == STATE_ALARM_DISARMED and state == STATE_ALARM_TRIGGERED:
            self._arm_mode = None

        async_dispatcher_send(self.hass, "alarmo_state_updated", self.area_id, old_state, state)

        self.async_write_ha_state()

    async def async_arm_failure(self, open_sensors: dict, context_id=None):
        """handle arm failure."""
        self._open_sensors = open_sensors

        if self._state != self._revert_state and self._revert_state:
            await self.async_update_state(self._revert_state)
        else:
            # when disarmed, only update the attributes
            if self._revert_state in const.ARM_MODES:
                self._arm_mode = self._revert_state

            self.async_write_ha_state()

        self._revert_state = None
        async_dispatcher_send(
            self.hass,
            "alarmo_event",
            const.EVENT_FAILED_TO_ARM,
            self.area_id,
            {
                "open_sensors": open_sensors,
                const.ATTR_CONTEXT_ID: context_id
            }
        )

    async def async_arm(self, arm_mode, **kwargs):
        """Arm the alarm or switch between arm modes."""
        skip_delay = kwargs.get("skip_delay", False)
        bypass_open_sensors = kwargs.get("bypass_open_sensors", False)
        context_id = kwargs.get("context_id", None)

        self._arm_mode = arm_mode
        exit_delay = self._config[const.ATTR_MODES][arm_mode]["exit_time"]

        if skip_delay or not exit_delay:
            # immediate arm event

            (open_sensors, bypassed_sensors) = self.hass.data[const.DOMAIN]["sensor_handler"].validate_arming_event(
                area_id=self.area_id,
                target_state=arm_mode,
                bypass_open_sensors=bypass_open_sensors
            )

            if open_sensors:
                # there where errors -> abort the arm
                _LOGGER.info(
                    "Cannot transition from state {} to state {}, there are open sensors".format(self._state, arm_mode)
                )
                await self.async_arm_failure(open_sensors, context_id=context_id)
                return False
            else:
                # proceed the arm
                if bypassed_sensors:
                    self.bypassed_sensors = bypassed_sensors
                self.open_sensors = None
                if self.changed_by:
                    _LOGGER.info("Alarm '{}' is armed ({}) by {}.".format(self.name, arm_mode, self.changed_by))
                else:
                    _LOGGER.info("Alarm '{}' is armed ({}).".format(self.name, arm_mode))
                if self._state and self._state != STATE_ALARM_ARMING:
                    async_dispatcher_send(
                        self.hass,
                        "alarmo_event",
                        const.EVENT_ARM,
                        self.area_id,
                        {
                            "arm_mode": arm_mode,
                            "delay": 0,
                            const.ATTR_CONTEXT_ID: context_id
                        }
                    )
                await self.async_update_state(arm_mode)
                return True

        else:  # normal arm event (from disarmed via arming)

            (open_sensors, _bypassed_sensors) = self.hass.data[const.DOMAIN]["sensor_handler"].validate_arming_event(
                area_id=self.area_id,
                target_state=arm_mode,
                use_delay=True,
                bypass_open_sensors=bypass_open_sensors,
            )

            if open_sensors:
                # there where errors -> abort the arm
                _LOGGER.info("Cannot arm right now, there are open sensors")
                await self.async_arm_failure(open_sensors, context_id=context_id)
                return False
            else:
                # proceed the arm
                _LOGGER.info("Alarm is now arming. Waiting for {} seconds.".format(exit_delay))
                async_dispatcher_send(
                    self.hass,
                    "alarmo_event",
                    const.EVENT_ARM,
                    self.area_id,
                    {
                        "arm_mode": arm_mode,
                        "delay": exit_delay,
                        const.ATTR_CONTEXT_ID: context_id
                    }
                )
                self.delay = exit_delay
                self.open_sensors = None
                await self.async_update_state(STATE_ALARM_ARMING)

                @callback
                async def async_leave_timer_finished(now):
                    """Update state at a scheduled point in time."""
                    _LOGGER.debug("async_leave_timer_finished")
                    await self.async_arm(
                        self.arm_mode,
                        bypass_open_sensors=bypass_open_sensors,
                        skip_delay=True
                    )

                self.async_set_timer(exit_delay, async_leave_timer_finished)
                return True

    async def async_trigger(self, skip_delay: bool = False, open_sensors: dict = None):
        """Trigger request. Will only be called the first time a sensor trips."""

        if self._state == STATE_ALARM_PENDING or skip_delay or not self._arm_mode:
            entry_delay = 0
        else:
            entry_delay = self._config[const.ATTR_MODES][self._arm_mode]["entry_time"]
        trigger_time = self._config[const.ATTR_MODES][self._arm_mode]["trigger_time"] if self._arm_mode else 0

        if self._state and (
            self._state != STATE_ALARM_PENDING or
            (self._state == STATE_ALARM_PENDING and skip_delay and open_sensors != self.open_sensors)
        ):
            # send event on first trigger or consecutive trigger in case it has no entry delay
            async_dispatcher_send(
                self.hass,
                "alarmo_event",
                const.EVENT_TRIGGER,
                self.area_id,
                {
                    "open_sensors": open_sensors if open_sensors else self._open_sensors,
                    "delay": entry_delay,
                }
            )

        if open_sensors:
            self.open_sensors = open_sensors

        if not entry_delay:
            # countdown finished or immediate trigger event
            await self.async_update_state(STATE_ALARM_TRIGGERED)

            if trigger_time:
                # there is a max. trigger time configured

                @callback
                async def async_trigger_timer_finished(now):
                    """Update state at a scheduled point in time."""
                    _LOGGER.debug("async_trigger_timer_finished")
                    self._changed_by = None
                    if self._config[const.ATTR_DISARM_AFTER_TRIGGER] or not self.arm_mode:
                        self.bypassed_sensors = None
                        await self.async_update_state(STATE_ALARM_DISARMED)
                    else:
                        self.open_sensors = None
                        self.bypassed_sensors = None
                        await self.async_arm(self.arm_mode, bypass_open_sensors=True, skip_delay=True)

                    async_dispatcher_send(
                        self.hass,
                        "alarmo_event",
                        const.EVENT_TRIGGER_TIME_EXPIRED,
                        self.area_id
                    )

                self.async_set_timer(trigger_time, async_trigger_timer_finished)
            _LOGGER.info("Alarm is triggered!")

        else:  # to pending state
            self.delay = entry_delay

            await self.async_update_state(STATE_ALARM_PENDING)

            @callback
            async def async_entry_timer_finished(now):
                """Update state at a scheduled point in time."""

                _LOGGER.debug("async_entry_timer_finished")
                await self.async_trigger()

            self.async_set_timer(entry_delay, async_entry_timer_finished)
            _LOGGER.info("Alarm will be triggered after {} seconds.".format(entry_delay))

    def async_set_timer(self, delay, cb_func):
        if self._timer:
            self._timer()
        now = dt_util.utcnow()

        if not isinstance(delay, datetime.timedelta):
            delay = datetime.timedelta(seconds=delay)

        self._timer = async_track_point_in_time(
            self.hass, cb_func, now + delay
        )


class AlarmoMasterEntity(AlarmoBaseEntity):
    """Defines a base alarm_control_panel entity."""

    def __init__(self, hass: HomeAssistant, name: str, entity_id: str) -> None:
        """Initialize the alarm_control_panel entity."""
        super().__init__(hass, name, entity_id)
        self.area_id = None
        self._target_state = None

    @property
    def supported_features(self) -> int:
        """Return the list of supported features."""

        supported_features = [
            item.supported_features or 0
            for item in self.hass.data[const.DOMAIN]["areas"].values()
        ]
        return functools.reduce(operator.and_, supported_features)

    async def async_added_to_hass(self):
        """Connect to dispatcher listening for entity data notifications."""
        await super().async_added_to_hass()

        # load the configuration and make sure that it is reloaded on changes
        @callback
        async def async_update_config(area_id=None):
            if area_id and area_id in self.hass.data[const.DOMAIN]["areas"]:
                # wait for update of the area entity, to refresh the supported_features
                async_call_later(self.hass, 1, async_update_config)
                return

            coordinator = self.hass.data[const.DOMAIN]["coordinator"]
            self._config = coordinator.store.async_get_config()

            await self.async_update_state()
            self.async_write_ha_state()

        self.async_on_remove(
            async_dispatcher_connect(self.hass, "alarmo_config_updated", async_update_config)
        )
        await async_update_config()

        @callback
        async def async_alarm_state_changed(area_id: str, old_state: str, new_state: str):
            if not area_id:
                return
            await self.async_update_state()

        async_dispatcher_connect(self.hass, "alarmo_state_updated", async_alarm_state_changed)

        @callback
        async def async_handle_event(event: str, area_id: str, args: dict = {}):
            if not area_id or event not in [
                const.EVENT_FAILED_TO_ARM,
                const.EVENT_TRIGGER,
                const.EVENT_TRIGGER_TIME_EXPIRED
            ]:
                return
            if event == const.EVENT_FAILED_TO_ARM and self._target_state is not None:
                open_sensors = args["open_sensors"]
                await self.async_arm_failure(open_sensors)
            if event == const.EVENT_TRIGGER and (
                self._state not in [STATE_ALARM_TRIGGERED, STATE_ALARM_PENDING] or (
                    self._state == STATE_ALARM_PENDING and
                    self.delay and self.delay > args.get("delay", 0)
                )
            ):
                # only pass initial trigger event or while trigger with shorter entry delay occurs during entry time
                async_dispatcher_send(
                    self.hass,
                    "alarmo_event",
                    const.EVENT_TRIGGER,
                    self.area_id,
                    args
                )
            if event == const.EVENT_TRIGGER_TIME_EXPIRED:
                if self.hass.data[const.DOMAIN]["areas"][area_id].state == STATE_ALARM_DISARMED:
                    await self.async_alarm_disarm(skip_code=True)

        async_dispatcher_connect(self.hass, "alarmo_event", async_handle_event)

        state = await self.async_get_last_state()
        if state and state.state:
            self._state = state.state
        else:
            self._state = STATE_ALARM_DISARMED
        self.async_write_ha_state()

    async def async_update_state(self, state: str = None):
        """update the state or refresh state attributes"""

        if state:
            # do not allow updating the state directly
            return

        states = [
            item.state
            for item in self.hass.data[const.DOMAIN]["areas"].values()
        ]
        state = None
        if STATE_ALARM_TRIGGERED in states:
            state = STATE_ALARM_TRIGGERED
        elif STATE_ALARM_PENDING in states:
            state = STATE_ALARM_PENDING
        elif STATE_ALARM_ARMING in states and all(el in const.ARM_MODES or el == STATE_ALARM_ARMING for el in states):
            state = STATE_ALARM_ARMING
        elif all(el == STATE_ALARM_ARMED_AWAY for el in states):
            state = STATE_ALARM_ARMED_AWAY
        elif all(el == STATE_ALARM_ARMED_HOME for el in states):
            state = STATE_ALARM_ARMED_HOME
        elif all(el == STATE_ALARM_ARMED_NIGHT for el in states):
            state = STATE_ALARM_ARMED_NIGHT
        elif all(el == STATE_ALARM_ARMED_CUSTOM_BYPASS for el in states):
            state = STATE_ALARM_ARMED_CUSTOM_BYPASS
        elif all(el == STATE_ALARM_ARMED_VACATION for el in states):
            state = STATE_ALARM_ARMED_VACATION
        elif all(el == STATE_ALARM_DISARMED for el in states):
            state = STATE_ALARM_DISARMED

        arm_modes = [
            item._arm_mode
            for item in self.hass.data[const.DOMAIN]["areas"].values()
        ]
        arm_mode = arm_modes[0] if len(set(arm_modes)) == 1 else None

        if state == self._target_state:
            # we are transitioning to an armed state and target state is reached
            self._target_state = None

        if state in [STATE_ALARM_ARMING, STATE_ALARM_PENDING]:
            # one or more areas went to arming/pending state, recalculate the delay time

            area_filter = dict(filter(lambda el: el[1].state == state, self.hass.data[const.DOMAIN]["areas"].items()))
            delays = [el.delay for el in area_filter.values()]

            # use maximum of all areas when arming, minimum of all areas when pending
            delay = max(delays) if state == STATE_ALARM_ARMING else min(delays) if len(delays) else None
        else:
            delay = None

        # take open sensors by combining areas having same state
        open_sensors = {}
        area_filter = dict(filter(lambda el: el[1].state == state, self.hass.data[const.DOMAIN]["areas"].items()))
        for item in area_filter.values():
            if item.open_sensors:
                open_sensors.update(item.open_sensors)

        if (
            arm_mode == self._arm_mode and
            (state == self._state or not state) and
            delay == self.delay and
            open_sensors == self.open_sensors
        ):
            # do not update if state and properties remain unchanged
            return

        self._arm_mode = arm_mode
        self.delay = delay
        self.open_sensors = open_sensors

        if state != self._state and state:
            # state changes
            old_state = self._state

            self._state = state
            _LOGGER.debug("entity {} was updated from {} to {}".format(self.entity_id, old_state, state))
            async_dispatcher_send(self.hass, "alarmo_state_updated", None, old_state, state)

        # take bypassed sensors by combining all areas
        bypassed_sensors = []
        for item in self.hass.data[const.DOMAIN]["areas"].values():
            if item.bypassed_sensors:
                bypassed_sensors.extend(item.bypassed_sensors)
        self.bypassed_sensors = bypassed_sensors

        self.async_write_ha_state()

    async def async_alarm_disarm(self, **kwargs):
        """Send disarm command."""
        code = kwargs.get("code", None)
        skip_code = kwargs.get("skip_code", False)
        context_id = kwargs.get("context_id", None)

        """Send disarm command."""
        res = await super().async_alarm_disarm(code=code, skip_code=skip_code)
        if res:
            for item in self.hass.data[const.DOMAIN]["areas"].values():
                if item.state != STATE_ALARM_DISARMED:
                    await item.async_alarm_disarm(code=code, skip_code=skip_code)

            async_dispatcher_send(self.hass, "alarmo_event", const.EVENT_DISARM, self.area_id, {
                const.ATTR_CONTEXT_ID: context_id
            })

    async def async_arm(self, arm_mode, **kwargs):
        """Arm the alarm or switch between arm modes."""
        skip_delay = kwargs.get("skip_delay", False)
        bypass_open_sensors = kwargs.get("bypass_open_sensors", False)
        context_id = kwargs.get("context_id", None)
        self._target_state = arm_mode

        open_sensors = {}
        for item in self.hass.data[const.DOMAIN]["areas"].values():
            if (item.state in const.ARM_MODES and item.arm_mode != arm_mode) or item.state == STATE_ALARM_DISARMED:
                res = await item.async_arm(
                    arm_mode,
                    skip_delay=skip_delay,
                    bypass_open_sensors=bypass_open_sensors
                )
                if not res:
                    open_sensors.update(item.open_sensors)

        if open_sensors:
            await self.async_arm_failure(open_sensors, context_id=context_id)
        else:
            delay = 0
            area_config = self.hass.data[const.DOMAIN]["coordinator"].store.async_get_areas()
            for (area_id, entity) in self.hass.data[const.DOMAIN]["areas"].items():
                if entity.state == STATE_ALARM_ARMING:
                    t = area_config[area_id][const.ATTR_MODES][arm_mode]["exit_time"]
                    delay = t if t > delay else delay

            async_dispatcher_send(
                self.hass,
                "alarmo_event",
                const.EVENT_ARM,
                self.area_id,
                {
                    "arm_mode": arm_mode,
                    "delay": delay,
                    const.ATTR_CONTEXT_ID: context_id
                }
            )

    async def async_arm_failure(self, open_sensors: dict, context_id=None):
        """handle arm failure."""
        self.open_sensors = open_sensors
        self._target_state = None

        for item in self.hass.data[const.DOMAIN]["areas"].values():
            if item.state != self._revert_state and self._revert_state:
                await item.async_update_state(self._revert_state)

        self._revert_state = None
        async_dispatcher_send(
            self.hass,
            "alarmo_event",
            const.EVENT_FAILED_TO_ARM,
            None,
            {
                "open_sensors": open_sensors,
                const.ATTR_CONTEXT_ID: context_id
            }
        )
        self.async_write_ha_state()

    async def async_trigger(self, skip_delay: bool = False):
        """handle triggering via service call"""
        for item in self.hass.data[const.DOMAIN]["areas"].values():
            if item.state != self._revert_state:
                await item.async_trigger(skip_delay=skip_delay)


================================================
FILE: custom_components/alarmo/automations.py
================================================
import logging
import copy
import re

from homeassistant.core import (
    HomeAssistant,
    callback,
)

from homeassistant.const import (
    ATTR_SERVICE,
    CONF_SERVICE_DATA,
    ATTR_ENTITY_ID,
    CONF_TYPE,
    # STATE_UNKNOWN,
    # STATE_OPEN,
    # STATE_CLOSED,
)

from homeassistant.components.notify import ATTR_MESSAGE
from homeassistant.helpers.service import async_call_from_config
from homeassistant.helpers.dispatcher import async_dispatcher_connect

from homeassistant.components.binary_sensor.device_condition import (
    ENTITY_CONDITIONS,
)

from . import const
from .alarm_control_panel import AlarmoBaseEntity
from .helpers import (
    friendly_name_for_entity_id,
)
from .sensors import (
    STATE_OPEN,
    STATE_CLOSED,
    STATE_UNAVAILABLE,
)

_LOGGER = logging.getLogger(__name__)

EVENT_ARM_FAILURE = "arm_failure"


def validate_area(trigger, area_id):
    if const.ATTR_AREA not in trigger:
        return False
    elif trigger[const.ATTR_AREA]:
        return trigger[const.ATTR_AREA] == area_id
    else:
        return area_id is None


def validate_modes(trigger, mode):
    if const.ATTR_MODES not in trigger:
        return False
    elif not trigger[const.ATTR_MODES]:
        return True
    else:
        return mode in trigger[const.ATTR_MODES]


def validate_trigger(trigger, to_state, from_state=None):
    if const.ATTR_EVENT not in trigger:
        return False
    elif trigger[const.ATTR_EVENT] == "untriggered" and from_state == "triggered":
        return True
    elif trigger[const.ATTR_EVENT] == to_state:
        return True
    else:
        return False


class AutomationHandler:
    def __init__(self, hass: HomeAssistant):
        self.hass = hass
        self._config = None
        self._subscriptions = []
        self._sensorTranslationCache = {}
        self._alarmTranslationCache = {}
        self._sensorTranslationLang = None
        self._alarmTranslationLang = None

        def async_update_config():
            """automation config updated, reload the configuration."""
            self._config = self.hass.data[const.DOMAIN]["coordinator"].store.async_get_automations()

        self._subscriptions.append(
            async_dispatcher_connect(hass, "alarmo_automations_updated", async_update_config)
        )
        async_update_config()

        @callback
        async def async_alarm_state_changed(area_id: str, old_state: str, new_state: str):
            if not old_state:
                # ignore automations at startup/restoring
                return

            if area_id:
                alarm_entity = self.hass.data[const.DOMAIN]["areas"][area_id]
            else:
                alarm_entity = self.hass.data[const.DOMAIN]["master"]

            if not alarm_entity:
                return

            _LOGGER.debug("state of {} is updated from {} to {}".format(alarm_entity.entity_id, old_state, new_state))

            if new_state in const.ARM_MODES:
                # we don't distinguish between armed modes for automations, they are handled separately
                new_state = "armed"

            for automation_id, config in self._config.items():
                if not config[const.ATTR_ENABLED]:
                    continue
                for trigger in config[const.ATTR_TRIGGERS]:
                    if (
                        validate_area(trigger, area_id) and
                        validate_modes(trigger, alarm_entity._arm_mode) and
                        validate_trigger(trigger, new_state, old_state)
                    ):
                        await self.async_execute_automation(automation_id, alarm_entity)

        self._subscriptions.append(
            async_dispatcher_connect(self.hass, "alarmo_state_updated", async_alarm_state_changed)
        )

        @callback
        async def async_handle_event(event: str, area_id: str, args: dict = {}):
            if event != const.EVENT_FAILED_TO_ARM:
                return
            if area_id:
                alarm_entity = self.hass.data[const.DOMAIN]["areas"][area_id]
            else:
                alarm_entity = self.hass.data[const.DOMAIN]["master"]

            _LOGGER.debug("{} has failed to arm".format(alarm_entity.entity_id))

            for automation_id, config in self._config.items():
                if not config[const.ATTR_ENABLED]:
                    continue
                for trigger in config[const.ATTR_TRIGGERS]:
                    if (
                        validate_area(trigger, area_id) and
                        validate_modes(trigger, alarm_entity._arm_mode) and
                        validate_trigger(trigger, EVENT_ARM_FAILURE)
                    ):
                        await self.async_execute_automation(automation_id, alarm_entity)

        self._subscriptions.append(
            async_dispatcher_connect(self.hass, "alarmo_event", async_handle_event)
        )

    def __del__(self):
        """prepare for removal"""
        while len(self._subscriptions):
            self._subscriptions.pop()()

    async def async_execute_automation(self, automation_id: str, alarm_entity: AlarmoBaseEntity):
        # automation is a dict of AutomationEntry
        _LOGGER.debug("executing automation {}".format(automation_id))

        actions = self._config[automation_id][const.ATTR_ACTIONS]
        for action in actions:

            service_call = {
                "service": action[ATTR_SERVICE]
            }
            if ATTR_ENTITY_ID in action and action[ATTR_ENTITY_ID]:
                service_call["entity_id"] = action[ATTR_ENTITY_ID]

            if (
                self._config[automation_id][CONF_TYPE] == const.ATTR_NOTIFICATION
                and ATTR_MESSAGE in action[CONF_SERVICE_DATA]
            ):
                data = copy.copy(action[CONF_SERVICE_DATA])

                res = re.search(r'{{open_sensors(\|lang=([^}]+))?(\|format=short)?}}', data[ATTR_MESSAGE])
                if res:
                    lang = res.group(2) if res.group(2) else "en"
                    names_only = True if res.group(3) else False

                    open_sensors = ""
                    if alarm_entity.open_sensors:
                        parts = []
                        for (entity_id, status) in alarm_entity.open_sensors.items():
                            if names_only:
                                parts.append(friendly_name_for_entity_id(entity_id, self.hass))
                            else:
                                parts.append(await self.async_get_open_sensor_string(entity_id, status, lang))
                        open_sensors = ", ".join(parts)

                    data[ATTR_MESSAGE] = data[ATTR_MESSAGE].replace(res.group(0), open_sensors)

                if "{{bypassed_sensors}}" in data[ATTR_MESSAGE]:
                    bypassed_sensors = ""
                    if alarm_entity.bypassed_sensors and len(alarm_entity.bypassed_sensors):
                        parts = []
                        for entity_id in alarm_entity.bypassed_sensors:
                            name = friendly_name_for_entity_id(entity_id, self.hass)
                            parts.append(name)
                        bypassed_sensors = ", ".join(parts)

                    data[ATTR_MESSAGE] = data[ATTR_MESSAGE].replace("{{bypassed_sensors}}", bypassed_sensors)

                res = re.search(r'{{arm_mode(\|lang=([^}]+))?}}', data[ATTR_MESSAGE])
                if res:
                    lang = res.group(2) if res.group(2) else "en"
                    arm_mode = await self.async_get_arm_mode_string(alarm_entity.arm_mode, lang)

                    data[ATTR_MESSAGE] = data[ATTR_MESSAGE].replace(res.group(0), arm_mode)

                if "{{changed_by}}" in data[ATTR_MESSAGE]:
                    changed_by = alarm_entity.changed_by if alarm_entity.changed_by else ""
                    data[ATTR_MESSAGE] = data[ATTR_MESSAGE].replace("{{changed_by}}", changed_by)

                service_call[CONF_SERVICE_DATA] = data

            elif CONF_SERVICE_DATA in action:
                service_call[CONF_SERVICE_DATA] = action[CONF_SERVICE_DATA]

            await async_call_from_config(
                self.hass,
                service_call
            )

    def get_automations_by_area(self, area_id: str):
        result = []
        for (automation_id, config) in self._config.items():
            if any(el[const.ATTR_AREA] == area_id for el in config[const.ATTR_TRIGGERS]):
                result.append(automation_id)

        return result

    async def async_get_open_sensor_string(self, entity_id: str, state: str, language: str):
        """get translation for sensor states"""

        if (
            self._sensorTranslationCache and
            self._sensorTranslationLang == language
        ):
            translations = self._sensorTranslationCache
        else:
            translations = await self.hass.helpers.translation.async_get_translations(
                language,
                "device_automation",
                ["binary_sensor"]
            )

            self._sensorTranslationCache = translations
            self._sensorTranslationLang = language

        entity = self.hass.states.get(entity_id)

        device_type = entity.attributes["device_class"] if entity and "device_class" in entity.attributes else None

        if state == STATE_OPEN:
            translation_key = "component.binary_sensor.device_automation.condition_type.{}".format(
                ENTITY_CONDITIONS[device_type][0]["type"]
            ) if device_type in ENTITY_CONDITIONS else None
            if translation_key and translation_key in translations:
                string = translations[translation_key]
            else:
                string = "{entity_name} is open"
        elif state == STATE_CLOSED:
            translation_key = "component.binary_sensor.device_automation.condition_type.{}".format(
                ENTITY_CONDITIONS[device_type][1]["type"]
            ) if device_type in ENTITY_CONDITIONS else None
            if translation_key and translation_key in translations:
                string = translations[translation_key]
            else:
                string = "{entity_name} is closed"

        elif state == STATE_UNAVAILABLE:
            string = "{entity_name} is unavailable"

        else:
            string = "{entity_name} is unknown"

        name = friendly_name_for_entity_id(entity_id, self.hass)
        string = string.replace("{entity_name}", name)

        return string

    async def async_get_arm_mode_string(self, arm_mode: str, language: str):
        """get translation for alarm arm mode"""
        if (
            self._alarmTranslationCache and
            self._alarmTranslationLang == language
        ):
            translations = self._alarmTranslationCache
        else:
            translations = await self.hass.helpers.translation.async_get_translations(
                language,
                "state",
                ["alarm_control_panel"]
            )

            self._alarmTranslationCache = translations
            self._alarmTranslationLang = language

        translation_key = "component.alarm_control_panel.state._.{}".format(arm_mode) if arm_mode else None
        if translation_key and translation_key in translations:
            return translations[translation_key]
        elif arm_mode:
            return " ".join(w.capitalize() for w in arm_mode.split("_"))
        else:
            return ""


================================================
FILE: custom_components/alarmo/card.py
================================================
import logging
import voluptuous as vol

from homeassistant.core import callback
from homeassistant.helpers.dispatcher import async_dispatcher_connect
from homeassistant.components.websocket_api import (
  decorators,
  async_register_command
)

_LOGGER = logging.getLogger(__name__)


@callback
@decorators.websocket_command({
    vol.Required("type"): "alarmo_updated",
})
@decorators.async_response
async def handle_subscribe_updates(hass, connection, msg):
    """Handle subscribe updates."""

    @callback
    def async_handle_event(event: str, area_id: str, args: dict = {}):
        """Forward events to websocket."""
        data = dict(**args, **{
            "event": event,
            "area_id": area_id
        })
        connection.send_message({
            "id": msg["id"],
            "type": "event",
            "event": {
                "data": data
            }
        })

    connection.subscriptions[msg["id"]] = async_dispatcher_connect(
        hass,
        "alarmo_event",
        async_handle_event
    )
    connection.send_result(msg["id"])


async def async_register_card(hass):
    """publish event to lovelace when alarm changes"""

    async_register_command(
      hass,
      handle_subscribe_updates
    )


================================================
FILE: custom_components/alarmo/config_flow.py
================================================
"""Config flow for the Alarmo component."""
import secrets

from homeassistant import config_entries

from .const import (
    DOMAIN,
    NAME,
)


class AlarmoConfigFlow(config_entries.ConfigFlow, domain=DOMAIN):
    """Config flow for Alarmo."""

    VERSION = "1.0.0"
    CONNECTION_CLASS = config_entries.CONN_CLASS_LOCAL_POLL

    async def async_step_user(self, user_input=None):
        """Handle a flow initialized by the user."""

        # Only a single instance of the integration
        if self._async_current_entries():
            return self.async_abort(reason="single_instance_allowed")

        id = secrets.token_hex(6)

        await self.async_set_unique_id(id)
        self._abort_if_unique_id_configured(updates=user_input)

        return self.async_create_entry(title=NAME, data={})


================================================
FILE: custom_components/alarmo/const.py
================================================
"""Store constants."""
import datetime
import voluptuous as vol

from homeassistant.const import (
    STATE_ALARM_ARMED_AWAY,
    STATE_ALARM_ARMED_HOME,
    STATE_ALARM_ARMED_NIGHT,
    STATE_ALARM_ARMED_CUSTOM_BYPASS,
    STATE_ALARM_ARMED_VACATION,
    STATE_ALARM_DISARMED,
    STATE_ALARM_TRIGGERED,
    STATE_ALARM_PENDING,
    STATE_ALARM_ARMING,
    ATTR_ENTITY_ID,
    CONF_MODE,
    CONF_CODE,
    ATTR_NAME,
)

from homeassistant.components.alarm_control_panel import AlarmControlPanelEntityFeature
from homeassistant.helpers import config_validation as cv

VERSION = "1.9.5"
NAME = "Alarmo"
MANUFACTURER = "@nielsfaber"

DOMAIN = "alarmo"

CUSTOM_COMPONENTS = "custom_components"
INTEGRATION_FOLDER = DOMAIN
PANEL_FOLDER = "frontend"
PANEL_FILENAME = "dist/alarm-panel.js"

PANEL_URL = "/api/panel_custom/alarmo"
PANEL_TITLE = NAME
PANEL_ICON = "mdi:shield-home"
PANEL_NAME = "alarm-panel"

INITIALIZATION_TIME = datetime.timedelta(seconds=60)
SENSOR_ARM_TIME = datetime.timedelta(seconds=5)

STATES = [
    STATE_ALARM_ARMED_AWAY,
    STATE_ALARM_ARMED_HOME,
    STATE_ALARM_ARMED_NIGHT,
    STATE_ALARM_ARMED_CUSTOM_BYPASS,
    STATE_ALARM_ARMED_VACATION,
    STATE_ALARM_DISARMED,
    STATE_ALARM_TRIGGERED,
    STATE_ALARM_PENDING,
    STATE_ALARM_ARMING,
]

ARM_MODES = [
    STATE_ALARM_ARMED_AWAY,
    STATE_ALARM_ARMED_HOME,
    STATE_ALARM_ARMED_NIGHT,
    STATE_ALARM_ARMED_CUSTOM_BYPASS,
    STATE_ALARM_ARMED_VACATION
]

ARM_MODE_TO_STATE = {
    "away": STATE_ALARM_ARMED_AWAY,
    "home": STATE_ALARM_ARMED_HOME,
    "night": STATE_ALARM_ARMED_NIGHT,
    "custom": STATE_ALARM_ARMED_CUSTOM_BYPASS,
    "vacation": STATE_ALARM_ARMED_VACATION
}

STATE_TO_ARM_MODE = {
    STATE_ALARM_ARMED_AWAY: "away",
    STATE_ALARM_ARMED_HOME: "home",
    STATE_ALARM_ARMED_NIGHT: "night",
    STATE_ALARM_ARMED_CUSTOM_BYPASS: "custom",
    STATE_ALARM_ARMED_VACATION: "vacation"
}

COMMAND_ARM_NIGHT = "arm_night"
COMMAND_ARM_AWAY = "arm_away"
COMMAND_ARM_HOME = "arm_home"
COMMAND_ARM_CUSTOM_BYPASS = "arm_custom_bypass"
COMMAND_ARM_VACATION = "arm_vacation"
COMMAND_DISARM = "disarm"

COMMANDS = [
    COMMAND_DISARM,
    COMMAND_ARM_AWAY,
    COMMAND_ARM_NIGHT,
    COMMAND_ARM_HOME,
    COMMAND_ARM_CUSTOM_BYPASS,
    COMMAND_ARM_VACATION
]

EVENT_DISARM = "disarm"
EVENT_LEAVE = "leave"
EVENT_ARM = "arm"
EVENT_ENTRY = "entry"
EVENT_TRIGGER = "trigger"
EVENT_FAILED_TO_ARM = "failed_to_arm"
EVENT_COMMAND_NOT_ALLOWED = "command_not_allowed"
EVENT_INVALID_CODE_PROVIDED = "invalid_code_provided"
EVENT_NO_CODE_PROVIDED = "no_code_provided"
EVENT_TRIGGER_TIME_EXPIRED = "trigger_time_expired"

ATTR_MODES = "modes"
ATTR_ARM_MODE = "arm_mode"
ATTR_CODE_DISARM_REQUIRED = "code_disarm_required"
ATTR_REMOVE = "remove"
ATTR_OLD_CODE = "old_code"

ATTR_TRIGGER_TIME = "trigger_time"
ATTR_EXIT_TIME = "exit_time"
ATTR_ENTRY_TIME = "entry_time"

ATTR_ENABLED = "enabled"
ATTR_USER_ID = "user_id"

ATTR_CAN_ARM = "can_arm"
ATTR_CAN_DISARM = "can_disarm"
ATTR_DISARM_AFTER_TRIGGER = "disarm_after_trigger"

ATTR_REMOVE = "remove"
ATTR_IS_OVERRIDE_CODE = "is_override_code"
ATTR_AREA_LIMIT = "area_limit"
ATTR_CODE_FORMAT = "code_format"
ATTR_CODE_LENGTH = "code_length"

ATTR_AUTOMATION_ID = "automation_id"

ATTR_TYPE = "type"
ATTR_AREA = "area"
ATTR_MASTER = "master"

ATTR_TRIGGERS = "triggers"
ATTR_ACTIONS = "actions"
ATTR_EVENT = "event"
ATTR_REQUIRE_CODE = "require_code"

ATTR_NOTIFICATION = "notification"
ATTR_VERSION = "version"
ATTR_STATE_PAYLOAD = "state_payload"
ATTR_COMMAND_PAYLOAD = "command_payload"

ATTR_FORCE = "force"
ATTR_SKIP_DELAY = "skip_delay"
ATTR_CONTEXT_ID = "context_id"

PUSH_EVENT = "mobile_app_notification_action"
EVENT_ACTION_FORCE_ARM = "ALARMO_FORCE_ARM"
EVENT_ACTION_RETRY_ARM = "ALARMO_RETRY_ARM"
EVENT_ACTION_DISARM = "ALARMO_DISARM"

MODES_TO_SUPPORTED_FEATURES = {
    STATE_ALARM_ARMED_AWAY: AlarmControlPanelEntityFeature.ARM_AWAY,
    STATE_ALARM_ARMED_HOME: AlarmControlPanelEntityFeature.ARM_HOME,
    STATE_ALARM_ARMED_NIGHT: AlarmControlPanelEntityFeature.ARM_NIGHT,
    STATE_ALARM_ARMED_CUSTOM_BYPASS: AlarmControlPanelEntityFeature.ARM_CUSTOM_BYPASS,
    STATE_ALARM_ARMED_VACATION: AlarmControlPanelEntityFeature.ARM_VACATION
}

SERVICE_ARM = "arm"
SERVICE_DISARM = "disarm"

SERVICE_ARM_SCHEMA = vol.Schema(
    {
        vol.Required(ATTR_ENTITY_ID): cv.entity_id,
        vol.Optional(CONF_CODE, default=""): cv.string,
        vol.Optional(CONF_MODE, default=STATE_ALARM_ARMED_AWAY): vol.In([
            "away",
            "home",
            "night",
            "custom",
            "vacation",
            STATE_ALARM_ARMED_AWAY,
            STATE_ALARM_ARMED_HOME,
            STATE_ALARM_ARMED_NIGHT,
            STATE_ALARM_ARMED_CUSTOM_BYPASS,
            STATE_ALARM_ARMED_VACATION,
        ]),
        vol.Optional(ATTR_SKIP_DELAY, default=False): cv.boolean,
        vol.Optional(ATTR_FORCE, default=False): cv.boolean,
        vol.Optional(ATTR_CONTEXT_ID): int
    }
)

SERVICE_DISARM_SCHEMA = vol.Schema(
    {
        vol.Required(ATTR_ENTITY_ID): cv.entity_id,
        vol.Optional(CONF_CODE, default=""): cv.string,
        vol.Optional(ATTR_CONTEXT_ID): int
    }
)

SERVICE_ENABLE_USER = "enable_user"
SERVICE_DISABLE_USER = "disable_user"
SERVICE_TOGGLE_USER_SCHEMA = vol.Schema(
    {
        vol.Required(ATTR_NAME, default=""): cv.string,
    }
)


================================================
FILE: custom_components/alarmo/event.py
================================================
# fire events in HA for use with automations

import logging

from homeassistant.core import callback
from homeassistant.helpers.dispatcher import async_dispatcher_connect

from . import const

_LOGGER = logging.getLogger(__name__)


class EventHandler:
    def __init__(self, hass):
        """Class constructor."""
        self.hass = hass
        self._subscription = async_dispatcher_connect(
            self.hass, "alarmo_event", self.async_handle_event
        )

    def __del__(self):
        """Class destructor."""
        self._subscription()

    @callback
    async def async_handle_event(self, event: str, area_id: str, args: dict = {}):
        """handle event"""

        if event in [
            const.EVENT_FAILED_TO_ARM,
            const.EVENT_COMMAND_NOT_ALLOWED,
            const.EVENT_INVALID_CODE_PROVIDED,
            const.EVENT_NO_CODE_PROVIDED
        ]:

            reasons = {
                const.EVENT_FAILED_TO_ARM: "open_sensors",
                const.EVENT_COMMAND_NOT_ALLOWED: "not_allowed",
                const.EVENT_INVALID_CODE_PROVIDED: "invalid_code",
                const.EVENT_NO_CODE_PROVIDED: "invalid_code",
            }

            data = dict(**args, **{
                "area_id": area_id,
                "reason": reasons[event],
            })
            if "open_sensors" in data:
                data["sensors"] = list(data["open_sensors"].keys())
                del data["open_sensors"]

            self.hass.bus.fire("alarmo_failed_to_arm", data)

        elif event in [
            const.EVENT_ARM,
            const.EVENT_DISARM
        ]:

            data = dict(**args, **{
                "area_id": area_id,
                "action": event
            })
            if "arm_mode" in data:
                data["mode"] = const.STATE_TO_ARM_MODE[data["arm_mode"]]
                del data["arm_mode"]

            self.hass.bus.fire("alarmo_command_success", data)


================================================
FILE: custom_components/alarmo/frontend/dist/alarm-panel.js
================================================
!function(e){"use strict";
/*! *****************************************************************************
    Copyright (c) Microsoft Corporation.

    Permission to use, copy, modify, and/or distribute this software for any
    purpose with or without fee is hereby granted.

    THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
    REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
    AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
    INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
    LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
    OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
    PERFORMANCE OF THIS SOFTWARE.
    ***************************************************************************** */function t(e,t,a,i){var s,n=arguments.length,r=n<3?t:null===i?i=Object.getOwnPropertyDescriptor(t,a):i;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)r=Reflect.decorate(e,t,a,i);else for(var o=e.length-1;o>=0;o--)(s=e[o])&&(r=(n<3?s(r):n>3?s(t,a,r):s(t,a))||r);return n>3&&r&&Object.defineProperty(t,a,r),r
/**
     * @license
     * Copyright 2019 Google LLC
     * SPDX-License-Identifier: BSD-3-Clause
     */}const a=window.ShadowRoot&&(void 0===window.ShadyCSS||window.ShadyCSS.nativeShadow)&&"adoptedStyleSheets"in Document.prototype&&"replace"in CSSStyleSheet.prototype,i=Symbol();class s{constructor(e,t){if(t!==i)throw Error("CSSResult is not constructable. Use `unsafeCSS` or `css` instead.");this.cssText=e}get styleSheet(){return a&&void 0===this.t&&(this.t=new CSSStyleSheet,this.t.replaceSync(this.cssText)),this.t}toString(){return this.cssText}}const n=new Map,r=e=>{let t=n.get(e);return void 0===t&&n.set(e,t=new s(e,i)),t},o=(e,...t)=>{const a=1===e.length?e[0]:t.reduce((t,a,i)=>t+(e=>{if(e instanceof s)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.")})(a)+e[i+1],e[0]);return r(a)},l=(e,t)=>{a?e.adoptedStyleSheets=t.map(e=>e instanceof CSSStyleSheet?e:e.styleSheet):t.forEach(t=>{const a=document.createElement("style");a.textContent=t.cssText,e.appendChild(a)})},d=a?e=>e:e=>e instanceof CSSStyleSheet?(e=>{let t="";for(const a of e.cssRules)t+=a.cssText;return(e=>r("string"==typeof e?e:e+""))(t)})(e):e
/**
     * @license
     * Copyright 2017 Google LLC
     * SPDX-License-Identifier: BSD-3-Clause
     */;var c,h,u,m;const p={toAttribute(e,t){switch(t){case Boolean:e=e?"":null;break;case Object:case Array:e=null==e?e:JSON.stringify(e)}return e},fromAttribute(e,t){let a=e;switch(t){case Boolean:a=null!==e;break;case Number:a=null===e?null:Number(e);break;case Object:case Array:try{a=JSON.parse(e)}catch(e){a=null}}return a}},g=(e,t)=>t!==e&&(t==t||e==e),v={attribute:!0,type:String,converter:p,reflect:!1,hasChanged:g};class f extends HTMLElement{constructor(){super(),this.Πi=new Map,this.Πo=void 0,this.Πl=void 0,this.isUpdatePending=!1,this.hasUpdated=!1,this.Πh=null,this.u()}static addInitializer(e){var t;null!==(t=this.v)&&void 0!==t||(this.v=[]),this.v.push(e)}static get observedAttributes(){this.finalize();const e=[];return this.elementProperties.forEach((t,a)=>{const i=this.Πp(a,t);void 0!==i&&(this.Πm.set(i,a),e.push(i))}),e}static createProperty(e,t=v){if(t.state&&(t.attribute=!1),this.finalize(),this.elementProperties.set(e,t),!t.noAccessor&&!this.prototype.hasOwnProperty(e)){const a="symbol"==typeof e?Symbol():"__"+e,i=this.getPropertyDescriptor(e,a,t);void 0!==i&&Object.defineProperty(this.prototype,e,i)}}static getPropertyDescriptor(e,t,a){return{get(){return this[t]},set(i){const s=this[e];this[t]=i,this.requestUpdate(e,s,a)},configurable:!0,enumerable:!0}}static getPropertyOptions(e){return this.elementProperties.get(e)||v}static finalize(){if(this.hasOwnProperty("finalized"))return!1;this.finalized=!0;const e=Object.getPrototypeOf(this);if(e.finalize(),this.elementProperties=new Map(e.elementProperties),this.Πm=new Map,this.hasOwnProperty("properties")){const e=this.properties,t=[...Object.getOwnPropertyNames(e),...Object.getOwnPropertySymbols(e)];for(const a of t)this.createProperty(a,e[a])}return this.elementStyles=this.finalizeStyles(this.styles),!0}static finalizeStyles(e){const t=[];if(Array.isArray(e)){const a=new Set(e.flat(1/0).reverse());for(const e of a)t.unshift(d(e))}else void 0!==e&&t.push(d(e));return t}static"Πp"(e,t){const a=t.attribute;return!1===a?void 0:"string"==typeof a?a:"string"==typeof e?e.toLowerCase():void 0}u(){var e;this.Πg=new Promise(e=>this.enableUpdating=e),this.L=new Map,this.Π_(),this.requestUpdate(),null===(e=this.constructor.v)||void 0===e||e.forEach(e=>e(this))}addController(e){var t,a;(null!==(t=this.ΠU)&&void 0!==t?t:this.ΠU=[]).push(e),void 0!==this.renderRoot&&this.isConnected&&(null===(a=e.hostConnected)||void 0===a||a.call(e))}removeController(e){var t;null===(t=this.ΠU)||void 0===t||t.splice(this.ΠU.indexOf(e)>>>0,1)}"Π_"(){this.constructor.elementProperties.forEach((e,t)=>{this.hasOwnProperty(t)&&(this.Πi.set(t,this[t]),delete this[t])})}createRenderRoot(){var e;const t=null!==(e=this.shadowRoot)&&void 0!==e?e:this.attachShadow(this.constructor.shadowRootOptions);return l(t,this.constructor.elementStyles),t}connectedCallback(){var e;void 0===this.renderRoot&&(this.renderRoot=this.createRenderRoot()),this.enableUpdating(!0),null===(e=this.ΠU)||void 0===e||e.forEach(e=>{var t;return null===(t=e.hostConnected)||void 0===t?void 0:t.call(e)}),this.Πl&&(this.Πl(),this.Πo=this.Πl=void 0)}enableUpdating(e){}disconnectedCallback(){var e;null===(e=this.ΠU)||void 0===e||e.forEach(e=>{var t;return null===(t=e.hostDisconnected)||void 0===t?void 0:t.call(e)}),this.Πo=new Promise(e=>this.Πl=e)}attributeChangedCallback(e,t,a){this.K(e,a)}"Πj"(e,t,a=v){var i,s;const n=this.constructor.Πp(e,a);if(void 0!==n&&!0===a.reflect){const r=(null!==(s=null===(i=a.converter)||void 0===i?void 0:i.toAttribute)&&void 0!==s?s:p.toAttribute)(t,a.type);this.Πh=e,null==r?this.removeAttribute(n):this.setAttribute(n,r),this.Πh=null}}K(e,t){var a,i,s;const n=this.constructor,r=n.Πm.get(e);if(void 0!==r&&this.Πh!==r){const e=n.getPropertyOptions(r),o=e.converter,l=null!==(s=null!==(i=null===(a=o)||void 0===a?void 0:a.fromAttribute)&&void 0!==i?i:"function"==typeof o?o:null)&&void 0!==s?s:p.fromAttribute;this.Πh=r,this[r]=l(t,e.type),this.Πh=null}}requestUpdate(e,t,a){let i=!0;void 0!==e&&(((a=a||this.constructor.getPropertyOptions(e)).hasChanged||g)(this[e],t)?(this.L.has(e)||this.L.set(e,t),!0===a.reflect&&this.Πh!==e&&(void 0===this.Πk&&(this.Πk=new Map),this.Πk.set(e,a))):i=!1),!this.isUpdatePending&&i&&(this.Πg=this.Πq())}async"Πq"(){this.isUpdatePending=!0;try{for(await this.Πg;this.Πo;)await this.Πo}catch(e){Promise.reject(e)}const e=this.performUpdate();return null!=e&&await e,!this.isUpdatePending}performUpdate(){var e;if(!this.isUpdatePending)return;this.hasUpdated,this.Πi&&(this.Πi.forEach((e,t)=>this[t]=e),this.Πi=void 0);let t=!1;const a=this.L;try{t=this.shouldUpdate(a),t?(this.willUpdate(a),null===(e=this.ΠU)||void 0===e||e.forEach(e=>{var t;return null===(t=e.hostUpdate)||void 0===t?void 0:t.call(e)}),this.update(a)):this.Π$()}catch(e){throw t=!1,this.Π$(),e}t&&this.E(a)}willUpdate(e){}E(e){var t;null===(t=this.ΠU)||void 0===t||t.forEach(e=>{var t;return null===(t=e.hostUpdated)||void 0===t?void 0:t.call(e)}),this.hasUpdated||(this.hasUpdated=!0,this.firstUpdated(e)),this.updated(e)}"Π$"(){this.L=new Map,this.isUpdatePending=!1}get updateComplete(){return this.getUpdateComplete()}getUpdateComplete(){return this.Πg}shouldUpdate(e){return!0}update(e){void 0!==this.Πk&&(this.Πk.forEach((e,t)=>this.Πj(t,this[t],e)),this.Πk=void 0),this.Π$()}updated(e){}firstUpdated(e){}}
/**
     * @license
     * Copyright 2017 Google LLC
     * SPDX-License-Identifier: BSD-3-Clause
     */
var _,b,y,w;f.finalized=!0,f.elementProperties=new Map,f.elementStyles=[],f.shadowRootOptions={mode:"open"},null===(h=(c=globalThis).reactiveElementPlatformSupport)||void 0===h||h.call(c,{ReactiveElement:f}),(null!==(u=(m=globalThis).reactiveElementVersions)&&void 0!==u?u:m.reactiveElementVersions=[]).push("1.0.0-rc.2");const k=globalThis.trustedTypes,$=k?k.createPolicy("lit-html",{createHTML:e=>e}):void 0,A=`lit$${(Math.random()+"").slice(9)}$`,x="?"+A,O=`<${x}>`,E=document,T=(e="")=>E.createComment(e),j=e=>null===e||"object"!=typeof e&&"function"!=typeof e,S=Array.isArray,C=/<(?:(!--|\/[^a-zA-Z])|(\/?[a-zA-Z][^>\s]*)|(\/?$))/g,M=/-->/g,N=/>/g,D=/>|[ 	\n\r](?:([^\s"'>=/]+)([ 	\n\r]*=[ 	\n\r]*(?:[^ 	\n\r"'`<>=]|("|')|))|$)/g,L=/'/g,z=/"/g,P=/^(?:script|style|textarea)$/i,q=(e=>(t,...a)=>({_$litType$:e,strings:t,values:a}))(1),R=Symbol.for("lit-noChange"),I=Symbol.for("lit-nothing"),U=new WeakMap,G=(e,t,a)=>{var i,s;const n=null!==(i=null==a?void 0:a.renderBefore)&&void 0!==i?i:t;let r=n._$litPart$;if(void 0===r){const e=null!==(s=null==a?void 0:a.renderBefore)&&void 0!==s?s:null;n._$litPart$=r=new B(t.insertBefore(T(),e),e,void 0,a)}return r.I(e),r},F=E.createTreeWalker(E,129,null,!1);class V{constructor({strings:e,_$litType$:t},a){let i;this.parts=[];let s=0,n=0;const r=e.length-1,o=this.parts,[l,d]=((e,t)=>{const a=e.length-1,i=[];let s,n=2===t?"<svg>":"",r=C;for(let t=0;t<a;t++){const a=e[t];let o,l,d=-1,c=0;for(;c<a.length&&(r.lastIndex=c,l=r.exec(a),null!==l);)c=r.lastIndex,r===C?"!--"===l[1]?r=M:void 0!==l[1]?r=N:void 0!==l[2]?(P.test(l[2])&&(s=RegExp("</"+l[2],"g")),r=D):void 0!==l[3]&&(r=D):r===D?">"===l[0]?(r=null!=s?s:C,d=-1):void 0===l[1]?d=-2:(d=r.lastIndex-l[2].length,o=l[1],r=void 0===l[3]?D:'"'===l[3]?z:L):r===z||r===L?r=D:r===M||r===N?r=C:(r=D,s=void 0);const h=r===D&&e[t+1].startsWith("/>")?" ":"";n+=r===C?a+O:d>=0?(i.push(o),a.slice(0,d)+"$lit$"+a.slice(d)+A+h):a+A+(-2===d?(i.push(void 0),t):h)}const o=n+(e[a]||"<?>")+(2===t?"</svg>":"");return[void 0!==$?$.createHTML(o):o,i]})(e,t);if(this.el=V.createElement(l,a),F.currentNode=this.el.content,2===t){const e=this.el.content,t=e.firstChild;t.remove(),e.append(...t.childNodes)}for(;null!==(i=F.nextNode())&&o.length<r;){if(1===i.nodeType){if(i.hasAttributes()){const e=[];for(const t of i.getAttributeNames())if(t.endsWith("$lit$")||t.startsWith(A)){const a=d[n++];if(e.push(t),void 0!==a){const e=i.getAttribute(a.toLowerCase()+"$lit$").split(A),t=/([.?@])?(.*)/.exec(a);o.push({type:1,index:s,name:t[2],strings:e,ctor:"."===t[1]?Q:"?"===t[1]?W:"@"===t[1]?X:K})}else o.push({type:6,index:s})}for(const t of e)i.removeAttribute(t)}if(P.test(i.tagName)){const e=i.textContent.split(A),t=e.length-1;if(t>0){i.textContent=k?k.emptyScript:"";for(let a=0;a<t;a++)i.append(e[a],T()),F.nextNode(),o.push({type:2,index:++s});i.append(e[t],T())}}}else if(8===i.nodeType)if(i.data===x)o.push({type:2,index:s});else{let e=-1;for(;-1!==(e=i.data.indexOf(A,e+1));)o.push({type:7,index:s}),e+=A.length-1}s++}}static createElement(e,t){const a=E.createElement("template");return a.innerHTML=e,a}}function H(e,t,a=e,i){var s,n,r,o;if(t===R)return t;let l=void 0!==i?null===(s=a.Σi)||void 0===s?void 0:s[i]:a.Σo;const d=j(t)?void 0:t._$litDirective$;return(null==l?void 0:l.constructor)!==d&&(null===(n=null==l?void 0:l.O)||void 0===n||n.call(l,!1),void 0===d?l=void 0:(l=new d(e),l.T(e,a,i)),void 0!==i?(null!==(r=(o=a).Σi)&&void 0!==r?r:o.Σi=[])[i]=l:a.Σo=l),void 0!==l&&(t=H(e,l.S(e,t.values),l,i)),t}class Y{constructor(e,t){this.l=[],this.N=void 0,this.D=e,this.M=t}u(e){var t;const{el:{content:a},parts:i}=this.D,s=(null!==(t=null==e?void 0:e.creationScope)&&void 0!==t?t:E).importNode(a,!0);F.currentNode=s;let n=F.nextNode(),r=0,o=0,l=i[0];for(;void 0!==l;){if(r===l.index){let t;2===l.type?t=new B(n,n.nextSibling,this,e):1===l.type?t=new l.ctor(n,l.name,l.strings,this,e):6===l.type&&(t=new Z(n,this,e)),this.l.push(t),l=i[++o]}r!==(null==l?void 0:l.index)&&(n=F.nextNode(),r++)}return s}v(e){let t=0;for(const a of this.l)void 0!==a&&(void 0!==a.strings?(a.I(e,a,t),t+=a.strings.length-2):a.I(e[t])),t++}}class B{constructor(e,t,a,i){this.type=2,this.N=void 0,this.A=e,this.B=t,this.M=a,this.options=i}setConnected(e){var t;null===(t=this.P)||void 0===t||t.call(this,e)}get parentNode(){return this.A.parentNode}get startNode(){return this.A}get endNode(){return this.B}I(e,t=this){e=H(this,e,t),j(e)?e===I||null==e||""===e?(this.H!==I&&this.R(),this.H=I):e!==this.H&&e!==R&&this.m(e):void 0!==e._$litType$?this._(e):void 0!==e.nodeType?this.$(e):(e=>{var t;return S(e)||"function"==typeof(null===(t=e)||void 0===t?void 0:t[Symbol.iterator])})(e)?this.g(e):this.m(e)}k(e,t=this.B){return this.A.parentNode.insertBefore(e,t)}$(e){this.H!==e&&(this.R(),this.H=this.k(e))}m(e){const t=this.A.nextSibling;null!==t&&3===t.nodeType&&(null===this.B?null===t.nextSibling:t===this.B.previousSibling)?t.data=e:this.$(E.createTextNode(e)),this.H=e}_(e){var t;const{values:a,_$litType$:i}=e,s="number"==typeof i?this.C(e):(void 0===i.el&&(i.el=V.createElement(i.h,this.options)),i);if((null===(t=this.H)||void 0===t?void 0:t.D)===s)this.H.v(a);else{const e=new Y(s,this),t=e.u(this.options);e.v(a),this.$(t),this.H=e}}C(e){let t=U.get(e.strings);return void 0===t&&U.set(e.strings,t=new V(e)),t}g(e){S(this.H)||(this.H=[],this.R());const t=this.H;let a,i=0;for(const s of e)i===t.length?t.push(a=new B(this.k(T()),this.k(T()),this,this.options)):a=t[i],a.I(s),i++;i<t.length&&(this.R(a&&a.B.nextSibling,i),t.length=i)}R(e=this.A.nextSibling,t){var a;for(null===(a=this.P)||void 0===a||a.call(this,!1,!0,t);e&&e!==this.B;){const t=e.nextSibling;e.remove(),e=t}}}class K{constructor(e,t,a,i,s){this.type=1,this.H=I,this.N=void 0,this.V=void 0,this.element=e,this.name=t,this.M=i,this.options=s,a.length>2||""!==a[0]||""!==a[1]?(this.H=Array(a.length-1).fill(I),this.strings=a):this.H=I}get tagName(){return this.element.tagName}I(e,t=this,a,i){const s=this.strings;let n=!1;if(void 0===s)e=H(this,e,t,0),n=!j(e)||e!==this.H&&e!==R,n&&(this.H=e);else{const i=e;let r,o;for(e=s[0],r=0;r<s.length-1;r++)o=H(this,i[a+r],t,r),o===R&&(o=this.H[r]),n||(n=!j(o)||o!==this.H[r]),o===I?e=I:e!==I&&(e+=(null!=o?o:"")+s[r+1]),this.H[r]=o}n&&!i&&this.W(e)}W(e){e===I?this.element.removeAttribute(this.name):this.element.setAttribute(this.name,null!=e?e:"")}}class Q extends K{constructor(){super(...arguments),this.type=3}W(e){this.element[this.name]=e===I?void 0:e}}class W extends K{constructor(){super(...arguments),this.type=4}W(e){e&&e!==I?this.element.setAttribute(this.name,""):this.element.removeAttribute(this.name)}}class X extends K{constructor(){super(...arguments),this.type=5}I(e,t=this){var a;if((e=null!==(a=H(this,e,t,0))&&void 0!==a?a:I)===R)return;const i=this.H,s=e===I&&i!==I||e.capture!==i.capture||e.once!==i.once||e.passive!==i.passive,n=e!==I&&(i===I||s);s&&this.element.removeEventListener(this.name,this,i),n&&this.element.addEventListener(this.name,this,e),this.H=e}handleEvent(e){var t,a;"function"==typeof this.H?this.H.call(null!==(a=null===(t=this.options)||void 0===t?void 0:t.host)&&void 0!==a?a:this.element,e):this.H.handleEvent(e)}}class Z{constructor(e,t,a){this.element=e,this.type=6,this.N=void 0,this.V=void 0,this.M=t,this.options=a}I(e){H(this,e)}}
/**
     * @license
     * Copyright 2017 Google LLC
     * SPDX-License-Identifier: BSD-3-Clause
     */
var J,ee,te,ae,ie,se;null===(b=(_=globalThis).litHtmlPlatformSupport)||void 0===b||b.call(_,V,B),(null!==(y=(w=globalThis).litHtmlVersions)&&void 0!==y?y:w.litHtmlVersions=[]).push("2.0.0-rc.3"),(null!==(J=(se=globalThis).litElementVersions)&&void 0!==J?J:se.litElementVersions=[]).push("3.0.0-rc.2");class ne extends f{constructor(){super(...arguments),this.renderOptions={host:this},this.Φt=void 0}createRenderRoot(){var e,t;const a=super.createRenderRoot();return null!==(e=(t=this.renderOptions).renderBefore)&&void 0!==e||(t.renderBefore=a.firstChild),a}update(e){const t=this.render();super.update(e),this.Φt=G(t,this.renderRoot,this.renderOptions)}connectedCallback(){var e;super.connectedCallback(),null===(e=this.Φt)||void 0===e||e.setConnected(!0)}disconnectedCallback(){var e;super.disconnectedCallback(),null===(e=this.Φt)||void 0===e||e.setConnected(!1)}render(){return R}}ne.finalized=!0,ne._$litElement$=!0,null===(te=(ee=globalThis).litElementHydrateSupport)||void 0===te||te.call(ee,{LitElement:ne}),null===(ie=(ae=globalThis).litElementPlatformSupport)||void 0===ie||ie.call(ae,{LitElement:ne});
/**
     * @license
     * Copyright 2017 Google LLC
     * SPDX-License-Identifier: BSD-3-Clause
     */
const re=e=>t=>"function"==typeof t?((e,t)=>(window.customElements.define(e,t),t))(e,t):((e,t)=>{const{kind:a,elements:i}=t;return{kind:a,elements:i,finisher(t){window.customElements.define(e,t)}}})(e,t)
/**
     * @license
     * Copyright 2017 Google LLC
     * SPDX-License-Identifier: BSD-3-Clause
     */,oe=(e,t)=>"method"===t.kind&&t.descriptor&&!("value"in t.descriptor)?{...t,finisher(a){a.createProperty(t.key,e)}}:{kind:"field",key:Symbol(),placement:"own",descriptor:{},originalKey:t.key,initializer(){"function"==typeof t.initializer&&(this[t.key]=t.initializer.call(this))},finisher(a){a.createProperty(t.key,e)}};function le(e){return(t,a)=>void 0!==a?((e,t,a)=>{t.constructor.createProperty(a,e)})(e,t,a):oe(e,t)
/**
     * @license
     * Copyright 2017 Google LLC
     * SPDX-License-Identifier: BSD-3-Clause
     */}function de(e){return le({...e,state:!0,attribute:!1})}
/**
     * @license
     * Copyright 2017 Google LLC
     * SPDX-License-Identifier: BSD-3-Clause
     */
/**
     * @license
     * Copyright 2017 Google LLC
     * SPDX-License-Identifier: BSD-3-Clause
     */
function ce(e,t){return(({finisher:e,descriptor:t})=>(a,i)=>{var s;if(void 0===i){const i=null!==(s=a.originalKey)&&void 0!==s?s:a.key,n=null!=t?{kind:"method",placement:"prototype",key:i,descriptor:t(a.key)}:{...a,key:i};return null!=e&&(n.finisher=function(t){e(t,i)}),n}{const s=a.constructor;void 0!==t&&Object.defineProperty(a,i,t(i)),null==e||e(s,i)}})({descriptor:a=>{const i={get(){var t;return null===(t=this.renderRoot)||void 0===t?void 0:t.querySelector(e)},enumerable:!0,configurable:!0};if(t){const t="symbol"==typeof a?Symbol():"__"+a;i.get=function(){var a;return void 0===this[t]&&(this[t]=null===(a=this.renderRoot)||void 0===a?void 0:a.querySelector(e)),this[t]}}return i}})}var he=/d{1,4}|M{1,4}|YY(?:YY)?|S{1,3}|Do|ZZ|Z|([HhMsDm])\1?|[aA]|"[^"]*"|'[^']*'/g,ue="[^\\s]+",me=/\[([^]*?)\]/gm;function pe(e,t){for(var a=[],i=0,s=e.length;i<s;i++)a.push(e[i].substr(0,t));return a}var ge=function(e){return function(t,a){var i=a[e].map((function(e){return e.toLowerCase()})).indexOf(t.toLowerCase());return i>-1?i:null}};function ve(e){for(var t=[],a=1;a<arguments.length;a++)t[a-1]=arguments[a];for(var i=0,s=t;i<s.length;i++){var n=s[i];for(var r in n)e[r]=n[r]}return e}var fe=["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],_e=["January","February","March","April","May","June","July","August","September","October","November","December"],be=pe(_e,3),ye={dayNamesShort:pe(fe,3),dayNames:fe,monthNamesShort:be,monthNames:_e,amPm:["am","pm"],DoFn:function(e){return e+["th","st","nd","rd"][e%10>3?0:(e-e%10!=10?1:0)*e%10]}},we=ve({},ye),ke=function(e,t){for(void 0===t&&(t=2),e=String(e);e.length<t;)e="0"+e;return e},$e={D:function(e){return String(e.getDate())},DD:function(e){return ke(e.getDate())},Do:function(e,t){return t.DoFn(e.getDate())},d:function(e){return String(e.getDay())},dd:function(e){return ke(e.getDay())},ddd:function(e,t){return t.dayNamesShort[e.getDay()]},dddd:function(e,t){return t.dayNames[e.getDay()]},M:function(e){return String(e.getMonth()+1)},MM:function(e){return ke(e.getMonth()+1)},MMM:function(e,t){return t.monthNamesShort[e.getMonth()]},MMMM:function(e,t){return t.monthNames[e.getMonth()]},YY:function(e){return ke(String(e.getFullYear()),4).substr(2)},YYYY:function(e){return ke(e.getFullYear(),4)},h:function(e){return String(e.getHours()%12||12)},hh:function(e){return ke(e.getHours()%12||12)},H:function(e){return String(e.getHours())},HH:function(e){return ke(e.getHours())},m:function(e){return String(e.getMinutes())},mm:function(e){return ke(e.getMinutes())},s:function(e){return String(e.getSeconds())},ss:function(e){return ke(e.getSeconds())},S:function(e){return String(Math.round(e.getMilliseconds()/100))},SS:function(e){return ke(Math.round(e.getMilliseconds()/10),2)},SSS:function(e){return ke(e.getMilliseconds(),3)},a:function(e,t){return e.getHours()<12?t.amPm[0]:t.amPm[1]},A:function(e,t){return e.getHours()<12?t.amPm[0].toUpperCase():t.amPm[1].toUpperCase()},ZZ:function(e){var t=e.getTimezoneOffset();return(t>0?"-":"+")+ke(100*Math.floor(Math.abs(t)/60)+Math.abs(t)%60,4)},Z:function(e){var t=e.getTimezoneOffset();return(t>0?"-":"+")+ke(Math.floor(Math.abs(t)/60),2)+":"+ke(Math.abs(t)%60,2)}},Ae=function(e){return+e-1},xe=[null,"[1-9]\\d?"],Oe=[null,ue],Ee=["isPm",ue,function(e,t){var a=e.toLowerCase();return a===t.amPm[0]?0:a===t.amPm[1]?1:null}],Te=["timezoneOffset","[^\\s]*?[\\+\\-]\\d\\d:?\\d\\d|[^\\s]*?Z?",function(e){var t=(e+"").match(/([+-]|\d\d)/gi);if(t){var a=60*+t[1]+parseInt(t[2],10);return"+"===t[0]?a:-a}return 0}],je=(ge("monthNamesShort"),ge("monthNames"),{default:"ddd MMM DD YYYY HH:mm:ss",shortDate:"M/D/YY",mediumDate:"MMM D, YYYY",longDate:"MMMM D, YYYY",fullDate:"dddd, MMMM D, YYYY",isoDate:"YYYY-MM-DD",isoDateTime:"YYYY-MM-DDTHH:mm:ssZ",shortTime:"HH:mm",mediumTime:"HH:mm:ss",longTime:"HH:mm:ss.SSS"});var Se=function(e,t,a){if(void 0===t&&(t=je.default),void 0===a&&(a={}),"number"==typeof e&&(e=new Date(e)),"[object Date]"!==Object.prototype.toString.call(e)||isNaN(e.getTime()))throw new Error("Invalid Date pass to format");var i=[];t=(t=je[t]||t).replace(me,(function(e,t){return i.push(t),"@@@"}));var s=ve(ve({},we),a);return(t=t.replace(he,(function(t){return $e[t](e,s)}))).replace(/@@@/g,(function(){return i.shift()}))};(function(){try{(new Date).toLocaleDateString("i")}catch(e){return"RangeError"===e.name}})(),function(){try{(new Date).toLocaleString("i")}catch(e){return"RangeError"===e.name}}(),function(){try{(new Date).toLocaleTimeString("i")}catch(e){return"RangeError"===e.name}}();function Ce(e){return e.substr(0,e.indexOf("."))}function Me(e){return e.substr(e.indexOf(".")+1)}var Ne="hass:bookmark",De=function(e,t,a,i){i=i||{},a=null==a?{}:a;var s=new Event(t,{bubbles:void 0===i.bubbles||i.bubbles,cancelable:Boolean(i.cancelable),composed:void 0===i.composed||i.composed});return s.detail=a,e.dispatchEvent(s),s},Le={alert:"hass:alert",automation:"hass:playlist-play",calendar:"hass:calendar",camera:"hass:video",climate:"hass:thermostat",configurator:"hass:settings",conversation:"hass:text-to-speech",device_tracker:"hass:account",fan:"hass:fan",group:"hass:google-circles-communities",history_graph:"hass:chart-line",homeassistant:"hass:home-assistant",homekit:"hass:home-automation",image_processing:"hass:image-filter-frames",input_boolean:"hass:drawing",input_datetime:"hass:calendar-clock",input_number:"hass:ray-vertex",input_select:"hass:format-list-bulleted",input_text:"hass:textbox",light:"hass:lightbulb",mailbox:"hass:mailbox",notify:"hass:comment-alert",person:"hass:account",plant:"hass:flower",proximity:"hass:apple-safari",remote:"hass:remote",scene:"hass:google-pages",script:"hass:file-document",sensor:"hass:eye",simple_alarm:"hass:bell",sun:"hass:white-balance-sunny",switch:"hass:flash",timer:"hass:timer",updater:"hass:cloud-upload",vacuum:"hass:robot-vacuum",water_heater:"hass:thermometer",weblink:"hass:open-in-new"};function ze(e,t){if(e in Le)return Le[e];switch(e){case"alarm_control_panel":switch(t){case"armed_home":return"hass:bell-plus";case"armed_night":return"hass:bell-sleep";case"disarmed":return"hass:bell-outline";case"triggered":return"hass:bell-ring";default:return"hass:bell"}case"binary_sensor":return t&&"off"===t?"hass:radiobox-blank":"hass:checkbox-marked-circle";case"cover":return"closed"===t?"hass:window-closed":"hass:window-open";case"lock":return t&&"unlocked"===t?"hass:lock-open":"hass:lock";case"media_player":return t&&"off"!==t&&"idle"!==t?"hass:cast-connected":"hass:cast";case"zwave":switch(t){case"dead":return"hass:emoticon-dead";case"sleeping":return"hass:sleep";case"initializing":return"hass:timer-sand";default:return"hass:z-wave"}default:return console.warn("Unable to find icon for domain "+e+" ("+t+")"),Ne}}var Pe=function(e,t,a){void 0===a&&(a=!1),a?history.replaceState(null,"",t):history.pushState(null,"",t),De(window,"location-changed",{replace:a})},qe={humidity:"hass:water-percent",illuminance:"hass:brightness-5",temperature:"hass:thermometer",pressure:"hass:gauge",power:"hass:flash",signal_strength:"hass:wifi"},Re={binary_sensor:function(e){var t=e.state&&"off"===e.state;switch(e.attributes.device_class){case"battery":return t?"hass:battery":"hass:battery-outline";case"cold":return t?"hass:thermometer":"hass:snowflake";case"connectivity":return t?"hass:server-network-off":"hass:server-network";case"door":return t?"hass:door-closed":"hass:door-open";case"garage_door":return t?"hass:garage":"hass:garage-open";case"gas":case"power":case"problem":case"safety":case"smoke":return t?"hass:shield-check":"hass:alert";case"heat":return t?"hass:thermometer":"hass:fire";case"light":return t?"hass:brightness-5":"hass:brightness-7";case"lock":return t?"hass:lock":"hass:lock-open";case"moisture":return t?"hass:water-off":"hass:water";case"motion":return t?"hass:walk":"hass:run";case"occupancy":return t?"hass:home-outline":"hass:home";case"opening":return t?"hass:square":"hass:square-outline";case"plug":return t?"hass:power-plug-off":"hass:power-plug";case"presence":return t?"hass:home-outline":"hass:home";case"sound":return t?"hass:music-note-off":"hass:music-note";case"vibration":return t?"hass:crop-portrait":"hass:vibrate";case"window":return t?"hass:window-closed":"hass:window-open";default:return t?"hass:radiobox-blank":"hass:checkbox-marked-circle"}},cover:function(e){var t="closed"!==e.state;switch(e.attributes.device_class){case"garage":return t?"hass:garage-open":"hass:garage";case"door":return t?"hass:door-open":"hass:door-closed";case"shutter":return t?"hass:window-shutter-open":"hass:window-shutter";case"blind":return t?"hass:blinds-open":"hass:blinds";case"window":return t?"hass:window-open":"hass:window-closed";default:return ze("cover",e.state)}},sensor:function(e){var t=e.attributes.device_class;if(t&&t in qe)return qe[t];if("battery"===t){var a=Number(e.state);if(isNaN(a))return"hass:battery-unknown";var i=10*Math.round(a/10);return i>=100?"hass:battery":i<=0?"hass:battery-alert":"hass:battery-"+i}var s=e.attributes.unit_of_measurement;return"°C"===s||"°F"===s?"hass:thermometer":ze("sensor")},input_datetime:function(e){return e.attributes.has_date?e.attributes.has_time?ze("input_datetime"):"hass:calendar":"hass:clock"}};const Ie=async()=>{if(customElements.get("ha-checkbox")&&customElements.get("ha-slider"))return;await customElements.whenDefined("partial-panel-resolver");const e=document.createElement("partial-panel-resolver");e.hass={panels:[{url_path:"tmp",component_name:"config"}]},e._updateRoutes(),await e.routerOptions.routes.tmp.load(),await customElements.whenDefined("ha-panel-config");const t=document.createElement("ha-panel-config");await t.routerOptions.routes.automation.load(),e.hass={panels:[{url_path:"tmp",component_name:"developer-tools"}]},e._updateRoutes(),await e.routerOptions.routes.tmp.load(),await customElements.whenDefined("ha-app-layout")},Ue=async()=>{var e,t,a,i,s,n,r,o;if(customElements.get("ha-yaml-editor"))return;const l=document.createElement("partial-panel-resolver").getRoutes([{component_name:"developer-tools",url_path:"a"}]);await(null===(a=null===(t=null===(e=null==l?void 0:l.routes)||void 0===e?void 0:e.a)||void 0===t?void 0:t.load)||void 0===a?void 0:a.call(t));const d=document.createElement("developer-tools-router");await(null===(o=null===(r=null===(n=null===(s=null===(i=d)||void 0===i?void 0:i.routerOptions)||void 0===s?void 0:s.routes)||void 0===n?void 0:n.service)||void 0===r?void 0:r.load)||void 0===o?void 0:o.call(r))},Ge=e=>e.callWS({type:"alarmo/config"}),Fe=e=>e.callWS({type:"alarmo/sensors"}),Ve=e=>e.callWS({type:"alarmo/users"}),He=e=>e.callWS({type:"alarmo/automations"}),Ye=e=>e.callWS({type:"alarmo/sensor_groups"}),Be=(e,t)=>e.callApi("POST","alarmo/config",t),Ke=(e,t)=>e.callApi("POST","alarmo/sensors",t),Qe=(e,t)=>e.callApi("POST","alarmo/users",t),We=(e,t)=>e.callApi("POST","alarmo/automations",t),Xe=(e,t)=>e.callApi("POST","alarmo/automations",{automation_id:t,remove:!0}),Ze=e=>e.callWS({type:"alarmo/areas"}),Je=(e,t)=>e.callApi("POST","alarmo/area",t),et=e=>{class a extends e{connectedCallback(){super.connectedCallback(),this.__checkSubscribed()}disconnectedCallback(){if(super.disconnectedCallback(),this.__unsubs){for(;this.__unsubs.length;){const e=this.__unsubs.pop();e instanceof Promise?e.then(e=>e()):e()}this.__unsubs=void 0}}updated(e){super.updated(e),e.has("hass")&&this.__checkSubscribed()}hassSubscribe(){return[]}__checkSubscribed(){void 0===this.__unsubs&&this.isConnected&&void 0!==this.hass&&(this.__unsubs=this.hassSubscribe())}}return t([le({attribute:!1})],a.prototype,"hass",void 0),a};var tt={modes_short:{armed_away:"Fora",armed_home:"Casa",armed_night:"Nit",armed_custom_bypass:"Personalitzat",armed_vacation:"Vacation"},enabled:"Activat",disabled:"Desactivat"},at={time_slider:{seconds:"seg",minutes:"min",infinite:"infinit",none:"cap"},editor:{ui_mode:"Canvia a UI",yaml_mode:"Canvia a YAML",edit_in_yaml:"Edit in YAML"},table:{filter:{label:"Filter items",item:"Filter by {name}",hidden_items:"{number} {number, plural,\n  one {item is}\n  other {items are}\n} hidden"}}},it={general:{title:"General",cards:{general:{description:"Aquest tauler defineix alguns paràmetres globals de l'alarma.",fields:{disarm_after_trigger:{heading:"Desactivar després del disparador",description:"Quan hagi transcorregut el temps d’activació, desactiveu l’alarma en lloc de tornar a l’estat armat."},enable_mqtt:{heading:"Activa MQTT",description:"Permet controlar el tauler d'alarma mitjançant MQTT."},enable_master:{heading:"Activa l'alarma mestra",description:"Crea una entitat per controlar totes les àrees simultàniament."}},actions:{setup_mqtt:"Configuració MQTT",setup_master:"Configuració mestra"}},modes:{title:"Modes",description:"Aquest tauler es pot utilitzar per configurar els modes d'activació de l'alarma.",modes:{armed_away:"El mode fora de casa s'utilitzarà quan totes les persones surtin de casa. Es controlen totes les portes i finestres que permeten l'accés a la casa, així com els sensors de moviment dins de la casa.",armed_home:"El mode a casa (també conegut com mode casa) s'utilitzarà quan configureu l'alarma mentre hi hagi persones a la casa. Es controlen totes les portes i finestres que permetin l'accés a la casa, però no els sensors de moviment a l'interior de la casa.",armed_night:"El mode nit s'utilitzarà quan configureu l'alarma abans d'anar a dormir. Es controlaran totes les portes i finestres que permetin l'accés a la casa i es seleccionaran els sensors de moviment (per exemple, a la planta baixa) de la casa.",armed_vacation:"Armed vacation can be used as an extension to the armed away mode in case of absence for longer duration. The delay times and trigger responses can be adapted (as desired) to being distant from home.",armed_custom_bypass:"Un mode addicional per definir el vostre propi perímetre de seguretat."},number_sensors_active:"{number} {number, plural,\n  one {sensor}\n  other {sensors}\n} activa",fields:{status:{heading:"Status",description:"Controls whether the alarm can be armed in this mode."},exit_delay:{heading:"Retard de sortida",description:"Quan activeu l'alarma, en aquest període de temps els sensors encara no activaran l'alarma."},entry_delay:{heading:"Retard d'entrada",description:"Temps de retard fins que s'activi l'alarma després que s'activi un dels sensors."},trigger_time:{heading:"Temps d'activació",description:"Temps durant el qual sonarà la sirena"}}},mqtt:{title:"Configuració MQTT",description:"Aquest tauler es pot utilitzar per configurar la interfície MQTT.",fields:{state_topic:{heading:"Tema d'estat",description:"Tema sobre el qual es publiquen les actualitzacions d'estat"},event_topic:{heading:"Tema d'esdeveniment",description:"Tema sobre el qual es publiquen els esdeveniments d'alarma"},command_topic:{heading:"Tama d'ordre",description:"Tema sobre el qual s'envien les ordres d'activació/desactivació."},require_code:{heading:"Requereix codi",description:"Requereix l'enviament d'un codi amb l'ordre."},state_payload:{heading:"Configura la càrrega útil per estat",item:"Definiu una càrrega útil per a l'estat ''{state}''"},command_payload:{heading:"Configura la càrrega útil per ordre",item:"Definiu una càrrega útil per a l'ordre ''{command}''"}}},areas:{title:"Àrees",description:"Les àrees es poden utilitzar per dividir el sistema d'alarma en diversos compartiments.",no_items:"Encara no hi ha àrees definides.",table:{remarks:"Observacions",summary:"Aquesta àrea conté {summary_sensors} i {summary_automations}.",summary_sensors:"{number} {number, plural,\n  one {sensor}\n  other {sensors}\n}",summary_automations:"{number} {number, plural,\n  one {automatisme}\n  other {automatismes}\n}"},actions:{add:"Afegeix"}}},dialogs:{create_area:{title:"Àrea nova",fields:{copy_from:"Copia la configuració de"}},edit_area:{title:"Edita l'àrea ''{area}''",name_warning:"Nota: si canvieu el nom, es canviarà l'identificador d'entitat"},remove_area:{title:"Voleu eliminar l'àrea?",description:"Confirmeu que voleu eliminar aquesta àrea? Aquesta àrea conté {sensors} sensors i {automatismes} automatismes, que també s'eliminaran."},edit_master:{title:"Configuració mestra"},disable_master:{title:"Voleu desactivar l'alarma mestra?",description:"Confirmeu que voleu eliminar l'alarma mestra? Aquesta àrea conté automatismes {automatismes}, que s'eliminaran amb aquesta acció."}}},sensors:{title:"Sensors",cards:{sensors:{description:"Sensors configurats actualment. Feu clic a una entitat per fer canvis.",table:{no_items:"No hi ha cap sensor per mostrar",arm_modes:"Modes d'armat",always_on:"(Sempre)",no_area_warning:"Sensor is not assigned to any area."}},add_sensors:{title:"Afegeix sensors",description:"Afegiu més sensors. Assegureu-vos que els vostres sensors tinguin un friendly_name perquè pugueu identificar-los.",no_items:"No hi ha entitats HA disponibles que es puguin configurar per a l'alarma. Assegureu-vos d'incloure entitats del tipus binary_sensor.",table:{type:"Detected type"},actions:{add_to_alarm:"afegeix a l'alarma",show_all:"Mostra-ho tot"}},editor:{title:"Edita el sensor",description:"Edita la configuració del sensor de ''{entity}''.",fields:{area:{heading:"Àrea",description:"Seleccioneu una àrea que contingui aquest sensor."},group:{heading:"Group",description:"Group with other sensors for combined triggering."},device_type:{heading:"Tipus de dispositiu",description:"Trieu un tipus de dispositiu per aplicar automàticament la configuració adequada.",choose:{door:{name:"Porta",description:"Porta, porta de garatge o altra entrada que s'utilitzi per entrar/sortir de casa."},window:{name:"Finestra",description:"Finestra o una porta que no s'utilitza per entrar a la casa, com ara un balcó."},motion:{name:"Moviment",description:"Sensor de presència o dispositiu similar que té un retard entre les activacions."},tamper:{name:"Antisabotatge",description:"Detector de retirada de la coberta del sensor, sensor de trencament de vidre, etc."},environmental:{name:"Ambiental",description:"Sensor de fum o gas, detector de fuites, etc. (no relacionat amb la protecció antirobatori)."},other:{name:"Genèric"}}},always_on:{heading:"Sempre activat",description:"El sensor sempre ha de disparar l'alarma."},modes:{heading:"Modes habilitats",description:"Modes d'alarma en què aquest sensor està actiu."},arm_on_close:{heading:"Arma després de tancar",description:"Després de la desactivació d'aquest sensor, s'omet automàticament el temps de retard de sortida restant."},use_exit_delay:{heading:"Use exit delay",description:"Sensor is allowed to be active when the exit delay starts."},use_entry_delay:{heading:"Use entry delay",description:"Sensor activation triggers the alarm after the entry delay rather than directly."},allow_open:{heading:"Permet obrir mentre s'arma l'alarma",description:"Permeteu que aquest sensor estigui actiu poc després de configurar-lo de manera que no bloquegi l'activació de l'alarma."},auto_bypass:{heading:"Omet automàticament",description:"Excloeu aquest sensor de l'alarma si està obert mentre s'arma l'alarma.",modes:"Modes in which sensor may be bypassed"},trigger_unavailable:{heading:"Activador quan no estigui disponible",description:"Quan l'estat del sensor no estigui disponible, això activarà el sensor."}},actions:{toggle_advanced:"Configuració avançada",remove:"Elimina",setup_groups:"Setup groups"},errors:{description:"Corregiu els errors següents:",no_area:"No s'ha seleccionat cap àrea",no_modes:"No s'han seleccionat modes per als quals el sensor hauria d'estar actiu",no_auto_bypass_modes:"No modes are selected for the sensor may be automatically bypassed"}}},dialogs:{manage_groups:{title:"Manage sensor groups",description:"In a sensor group multiple sensors must be activated within a time period before the alarm is triggered.",no_items:"No groups yet",actions:{new_group:"New group"}},create_group:{title:"New sensor group",fields:{name:{heading:"Name",description:"Name for sensor group"},timeout:{heading:"Time-out",description:"Time period during which consecutive sensor activations triggers the alarm."},sensors:{heading:"Sensors",description:"Select the sensors which are contained by this group."}},errors:{invalid_name:"Invalid name provided.",insufficient_sensors:"At least 2 sensors need to be selected."}},edit_group:{title:"Edit sensor group ''{name}''"}}},codes:{title:"Codis",cards:{codes:{description:"Canvieu la configuració del codi.",fields:{code_arm_required:{heading:"Utilitzeu un codi d'activació",description:"Requereix un codi per activar l'alarma"},code_disarm_required:{heading:"Utilitzeu un codi de desactivació",description:"Requereix un codi per desactivar l'alarma"},code_format:{heading:"Format del codi",description:"Estableix el tipus de codi per a la targeta d'alarma Lovelace.",code_format_number:"codi PIN",code_format_text:"contrasenya"}}},user_management:{title:"Gestió d'usuaris",description:"Cada usuari té el seu propi codi per activar/desactivar l'alarma.",no_items:"Encara no hi ha usuaris",actions:{new_user:"usuari nou"}},new_user:{title:"Crea un usuari nou",description:"Es poden crear usuaris per proporcionar accés al funcionament de l'alarma.",fields:{name:{heading:"Nom",description:"Nom de l'usuari."},code:{heading:"Codi",description:"Codi d'aquest usuari."},confirm_code:{heading:"Confirmeu el codi",description:"Repetiu el codi."},can_arm:{heading:"Permetre que el codi active l'alarma",description:"Entering this code activates the alarm"},can_disarm:{heading:"Permetre que el codi desactive l'alarma",description:"Entering this code deactivates the alarm"},is_override_code:{heading:"És un codi de sobreescriptura",description:"Si introduïu aquest codi, es forçarà l'estat d'activació de l'alarma"},area_limit:{heading:"Restricted areas",description:"Limit user to control only the selected areas"}},errors:{no_name:"No s'ha proporcionat cap nom.",no_code:"El codi ha de tenir 4 caràcters o números com a mínim.",code_mismatch:"Els codis no coincideixen."}},edit_user:{title:"Edita l'usuari",description:"Canvia la configuració de l'usuari ''{name}''.",fields:{old_code:{heading:"Codi actual",description:"Codi actual, deixeu-lo en blanc per deixar-lo sense canvis."}}}}},actions:{title:"Accions",cards:{notifications:{title:"Notificacions",description:"Utilitzant aquest tauler, podeu gestionar les notificacions que s'envien quan es produeix un determinat esdeveniment d'alarma.",table:{no_items:"Encara no s'han creat notificacions.",no_area_warning:"Action is not assigned to any area."},actions:{new_notification:"nova notificació"}},actions:{description:"Aquest tauler es pot utilitzar per canviar un dispositiu quan l'estat d'alarma canvia.",table:{no_items:"Encara no s'han creat accions."},actions:{new_action:"nova acció"}},new_notification:{title:"Crea una notificació",description:"Crea una nova notificació.",trigger:"Condition",action:"Task",options:"Options",fields:{event:{heading:"Esdeveniment",description:"Quan s'ha d'enviar la notificació",choose:{armed:{name:"L'alarma està activada",description:"L'alarma s'ha activat correctament"},disarmed:{name:"L'alarma està desactivada",description:"L'alarma està desactivada"},triggered:{name:"L'alarma s'activat per esdeveniment",description:"L'alarma s'activat per esdeveniment"},untriggered:{name:"Alarm not longer triggered",description:"The triggered state of the alarm has ended"},arm_failure:{name:"No s'ha pogut activar l'alarma",description:"L'activació de l'alarma ha fallat a causa d'un o més sensors estan oberts"},arming:{name:"S'ha iniciat el retard de sortida",description:"S'ha iniciat el retard de sortida, a punt per sortir de casa."},pending:{name:"S'ha iniciat el retard d'entrada",description:"El retard d'entrada s'ha iniciat, l'alarma s'activarà aviat."}}},mode:{heading:"Mode",description:"Limita l'acció a modes específics d'activació (opcional)"},title:{heading:"Títol",description:"Títol del missatge de notificació"},message:{heading:"Missatge",description:"Contingut del missatge de notificació",insert_wildcard:"Insert wildcard",placeholders:{armed:"The alarm is set to {{arm_mode}}",disarmed:"The alarm is now OFF",triggered:"The alarm is triggered! Cause: {{open_sensors}}.",untriggered:"The alarm is not longer triggered.",arm_failure:"The alarm could not be armed right now, due to: {{open_sensors}}.",arming:"The alarm will be armed soon, please leave the house.",pending:"The alarm is about to trigger, disarm it quickly!"}},open_sensors_format:{heading:"Format for open_sensors wildcard",description:"Choose which sensor information in inserted in the message",options:{default:"Names and states",short:"Names only"}},arm_mode_format:{heading:"Translation for arm_mode wildcard",description:"Choose in which language the arm mode is inserted in the message"},target:{heading:"Destinatari",description:"Dispositiu al qual enviar el missatge"},name:{heading:"Nom",description:"Descripció d'aquesta notificació",placeholders:{armed:"Notify {target} upon arming",disarmed:"Notify {target} upon disarming",triggered:"Notify {target} when triggered",untriggered:"Notify {target} when triggering stops",arm_failure:"Notify {target} on failure",arming:"Notify {target} when leaving",pending:"Notify {target} when arriving"}},delete:{heading:"Delete automation",description:"Permanently remove this automation"}},actions:{test:"Prova-ho"}},new_action:{title:"Crea una acció",description:"Aquest tauler es pot utilitzar per canviar un dispositiu quan l'estat d'alarma canvia.",fields:{event:{heading:"Esdeveniment",description:"Quan s'ha d'executar l'acció"},area:{heading:"Àrea",description:"Àrea per a la qual s'aplica l'esdeveniment, deixeu-la en blanc per seleccionar l'alarma global."},mode:{heading:"Mode",description:"Limita l'acció a modes específics d'activació (opcional)"},entity:{heading:"Entitat",description:"Entitat en què es realitzarà l'acció"},action:{heading:"Acció",description:"Acció a realitzar a l'entitat",no_common_actions:"Actions can only be assigned in YAML mode for the selected entities."},name:{heading:"Nom",description:"Descripció d'aquesta acció",placeholders:{armed:"Set {entity} to {state} upon arming",disarmed:"Set {entity} to {state} upon disarming",triggered:"Set {entity} to {state} when triggered",untriggered:"Set {entity} to {state} when triggering stops",arm_failure:"Set {entity} to {state} on failure",arming:"Set {entity} to {state} when leaving",pending:"Set {entity} to {state} when arriving"}}}}}}},st={common:tt,components:at,title:"Tauler alarma",panels:it},nt=Object.freeze({__proto__:null,common:tt,components:at,title:"Tauler alarma",panels:it,default:st}),rt={modes_short:{armed_away:"Away",armed_home:"Home",armed_night:"Night",armed_custom_bypass:"Custom",armed_vacation:"Vacation"},enabled:"Enabled",disabled:"Disabled"},ot={time_slider:{seconds:"sec",minutes:"min",infinite:"infinite",none:"none"},editor:{ui_mode:"To UI",yaml_mode:"To YAML",edit_in_yaml:"Edit in YAML"},table:{filter:{label:"Filter items",item:"Filter by {name}",hidden_items:"{number} {number, plural,\n  one {item is}\n  other {items are}\n} hidden"}}},lt={general:{title:"General",cards:{general:{description:"This panel defines some global settings for the alarm.",fields:{disarm_after_trigger:{heading:"Disarm after trigger",description:"After trigger time has expired, disarm the alarm instead of returning to armed state."},enable_mqtt:{heading:"Enable MQTT",description:"Allow the alarm panel to be controlled through MQTT."},enable_master:{heading:"Enable alarm master",description:"Creates an entity for controlling all areas simultaneously."}},actions:{setup_mqtt:"MQTT Configuration",setup_master:"Master Configuration"}},modes:{title:"Modes",description:"This panel can be used to set up the arm modes of the alarm.",modes:{armed_away:"Armed away will be used when all people left the house. All doors and windows allowing access to the house will be guarded, as well as motion sensors inside the house.",armed_home:"Armed home (also known as armed stay) will be used when setting the alarm while people are in the house. All doors and windows allowing access to the house will be guarded, but not motion sensors inside the house.",armed_night:"Armed night will be used when setting the alarm before going to sleep. All doors and windows allowing access to the house will be guarded, and selected motion sensors (downstairs) in the house.",armed_vacation:"Armed vacation can be used as an extension to the armed away mode in case of absence for longer duration. The delay times and trigger responses can be adapted (as desired) to being distant from home.",armed_custom_bypass:"An extra mode for defining your own security perimeter."},number_sensors_active:"{number} {number, plural,\n  one {sensor}\n  other {sensors}\n} active",fields:{status:{heading:"Status",description:"Controls whether the alarm can be armed in this mode."},exit_delay:{heading:"Exit delay",description:"When arming the alarm, within this time period the sensors will not trigger the alarm yet."},entry_delay:{heading:"Entry delay",description:"Delay time until the alarm is triggered after one of the sensors is activated."},trigger_time:{heading:"Trigger time",description:"Time during which the alarm will remain in the triggered state after activation."}}},mqtt:{title:"MQTT configuration",description:"This panel can be used for configuration of the MQTT interface.",fields:{state_topic:{heading:"State topic",description:"Topic on which state updates are published"},event_topic:{heading:"Event topic",description:"Topic on which alarm events are published"},command_topic:{heading:"Command topic",description:"Topic which Alarmo listens to for arm/disarm commands."},require_code:{heading:"Require code",description:"Require the code to be sent with the command."},state_payload:{heading:"Configure payload per state",item:"Define a payload for state ''{state}''"},command_payload:{heading:"Configure payload per command",item:"Define a payload for command ''{command}''"}}},areas:{title:"Areas",description:"Areas can be used for dividing your alarm system into multiple compartments.",no_items:"There are no areas defined yet.",table:{remarks:"Remarks",summary:"This area contains {summary_sensors} and {summary_automations}.",summary_sensors:"{number} {number, plural,\n  one {sensor}\n  other {sensors}\n}",summary_automations:"{number} {number, plural,\n  one {automation}\n  other {automations}\n}"},actions:{add:"Add"}}},dialogs:{create_area:{title:"New area",fields:{copy_from:"Copy settings from"}},edit_area:{title:"Editing area ''{area}''",name_warning:"Note: changing the name will change the entity ID"},remove_area:{title:"Remove area?",description:"Are you sure you want to remove this area? This area contains {sensors} sensors and {automations} automations, which will be removed as well."},edit_master:{title:"Master configuration"},disable_master:{title:"Disable master?",description:"Are you sure you want to remove the alarm master? This area contains {automations} automations, which will be removed with this action."}}},sensors:{title:"Sensors",cards:{sensors:{description:"Currently configured sensors. Click on an item to make changes.",table:{no_items:"There are no sensors to be displayed here.",no_area_warning:"Sensor is not assigned to any area.",arm_modes:"Arm Modes",always_on:"(Always)"}},add_sensors:{title:"Add Sensors",description:"Add more sensors. Make sure that your sensors have a suitable name, so you can identify them.",no_items:"There are no available HA entities that can be configured for the alarm. Make sure to include entities of the type binary_sensor.",table:{type:"Detected type"},actions:{add_to_alarm:"add to alarm",filter_supported:"Hide items with unknown type"}},editor:{title:"Edit Sensor",description:"Configuring the sensor settings of ''{entity}''.",fields:{area:{heading:"Area",description:"Select an area which contains this sensor."},group:{heading:"Group",description:"Group with other sensors for combined triggering."},device_type:{heading:"Device Type",description:"Choose a device type to automatically apply appropriate settings.",choose:{door:{name:"Door",description:"A door, gate or other entrance that is used for entering/leaving the home."},window:{name:"Window",description:"A window, or a door not used for entering the house such as balcony."},motion:{name:"Motion",description:"Presence sensor or similar device having a delay between activations."},tamper:{name:"Tamper",description:"Detector of sensor cover removal, glass break sensor, etc."},environmental:{name:"Environmental",description:"Smoke/gas sensor, leak detector, etc. (not related to burglar protection)."},other:{name:"Generic"}}},always_on:{heading:"Always on",description:"Sensor should always trigger the alarm."},modes:{heading:"Enabled modes",description:"Alarm modes in which this sensor is active."},arm_on_close:{heading:"Arm after closing",description:"After deactivation of this sensor, the remaining exit delay will automatically be skipped."},use_exit_delay:{heading:"Use exit delay",description:"Sensor is allowed to be active when the exit delay starts."},use_entry_delay:{heading:"Use entry delay",description:"Sensor activation triggers the alarm after the entry delay rather than directly."},allow_open:{heading:"Allow open after arming",description:"If the sensor is still active after the exit delay, this will not cause arming to fail."},auto_bypass:{heading:"Bypass automatically",description:"Exclude this sensor from the alarm if it is open while arming.",modes:"Modes in which sensor may be bypassed"},trigger_unavailable:{heading:"Trigger when unavailable",description:"When the sensor state becomes 'unavailable', this will activate the sensor."}},actions:{toggle_advanced:"Advanced settings",remove:"Remove",setup_groups:"Setup groups"},errors:{description:"Please correct the following errors:",no_area:"No area is selected",no_modes:"No modes are selected for which the sensor should be active",no_auto_bypass_modes:"No modes are selected for the sensor may be automatically bypassed"}}},dialogs:{manage_groups:{title:"Manage sensor groups",description:"In a sensor group multiple sensors must be activated within a time period before the alarm is triggered.",no_items:"No groups yet",actions:{new_group:"New group"}},create_group:{title:"New sensor group",fields:{name:{heading:"Name",description:"Name for sensor group"},timeout:{heading:"Time-out",description:"Time period during which consecutive sensor activations triggers the alarm."},sensors:{heading:"Sensors",description:"Select the sensors which are contained by this group."}},errors:{invalid_name:"Invalid name provided.",insufficient_sensors:"At least 2 sensors need to be selected."}},edit_group:{title:"Edit sensor group ''{name}''"}}},codes:{title:"Codes",cards:{codes:{description:"Change settings for the code.",fields:{code_arm_required:{heading:"Use arm code",description:"Require a code for arming the alarm"},code_disarm_required:{heading:"Use disarm code",description:"Require a code for disarming the alarm"},code_format:{heading:"Code format",description:"Sets the input type for Lovelace alarm card.",code_format_number:"pincode",code_format_text:"password"}}},user_management:{title:"User management",description:"Each user has its own code to arm/disarm the alarm.",no_items:"There are no users yet",actions:{new_user:"new user"}},new_user:{title:"Create new user",description:"Users can be created for providing access to operating the alarm.",fields:{name:{heading:"Name",description:"Name of the user."},code:{heading:"Code",description:"Code for this user."},confirm_code:{heading:"Confirm code",description:"Repeat the code."},can_arm:{heading:"Allow code for arming",description:"Entering this code activates the alarm"},can_disarm:{heading:"Allow code for disarming",description:"Entering this code deactivates the alarm"},is_override_code:{heading:"Is override code",description:"Entering this code will arm the alarm in force"},area_limit:{heading:"Restricted areas",description:"Limit user to control only the selected areas"}},errors:{no_name:"No name provided.",no_code:"Code should have 4 characters/numbers minimum.",code_mismatch:"The codes don't match."}},edit_user:{title:"Edit User",description:"Change configuration for user ''{name}''.",fields:{old_code:{heading:"Current code",description:"Current code, leave empty to leave unchanged."}}}}},actions:{title:"Actions",cards:{notifications:{title:"Notifications",description:"Using this panel, you can manage notifications to be sent when a certain alarm event occurs.",table:{no_items:"There are no notifications created yet.",no_area_warning:"Action is not assigned to any area."},actions:{new_notification:"new notification"}},actions:{description:"This panel can be used to switch a device when the alarm state changes.",table:{no_items:"There are no actions created yet."},actions:{new_action:"new action"}},new_notification:{title:"Configure notification",description:"Receive a notification when arming/disarming the alarm, on activation, etc.",trigger:"Condition",action:"Task",options:"Options",fields:{event:{heading:"Event",description:"When should the notification be sent",choose:{armed:{name:"Alarm is armed",description:"The alarm is succesfully armed"},disarmed:{name:"Alarm is disarmed",description:"The alarm is disarmed"},triggered:{name:"Alarm is triggered",description:"The alarm is triggered"},untriggered:{name:"Alarm not longer triggered",description:"The triggered state of the alarm has ended"},arm_failure:{name:"Failed to arm",description:"The arming of the alarm failed due to one or more open sensors"},arming:{name:"Exit delay started",description:"Exit delay started, ready to leave the house."},pending:{name:"Entry delay started",description:"Entry delay started, the alarm will trigger soon."}}},mode:{heading:"Mode",description:"Limit the action to specific arm modes (optional)"},title:{heading:"Title",description:"Title for the notification message"},message:{heading:"Message",description:"Content of the notification message",insert_wildcard:"Insert wildcard",placeholders:{armed:"The alarm is set to {{arm_mode}}",disarmed:"The alarm is now OFF",triggered:"The alarm is triggered! Cause: {{open_sensors}}.",untriggered:"The alarm is not longer triggered.",arm_failure:"The alarm could not be armed right now, due to: {{open_sensors}}.",arming:"The alarm will be armed soon, please leave the house.",pending:"The alarm is about to trigger, disarm it quickly!"}},open_sensors_format:{heading:"Format for open_sensors wildcard",description:"Choose which sensor information in inserted in the message",options:{default:"Names and states",short:"Names only"}},arm_mode_format:{heading:"Translation for arm_mode wildcard",description:"Choose in which language the arm mode is inserted in the message"},target:{heading:"Target",description:"Device to send the notification to"},name:{heading:"Name",description:"Description for this notification",placeholders:{armed:"Notify {target} upon arming",disarmed:"Notify {target} upon disarming",triggered:"Notify {target} when triggered",untriggered:"Notify {target} when triggering stops",arm_failure:"Notify {target} on failure",arming:"Notify {target} when leaving",pending:"Notify {target} when arriving"}},delete:{heading:"Delete automation",description:"Permanently remove this automation"}},actions:{test:"Try it"}},new_action:{title:"Configure action",description:"Switch lights or devices (such as sirens) when arming/disarming the alarm, on activation, etc.",fields:{event:{heading:"Event",description:"When should the action be executed"},area:{heading:"Area",description:"Area for which the event applies, leave empty to select the global alarm."},mode:{heading:"Mode",description:"Limit the action to specific arm modes (optional)"},entity:{heading:"Entity",description:"Entity to perform action on"},action:{heading:"Action",description:"Action to perform on the entity",no_common_actions:"Actions can only be assigned in YAML mode for the selected entities."},name:{heading:"Name",description:"Description for this action",placeholders:{armed:"Set {entity} to {state} upon arming",disarmed:"Set {entity} to {state} upon disarming",triggered:"Set {entity} to {state} when triggered",untriggered:"Set {entity} to {state} when triggering stops",arm_failure:"Set {entity} to {state} on failure",arming:"Set {entity} to {state} when leaving",pending:"Set {entity} to {state} when arriving"}}}}}}},dt={common:rt,components:ot,title:"Alarm panel",panels:lt},ct=Object.freeze({__proto__:null,common:rt,components:ot,title:"Alarm panel",panels:lt,default:dt}),ht={modes_short:{armed_away:"Ausente",armed_home:"En casa",armed_night:"Nocturno",armed_custom_bypass:"Personalizado",armed_vacation:"Vacaciones"},enabled:"Habilitar",disabled:"Deshabilitar"},ut={time_slider:{seconds:"seg",minutes:"min",infinite:"infinito",none:"ninguno"},editor:{ui_mode:"Editar en la UI",yaml_mode:"Editar en YAML",edit_in_yaml:"Editar en YAML"},table:{filter:{label:"Filtrar entidades",item:"Filtrar por {name}",hidden_items:"{number} {number, plural,\n  one {entidas está}\n  other {entidades están}\n} oculta"}}},mt={general:{title:"General",cards:{general:{description:"Este panel define algunos ajustes globales para la alarma.",fields:{disarm_after_trigger:{heading:"Desarmar después de disparar",description:"Una vez transcurrido el tiempo de activación, desactivar la alarma en lugar de volver al estado de armada."},enable_mqtt:{heading:"Habilitar MQTT",description:"Permitir que el panel de alarma se controle a través de MQTT."},enable_master:{heading:"Habilitar alarma maestra",description:"Crea una entidad para controlar todas las áreas simultáneamente."}},actions:{setup_mqtt:"Configuración MQTT",setup_master:"Configuración maestra"}},modes:{title:"Modos",description:"Este panel se puede utilizar para configurar los modos de armado de la alarma.",modes:{armed_away:"Armado ausente se utilizará cuando todas las personas salgan de la casa. Todas las puertas y ventanas que permitan el acceso a la casa estarán vigiladas, así como los sensores de movimiento dentro de la casa.",armed_home:"Armado en casa (también conocido como estancia armada) se utilizará cuando se active la alarma mientras haya personas en la casa. Todas las puertas y ventanas que permitan el acceso a la casa estarán protegidas, pero no los sensores de movimiento dentro de la casa.",armed_night:"Armado nocturno se usará al configurar la alarma antes de irse a dormir. Todas las puertas y ventanas que permitan el acceso a la casa estarán resguardadas y se seleccionarán sensores de movimiento en la casa.",armed_vacation:"Armado en vacaciones se puede usar como una extensión del modo armado ausente en caso de ausencia de mayor duración. Los tiempos de retardo y las respuestas de activación se pueden adaptar (como se desee) a estar lejos de casa.",armed_custom_bypass:"Un modo adicional para definir su propio perímetro de seguridad."},number_sensors_active:"{number} {number, plural,\n  one {sensor}\n  other {sensores}\n} activo",fields:{status:{heading:"Estado",description:"Controla si la alarma se puede armar en este modo."},exit_delay:{heading:"Retardo de salida",description:"Al armar la alarma, dentro de este período de tiempo, los sensores aún no dispararán la alarma."},entry_delay:{heading:"Retardo de entrada",description:"Tiempo de retardo hasta que se activa la alarma después de que se active alguno de los sensores."},trigger_time:{heading:"Tiempo de activación",description:"Tiempo durante el cual sonará la sirena."}}},mqtt:{title:"Configuración MQTT",description:"Este panel se puede utilizar para configurar la interfaz MQTT.",fields:{state_topic:{heading:"Tema del estado",description:"Tema sobre el que se publican las actualizaciones de estado."},event_topic:{heading:"Tema del evento",description:"Tema sobre el que se publican los eventos de alarma."},command_topic:{heading:"Tema del comando",description:"Tema sobre el que se envían los comandos de armado / desarmado."},require_code:{heading:"Requerir código",description:"Requiere que el código se envíe con el comando."},state_payload:{heading:"Configurar la carga útil por estado",item:"Defina una carga útil para el estado ''{state}''"},command_payload:{heading:"Configurar la carga útil por comando",item:"Defina una carga útil para el comando ''{command}''"}}},areas:{title:"Áreas",description:"Las áreas se pueden utilizar para dividir su sistema de alarma en varios compartimentos.",no_items:"Aún no hay áreas definidas.",table:{remarks:"Comentarios",summary:"Esta área contiene {summary_sensors} y {summary_automations}.",summary_sensors:"{number} {number, plural,\n  one {sensor}\n  other {sensores}\n}",summary_automations:"{number} {number, plural,\n  one {automatizacion}\n  other {automatizaciones}\n}"},actions:{add:"Agregar"}}},dialogs:{create_area:{title:"Nueva área",fields:{copy_from:"Copiar la configuración de"}},edit_area:{title:"Editando área ''{area}''",name_warning:"Nota: cambiar el nombre cambiará el ID de la entidad."},remove_area:{title:"¿Eliminar área?",description:"¿Está seguro de que desea eliminar esta área? Esta área contiene {sensors} sensores y {automations} automatizaciones que también se eliminarán."},edit_master:{title:"Configuración maestra"},disable_master:{title:"¿Deshabilitar maestro?",description:"¿Está seguro de que desea eliminar la alarma maestra? Esta área contiene {sensors} sensores y {automations} automatizaciones que también se eliminarán."}}},sensors:{title:"Sensores",cards:{sensors:{description:"Sensores configurados actualmente. Haga clic en una entidad para realizar cambios.",table:{no_items:"No hay sensores para mostrar aquí.",no_area_warning:"El sensor no está asignado a ningún área.",arm_modes:"Modos de armado",always_on:"(Siempre)"}},add_sensors:{title:"Agregar sensores",description:"Agrega más sensores. Asegúrate de que tus sensores tengan un nombre amigable, para que puedas identificarlos.",no_items:"No hay entidades HA disponibles que se puedan configurar para la alarma. Asegúrese de incluir entidades del tipo sensor binario.",table:{type:"Tipo detectado"},actions:{add_to_alarm:"agregar a la alarma",filter_supported:"Ocultar elementos con tipo desconocido"}},editor:{title:"Editar sensor",description:"Configurando los ajustes del sensor de ''{entity}''.",fields:{area:{heading:"Área",description:"Seleccione un área que contenga este sensor."},group:{heading:"Grupo",description:"Agrupar con otros sensores para un disparado combinado."},device_type:{heading:"Tipo de dispositivo",description:"Elija un tipo de dispositivo para aplicar automáticamente la configuración adecuada.",choose:{door:{name:"Puerta",description:"Una puerta, portón u otra entrada que se utilice para entrar / salir de la casa."},window:{name:"Ventana",description:"Una ventana o una puerta que no se use para entrar a la casa, como un balcón."},motion:{name:"Movimiento",description:"Sensor de presencia o dispositivo similar que tiene un retardo entre activaciones."},tamper:{name:"Sabotaje",description:"Detector de extracción de la cubierta del sensor, sensor de rotura de vidrio, etc."},environmental:{name:"Medioambiental",description:"Sensor de humo / gas, detector de fugas, etc. (no relacionado con la protección antirrobo)."},other:{name:"Genérico"}}},always_on:{heading:"Siempre encendido",description:"El sensor siempre debe activar la alarma."},modes:{heading:"Modos habilitados",description:"Modos de alarma en los que este sensor está activo."},arm_on_close:{heading:"Armar después de cerrar",description:"Después de la desactivación de este sensor, se saltará automáticamente el retardo de salida restante."},use_exit_delay:{heading:"Usar retardo de salida",description:"Se permite que el sensor esté activo cuando comienza el retardo de salida."},use_entry_delay:{heading:"Usar retardo de entrada",description:"La activación del sensor activa la alarma después del retardo de entrada en lugar de directamente."},allow_open:{heading:"Permitir abrir mientras se arma",description:"Si el sensor aún está activo después del retardo de salida, esto no hará que falle el armado."},auto_bypass:{heading:"Omitir automáticamente",description:"Excluya este sensor de la alarma si está abierto mientras se arma.",modes:"Modos en los que se puede omitir el sensor"},trigger_unavailable:{heading:"Activar cuando no esté disponible",description:"Cuando el estado del sensor se vuelve 'no disponible', esto activará el sensor."}},actions:{toggle_advanced:"Configuración avanzada",remove:"Eliminar",setup_groups:"Configurar grupos"},errors:{description:"Por favor, corrija los siguientes errores:",no_area:"No se ha seleccionado ninguna área",no_modes:"No se han seleccionados modos para los que el sensor deba estar activo",no_auto_bypass_modes:"No se han seleccionados modos para los que el sensor pueda ser omitido"}}},dialogs:{manage_groups:{title:"Administrar grupos de sensores",description:"En un grupo de sensores, se deben activar varios sensores dentro de un período de tiempo antes de que se dispare la alarma.",no_items:"Todavía no hay grupos",actions:{new_group:"Nuevo grupo"}},create_group:{title:"Nuevo grupo de sensores",fields:{name:{heading:"Nombre",description:"Nombre del grupo de sensores"},timeout:{heading:"Tiempo muerto",description:"Período de tiempo durante el cual las activaciones consecutivas del sensor activan la alarma."},sensors:{heading:"Sensores",description:"Seleccione los sensores que están contenidos en este grupo."}},errors:{invalid_name:"Nombre proporcionado no válido.",insufficient_sensors:"Se deben seleccionar al menos 2 sensores."}},edit_group:{title:"Editar grupo de sensores '{name}'"}}},codes:{title:"Códigos",cards:{codes:{description:"Cambiar la configuración del código.",fields:{code_arm_required:{heading:"Usar código de armado",description:"Requiere un código para armar la alarma."},code_disarm_required:{heading:"Usar código de desarmado",description:"Requiere un código para desarmar la alarma."},code_format:{heading:"Formato del código",description:"Establece el tipo de entrada para la tarjeta de la alarma.",code_format_number:"código PIN",code_format_text:"contraseña"}}},user_management:{title:"Gestión de usuarios",description:"Cada usuario tiene su propio código para armar / desarmar la alarma.",no_items:"Aún no hay usuarios",actions:{new_user:"nuevo usuario"}},new_user:{title:"Crear nuevo usuario",description:"Se pueden crear usuarios para proporcionar acceso a la operación de la alarma.",fields:{name:{heading:"Nombre",description:"Nombre del usuario."},code:{heading:"Código",description:"Código para este usuario."},confirm_code:{heading:"Confirmar código",description:"Repite el código."},can_arm:{heading:"Permitir código para armar",description:"Al ingresar este código se activa la alarma."},can_disarm:{heading:"Permitir código para desarmar",description:"Al ingresar este código se desactiva la alarma."},is_override_code:{heading:"Es un código de anulación",description:"Al ingresar este código se forzará el armado de la alarma."},area_limit:{heading:"Áreas restringidas",description:"Limitar al usuario a controlar solo las áreas seleccionadas"}},errors:{no_name:"No se proporcionó ningún nombre.",no_code:"El código debe tener 4 caracteres / números como mínimo.",code_mismatch:"Los códigos no coinciden."}},edit_user:{title:"Editar usuario",description:"Cambiar la configuración del usuario ''{name}''.",fields:{old_code:{heading:"Código actual",description:"Código actual, déjelo en blanco para no modificarlo."}}}}},actions:{title:"Acciones",cards:{notifications:{title:"Notificaciones",description:"Usando este panel, puede administrar las notificaciones que se enviarán durante un evento de alarma determinado.",table:{no_items:"Aún no se han creado notificaciones.",no_area_warning:"La acción no está asignada a ningún área."},actions:{new_notification:"nueva notificación"}},actions:{description:"Este panel se puede utilizar para cambiar un dispositivo cuando cambia el estado de alarma.",table:{no_items:"Aún no se han creado acciones."},actions:{new_action:"nueva acción"}},new_notification:{title:"Crear notificación",description:"Crear una nueva notificación.",trigger:"Condición",action:"Tarea",options:"Opciones",fields:{event:{heading:"Evento",description:"Cuándo debe enviarse la notificación.",choose:{armed:{name:"La alarma está armada",description:"La alarma está correctamente armada."},disarmed:{name:"La alarma está desarmada",description:"La alarma está desarmada."},triggered:{name:"Se ha disparado la alarma",description:"La alarma se ha disparado."},untriggered:{name:"Alarm not longer triggered",description:"The triggered state of the alarm has ended"},arm_failure:{name:"No se pudo armar",description:"El armado de la alarma falló debido a uno o más sensores abiertos."},arming:{name:"Se ha iniciado el retardo de salida",description:"Se ha iniciado el retardo de salida, listo para salir de la casa."},pending:{name:"Se ha iniciado el retardo de entrada",description:"Se ha iniciado el retardo de entrada, la alarma se disparará pronto."}}},mode:{heading:"Modo",description:"Limita la acción a modos de armado específicos (opcional)."},title:{heading:"Título",description:"Título del mensaje de notificación."},message:{heading:"Mensaje",description:"Contenido del mensaje de notificación.",insert_wildcard:"Insertar comodín",placeholders:{armed:"La alarma está configurada en {{arm_mode}}",disarmed:"Ahora la alarma está APAGADA",triggered:"¡Se ha disparado la alarma! Causa: {{open_sensors}}.",untriggered:"The alarm is not longer triggered.",arm_failure:"No se pudo armar la alarma en este momento debido a: {{open_sensors}}.",arming:"Se armará pronto la alarma, por favor, salga de la casa.",pending:"¡La alarma está a punto de dispararse, desarme rápidamente!"}},open_sensors_format:{heading:"Formato para el comodín open_sensors",description:"Elija qué información del sensor se inserta en el mensaje",options:{default:"Nombres y estados",short:"Solo nombres"}},arm_mode_format:{heading:"Traducción del comodín arm_mode",description:"Elija en qué idioma se inserta el modo de armado en el mensaje"},target:{heading:"Objetivo",description:"Dispositivo al que enviar el mensaje push."},name:{heading:"Nombre",description:"Descripción de esta notificación.",placeholders:{armed:"Notificar a {target} al armar",disarmed:"Notificar a {target} al desarmar",triggered:"Notificar a {target} cuando se dispare",untriggered:"Notify {target} when triggering stops",arm_failure:"Notificar a {target} si falla",arming:"Notificar a {target} cuando se vaya",pending:"Notificar a {target} cuando llegue"}},delete:{heading:"Eliminar automatización",description:"Eliminar esta automatización de forma permanente"}},actions:{test:"Pruébelo"}},new_action:{title:"Crear acción",description:"Este panel se puede utilizar para cambiar un dispositivo cuando cambia el estado de la alarma.",fields:{event:{heading:"Evento",description:"¿Cuándo debe ejecutarse la acción?"},area:{heading:"Área",description:"Área para la que se aplica el evento, déjelo en blanco para seleccionar la alarma global."},mode:{heading:"Modo",description:"Limita la acción a modos de armado específicos (opcional)"},entity:{heading:"Entidad",description:"Entidad sobre la que realizar la acción."},action:{heading:"Acción",description:"Acción a realizar en la entidad.",no_common_actions:"Las acciones solo se pueden asignar en modo YAML para las entidades seleccionadas."},name:{heading:"Nombre",description:"Descripción de esta acción.",placeholders:{armed:"Establecer {entity} en {state} al armar",disarmed:"Establecer {entity} en {state} al desarmar",triggered:"Establecer {entity} en {state} cuando se dispare",untriggered:"Set {entity} to {state} when triggering stops",arm_failure:"Establecer {entity} en {state} si falla",arming:"Establecer {entity} en {state} cuando se vaya",pending:"Establecer {entity} en {state} cuando llegue"}}}}}}},pt={common:ht,components:ut,title:"Panel de alarma",panels:mt},gt=Object.freeze({__proto__:null,common:ht,components:ut,title:"Panel de alarma",panels:mt,default:pt}),vt={modes_short:{armed_away:"Eemal",armed_home:"Kodus",armed_night:"Ööseks",armed_custom_bypass:"Valikuline",armed_vacation:"Vacation"},enabled:"Lubatud",disabled:"Keelatud"},ft={time_slider:{seconds:"sek",minutes:"min",infinite:"piiranguta",none:"puudub"},editor:{ui_mode:"Kasutajaliides",yaml_mode:"Koodiredaktor",edit_in_yaml:"Edit in YAML"},table:{filter:{label:"Filter items",item:"Filter by {name}",hidden_items:"{number} {number, plural,\n  one {item is}\n  other {items are}\n} hidden"}}},_t={general:{title:"Üldsätted",cards:{general:{description:"Need seaded kehtivad kõikides valve olekutes.",fields:{disarm_after_trigger:{heading:"Häire summutamine",description:"Peale häire lõppu võta valvest maha miite ära valvesta uuesti."},enable_mqtt:{heading:"Luba MQTT juhtimine",description:"Luba nupustiku juhtimist MQTT abil."},enable_master:{heading:"Luba põhivalvestus",description:"Loob olemi mis haldab kõiki valvestamise alasid korraga."}},actions:{setup_mqtt:"MQTT seadistamine",setup_master:"Põhivalvestuse sätted"}},modes:{title:"Režiimid",description:"Selles vaates seadistatakse valvestamise režiime.",modes:{armed_away:"Täielik valvestamine kui kedagi pole kodus. Kasutusel on kõik andurid.",armed_home:"Valvestatud kodus ei kasuta liikumisandureid kuid väisuksed ja aknad on valve all.",armed_night:"Valvestatud ööseks ei kasuta määratud liikumisandureid, välisperimeeter on valve all.",armed_vacation:"Armed vacation can be used as an extension to the armed away mode in case of absence for longer duration. The delay times and trigger responses can be adapted (as desired) to being distant from home.",armed_custom_bypass:"Valikulise valvestuse puhul saab määrata kasutatavad andurid."},number_sensors_active:"{number} {number, plural,\n  one {andur}\n  other {andurit}\n} aktiiv",fields:{status:{heading:"Status",description:"Controls whether the alarm can be armed in this mode."},exit_delay:{heading:"Ooteaeg valvestamisel",description:"Viivitus enne valvestamise rakendumist."},entry_delay:{heading:"Sisenemise viivitus",description:"Viivitus sisenemisel enne häire rakendumist."},trigger_time:{heading:"Häire kestus",description:"Sireeni jne. aktiveerimise kestus."}}},mqtt:{title:"MQTT sätted",description:"MQTT parameetrite seadistamine.",fields:{state_topic:{heading:"Oleku teema (topic)",description:"Teema milles avaldatakse oleku muutused."},event_topic:{heading:"Event topic",description:"Topic on which alarm events are published"},command_topic:{heading:"Käskude teema (topic)",description:"Teema milles avaldatakse valvestamise käsud."},require_code:{heading:"Nõua PIN koodi",description:"Käskude edastamiseks on vajalik PIN kood."},state_payload:{heading:"Määra olekute toimeandmed",item:"Määra oleku ''{state}'' toimeandmed"},command_payload:{heading:"Määra käskude toimeandmed",item:"Määra käsu ''{command}'' toimeandmed"}}},areas:{title:"Alad",description:"Alasid kasutatakse elamise jagamiseks valvetsoonideks.",no_items:"Valvestamise alad on loomata.",table:{remarks:"Ala teave",summary:"See ala sisaldab {summary_sensors} ja {summary_automations}.",summary_sensors:"{number} {number, plural,\n  one {andur}\n  other {andurit}\n}",summary_automations:"{number} {number, plural,\n  one {automatiseering}\n  other {automatiseeringut}\n}"},actions:{add:"Lisa"}}},dialogs:{create_area:{title:"Uus ala",fields:{copy_from:"Kopeeri sätted allikast:"}},edit_area:{title:"Ala ''{area}'' muutmine",name_warning:"NB! Nime muutmisel muutub ka olemi ID"},remove_area:{title:"Kas kustutada ala?",description:"Kas kustutada see ala? Ala kaasab andurid {sensors} ja automatiseeringud {automations} mis samuti eemaldatakse."},edit_master:{title:"Põhiala seaded"},disable_master:{title:"Kas keelata põhiala?",description:"Kas keelata põhiala? Ala kaasab andurid {sensors} ja automatiseeringud {automations} mis samuti eemaldatakse.."}}},sensors:{title:"Andurid",cards:{sensors:{description:"Kasutusel olevad andurid. Klõpsa olemil, et seadistada.",table:{no_items:"Andureid pole lisatud. Alustuseks lisa mõni andur.",no_area_warning:"Sensor is not assigned to any area.",arm_modes:"Valvestamise olek",always_on:"(alati)"}},add_sensors:{title:"Andurite lisamine",description:"Lisa veel andureid. Mõistlik on panna neile arusaadav nimi (friendly_name).",no_items:"Puuduvad valvestamiseks sobivad Home Assistanti olemid. Lisatavad olemid peavad olema olekuandurid (binary_sensor).",table:{type:"Detected type"},actions:{add_to_alarm:"Lisa valvesüsteemile",filter_supported:"Hide items with unknown type"}},editor:{title:"Andurite sätted",description:"Muuda olemi ''{entity}'' sätteid.",fields:{area:{heading:"Ala",description:"Vali ala kus see andur asub."},group:{heading:"Group",description:"Group with other sensors for combined triggering."},device_type:{heading:"Seadme tüüp",description:"Vali anduri tüüp, et automaatselt rakendada sobivad sätted.",choose:{door:{name:"Uks",description:"Uks, värav või muu piire mida kasutatakse sisenemiseks või väljumiseks."},window:{name:"Aken",description:"Aken või uks mida ei kasutata sisenemiseks nagu rõduuks."},motion:{name:"Liikumisandur",description:"Kohaloleku andurid mille rakendumiste vahel on viide."},tamper:{name:"Terviklikkus",description:"Anduri muukimine või klaasipurustusandur jms."},environmental:{name:"Ohu andurid",description:"Suitsu või gaasilekke andur, veeleke jne. (ei ole seotud sissetungimisega)."},other:{name:"Tavaandur"}}},always_on:{heading:"Alati kasutusel",description:"Andur käivitab häire igas valve olekus."},modes:{heading:"Valve olekute valik",description:"Valve olekud kus seda andurit kasutatakse."},arm_on_close:{heading:"Valvesta sulgemisel",description:"Selle anduri rakendumisel valvestatakse kohe ilma viiveta."},use_exit_delay:{heading:"Use exit delay",description:"Sensor is allowed to be active when the exit delay starts."},use_entry_delay:{heading:"Use entry delay",description:"Sensor activation triggers the alarm after the entry delay rather than directly."},allow_open:{heading:"Lahkumisviivitus",description:"See andur ei aktiveeru enne lahkumisviivituse lõppu."},auto_bypass:{heading:"Bypass automatically",description:"Exclude this sensor from the alarm if it is open while arming.",modes:"Modes in which sensor may be bypassed"},trigger_unavailable:{heading:"Andurite saadavus",description:"Käivita häire kui andur muutub kättesaamatuks."}},actions:{toggle_advanced:"Täpsemad sätted",remove:"Eemalda",setup_groups:"Setup groups"},errors:{description:"Palun paranda jägmised vead:",no_area:"Ala pole määratud",no_modes:"Anduri tüüp on määramata, ei tea kuida kasutada",no_auto_bypass_modes:"No modes are selected for the sensor may be automatically bypassed"}}},dialogs:{manage_groups:{title:"Manage sensor groups",description:"In a sensor group multiple sensors must be activated within a time period before the alarm is triggered.",no_items:"No groups yet",actions:{new_group:"New group"}},create_group:{title:"New sensor group",fields:{name:{heading:"Name",description:"Name for sensor group"},timeout:{heading:"Time-out",description:"Time period during which consecutive sensor activations triggers the alarm."},sensors:{heading:"Sensors",description:"Select the sensors which are contained by this group."}},errors:{invalid_name:"Invalid name provided.",insufficient_sensors:"At least 2 sensors need to be selected."}},edit_group:{title:"Edit sensor group ''{name}''"}}},codes:{title:"Koodid",cards:{codes:{description:"Valvestuskoodide muutmine.",fields:{code_arm_required:{heading:"Valvestamine koodiga",description:"Valvestamiseks tuleb sisestada kood"},code_disarm_required:{heading:"Valvest vabastamise kood",description:"Valvest vabastamiseks tulem sisestada kood"},code_format:{heading:"Koodi vorming",description:"Kasutajaliidese koodi tüübid.",code_format_number:"PIN kood",code_format_text:"Salasõna"}}},user_management:{title:"Kasutajate haldus",description:"Igal kasutajal on oma juhtkood.",no_items:"Kasutajaid pole määratud",actions:{new_user:"Uus kasutaja"}},new_user:{title:"Lisa uus kasutaja",description:"Valvesüsteemi kasutaja lisamine.",fields:{name:{heading:"Nimi",description:"Kasutaja nimi."},code:{heading:"Valvestuskood",description:"Selle kasutaja kood."},confirm_code:{heading:"Koodi kinnitamine",description:"Sisesta sama kood uuesti."},can_arm:{heading:"Tohib valvestada",description:"Koodi sisestamine valvestab."},can_disarm:{heading:"Tohib valvest maha võtta",description:"Koodi sisestamine võtab valvest maha."},is_override_code:{heading:"Alistuskood",description:"Koodi sisestamine käivitab kohese häire"},area_limit:{heading:"Restricted areas",description:"Limit user to control only the selected areas"}},errors:{no_name:"Nimi puudub.",no_code:"Kood peab olema vhemalt 4 tärki.",code_mismatch:"Sisestatud koodid ei klapi."}},edit_user:{title:"Muuda kasutaja sätteid",description:"Muuda kasutaja ''{name}'' sätteid.",fields:{old_code:{heading:"Kehtiv kood",description:"Kehtiv kood, jäta tühjaks kui ei taha muuta."}}}}},actions:{title:"Toimingud",cards:{notifications:{title:"Teavitused",description:"Halda saadetavaid teavitusi",table:{no_items:"Teavitusi pole veel loodud.",no_area_warning:"Action is not assigned to any area."},actions:{new_notification:"Uus teavitus"}},actions:{description:"Arenduses, mõeldud seadmete lülitamiseks.",table:{no_items:"Toiminguid pole veel määratud."},actions:{new_action:"Uus toiming"}},new_notification:{title:"Loo teavitus",description:"Uue teavituse loomine.",trigger:"Condition",action:"Task",options:"Options",fields:{event:{heading:"Sündmus",description:"Mille puhul teavitada",choose:{armed:{name:"Valvestatud",description:"Valvestamine oli edukas"},disarmed:{name:"Valvest maas",description:"Valve mahavõtmine õnnestus"},triggered:{name:"Häire",description:"Valvesüsteem andis häire"},untriggered:{name:"Alarm not longer triggered",description:"The triggered state of the alarm has ended"},arm_failure:{name:"Valvestamine nurjus",description:"Valvestamine ei õnnestunud mõne anduri oleku või vea tõttu"},arming:{name:"Valvestamise eelne viivitus algas",description:"Algas valvestamise eelviide, majast võib lahkuda."},pending:{name:"Sisenemise viide rakendus",description:"Märgati sisenemist, häire rakendub peale viidet."}}},mode:{heading:"Olek",description:"Millises valve olekus teavitada (valikuline)"},title:{heading:"Päis",description:"Teavitussõnumi päis"},message:{heading:"Sisu",description:"Teavitussõnumi tekst",insert_wildcard:"Insert wildcard",placeholders:{armed:"The alarm is set to {{arm_mode}}",disarmed:"The alarm is now OFF",triggered:"The alarm is triggered!
Download .txt
gitextract_4o_zm6x8/

├── .vscode/
│   └── settings.json
├── README.md
├── automations.yaml
├── cloud_config.yaml
├── configuration.yaml
├── custom_components/
│   ├── alarmo/
│   │   ├── __init__.py
│   │   ├── alarm_control_panel.py
│   │   ├── automations.py
│   │   ├── card.py
│   │   ├── config_flow.py
│   │   ├── const.py
│   │   ├── event.py
│   │   ├── frontend/
│   │   │   └── dist/
│   │   │       └── alarm-panel.js
│   │   ├── helpers.py
│   │   ├── manifest.json
│   │   ├── mqtt.py
│   │   ├── panel.py
│   │   ├── sensors.py
│   │   ├── services.yaml
│   │   ├── store.py
│   │   └── websockets.py
│   └── hacs/
│       ├── __init__.py
│       ├── base.py
│       ├── config_flow.py
│       ├── const.py
│       ├── diagnostics.py
│       ├── entity.py
│       ├── enums.py
│       ├── exceptions.py
│       ├── frontend.py
│       ├── hacs_frontend/
│       │   ├── __init__.py
│       │   ├── c.004a7b01.js
│       │   ├── c.01f18260.js
│       │   ├── c.063631e8.js
│       │   ├── c.0681dd5f.js
│       │   ├── c.07e1d870.js
│       │   ├── c.18158037.js
│       │   ├── c.21c042d4.js
│       │   ├── c.2442b973.js
│       │   ├── c.24bd2446.js
│       │   ├── c.262db200.js
│       │   ├── c.2a7cd87a.js
│       │   ├── c.2aa297ae.js
│       │   ├── c.3507790e.js
│       │   ├── c.38b86040.js
│       │   ├── c.46ab4f2a.js
│       │   ├── c.487362b0.js
│       │   ├── c.4a97632a.js
│       │   ├── c.4d3573a6.js
│       │   ├── c.50bfd408.js
│       │   ├── c.55084342.js
│       │   ├── c.5d9598b2.js
│       │   ├── c.5ec2d281.js
│       │   ├── c.656daa82.js
│       │   ├── c.6711bf6c.js
│       │   ├── c.6764b15a.js
│       │   ├── c.67735e63.js
│       │   ├── c.743a15a1.js
│       │   ├── c.80122d23.js
│       │   ├── c.8e28b461.js
│       │   ├── c.90083196.js
│       │   ├── c.91b5f3b9.js
│       │   ├── c.9475214f.js
│       │   ├── c.962e71e3.js
│       │   ├── c.99c1c4ba.js
│       │   ├── c.9a1f96ed.js
│       │   ├── c.a1d7c963.js
│       │   ├── c.a9ee435e.js
│       │   ├── c.abbcb4be.js
│       │   ├── c.ad739743.js
│       │   ├── c.b27925d9.js
│       │   ├── c.bad50d60.js
│       │   ├── c.bc53dda1.js
│       │   ├── c.bd21ff9b.js
│       │   ├── c.c28253df.js
│       │   ├── c.c4f30bcd.js
│       │   ├── c.cf66b923.js
│       │   ├── c.d5d0a5c5.js
│       │   ├── c.d9dcade0.js
│       │   ├── c.da8de431.js
│       │   ├── c.e0e56ec4.js
│       │   ├── c.e23b0d0b.js
│       │   ├── c.e431cd4c.js
│       │   ├── c.e4d174e7.js
│       │   ├── c.e6921cf4.js
│       │   ├── c.eb4f9da9.js
│       │   ├── c.ecb39554.js
│       │   ├── c.f4178207.js
│       │   ├── c.f6d57c77.js
│       │   ├── c.fb6ed4e2.js
│       │   ├── c.fb76e5d5.js
│       │   ├── c.fc1fab2b.js
│       │   ├── c.fe747ba2.js
│       │   ├── c.ff22e505.js
│       │   ├── entrypoint.js
│       │   ├── main-7bc9a818.js
│       │   ├── manifest.json
│       │   └── version.py
│       ├── iconset.js
│       ├── manifest.json
│       ├── repositories/
│       │   ├── __init__.py
│       │   ├── appdaemon.py
│       │   ├── base.py
│       │   ├── integration.py
│       │   ├── netdaemon.py
│       │   ├── plugin.py
│       │   ├── python_script.py
│       │   └── theme.py
│       ├── sensor.py
│       ├── system_health.py
│       ├── translations/
│       │   └── en.json
│       ├── update.py
│       ├── utils/
│       │   ├── __init__.py
│       │   ├── backup.py
│       │   ├── configuration_schema.py
│       │   ├── data.py
│       │   ├── decode.py
│       │   ├── decorator.py
│       │   ├── default.repositories
│       │   ├── filters.py
│       │   ├── json.py
│       │   ├── logger.py
│       │   ├── path.py
│       │   ├── platform_setup.py
│       │   ├── queue_manager.py
│       │   ├── regex.py
│       │   ├── store.py
│       │   ├── template.py
│       │   ├── validate.py
│       │   ├── version.py
│       │   └── workarounds.py
│       ├── validate/
│       │   ├── README.md
│       │   ├── __init__.py
│       │   ├── archived.py
│       │   ├── base.py
│       │   ├── brands.py
│       │   ├── description.py
│       │   ├── hacsjson.py
│       │   ├── images.py
│       │   ├── information.py
│       │   ├── integration_manifest.py
│       │   ├── issues.py
│       │   ├── manager.py
│       │   └── topics.py
│       └── websocket/
│           ├── __init__.py
│           ├── critical.py
│           ├── repositories.py
│           └── repository.py
├── lovelace_ui_raw_config_file.yaml
├── scenes.yaml
├── scripts.yaml
├── switches/
│   ├── antonettes_work_laptop.yaml
│   ├── br_fireplace.yaml
│   ├── br_tv.yaml
│   ├── juans_work_laptop.yaml
│   ├── lr_fireplace.yaml
│   ├── lr_tv.yaml
│   └── mac_studio_wol.yaml
├── themes/
│   ├── google_dark_theme.yaml
│   ├── google_light_theme.yaml
│   ├── google_theme.yaml
│   ├── ios_dark_mode.yaml
│   ├── ios_light_mode.yaml
│   ├── ios_theme.yaml
│   └── macos.yaml
└── www/
    └── community/
        ├── alarmo-card/
        │   └── alarmo-card.js
        ├── kiosk-mode/
        │   └── kiosk-mode.js
        ├── lovelace-mushroom/
        │   └── mushroom.js
        ├── mini-graph-card/
        │   └── mini-graph-card-bundle.js
        └── vertical-stack-in-card/
            └── vertical-stack-in-card.js
Download .txt
Showing preview only (685K chars total). Download the full file or copy to clipboard to get everything.
SYMBOL INDEX (6672 symbols across 119 files)

FILE: custom_components/alarmo/__init__.py
  function async_setup (line 46) | async def async_setup(hass, config):
  function async_setup_entry (line 51) | async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry):
  function async_unload_entry (line 95) | async def async_unload_entry(hass, entry):
  function async_remove_entry (line 111) | async def async_remove_entry(hass, entry):
  class AlarmoCoordinator (line 119) | class AlarmoCoordinator(DataUpdateCoordinator):
    method __init__ (line 122) | def __init__(self, hass, session, entry, store):
    method setup_alarm_entities (line 140) | def setup_alarm_entities(self):
    method async_update_config (line 155) | async def async_update_config(self, data):
    method async_update_area_config (line 173) | async def async_update_area_config(self, area_id: str = None, data: di...
    method async_update_sensor_config (line 216) | def async_update_sensor_config(self, entity_id: str, data: dict):
    method async_update_user_config (line 233) | def async_update_user_config(self, user_id: str = None, data: dict = {}):
    method async_authenticate_user (line 262) | def async_authenticate_user(self, code: str, user_id: str = None):
    method async_update_automation_config (line 282) | def async_update_automation_config(self, automation_id: str = None, da...
    method register_events (line 292) | def register_events(self):
    method async_remove_entity (line 334) | async def async_remove_entity(self, area_id: str):
    method async_get_sensor_groups (line 345) | def async_get_sensor_groups(self):
    method async_get_group_for_sensor (line 350) | def async_get_group_for_sensor(self, entity_id: str):
    method assign_sensor_to_group (line 355) | def assign_sensor_to_group(self, entity_id: str, group_id: str):
    method async_update_sensor_group_config (line 378) | def async_update_sensor_group_config(self, group_id: str = None, data:...
    method async_unload (line 388) | async def async_unload(self):
    method async_delete_config (line 407) | async def async_delete_config(self):
  function register_services (line 413) | def register_services(hass):

FILE: custom_components/alarmo/alarm_control_panel.py
  function async_setup (line 49) | async def async_setup(hass, config):
  function async_setup_platform (line 54) | async def async_setup_platform(hass, config, async_add_entities, discove...
  function async_setup_entry (line 59) | async def async_setup_entry(hass, config_entry, async_add_devices):
  class AlarmoBaseEntity (line 108) | class AlarmoBaseEntity(AlarmControlPanelEntity, RestoreEntity):
    method __init__ (line 109) | def __init__(self, hass: HomeAssistant, name: str, entity_id: str) -> ...
    method device_info (line 126) | def device_info(self) -> dict:
    method unique_id (line 137) | def unique_id(self):
    method icon (line 142) | def icon(self):
    method name (line 147) | def name(self):
    method should_poll (line 152) | def should_poll(self) -> bool:
    method code_format (line 157) | def code_format(self):
    method changed_by (line 178) | def changed_by(self):
    method state (line 183) | def state(self):
    method supported_features (line 188) | def supported_features(self) -> int:
    method code_arm_required (line 193) | def code_arm_required(self):
    method arm_mode (line 201) | def arm_mode(self):
    method open_sensors (line 206) | def open_sensors(self):
    method open_sensors (line 214) | def open_sensors(self, value):
    method bypassed_sensors (line 222) | def bypassed_sensors(self):
    method bypassed_sensors (line 230) | def bypassed_sensors(self, value):
    method delay (line 238) | def delay(self):
    method delay (line 243) | def delay(self, value):
    method extra_state_attributes (line 253) | def extra_state_attributes(self):
    method _validate_code (line 263) | def _validate_code(self, code, state):
    method async_service_disarm_handler (line 300) | async def async_service_disarm_handler(self, code, context_id=None):
    method async_alarm_disarm (line 309) | async def async_alarm_disarm(self, **kwargs):
    method async_service_arm_handler (line 354) | async def async_service_arm_handler(self, code, mode, skip_delay, forc...
    method async_handle_arm_request (line 369) | async def async_handle_arm_request(self, arm_mode, **kwargs):
    method async_alarm_arm_away (line 435) | async def async_alarm_arm_away(self, code=None, skip_code=False):
    method async_alarm_arm_home (line 440) | async def async_alarm_arm_home(self, code=None, skip_code=False):
    method async_alarm_arm_night (line 445) | async def async_alarm_arm_night(self, code=None, skip_code=False):
    method async_alarm_arm_custom_bypass (line 450) | async def async_alarm_arm_custom_bypass(self, code=None, skip_code=Fal...
    method async_alarm_arm_vacation (line 455) | async def async_alarm_arm_vacation(self, code=None, skip_code=False):
    method async_alarm_trigger (line 460) | async def async_alarm_trigger(self, code=None) -> None:
    method async_added_to_hass (line 465) | async def async_added_to_hass(self):
    method async_will_remove_from_hass (line 484) | async def async_will_remove_from_hass(self):
  class AlarmoAreaEntity (line 489) | class AlarmoAreaEntity(AlarmoBaseEntity):
    method __init__ (line 492) | def __init__(self, hass: HomeAssistant, name: str, entity_id: str, are...
    method supported_features (line 503) | def supported_features(self) -> int:
    method async_added_to_hass (line 515) | async def async_added_to_hass(self):
    method async_update_state (line 550) | async def async_update_state(self, state: str = None):
    method async_arm_failure (line 576) | async def async_arm_failure(self, open_sensors: dict, context_id=None):
    method async_arm (line 601) | async def async_arm(self, arm_mode, **kwargs):
    method async_trigger (line 695) | async def async_trigger(self, skip_delay: bool = False, open_sensors: ...
    method async_set_timer (line 768) | def async_set_timer(self, delay, cb_func):
  class AlarmoMasterEntity (line 781) | class AlarmoMasterEntity(AlarmoBaseEntity):
    method __init__ (line 784) | def __init__(self, hass: HomeAssistant, name: str, entity_id: str) -> ...
    method supported_features (line 791) | def supported_features(self) -> int:
    method async_added_to_hass (line 800) | async def async_added_to_hass(self):
    method async_update_state (line 869) | async def async_update_state(self, state: str = None):
    method async_alarm_disarm (line 958) | async def async_alarm_disarm(self, **kwargs):
    method async_arm (line 975) | async def async_arm(self, arm_mode, **kwargs):
    method async_arm_failure (line 1015) | async def async_arm_failure(self, open_sensors: dict, context_id=None):
    method async_trigger (line 1037) | async def async_trigger(self, skip_delay: bool = False):

FILE: custom_components/alarmo/automations.py
  function validate_area (line 44) | def validate_area(trigger, area_id):
  function validate_modes (line 53) | def validate_modes(trigger, mode):
  function validate_trigger (line 62) | def validate_trigger(trigger, to_state, from_state=None):
  class AutomationHandler (line 73) | class AutomationHandler:
    method __init__ (line 74) | def __init__(self, hass: HomeAssistant):
    method __del__ (line 153) | def __del__(self):
    method async_execute_automation (line 158) | async def async_execute_automation(self, automation_id: str, alarm_ent...
    method get_automations_by_area (line 226) | def get_automations_by_area(self, area_id: str):
    method async_get_open_sensor_string (line 234) | async def async_get_open_sensor_string(self, entity_id: str, state: st...
    method async_get_arm_mode_string (line 284) | async def async_get_arm_mode_string(self, arm_mode: str, language: str):

FILE: custom_components/alarmo/card.py
  function handle_subscribe_updates (line 19) | async def handle_subscribe_updates(hass, connection, msg):
  function async_register_card (line 45) | async def async_register_card(hass):

FILE: custom_components/alarmo/config_flow.py
  class AlarmoConfigFlow (line 12) | class AlarmoConfigFlow(config_entries.ConfigFlow, domain=DOMAIN):
    method async_step_user (line 18) | async def async_step_user(self, user_input=None):

FILE: custom_components/alarmo/event.py
  class EventHandler (line 13) | class EventHandler:
    method __init__ (line 14) | def __init__(self, hass):
    method __del__ (line 21) | def __del__(self):
    method async_handle_event (line 26) | async def async_handle_event(self, event: str, area_id: str, args: dic...

FILE: custom_components/alarmo/frontend/dist/alarm-panel.js
  function t (line 15) | function t(e,t,a,i){var s,n=arguments.length,r=n<3?t:null===i?i=Object.g...
  class s (line 20) | class s{constructor(e,t){if(t!==i)throw Error("CSSResult is not construc...
    method constructor (line 20) | constructor(e,t){if(t!==i)throw Error("CSSResult is not constructable....
    method styleSheet (line 20) | get styleSheet(){return a&&void 0===this.t&&(this.t=new CSSStyleSheet,...
    method toString (line 20) | toString(){return this.cssText}
  method toAttribute (line 25) | toAttribute(e,t){switch(t){case Boolean:e=e?"":null;break;case Object:ca...
  method fromAttribute (line 25) | fromAttribute(e,t){let a=e;switch(t){case Boolean:a=null!==e;break;case ...
  class f (line 25) | class f extends HTMLElement{constructor(){super(),this.Πi=new Map,this.Π...
    method constructor (line 25) | constructor(){super(),this.Πi=new Map,this.Πo=void 0,this.Πl=void 0,th...
    method addInitializer (line 25) | static addInitializer(e){var t;null!==(t=this.v)&&void 0!==t||(this.v=...
    method observedAttributes (line 25) | static get observedAttributes(){this.finalize();const e=[];return this...
    method createProperty (line 25) | static createProperty(e,t=v){if(t.state&&(t.attribute=!1),this.finaliz...
    method getPropertyDescriptor (line 25) | static getPropertyDescriptor(e,t,a){return{get(){return this[t]},set(i...
    method getPropertyOptions (line 25) | static getPropertyOptions(e){return this.elementProperties.get(e)||v}
    method finalize (line 25) | static finalize(){if(this.hasOwnProperty("finalized"))return!1;this.fi...
    method finalizeStyles (line 25) | static finalizeStyles(e){const t=[];if(Array.isArray(e)){const a=new S...
    method "Πp" (line 25) | static"Πp"(e,t){const a=t.attribute;return!1===a?void 0:"string"==type...
    method u (line 25) | u(){var e;this.Πg=new Promise(e=>this.enableUpdating=e),this.L=new Map...
    method addController (line 25) | addController(e){var t,a;(null!==(t=this.ΠU)&&void 0!==t?t:this.ΠU=[])...
    method removeController (line 25) | removeController(e){var t;null===(t=this.ΠU)||void 0===t||t.splice(thi...
    method "Π_" (line 25) | "Π_"(){this.constructor.elementProperties.forEach((e,t)=>{this.hasOwnP...
    method createRenderRoot (line 25) | createRenderRoot(){var e;const t=null!==(e=this.shadowRoot)&&void 0!==...
    method connectedCallback (line 25) | connectedCallback(){var e;void 0===this.renderRoot&&(this.renderRoot=t...
    method enableUpdating (line 25) | enableUpdating(e){}
    method disconnectedCallback (line 25) | disconnectedCallback(){var e;null===(e=this.ΠU)||void 0===e||e.forEach...
    method attributeChangedCallback (line 25) | attributeChangedCallback(e,t,a){this.K(e,a)}
    method "Πj" (line 25) | "Πj"(e,t,a=v){var i,s;const n=this.constructor.Πp(e,a);if(void 0!==n&&...
    method K (line 25) | K(e,t){var a,i,s;const n=this.constructor,r=n.Πm.get(e);if(void 0!==r&...
    method requestUpdate (line 25) | requestUpdate(e,t,a){let i=!0;void 0!==e&&(((a=a||this.constructor.get...
    method "Πq" (line 25) | async"Πq"(){this.isUpdatePending=!0;try{for(await this.Πg;this.Πo;)awa...
    method performUpdate (line 25) | performUpdate(){var e;if(!this.isUpdatePending)return;this.hasUpdated,...
    method willUpdate (line 25) | willUpdate(e){}
    method E (line 25) | E(e){var t;null===(t=this.ΠU)||void 0===t||t.forEach(e=>{var t;return ...
    method "Π$" (line 25) | "Π$"(){this.L=new Map,this.isUpdatePending=!1}
    method updateComplete (line 25) | get updateComplete(){return this.getUpdateComplete()}
    method getUpdateComplete (line 25) | getUpdateComplete(){return this.Πg}
    method shouldUpdate (line 25) | shouldUpdate(e){return!0}
    method update (line 25) | update(e){void 0!==this.Πk&&(this.Πk.forEach((e,t)=>this.Πj(t,this[t],...
    method updated (line 25) | updated(e){}
    method firstUpdated (line 25) | firstUpdated(e){}
  class V (line 31) | class V{constructor({strings:e,_$litType$:t},a){let i;this.parts=[];let ...
    method constructor (line 31) | constructor({strings:e,_$litType$:t},a){let i;this.parts=[];let s=0,n=...
    method createElement (line 31) | static createElement(e,t){const a=E.createElement("template");return a...
  function H (line 31) | function H(e,t,a=e,i){var s,n,r,o;if(t===R)return t;let l=void 0!==i?nul...
  class Y (line 31) | class Y{constructor(e,t){this.l=[],this.N=void 0,this.D=e,this.M=t}u(e){...
    method constructor (line 31) | constructor(e,t){this.l=[],this.N=void 0,this.D=e,this.M=t}
    method u (line 31) | u(e){var t;const{el:{content:a},parts:i}=this.D,s=(null!==(t=null==e?v...
    method v (line 31) | v(e){let t=0;for(const a of this.l)void 0!==a&&(void 0!==a.strings?(a....
  class B (line 31) | class B{constructor(e,t,a,i){this.type=2,this.N=void 0,this.A=e,this.B=t...
    method constructor (line 31) | constructor(e,t,a,i){this.type=2,this.N=void 0,this.A=e,this.B=t,this....
    method setConnected (line 31) | setConnected(e){var t;null===(t=this.P)||void 0===t||t.call(this,e)}
    method parentNode (line 31) | get parentNode(){return this.A.parentNode}
    method startNode (line 31) | get startNode(){return this.A}
    method endNode (line 31) | get endNode(){return this.B}
    method I (line 31) | I(e,t=this){e=H(this,e,t),j(e)?e===I||null==e||""===e?(this.H!==I&&thi...
    method k (line 31) | k(e,t=this.B){return this.A.parentNode.insertBefore(e,t)}
    method $ (line 31) | $(e){this.H!==e&&(this.R(),this.H=this.k(e))}
    method m (line 31) | m(e){const t=this.A.nextSibling;null!==t&&3===t.nodeType&&(null===this...
    method _ (line 31) | _(e){var t;const{values:a,_$litType$:i}=e,s="number"==typeof i?this.C(...
    method C (line 31) | C(e){let t=U.get(e.strings);return void 0===t&&U.set(e.strings,t=new V...
    method g (line 31) | g(e){S(this.H)||(this.H=[],this.R());const t=this.H;let a,i=0;for(cons...
    method R (line 31) | R(e=this.A.nextSibling,t){var a;for(null===(a=this.P)||void 0===a||a.c...
  class K (line 31) | class K{constructor(e,t,a,i,s){this.type=1,this.H=I,this.N=void 0,this.V...
    method constructor (line 31) | constructor(e,t,a,i,s){this.type=1,this.H=I,this.N=void 0,this.V=void ...
    method tagName (line 31) | get tagName(){return this.element.tagName}
    method I (line 31) | I(e,t=this,a,i){const s=this.strings;let n=!1;if(void 0===s)e=H(this,e...
    method W (line 31) | W(e){e===I?this.element.removeAttribute(this.name):this.element.setAtt...
  class Q (line 31) | class Q extends K{constructor(){super(...arguments),this.type=3}W(e){thi...
    method constructor (line 31) | constructor(){super(...arguments),this.type=3}
    method W (line 31) | W(e){this.element[this.name]=e===I?void 0:e}
  class W (line 31) | class W extends K{constructor(){super(...arguments),this.type=4}W(e){e&&...
    method constructor (line 31) | constructor(){super(...arguments),this.type=4}
    method W (line 31) | W(e){e&&e!==I?this.element.setAttribute(this.name,""):this.element.rem...
  class X (line 31) | class X extends K{constructor(){super(...arguments),this.type=5}I(e,t=th...
    method constructor (line 31) | constructor(){super(...arguments),this.type=5}
    method I (line 31) | I(e,t=this){var a;if((e=null!==(a=H(this,e,t,0))&&void 0!==a?a:I)===R)...
    method handleEvent (line 31) | handleEvent(e){var t,a;"function"==typeof this.H?this.H.call(null!==(a...
  class Z (line 31) | class Z{constructor(e,t,a){this.element=e,this.type=6,this.N=void 0,this...
    method constructor (line 31) | constructor(e,t,a){this.element=e,this.type=6,this.N=void 0,this.V=voi...
    method I (line 31) | I(e){H(this,e)}
  class ne (line 37) | class ne extends f{constructor(){super(...arguments),this.renderOptions=...
    method constructor (line 37) | constructor(){super(...arguments),this.renderOptions={host:this},this....
    method createRenderRoot (line 37) | createRenderRoot(){var e,t;const a=super.createRenderRoot();return nul...
    method update (line 37) | update(e){const t=this.render();super.update(e),this.Φt=G(t,this.rende...
    method connectedCallback (line 37) | connectedCallback(){var e;super.connectedCallback(),null===(e=this.Φt)...
    method disconnectedCallback (line 37) | disconnectedCallback(){var e;super.disconnectedCallback(),null===(e=th...
    method render (line 37) | render(){return R}
  method finisher (line 43) | finisher(t){window.customElements.define(e,t)}
  method finisher (line 48) | finisher(a){a.createProperty(t.key,e)}
  method initializer (line 48) | initializer(){"function"==typeof t.initializer&&(this[t.key]=t.initializ...
  method finisher (line 48) | finisher(a){a.createProperty(t.key,e)}
  function le (line 48) | function le(e){return(t,a)=>void 0!==a?((e,t,a)=>{t.constructor.createPr...
  function de (line 53) | function de(e){return le({...e,state:!0,attribute:!1})}
  function ce (line 64) | function ce(e,t){return(({finisher:e,descriptor:t})=>(a,i)=>{var s;if(vo...
  function pe (line 64) | function pe(e,t){for(var a=[],i=0,s=e.length;i<s;i++)a.push(e[i].substr(...
  function ve (line 64) | function ve(e){for(var t=[],a=1;a<arguments.length;a++)t[a-1]=arguments[...
  function Ce (line 64) | function Ce(e){return e.substr(0,e.indexOf("."))}
  function Me (line 64) | function Me(e){return e.substr(e.indexOf(".")+1)}
  function ze (line 64) | function ze(e,t){if(e in Le)return Le[e];switch(e){case"alarm_control_pa...
  class a (line 64) | class a extends e{connectedCallback(){super.connectedCallback(),this.__c...
    method connectedCallback (line 64) | connectedCallback(){super.connectedCallback(),this.__checkSubscribed()}
    method disconnectedCallback (line 64) | disconnectedCallback(){if(super.disconnectedCallback(),this.__unsubs){...
    method updated (line 64) | updated(e){super.updated(e),e.has("hass")&&this.__checkSubscribed()}
    method hassSubscribe (line 64) | hassSubscribe(){return[]}
    method __checkSubscribed (line 64) | __checkSubscribed(){void 0===this.__unsubs&&this.isConnected&&void 0!=...
  function Ft (line 64) | function Ft(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("...
  function Ht (line 64) | function Ht(e,t,a){if(a||2===arguments.length)for(var i,s=0,n=t.length;s...
  function Wt (line 78) | function Wt(e){return e.type===Bt.literal}
  function Xt (line 78) | function Xt(e){return e.type===Bt.argument}
  function Zt (line 78) | function Zt(e){return e.type===Bt.number}
  function Jt (line 78) | function Jt(e){return e.type===Bt.date}
  function ea (line 78) | function ea(e){return e.type===Bt.time}
  function ta (line 78) | function ta(e){return e.type===Bt.select}
  function aa (line 78) | function aa(e){return e.type===Bt.plural}
  function ia (line 78) | function ia(e){return e.type===Bt.pound}
  function sa (line 78) | function sa(e){return e.type===Bt.tag}
  function na (line 78) | function na(e){return!(!e||"object"!=typeof e||e.type!==Kt.number)}
  function ra (line 78) | function ra(e){return!(!e||"object"!=typeof e||e.type!==Kt.dateTime)}
  function da (line 78) | function da(e){var t={};return e.replace(la,(function(e){var a=e.length;...
  function fa (line 92) | function fa(e){var t={};return"r"===e[e.length-1]?t.roundingPriority="mo...
  function _a (line 92) | function _a(e){switch(e){case"sign-auto":return{signDisplay:"auto"};case...
  function ba (line 92) | function ba(e){var t;if("E"===e[0]&&"E"===e[1]?(t={notation:"engineering...
  function ya (line 92) | function ya(e){var t=_a(e);return t||{}}
  function wa (line 92) | function wa(e){for(var t={},a=0,i=e;a<i.length;a++){var s=i[a];switch(s....
  function Aa (line 92) | function Aa(e,t){return{start:e,end:t}}
  function Ia (line 92) | function Ia(e,t){return new RegExp(e,t)}
  function e (line 92) | function e(e,t){void 0===t&&(t={}),this.message=e,this.position={offset:...
  function Fa (line 92) | function Fa(e){return e>=97&&e<=122||e>=65&&e<=90}
  function Va (line 92) | function Va(e){return 45===e||46===e||e>=48&&e<=57||95===e||e>=97&&e<=12...
  function Ha (line 92) | function Ha(e){return e>=9&&e<=13||32===e||133===e||e>=8206&&e<=8207||82...
  function Ya (line 92) | function Ya(e){return e>=33&&e<=35||36===e||e>=37&&e<=39||40===e||41===e...
  function Ba (line 92) | function Ba(e,t){void 0===t&&(t={}),t=Qt({shouldParseSkeletons:!0,requir...
  function Ka (line 92) | function Ka(e,t){var a=t&&t.cache?t.cache:ai,i=t&&t.serializer?t.seriali...
  function Qa (line 92) | function Qa(e,t,a,i){var s,n=null==(s=i)||"number"==typeof s||"boolean"=...
  function Wa (line 92) | function Wa(e,t,a){var i=Array.prototype.slice.call(arguments,3),s=a(i),...
  function Xa (line 92) | function Xa(e,t,a,i,s){return a.bind(t,e,i,s)}
  function Za (line 92) | function Za(e,t){return Xa(e,this,1===e.length?Qa:Wa,t.cache.create(),t....
  function ei (line 92) | function ei(){this.cache=Object.create(null)}
  function t (line 92) | function t(t,a,i){var s=e.call(this,t)||this;return s.code=a,s.originalM...
  function t (line 92) | function t(t,a,i,s){return e.call(this,'Invalid values for "'.concat(t,'...
  function t (line 92) | function t(t,a,i){return e.call(this,'Value for "'.concat(t,'" must be o...
  function t (line 92) | function t(t,a){return e.call(this,'The intl string context variable "'....
  function di (line 92) | function di(e){return"function"==typeof e}
  function ci (line 92) | function ci(e,t,a,i,s,n,r){if(1===e.length&&Wt(e[0]))return[{type:si.lit...
  function hi (line 92) | function hi(e,t){return t?Object.keys(e).reduce((function(a,i){var s,n;r...
  function ui (line 92) | function ui(e){return{create:function(){return{get:function(t){return e[...
  function e (line 92) | function e(t,a,i,s){var n,r=this;if(void 0===a&&(a=e.defaultLocale),this...
  function gi (line 92) | function gi(e,t,...a){const i=t.replace(/['"]+/g,"").replace("-","_");va...
  function Ai (line 92) | function Ai(e){return function(e){if(!e)return Ne;if(e.attributes.icon)r...
  function xi (line 92) | function xi(e){return(e=e.replace("_"," ")).charAt(0).toUpperCase()+e.sl...
  function Oi (line 92) | function Oi(e){return e?e.attributes&&e.attributes.friendly_name?e.attri...
  function Ei (line 92) | function Ei(e){let t=[];return e.forEach(e=>{t.find(t=>"object"==typeof ...
  function Ti (line 92) | function Ti(e,t){return e.filter(e=>e!==t)}
  function ji (line 92) | function ji(e,t){return e?Object.entries(e).filter(([e])=>t.includes(e))...
  function Ci (line 92) | function Ci(e){return null!=e}
  function Mi (line 92) | function Mi(e,t){if(null===e||null===t)return e===t;const a=Object.keys(...
  function Ni (line 92) | function Ni(e,t){const a=e.hasOwnProperty("tagName")?e:e.target;De(a,"sh...
  function Di (line 92) | function Di(e,t){Ni(t,q`
  function zi (line 106) | function zi(e,t){return Object.entries(t).forEach(([t,a])=>{e=t in e&&"o...
  function Pi (line 106) | function Pi(e,t){const a=e=>"object"==typeof e?a(e.name):e.trim().toLowe...
  method constructor (line 264) | constructor(){super(...arguments),this.min=0,this.max=100,this.step=10,t...
  method firstUpdated (line 264) | firstUpdated(){this.value>0&&this.value<60&&(this.unit="sec"),"min"==thi...
  method render (line 264) | render(){return q`
  method getValue (line 276) | getValue(){const e=Number(Math.round(this.value*this.scaleFactor));retur...
  method getUnit (line 276) | getUnit(){switch(this.unit){case"sec":return gi("components.time_slider....
  method getSlider (line 276) | getSlider(){return q`
  method updateValue (line 286) | updateValue(e){const t=Number(e.target.value);this.value=Math.round(t/th...
  method toggleUnit (line 286) | toggleUnit(){this.unit="min"==this.unit?"sec":"min",this.scaleFactor="mi...
  class Ki (line 335) | class Ki{constructor(e){}T(e,t,a){this.Σdt=e,this.M=t,this.Σct=a}S(e,t){...
    method constructor (line 335) | constructor(e){}
    method T (line 335) | T(e,t,a){this.Σdt=e,this.M=t,this.Σct=a}
    method S (line 335) | S(e,t){return this.update(e,t)}
    method update (line 335) | update(e,t){return this.render(...t)}
  method constructor (line 335) | constructor(){super(...arguments),this.label="",this.items=[],this.clear...
  method open (line 364) | open(){this.updateComplete.then(()=>{var e,t;null===(t=null===(e=this.sh...
  method disconnectedCallback (line 364) | disconnectedCallback(){super.disconnectedCallback(),this._overlayMutatio...
  method focus (line 364) | focus(){this.updateComplete.then(()=>{var e;(null===(e=this.shadowRoot)|...
  method shouldUpdate (line 364) | shouldUpdate(e){if(e.get("items"))if(Mi(this.items,e.get("items"))){if(1...
  method firstUpdated (line 364) | firstUpdated(){this._comboBox.items=this.items}
  method render (line 364) | render(){const e=Ci(this._value)&&this.items.find(e=>e.value==this._valu...
  method _clearValue (line 402) | _clearValue(e){e.stopPropagation(),this._setValue("")}
  method _value (line 402) | get _value(){return Ci(this.value)?this.value:""}
  method _toggleOpen (line 402) | _toggleOpen(e){var t,a,i,s,n,r;this.items.length?this._opened?(null===(i...
  method _openedChanged (line 402) | _openedChanged(e){if(this._opened=e.detail.value,this._opened&&"Mutation...
  method _valueChanged (line 402) | _valueChanged(e){const t=e.detail.value;t!==this._value&&this._setValue(t)}
  method _setValue (line 402) | _setValue(e){this.value=e,setTimeout(()=>{De(this,"value-changed",{value...
  method styles (line 402) | static get styles(){return o`
  class Xi (line 438) | class Xi extends Ki{constructor(e){if(super(e),this.previousValue=Wi,e.t...
    method constructor (line 438) | constructor(e){if(super(e),this.previousValue=Wi,e.type!==Yi)throw new...
    method render (line 438) | render(e,t){return I}
    method update (line 438) | update(e,[t,a]){var i;const s=this.previousValue===Wi;if(!this.hasChan...
    method hasChanged (line 438) | hasChanged(e){let t=!0;return Array.isArray(e)?Array.isArray(this.prev...
  method addRenderer (line 438) | addRenderer(e,t,a){e.renderer=(e,i,s)=>{G(t.call(a.host,s.item,s,i),e,a)}}
  method runRenderer (line 438) | runRenderer(e){e.requestContentUpdate()}
  method styles (line 438) | static get styles(){return o`
  method render (line 442) | render(){return q`
  method constructor (line 444) | constructor(){super(),this.addEventListener("clickHeader",this.manageSpo...
  method manageSpoilers (line 444) | manageSpoilers(e){const t=e.target;t.getAttribute("active")?t.removeAttr...
  method styles (line 444) | static get styles(){return o`
  method render (line 448) | render(){return q`
  method constructor (line 450) | constructor(){super(),this.clickHeader=new CustomEvent("clickHeader",{de...
  method handleClick (line 450) | handleClick(){this.dispatchEvent(this.clickHeader)}
  method render (line 450) | render(){return q`
  method styles (line 457) | static get styles(){return o`
  method attributeChangedCallback (line 507) | attributeChangedCallback(e,t,a){this.hasAttribute("active")&&this.nextEl...
  method styles (line 507) | static get styles(){return o`
  method render (line 517) | render(){return q`
  method hassSubscribe (line 521) | hassSubscribe(){return this._fetchData(),[this.hass.connection.subscribe...
  method _fetchData (line 521) | async _fetchData(){this.hass&&(this.areas=await Ze(this.hass),this.senso...
  method firstUpdated (line 521) | async firstUpdated(){await this._fetchData(),this.selectedArea=Object.ke...
  method render (line 521) | render(){return this.data?q`
  method getSensorsByMode (line 565) | getSensorsByMode(e){return Object.values(this.sensors).filter(t=>t.modes...
  method renderModeConfig (line 565) | renderModeConfig(e){const t=e in this.data?this.data[e]:void 0;return q`
  method selectArea (line 642) | selectArea(e){e!=this.selectedArea&&(this.selectedArea=e,this.data=Objec...
  method saveClick (line 642) | saveClick(e){Je(this.hass,{area_id:this.selectedArea,modes:this.data}).c...
  method saveData (line 642) | saveData(e,t){this.data=Object.assign(Object.assign({},this.data),{[e]:O...
  method styles (line 642) | static get styles(){return o`
  method constructor (line 677) | constructor(){super(...arguments),this.threeLine=!1}
  method render (line 677) | render(){return q`
  method styles (line 683) | static get styles(){return o`
  method constructor (line 747) | constructor(){super(...arguments),this.header="",this.open=!1}
  method render (line 747) | render(){return q`
  method styles (line 767) | static get styles(){return o`
  method constructor (line 798) | constructor(){super(...arguments),this.areas={}}
  method hassSubscribe (line 798) | hassSubscribe(){return this._fetchData(),[this.hass.connection.subscribe...
  method _fetchData (line 798) | async _fetchData(){if(!this.hass)return;const e=await Ge(this.hass);this...
  method firstUpdated (line 798) | firstUpdated(){(async()=>{await Ie()})()}
  method render (line 798) | render(){return this.hass&&this.selection?q`
  method saveClick (line 908) | saveClick(e){this.hass&&Be(this.hass,{mqtt:Object.assign(Object.assign({...
  method cancelClick (line 908) | cancelClick(){Pe(0,Ui("general"),!0)}
  class ls (line 914) | class ls extends Ki{constructor(e){if(super(e),this.vt=I,e.type!==Hi)thr...
    method constructor (line 914) | constructor(e){if(super(e),this.vt=I,e.type!==Hi)throw Error(this.cons...
    method render (line 914) | render(e){if(e===I)return this.Vt=void 0,this.vt=e;if(e===R)return e;i...
  method render (line 914) | render(){return q`
  method renderCheckmark (line 920) | renderCheckmark(){return this.checkmark?q`
  method renderButton (line 924) | renderButton(){return this.cancellable?q`
  method _toggleSelect (line 932) | _toggleSelect(){if(!this.value||!this.clickable)return;this.selectable&&...
  method _buttonClick (line 932) | _buttonClick(){const e=new CustomEvent("button-clicked",{detail:this.val...
  method styles (line 932) | static get styles(){return o`
  method constructor (line 1066) | constructor(){super(...arguments),this.value=[]}
  method render (line 1066) | render(){return this.items?q`
  method _itemChanged (line 1080) | _itemChanged(e){const t=e.target.checked,a=String(e.detail);if(this.sele...
  method styles (line 1080) | static get styles(){return o`
  method filters (line 1088) | set filters(e){this.filterConfig||(this.filterConfig=e)}
  method shouldUpdate (line 1088) | shouldUpdate(e){return e.get("filters")&&!this.filterConfig&&(this.filte...
  method render (line 1088) | render(){if(!this.columns||!this.data)return q``;const e=this.data.filte...
  method renderHeaderRow (line 1100) | renderHeaderRow(){return this.columns?q`
  method renderDataRow (line 1111) | renderDataRow(e){return this.columns?q`
  method filterTableData (line 1125) | filterTableData(e,t){return!t||Object.keys(t).every(a=>{if(!Object.keys(...
  method _getFilteredItems (line 1125) | _getFilteredItems(){return this.data.filter(e=>!this.filterTableData(e,t...
  method handleClick (line 1125) | handleClick(e){if(!this.selectable)return;const t=new CustomEvent("row-c...
  method renderFilterRow (line 1125) | renderFilterRow(){var e;return this.filterConfig?q`
  method _toggleFilterMenu (line 1143) | _toggleFilterMenu(e){const t=e.target;this._menu.anchor=t,this._menu.ope...
  method renderFilterMenu (line 1143) | renderFilterMenu(){return this.filterConfig&&this.filterSelection?q`
  method _updateFilterSelection (line 1174) | _updateFilterSelection(e,t){"boolean"==typeof t&&(t=t?this.filterConfig[...
  method _clearFilters (line 1174) | _clearFilters(){Object.keys(this.filterConfig).forEach(e=>{this.filterCo...
  method _applyFilterSelection (line 1174) | _applyFilterSelection(){Object.keys(this.filterConfig).forEach(e=>{this....
  method showDialog (line 1342) | async showDialog(e){this._params=e,await this.updateComplete}
  method closeDialog (line 1342) | async closeDialog(){this._params&&this._params.cancel(),this._params=voi...
  method render (line 1342) | render(){return this._params?q`
  method confirmClick (line 1362) | confirmClick(){this._params.confirm()}
  method cancelClick (line 1362) | cancelClick(){this._params.cancel()}
  method styles (line 1362) | static get styles(){return o`
  method ConfirmDeleteDialog (line 1367) | get ConfirmDeleteDialog(){return ms}
  method constructor (line 1367) | constructor(){super(...arguments),this.areas={},this.sensors={},this.aut...
  method hassSubscribe (line 1367) | hassSubscribe(){return this._fetchData(),[this.hass.connection.subscribe...
  method _fetchData (line 1367) | async _fetchData(){this.hass&&(this.areas=await Ze(this.hass),this.senso...
  method showDialog (line 1367) | async showDialog(e){await this._fetchData(),this._params=e,e.area_id&&(t...
  method closeDialog (line 1367) | async closeDialog(){this._params=void 0,this.area_id=void 0,this.name=""}
  method render (line 1367) | render(){return this._params?q`
  method saveClick (line 1412) | saveClick(e){const t=this.name.trim();if(!t.length)return;let a={name:t}...
  method deleteClick (line 1412) | async deleteClick(e){if(!this.area_id)return;const t=Object.values(this....
  method styles (line 1412) | static get styles(){return o`
  method CreateAreaDialog (line 1426) | get CreateAreaDialog(){return gs}
  method constructor (line 1426) | constructor(){super(...arguments),this.areas={},this.sensors={},this.aut...
  method hassSubscribe (line 1426) | hassSubscribe(){return this._fetchData(),[this.hass.connection.subscribe...
  method _fetchData (line 1426) | async _fetchData(){this.hass&&(this.areas=await Ze(this.hass),this.senso...
  method render (line 1426) | render(){if(!this.hass)return q``;const e=Object.values(this.areas);e.so...
  method addClick (line 1443) | addClick(e){const t=e.target;De(t,"show-dialog",{dialogTag:"create-area-...
  method editClick (line 1443) | editClick(e,t){const a=e.target;De(a,"show-dialog",{dialogTag:"create-ar...
  method constructor (line 1443) | constructor(){super(...arguments),this.name=""}
  method showDialog (line 1443) | async showDialog(e){this._params=e;const t=await Ge(this.hass);this.name...
  method closeDialog (line 1443) | async closeDialog(){this._params=void 0}
  method render (line 1443) | render(){return this._params?q`
  method saveClick (line 1466) | saveClick(){const e=this.name.trim();e.length&&Be(this.hass,{master:{ena...
  method styles (line 1466) | static get styles(){return o`
  method EditMasterDialog (line 1476) | get EditMasterDialog(){return _s}
  method constructor (line 1476) | constructor(){super(...arguments),this.areas={},this.automations={}}
  method hassSubscribe (line 1476) | hassSubscribe(){return this._fetchData(),[this.hass.connection.subscribe...
  method _fetchData (line 1476) | async _fetchData(){this.hass&&(this.config=await Ge(this.hass),this.area...
  method firstUpdated (line 1476) | firstUpdated(){(async()=>{await Ie()})()}
  method render (line 1476) | render(){var e,t,a,i,s,n,r,o;return this.hass&&this.config&&this.data?"m...
  method setupMasterClick (line 1553) | setupMasterClick(e){const t=e.target;De(t,"show-dialog",{dialogTag:"edit...
  method toggleEnableMaster (line 1553) | async toggleEnableMaster(e){const t=e.target;let a=t.checked;if(!a){cons...
  method saveData (line 1553) | saveData(e){this.hass&&this.data&&(this.data=Object.assign(Object.assign...
  method showDialog (line 1553) | async showDialog(e){this._params=e,await this.updateComplete}
  method closeDialog (line 1553) | async closeDialog(){this._params=void 0}
  method render (line 1553) | render(){return this._params?q`
  method styles (line 1572) | static get styles(){return o`
  method ErrorDialog (line 1576) | get ErrorDialog(){return As}
  method constructor (line 1576) | constructor(){super(...arguments),this.sensorGroups={},this.sensors={}}
  method hassSubscribe (line 1576) | hassSubscribe(){return this._fetchData(),[this.hass.connection.subscribe...
  method _fetchData (line 1576) | async _fetchData(){this.hass&&(this.sensorGroups=await Ye(this.hass),thi...
  method showDialog (line 1576) | async showDialog(e){await this._fetchData(),this._params=e,e.group_id&&O...
  method closeDialog (line 1576) | async closeDialog(){this._params=void 0}
  method render (line 1576) | render(){return this._params?q`
  method renderHeader (line 1630) | renderHeader(){return q`
  method renderSensorOptions (line 1640) | renderSensorOptions(){const e=Object.keys(this.sensors).filter(e=>!Ci(th...
  method saveClick (line 1647) | saveClick(e){var t,a;this.data.name.length&&(this.data.group_id&&this.da...
  method deleteClick (line 1647) | deleteClick(e){var t,a;this.data.group_id&&(t=this.hass,a=this.data.grou...
  method styles (line 1647) | static get styles(){return o`
  method CreateSensorGroupDialog (line 1655) | get CreateSensorGroupDialog(){return Os}
  method constructor (line 1655) | constructor(){super(...arguments),this.sensorGroups={},this.sensors={}}
  method hassSubscribe (line 1655) | hassSubscribe(){return this._fetchData(),[this.hass.connection.subscribe...
  method _fetchData (line 1655) | async _fetchData(){this.hass&&(this.sensorGroups=await Ye(this.hass),thi...
  method showDialog (line 1655) | async showDialog(e){await this._fetchData(),this._params=e,await this.up...
  method closeDialog (line 1655) | async closeDialog(){this._params=void 0}
  method render (line 1655) | render(){return this._params?q`
  method renderHeader (line 1670) | renderHeader(){return q`
  method renderGroup (line 1679) | renderGroup(e){return q`
  method createGroupClick (line 1692) | createGroupClick(e){const t=e.target;De(t,"show-dialog",{dialogTag:"crea...
  method editGroupClick (line 1692) | editGroupClick(e,t){const a=e.target;De(a,"show-dialog",{dialogTag:"crea...
  method styles (line 1692) | static get styles(){return o`
  method ManageSensorGroupsDialog (line 1747) | get ManageSensorGroupsDialog(){return Ts}
  method constructor (line 1747) | constructor(){super(...arguments),this.showBypassModes=!1}
  method hassSubscribe (line 1747) | hassSubscribe(){return this._fetchData(),[this.hass.connection.subscribe...
  method _fetchData (line 1747) | async _fetchData(){var e;if(!this.hass)return;const t=await Ze(this.hass...
  method render (line 1747) | render(){if(!this.data)return q``;this.hass.states[this.data.entity_id];...
  method modesByArea (line 1989) | modesByArea(e){const t=Object.keys(this.areas).reduce((e,t)=>Object.assi...
  method _SetData (line 1989) | _SetData(e){if(this.data)for(const[t,a]of Object.entries(e))switch(t){ca...
  method setMode (line 1989) | setMode(e){this.data&&(this.data=Object.assign(Object.assign({},this.dat...
  method setBypassMode (line 1989) | setBypassMode(e){this.data&&(this.data=Object.assign(Object.assign({},th...
  method setType (line 1989) | setType(e){if(!this.data)return;const t=e!=bi.Other?$s(this.modesByArea(...
  method deleteClick (line 1989) | deleteClick(e){var t,a;(t=this.hass,a=this.item,t.callApi("POST","alarmo...
  method saveClick (line 1989) | saveClick(e){if(!this.data)return;const t=[];this.data=Object.assign(Obj...
  method cancelClick (line 1996) | cancelClick(){Pe(0,Ui("sensors"),!0)}
  method manageGroupsClick (line 1996) | manageGroupsClick(e){const t=e.target;De(t,"show-dialog",{dialogTag:"man...
  method getSensorGroups (line 1996) | getSensorGroups(){return Object.keys(this.sensorGroups).map(e=>Object({v...
  method hassSubscribe (line 1996) | hassSubscribe(){return this._fetchData(),[this.hass.connection.subscribe...
  method _fetchData (line 1996) | async _fetchData(){this.hass&&(this.areas=await Ze(this.hass),this.senso...
  method firstUpdated (line 1996) | async firstUpdated(){this.path&&2==this.path.length&&"filter"==this.path...
  method render (line 1996) | render(){return this.hass&&this.areas&&this.sensors?q`
  method tableColumns (line 2013) | tableColumns(){const e=()=>q`
  method getTableData (line 2040) | getTableData(){let e=Object.keys(this.sensors).map(e=>{const t=this.hass...
  method toggleEnabled (line 2040) | toggleEnabled(e,t){const a=e.target.checked;Ke(this.hass,{entity_id:t,en...
  method removeCustomName (line 2040) | removeCustomName(e){let t={entity_id:e,name:""};Ke(this.hass,t)}
  method getTableFilterOptions (line 2040) | getTableFilterOptions(){let e=Object.values(this.areas).map(e=>Object({v...
  method constructor (line 2040) | constructor(){super(...arguments),this.addSelection=[],this.areas={},thi...
  method hassSubscribe (line 2040) | hassSubscribe(){return this._fetchData(),[this.hass.connection.subscribe...
  method _fetchData (line 2040) | async _fetchData(){this.hass&&(this.areas=await Ze(this.hass))}
  method firstUpdated (line 2040) | async firstUpdated(){this.areas=await Ze(this.hass),this.sensors=await F...
  method render (line 2040) | render(){const e={checkbox:{width:"48px",renderer:e=>q`
  method toggleSelect (line 2071) | toggleSelect(e,t){const a=e.target.checked;this.addSelection=a&&!this.ad...
  method addSelected (line 2071) | addSelected(e){if(!this.hass)return;const t=Object.values(this.areas).ma...
  method getTableFilterOptions (line 2071) | getTableFilterOptions(){return{isSupportedType:{name:gi("panels.sensors....
  method firstUpdated (line 2071) | firstUpdated(){(async()=>{await Ie()})()}
  method render (line 2071) | render(){var e,t;if(!this.hass)return q``;if(this.path.params.edit)retur...
  method constructor (line 2085) | constructor(){super(...arguments),this.data={can_arm:!0,can_disarm:!0,is...
  method firstUpdated (line 2085) | async firstUpdated(){if(this.users=await Ve(this.hass),this.areas=await ...
  method render (line 2085) | render(){var e;return this.users?q`
  method getAreaOptions (line 2245) | getAreaOptions(){let e=Object.keys(this.areas||{}).map(e=>Object({value:...
  method toggleSelectArea (line 2245) | toggleSelectArea(e,t){if((this.data.area_limit||[]).length<=1&&!t)return...
  method deleteClick (line 2245) | deleteClick(e){var t,a;this.item&&(t=this.hass,a=this.item,t.callApi("PO...
  method saveClick (line 2245) | saveClick(e){var t,a,i;let s=Object.assign({},this.data);(null===(t=s.na...
  method cancelClick (line 2245) | cancelClick(){Pe(0,Ui("codes"),!0)}
  method styles (line 2245) | static get styles(){return o`
  method constructor (line 2258) | constructor(){super(...arguments),this.users={}}
  method hassSubscribe (line 2258) | hassSubscribe(){return this._fetchData(),[this.hass.connection.subscribe...
  method _fetchData (line 2258) | async _fetchData(){if(!this.hass)return;const e=await Ge(this.hass);this...
  method render (line 2258) | render(){return this.hass&&this.data?"new_user"==this.path.subpage?q`
  method usersPanel (line 2321) | usersPanel(){if(!this.hass)return q``;const e=Object.values(this.users);...
  method addUserClick (line 2349) | addUserClick(){Pe(0,Ui("codes","new_user"),!0)}
  method saveData (line 2349) | saveData(e){this.hass&&(this.data=Object.assign(Object.assign({},this.da...
  method toggleEnabled (line 2349) | toggleEnabled(e,t){const a=e.target.checked;Qe(this.hass,{user_id:t,enab...
  method constructor (line 2349) | constructor(){super(...arguments),this.items=[],this.value=[],this.label...
  method shouldUpdate (line 2349) | shouldUpdate(e){return e.get("items")&&(Mi(this.items,e.get("items"))||t...
  method firstUpdated (line 2349) | firstUpdated(){this.value.some(e=>!this.items.map(e=>e.value).includes(e...
  method render (line 2349) | render(){return q`
  method _removeClick (line 2373) | _removeClick(e){this.value=this.value.filter(t=>t!==e),De(this,"value-ch...
  method _addClick (line 2373) | _addClick(e){e.stopPropagation();const t=e.target,a=t.value;this.value.i...
  method styles (line 2373) | static get styles(){return o`
  method constructor (line 2419) | constructor(){super(...arguments),this.config={type:wi.Notification,trig...
  method firstUpdated (line 2419) | async firstUpdated(){if(await Ue(),this.areas=await Ze(this.hass),this.a...
  method render (line 2419) | render(){var e,t,a,i;return this.hass&&this.areas&&this.alarmoConfig?q`
  method _setEvent (line 2692) | _setEvent(e){e.stopPropagation();const t=e.detail.value;let a=this.confi...
  method _setArea (line 2692) | _setArea(e){var t;e.stopPropagation();const a=e.detail.value;let i=this....
  method _setModes (line 2692) | _setModes(e){e.stopPropagation();const t=e.detail.value;let a=this.confi...
  method _setService (line 2692) | _setService(e){e.stopPropagation();const t=String(e.detail.value);let a=...
  method _setTitle (line 2692) | _setTitle(e){e.stopPropagation();const t=e.target.value;let a=this.confi...
  method _setEntity (line 2692) | _setEntity(e){e.stopPropagation();const t=e.target.value;let a=this.conf...
  method _setMessage (line 2692) | _setMessage(e){let t=this.config.actions;Object.assign(t,{0:Object.assig...
  method _setName (line 2692) | _setName(e){e.stopPropagation();const t=e.target.value;this.config=Objec...
  method _setYaml (line 2692) | _setYaml(e){const t=e.detail.value;let a={};an(null==t?void 0:t.service)...
  method _validateConfig (line 2692) | _validateConfig(){var e;this.errors={};const t=this._parseAutomation(),a...
  method _validAction (line 2692) | _validAction(){var e;const t=this._parseAutomation().actions[0];return t...
  method _insertWildCard (line 2692) | _insertWildCard(e){var t;const a=this.shadowRoot.querySelector("#message...
  method _toggleYamlMode (line 2692) | _toggleYamlMode(){if(this.viewMode=this.viewMode==nn.UI?nn.Yaml:nn.UI,th...
  method _namePlaceholder (line 2692) | _namePlaceholder(){const e=this.config.triggers[0].event,t=this.config.a...
  method _messagePlaceholder (line 2692) | _messagePlaceholder(){const e=this.config.triggers[0].event;return e?gi(...
  method _parseAutomation (line 2692) | _parseAutomation(){var e;let t=Object.assign({},this.config),a=t.actions...
  method _getOpenSensorsFormat (line 2692) | _getOpenSensorsFormat(e=!1){var t;const a=((null===(t=this.config.action...
  method _setOpenSensorsFormat (line 2692) | _setOpenSensorsFormat(e){var t;e.stopPropagation();const a=String(e.deta...
  method _getArmModeFormat (line 2692) | _getArmModeFormat(e=!1){var t;const a=((null===(t=this.config.actions[0]...
  method _setArmModeFormat (line 2692) | _setArmModeFormat(e){var t;e.stopPropagation();const a=String(e.detail.v...
  method _saveClick (line 2692) | _saveClick(e){if(!this._validateConfig())return;let t=this._parseAutomat...
  method _deleteClick (line 2692) | _deleteClick(e){var t;(null===(t=this.item)||void 0===t?void 0:t.automat...
  method _testClick (line 2692) | _testClick(e){const t=this._parseAutomation().actions[0],[a,i]=t.service...
  method _cancelClick (line 2692) | _cancelClick(){Pe(0,Ui("actions"),!0)}
  method styles (line 2692) | static get styles(){return o`
  method constructor (line 2764) | constructor(){super(...arguments),this.config={type:wi.Action,triggers:[...
  method firstUpdated (line 2764) | async firstUpdated(){if(await Ue(),this.areas=await Ze(this.hass),this.a...
  method render (line 2764) | render(){var e;return this.hass&&this.areas&&this.alarmoConfig?q`
  method renderActions (line 2951) | renderActions(){let e=this.config.actions.map(e=>e.entity_id),t=Ks(e,thi...
  method _selectedAction (line 2958) | _selectedAction(){let e=this.config.actions.map(e=>e.service);return e.e...
  method _setEvent (line 2958) | _setEvent(e){e.stopPropagation();const t=e.detail.value;let a=this.confi...
  method _setArea (line 2958) | _setArea(e){var t;e.stopPropagation();const a=e.detail.value;let i=this....
  method _setModes (line 2958) | _setModes(e){e.stopPropagation();const t=e.detail.value,a=this.config.tr...
  method _setEntity (line 2958) | _setEntity(e){e.stopPropagation();const t=e.detail.value;let a=this.conf...
  method _setAction (line 2958) | _setAction(e){let t=this.config.actions,a=this.config.actions.map(e=>e.e...
  method _setName (line 2958) | _setName(e){e.stopPropagation();const t=e.target.value;this.config=Objec...
  method _setYaml (line 2958) | _setYaml(e){let t=e.detail.value,a=[{}];var i;tn(t)&&(t=[t]),"object"==t...
  method _validateConfig (line 2958) | _validateConfig(){this.errors={};const e=this._parseAutomation(),t=e.tri...
  method _validAction (line 2958) | _validAction(){const e=this._parseAutomation(),t=e.actions.map(e=>e.serv...
  method _toggleYamlMode (line 2958) | _toggleYamlMode(){this.viewMode=this.viewMode==on.UI?on.Yaml:on.UI,this....
  method _namePlaceholder (line 2958) | _namePlaceholder(){var e,t,a,i;if(!this._validAction)return"";const s=th...
  method _getEntities (line 2958) | _getEntities(){return Ei(this.config.actions.map(e=>e.entity_id).filter(...
  method _hasCustomEntities (line 2958) | _hasCustomEntities(){return this._getEntities().some(e=>!Qs(this.hass).i...
  method _parseAutomation (line 2958) | _parseAutomation(){let e=Object.assign({},this.config);return!Zs(e.name)...
  method _saveClick (line 2958) | _saveClick(e){if(!this._validateConfig())return;let t=this._parseAutomat...
  method _deleteClick (line 2958) | _deleteClick(e){var t;(null===(t=this.item)||void 0===t?void 0:t.automat...
  method _testClick (line 2958) | _testClick(e){this._parseAutomation().actions.forEach(t=>{const[a,i]=t.s...
  method _cancelClick (line 2958) | _cancelClick(){Pe(0,Ui("actions"),!0)}
  method styles (line 2958) | static get styles(){return o`
  method constructor (line 3038) | constructor(){super(...arguments),this.areas={},this.getAreaForAutomatio...
  method hassSubscribe (line 3038) | hassSubscribe(){return this._fetchData(),[this.hass.connection.subscribe...
  method _fetchData (line 3038) | async _fetchData(){if(!this.hass)return;const e=await He(this.hass);this...
  method firstUpdated (line 3038) | firstUpdated(){var e;this.path.filter&&(this.selectedArea=null===(e=this...
  method render (line 3038) | render(){if(!this.hass||!this.automations||!this.config)return q``;if("n...
  method toggleEnable (line 3109) | toggleEnable(e,t){We(this.hass,{automation_id:t,enabled:!e.target.checke...
  method getTableFilterOptions (line 3109) | getTableFilterOptions(){if(!this.hass)return;let e=Object.values(this.ar...
  method addNotificationClick (line 3109) | addNotificationClick(){Pe(0,Ui("actions","new_notification"),!0)}
  method addActionClick (line 3109) | addActionClick(){Pe(0,Ui("actions","new_action"),!0)}
  method firstUpdated (line 3109) | async firstUpdated(){window.addEventListener("location-changed",()=>{thi...
  method render (line 3109) | render(){if(!customElements.get("ha-app-layout")||!this.userConfig)retur...
  method getView (line 3147) | getView(e){switch(e.page){case"general":return q`
  method handlePageSelected (line 3161) | handlePageSelected(e){const t=e.detail.item.getAttribute("page-name");t!...
  method styles (line 3161) | static get styles(){return o`

FILE: custom_components/alarmo/helpers.py
  function friendly_name_for_entity_id (line 12) | def friendly_name_for_entity_id(entity_id: str, hass: HomeAssistant):
  function omit (line 21) | def omit(obj: dict, blacklisted_keys: list):

FILE: custom_components/alarmo/mqtt.py
  class MqttHandler (line 29) | class MqttHandler:
    method __init__ (line 30) | def __init__(self, hass: HomeAssistant):
    method __del__ (line 158) | def __del__(self):
    method _async_subscribe_topics (line 165) | async def _async_subscribe_topics(self):
    method async_message_received (line 186) | async def async_message_received(self, msg):

FILE: custom_components/alarmo/panel.py
  function async_register_panel (line 22) | async def async_register_panel(hass):
  function async_unregister_panel (line 45) | def async_unregister_panel(hass):

FILE: custom_components/alarmo/sensors.py
  function parse_sensor_state (line 76) | def parse_sensor_state(state):
  function sensor_state_allowed (line 89) | def sensor_state_allowed(state, sensor_config, alarm_state):
  class SensorHandler (line 120) | class SensorHandler:
    method __init__ (line 121) | def __init__(self, hass: HomeAssistant):
    method __del__ (line 154) | def __del__(self):
    method async_watch_sensor_states (line 162) | def async_watch_sensor_states(self, area_id: str = None, old_state: st...
    method active_sensors_for_alarm_state (line 193) | def active_sensors_for_alarm_state(self, area_id: str, state: str = No...
    method validate_arming_event (line 213) | def validate_arming_event(self, area_id: str, target_state: str = None...
    method async_sensor_state_changed (line 251) | async def async_sensor_state_changed(self, entity, old_state, new_state):
    method start_arm_timer (line 317) | def start_arm_timer(self, entity):
    method stop_arm_timer (line 336) | def stop_arm_timer(self, entity=None):
    method process_group_event (line 345) | def process_group_event(self, entity: str, state: str) -> dict:

FILE: custom_components/alarmo/store.py
  class ModeEntry (line 39) | class ModeEntry:
  class MqttConfig (line 49) | class MqttConfig:
  class MasterConfig (line 62) | class MasterConfig:
  class AreaEntry (line 70) | class AreaEntry:
  class Config (line 85) | class Config:
  class SensorEntry (line 97) | class SensorEntry:
  class UserEntry (line 116) | class UserEntry:
  class AlarmoTriggerEntry (line 132) | class AlarmoTriggerEntry:
  class EntityTriggerEntry (line 141) | class EntityTriggerEntry:
  class ActionEntry (line 149) | class ActionEntry:
  class AutomationEntry (line 158) | class AutomationEntry:
  class SensorGroupEntry (line 170) | class SensorGroupEntry:
  function parse_automation_entry (line 180) | def parse_automation_entry(data: dict):
  class MigratableStore (line 203) | class MigratableStore(Store):
    method _async_migrate_func (line 204) | async def _async_migrate_func(self, old_version, data: dict):
  class AlarmoStorage (line 296) | class AlarmoStorage:
    method __init__ (line 299) | def __init__(self, hass: HomeAssistant) -> None:
    method async_load (line 310) | async def async_load(self) -> None:
    method async_factory_default (line 381) | async def async_factory_default(self):
    method async_schedule_save (line 403) | def async_schedule_save(self) -> None:
    method async_save (line 407) | async def async_save(self) -> None:
    method _data_to_save (line 412) | def _data_to_save(self) -> dict:
    method async_delete (line 436) | async def async_delete(self):
    method async_get_config (line 449) | def async_get_config(self):
    method async_update_config (line 453) | def async_update_config(self, changes: dict):
    method async_update_mode_config (line 462) | def async_update_mode_config(self, mode: str, changes: dict):
    method async_get_area (line 478) | def async_get_area(self, area_id) -> AreaEntry:
    method async_get_areas (line 484) | def async_get_areas(self):
    method async_create_area (line 492) | def async_create_area(self, data: dict) -> AreaEntry:
    method async_delete_area (line 501) | def async_delete_area(self, area_id: str) -> None:
    method async_update_area (line 510) | def async_update_area(self, area_id: str, changes: dict) -> AreaEntry:
    method async_get_sensor (line 518) | def async_get_sensor(self, entity_id) -> SensorEntry:
    method async_get_sensors (line 524) | def async_get_sensors(self):
    method async_create_sensor (line 532) | def async_create_sensor(self, entity_id: str, data: dict) -> SensorEntry:
    method async_delete_sensor (line 542) | def async_delete_sensor(self, entity_id: str) -> None:
    method async_update_sensor (line 551) | def async_update_sensor(self, entity_id: str, changes: dict) -> Sensor...
    method async_get_user (line 559) | def async_get_user(self, user_id) -> UserEntry:
    method async_get_users (line 565) | def async_get_users(self):
    method async_create_user (line 573) | def async_create_user(self, data: dict) -> UserEntry:
    method async_delete_user (line 582) | def async_delete_user(self, user_id: str) -> None:
    method async_update_user (line 591) | def async_update_user(self, user_id: str, changes: dict) -> UserEntry:
    method async_get_automations (line 599) | def async_get_automations(self):
    method async_create_automation (line 607) | def async_create_automation(self, data: dict) -> AutomationEntry:
    method async_delete_automation (line 616) | def async_delete_automation(self, automation_id: str) -> None:
    method async_update_automation (line 625) | def async_update_automation(self, automation_id: str, changes: dict) -...
    method async_get_sensor_group (line 633) | def async_get_sensor_group(self, group_id) -> SensorGroupEntry:
    method async_get_sensor_groups (line 639) | def async_get_sensor_groups(self):
    method async_create_sensor_group (line 647) | def async_create_sensor_group(self, data: dict) -> SensorGroupEntry:
    method async_delete_sensor_group (line 656) | def async_delete_sensor_group(self, group_id: str) -> None:
    method async_update_sensor_group (line 665) | def async_update_sensor_group(self, group_id: str, changes: dict) -> S...
  function async_get_registry (line 674) | async def async_get_registry(hass: HomeAssistant) -> AlarmoStorage:

FILE: custom_components/alarmo/websockets.py
  function handle_subscribe_updates (line 79) | async def handle_subscribe_updates(hass, connection, msg):
  class AlarmoConfigView (line 97) | class AlarmoConfigView(HomeAssistantView):
    method post (line 147) | async def post(self, request, data):
  class AlarmoAreaView (line 156) | class AlarmoAreaView(HomeAssistantView):
    method post (line 185) | async def post(self, request, data):
  class AlarmoSensorView (line 199) | class AlarmoSensorView(HomeAssistantView):
    method post (line 235) | async def post(self, request, data):
  class AlarmoUserView (line 246) | class AlarmoUserView(HomeAssistantView):
    method post (line 271) | async def post(self, request, data):
  class AlarmoAutomationView (line 284) | class AlarmoAutomationView(HomeAssistantView):
    method post (line 335) | async def post(self, request, data):
  class AlarmoSensorGroupView (line 348) | class AlarmoSensorGroupView(HomeAssistantView):
    method post (line 370) | async def post(self, request, data):
  function websocket_get_config (line 384) | def websocket_get_config(hass, connection, msg):
  function websocket_get_areas (line 392) | def websocket_get_areas(hass, connection, msg):
  function websocket_get_sensors (line 400) | def websocket_get_sensors(hass, connection, msg):
  function websocket_get_users (line 411) | def websocket_get_users(hass, connection, msg):
  function websocket_get_automations (line 419) | def websocket_get_automations(hass, connection, msg):
  function websocket_get_alarm_entities (line 427) | def websocket_get_alarm_entities(hass, connection, msg):
  function websocket_get_sensor_groups (line 445) | def websocket_get_sensor_groups(hass, connection, msg):
  function websocket_get_countdown (line 453) | def websocket_get_countdown(hass, connection, msg):
  function async_register_websockets (line 467) | async def async_register_websockets(hass):

FILE: custom_components/hacs/__init__.py
  function async_initialize_integration (line 40) | async def async_initialize_integration(
  function async_setup (line 215) | async def async_setup(hass: HomeAssistant, config: dict[str, Any]) -> bool:
  function async_setup_entry (line 220) | async def async_setup_entry(hass: HomeAssistant, config_entry: ConfigEnt...
  function async_unload_entry (line 228) | async def async_unload_entry(hass: HomeAssistant, config_entry: ConfigEn...
  function async_reload_entry (line 263) | async def async_reload_entry(hass: HomeAssistant, config_entry: ConfigEn...

FILE: custom_components/hacs/base.py
  class RemovedRepository (line 68) | class RemovedRepository:
    method update_data (line 77) | def update_data(self, data: dict):
    method to_json (line 90) | def to_json(self):
  class HacsConfiguration (line 102) | class HacsConfiguration:
    method to_json (line 128) | def to_json(self) -> str:
    method update_from_dict (line 132) | def update_from_dict(self, data: dict) -> None:
  class HacsCore (line 142) | class HacsCore:
  class HacsCommon (line 151) | class HacsCommon:
  class HacsStatus (line 162) | class HacsStatus:
  class HacsSystem (line 170) | class HacsSystem:
    method disabled (line 179) | def disabled(self) -> bool:
  class HacsRepositories (line 185) | class HacsRepositories:
    method list_all (line 195) | def list_all(self) -> list[HacsRepository]:
    method list_removed (line 200) | def list_removed(self) -> list[RemovedRepository]:
    method list_downloaded (line 205) | def list_downloaded(self) -> list[HacsRepository]:
    method register (line 209) | def register(self, repository: HacsRepository, default: bool = False) ...
    method unregister (line 228) | def unregister(self, repository: HacsRepository) -> None:
    method mark_default (line 247) | def mark_default(self, repository: HacsRepository) -> None:
    method set_repository_id (line 259) | def set_repository_id(self, repository, repo_id):
    method is_default (line 272) | def is_default(self, repository_id: str | None = None) -> bool:
    method is_registered (line 278) | def is_registered(
    method is_downloaded (line 290) | def is_downloaded(
    method get_by_id (line 304) | def get_by_id(self, repository_id: str | None) -> HacsRepository | None:
    method get_by_full_name (line 310) | def get_by_full_name(self, repository_full_name: str | None) -> HacsRe...
    method is_removed (line 316) | def is_removed(self, repository_full_name: str) -> bool:
    method removed_repository (line 322) | def removed_repository(self, repository_full_name: str) -> RemovedRepo...
  class HacsBase (line 337) | class HacsBase:
    method integration_dir (line 362) | def integration_dir(self) -> pathlib.Path:
    method set_stage (line 366) | def set_stage(self, stage: HacsStage | None) -> None:
    method disable_hacs (line 376) | def disable_hacs(self, reason: HacsDisabledReason) -> None:
    method enable_hacs (line 393) | def enable_hacs(self) -> None:
    method enable_hacs_category (line 399) | def enable_hacs_category(self, category: HacsCategory) -> None:
    method disable_hacs_category (line 405) | def disable_hacs_category(self, category: HacsCategory) -> None:
    method async_save_file (line 411) | async def async_save_file(self, file_path: str, content: Any) -> bool:
    method async_can_update (line 447) | async def async_can_update(self) -> int:
    method async_github_get_hacs_default_file (line 465) | async def async_github_get_hacs_default_file(self, filename: str) -> l...
    method async_github_api_method (line 477) | async def async_github_api_method(
    method async_register_repository (line 507) | async def async_register_repository(
    method startup_tasks (line 584) | async def startup_tasks(self, _=None) -> None:
    method async_download_file (line 676) | async def async_download_file(self, url: str, *, headers: dict | None ...
    method async_recreate_entities (line 722) | async def async_recreate_entities(self) -> None:
    method async_dispatch (line 739) | def async_dispatch(self, signal: HacsDispatchEvent, data: dict | None ...
    method set_active_categories (line 743) | def set_active_categories(self) -> None:
    method async_get_all_category_repositories (line 760) | async def async_get_all_category_repositories(self, _=None) -> None:
    method async_get_category_repositories (line 772) | async def async_get_category_repositories(self, category: HacsCategory...
    method async_update_all_repositories (line 804) | async def async_update_all_repositories(self, _=None) -> None:
    method async_check_rate_limit (line 817) | async def async_check_rate_limit(self, _=None) -> None:
    method async_prosess_queue (line 829) | async def async_prosess_queue(self, _=None) -> None:
    method async_handle_removed_repositories (line 861) | async def async_handle_removed_repositories(self, _=None) -> None:
    method async_update_downloaded_repositories (line 899) | async def async_update_downloaded_repositories(self, _=None) -> None:
    method async_handle_critical_repositories (line 911) | async def async_handle_critical_repositories(self, _=None) -> None:

FILE: custom_components/hacs/config_flow.py
  class HacsFlowHandler (line 20) | class HacsFlowHandler(config_entries.ConfigFlow, domain=DOMAIN):
    method __init__ (line 26) | def __init__(self):
    method async_step_user (line 36) | async def async_step_user(self, user_input):
    method async_step_device (line 54) | async def async_step_device(self, _user_input):
    method _show_config_form (line 94) | async def _show_config_form(self, user_input):
    method async_step_device_done (line 120) | async def async_step_device_done(self, _user_input):
    method async_step_reauth (line 132) | async def async_step_reauth(self, user_input=None):
    method async_step_reauth_confirm (line 136) | async def async_step_reauth_confirm(self, user_input=None):
    method async_get_options_flow (line 148) | def async_get_options_flow(config_entry):
  class HacsOptionsFlowHandler (line 152) | class HacsOptionsFlowHandler(config_entries.OptionsFlow):
    method __init__ (line 155) | def __init__(self, config_entry):
    method async_step_init (line 159) | async def async_step_init(self, _user_input=None):
    method async_step_user (line 163) | async def async_step_user(self, user_input=None):

FILE: custom_components/hacs/diagnostics.py
  function async_get_config_entry_diagnostics (line 16) | async def async_get_config_entry_diagnostics(

FILE: custom_components/hacs/entity.py
  function system_info (line 19) | def system_info(hacs: HacsBase) -> dict:
  class HacsBaseEntity (line 32) | class HacsBaseEntity(Entity):
    method __init__ (line 38) | def __init__(self, hacs: HacsBase) -> None:
    method async_added_to_hass (line 42) | async def async_added_to_hass(self) -> None:
    method _update (line 53) | def _update(self) -> None:
    method async_update (line 56) | async def async_update(self) -> None:
    method _update_and_write_state (line 61) | def _update_and_write_state(self, _: Any) -> None:
  class HacsSystemEntity (line 67) | class HacsSystemEntity(HacsBaseEntity):
    method device_info (line 74) | def device_info(self) -> dict[str, any]:
  class HacsRepositoryEntity (line 79) | class HacsRepositoryEntity(HacsBaseEntity):
    method __init__ (line 82) | def __init__(
    method available (line 93) | def available(self) -> bool:
    method device_info (line 98) | def device_info(self) -> dict[str, any]:
    method _update_and_write_state (line 115) | def _update_and_write_state(self, data: dict) -> None:

FILE: custom_components/hacs/enums.py
  class HacsGitHubRepo (line 6) | class HacsGitHubRepo(str, Enum):
  class HacsCategory (line 13) | class HacsCategory(str, Enum):
    method __str__ (line 23) | def __str__(self):
  class HacsDispatchEvent (line 27) | class HacsDispatchEvent(str, Enum):
  class RepositoryFile (line 40) | class RepositoryFile(str, Enum):
  class ConfigurationType (line 47) | class ConfigurationType(str, Enum):
  class LovelaceMode (line 52) | class LovelaceMode(str, Enum):
  class HacsStage (line 61) | class HacsStage(str, Enum):
  class HacsDisabledReason (line 69) | class HacsDisabledReason(str, Enum):

FILE: custom_components/hacs/exceptions.py
  class HacsException (line 4) | class HacsException(Exception):
  class HacsRepositoryArchivedException (line 8) | class HacsRepositoryArchivedException(HacsException):
  class HacsNotModifiedException (line 12) | class HacsNotModifiedException(HacsException):
  class HacsExpectedException (line 16) | class HacsExpectedException(HacsException):
  class HacsRepositoryExistException (line 20) | class HacsRepositoryExistException(HacsException):
  class HacsExecutionStillInProgress (line 24) | class HacsExecutionStillInProgress(HacsException):
  class AddonRepositoryException (line 28) | class AddonRepositoryException(HacsException):
    method __init__ (line 36) | def __init__(self) -> None:
  class HomeAssistantCoreRepositoryException (line 40) | class HomeAssistantCoreRepositoryException(HacsException):
    method __init__ (line 48) | def __init__(self) -> None:

FILE: custom_components/hacs/frontend.py
  function async_register_frontend (line 21) | def async_register_frontend(hass: HomeAssistant, hacs: HacsBase) -> None:
  class HacsFrontendDev (line 80) | class HacsFrontendDev(HomeAssistantView):
    method get (line 87) | async def get(self, request, requested_file):  # pylint: disable=unuse...

FILE: custom_components/hacs/hacs_frontend/__init__.py
  function locate_dir (line 4) | def locate_dir():

FILE: custom_components/hacs/hacs_frontend/c.004a7b01.js
  function t (line 1) | function t(t,e){var n=-1;return t.some((function(t,r){return t[0]===e&&(...
  function e (line 1) | function e(){this.__entries__=[]}
  function t (line 1) | function t(){this.connected_=!1,this.mutationEventsAdded_=!1,this.mutati...
  function u (line 1) | function u(t){return parseFloat(t)||0}
  function f (line 1) | function f(t){for(var e=[],n=1;n<arguments.length;n++)e[n-1]=arguments[n...
  function d (line 1) | function d(t){var e=t.clientWidth,n=t.clientHeight;if(!e&&!n)return h;va...
  function v (line 1) | function v(t){return e?p(t)?function(t){var e=t.getBBox();return l(0,0,e...
  function l (line 1) | function l(t,e,n,r){return{x:t,y:e,width:n,height:r}}
  function t (line 1) | function t(t){this.broadcastWidth=0,this.broadcastHeight=0,this.contentR...
  function e (line 1) | function e(e,n,r){if(this.activeObservations_=[],this.observations_=new ...

FILE: custom_components/hacs/hacs_frontend/c.01f18260.js
  function o (line 1) | function o(e){var i=c.call(this,t(t({},o.defaultAdapter),e))||this;retur...
  class N (line 1) | class N extends d{constructor(){super(...arguments),this.mdcFoundationCl...
    method constructor (line 1) | constructor(){super(...arguments),this.mdcFoundationClass=z,this.absol...
    method render (line 1) | render(){const e={"mdc-menu-surface--fixed":this.fixed,"mdc-menu-surfa...
    method createAdapter (line 9) | createAdapter(){return Object.assign(Object.assign({},m(this.mdcRoot))...
    method onKeydown (line 9) | onKeydown(e){this.mdcFoundation&&this.mdcFoundation.handleKeydown(e)}
    method onBodyClick (line 9) | onBodyClick(e){if(this.stayOpenOnBodyClick)return;-1===e.composedPath(...
    method registerBodyClick (line 9) | registerBodyClick(){this.onBodyClickBound=this.onBodyClick.bind(this),...
    method deregisterBodyClick (line 9) | deregisterBodyClick(){document.body.removeEventListener("click",this.o...
    method close (line 9) | close(){this.open=!1}
    method show (line 9) | show(){this.open=!0}
  function c (line 9) | function c(e){var o=i.call(this,t(t({},c.defaultAdapter),e))||this;retur...
  class W (line 9) | class W extends d{constructor(){super(...arguments),this.mdcFoundationCl...
    method constructor (line 9) | constructor(){super(...arguments),this.mdcFoundationClass=j,this.listE...
    method listElement (line 9) | get listElement(){return this.listElement_||(this.listElement_=this.re...
    method items (line 9) | get items(){const e=this.listElement;return e?e.items:[]}
    method index (line 9) | get index(){const e=this.listElement;return e?e.index:-1}
    method selected (line 9) | get selected(){const e=this.listElement;return e?e.selected:null}
    method render (line 9) | render(){const e="menu"===this.innerRole?"menuitem":"option";return s`
    method createAdapter (line 39) | createAdapter(){return{addClassToElementAtIndex:(e,t)=>{const i=this.l...
    method onKeydown (line 39) | onKeydown(e){this.mdcFoundation&&this.mdcFoundation.handleKeydown(e)}
    method onAction (line 39) | onAction(e){const t=this.listElement;if(this.mdcFoundation&&t){const i...
    method onOpened (line 39) | onOpened(){this.open=!0,this.mdcFoundation&&this.mdcFoundation.handleM...
    method onClosed (line 39) | onClosed(){this.open=!1}
    method getUpdateComplete (line 39) | async getUpdateComplete(){await this._listUpdateComplete;return await ...
    method firstUpdated (line 39) | async firstUpdated(){super.firstUpdated();const e=this.listElement;e&&...
    method select (line 39) | select(e){const t=this.listElement;t&&t.select(e)}
    method close (line 39) | close(){this.open=!1}
    method show (line 39) | show(){this.open=!0}
    method getFocusedItemIndex (line 39) | getFocusedItemIndex(){const e=this.listElement;return e?e.getFocusedIt...
    method focusItemAtIndex (line 39) | focusItemAtIndex(e){const t=this.listElement;t&&t.focusItemAtIndex(e)}
    method layout (line 39) | layout(e=!0){const t=this.listElement;t&&t.layout(e)}
  class Y (line 39) | class Y extends d{constructor(){super(...arguments),this.disabled=!1,thi...
    method constructor (line 39) | constructor(){super(...arguments),this.disabled=!1,this.containingForm...
    method findFormElement (line 39) | findFormElement(){if(!this.shadowRoot||Q)return null;const e=this.getR...
    method connectedCallback (line 39) | connectedCallback(){var e;super.connectedCallback(),this.containingFor...
    method disconnectedCallback (line 39) | disconnectedCallback(){var e;super.disconnectedCallback(),null===(e=th...
    method click (line 39) | click(){this.formElement&&!this.disabled&&(this.formElement.focus(),th...
    method firstUpdated (line 39) | firstUpdated(){super.firstUpdated(),this.shadowRoot&&this.mdcRoot.addE...
  method constructor (line 39) | constructor(...t){super(...t),e(this)}
  class Z (line 89) | class Z extends Y{constructor(){super(...arguments),this.checked=!1,this...
    method constructor (line 89) | constructor(){super(...arguments),this.checked=!1,this.indeterminate=!...
    method createAdapter (line 89) | createAdapter(){return{}}
    method update (line 89) | update(e){const t=e.get("indeterminate"),i=e.get("checked"),c=e.get("d...
    method calculateAnimationStateName (line 89) | calculateAnimationStateName(e,t,i){return i?"disabled":t?"indeterminat...
    method renderRipple (line 89) | renderRipple(){return this.shouldRenderRipple?this.renderRippleTemplat...
    method renderRippleTemplate (line 89) | renderRippleTemplate(){return s`<mwc-ripple
    method render (line 91) | render(){const e=this.indeterminate||this.checked,t={"mdc-checkbox--di...
    method setFormData (line 125) | setFormData(e){this.name&&this.checked&&e.append(this.name,this.value)}
    method handleFocus (line 125) | handleFocus(){this.focused=!0,this.handleRippleFocus()}
    method handleBlur (line 125) | handleBlur(){this.focused=!1,this.handleRippleBlur()}
    method handleRippleMouseDown (line 125) | handleRippleMouseDown(e){const t=()=>{window.removeEventListener("mous...
    method handleRippleTouchStart (line 125) | handleRippleTouchStart(e){this.rippleHandlers.startPress(e)}
    method handleRippleDeactivate (line 125) | handleRippleDeactivate(){this.rippleHandlers.endPress()}
    method handleRippleMouseEnter (line 125) | handleRippleMouseEnter(){this.rippleHandlers.startHover()}
    method handleRippleMouseLeave (line 125) | handleRippleMouseLeave(){this.rippleHandlers.endHover()}
    method handleRippleFocus (line 125) | handleRippleFocus(){this.rippleHandlers.startFocus()}
    method handleRippleBlur (line 125) | handleRippleBlur(){this.rippleHandlers.endFocus()}
    method handleChange (line 125) | handleChange(){this.checked=this.formElement.checked,this.indeterminat...
    method resetAnimationClass (line 125) | resetAnimationClass(){this.animationClass=""}
    method isRippleActive (line 125) | get isRippleActive(){var e;return(null===(e=this.rippleElement)||void ...
  method constructor (line 125) | constructor(...t){super(...t),e(this)}
  function c (line 129) | function c(e){var o=i.call(this,t(t({},c.defaultAdapter),e))||this;retur...
  class oe (line 129) | class oe extends d{constructor(){super(...arguments),this.alignEnd=!1,th...
    method constructor (line 129) | constructor(){super(...arguments),this.alignEnd=!1,this.spaceBetween=!...
    method createAdapter (line 129) | createAdapter(){return{registerInteractionHandler:(e,t)=>{this.labelEl...
    method input (line 129) | get input(){var e,t;return null!==(t=null===(e=this.slottedInputs)||vo...
    method render (line 129) | render(){const e={"mdc-form-field--align-end":this.alignEnd,"mdc-form-...
    method click (line 134) | click(){this._labelClick()}
    method _labelClick (line 134) | _labelClick(){const e=this.input;e&&(e.focus(),e.click())}
  method constructor (line 134) | constructor(...t){super(...t),e(this)}

FILE: custom_components/hacs/hacs_frontend/c.063631e8.js
  function Wa (line 1) | function Wa(){Ua=!0,requestAnimationFrame((function(){Ua=!1,function(e){...
  function Ka (line 1) | function Ka(e){const t=e[0],i=e[1],a=e[2];try{i.apply(t,a)}catch(e){setT...
  function Ya (line 1) | function Ya(e){if(!e||"object"!=typeof e)return e;if("[object Date]"==Ob...
  class Xa (line 1) | class Xa extends TypeError{constructor(e,t){let i;const{message:a,...n}=...
    method constructor (line 1) | constructor(e,t){let i;const{message:a,...n}=e,{path:o}=e;super(0===o....
  function Ja (line 1) | function Ja(e){return"object"==typeof e&&null!=e}
  function en (line 1) | function en(e){return"string"==typeof e?JSON.stringify(e):""+e}
  function tn (line 1) | function tn(e,t,i,a){if(!0===e)return;!1===e?e={}:"string"==typeof e&&(e...
  class on (line 1) | class on{constructor(e){this.TYPE=void 0,this.type=void 0,this.schema=vo...
    method constructor (line 1) | constructor(e){this.TYPE=void 0,this.type=void 0,this.schema=void 0,th...
    method assert (line 1) | assert(e){return sn(e,this)}
    method create (line 1) | create(e){return function(e,t){const i=ln(e,t,{coerce:!0});if(i[0])thr...
    method is (line 1) | is(e){return rn(e,this)}
    method mask (line 1) | mask(e){return function(e,t){const i=ln(e,t,{coerce:!0,mask:!0});if(i[...
    method validate (line 1) | validate(e,t){return void 0===t&&(t={}),ln(e,this,t)}
  function sn (line 1) | function sn(e,t){const i=ln(e,t);if(i[0])throw i[0]}
  function rn (line 1) | function rn(e,t){return!ln(e,t)[0]}
  function ln (line 1) | function ln(e,t,i){void 0===i&&(i={});const a=nn(e,t,i),n=function(e){co...
  function dn (line 1) | function dn(){for(var e=arguments.length,t=new Array(e),i=0;i<e;i++)t[i]...
  function cn (line 1) | function cn(e,t){return new on({type:e,schema:null,validator:t})}
  function un (line 1) | function un(){return cn("any",(()=>!0))}
  function hn (line 1) | function hn(e){return new on({type:"array",schema:e,*entries(t){if(e&&Ar...
  function pn (line 1) | function pn(){return cn("boolean",(e=>"boolean"==typeof e))}
  function vn (line 1) | function vn(e){const t=en(e),i=typeof e;return new on({type:"literal",sc...
  function mn (line 1) | function mn(){return cn("number",(e=>"number"==typeof e&&!isNaN(e)||"Exp...
  function fn (line 1) | function fn(e){const t=e?Object.keys(e):[],i=cn("never",(()=>!1));return...
  function gn (line 1) | function gn(e){return new on({...e,validator:(t,i)=>void 0===t||e.valida...
  function _n (line 1) | function _n(){return cn("string",(e=>"string"==typeof e||"Expected a str...
  function yn (line 1) | function yn(e){const t=Object.keys(e);return new on({type:"type",schema:...
  function kn (line 1) | function kn(e){const t=e.map((e=>e.type)).join(" | ");return new on({typ...
  class Ln (line 1) | class Ln extends HTMLElement{static get version(){return"23.1.3"}}
    method version (line 1) | static get version(){return"23.1.3"}
  method properties (line 1) | static get properties(){return{theme:{type:String,reflectToAttribute:!0,...
  method __deprecatedThemePropertyChanged (line 1) | __deprecatedThemePropertyChanged(e){this._set_theme(e)}
  function Pn (line 1) | function Pn(e,i,a={}){var n;e&&(n=e,Nn(customElements.get(n))&&console.w...
  function Mn (line 1) | function Mn(){return window.Vaadin&&window.Vaadin.styleModules?window.Va...
  function Fn (line 1) | function Fn(e=""){let t=0;return 0===e.indexOf("lumo-")||0===e.indexOf("...
  function Dn (line 1) | function Dn(e){const t=[];return e.include&&[].concat(e.include).forEach...
  function Bn (line 1) | function Bn(e){const t=`${e}-default-theme`,i=Mn().filter((i=>i.moduleId...
  function Nn (line 1) | function Nn(e){return e&&Object.prototype.hasOwnProperty.call(e,"__theme...
  method finalize (line 1) | static finalize(){if(super.finalize(),this.elementStyles)return;const e=...
  method finalizeStyles (line 1) | static finalizeStyles(e){const t=this.getStylesForThis();return e?[...su...
  method getStylesForThis (line 1) | static getStylesForThis(){const e=Object.getPrototypeOf(this.prototype),...
  method constructor (line 304) | constructor(){super(),this.__controllers=new Set}
  method connectedCallback (line 304) | connectedCallback(){super.connectedCallback(),this.__controllers.forEach...
  method disconnectedCallback (line 304) | disconnectedCallback(){super.disconnectedCallback(),this.__controllers.f...
  method addController (line 304) | addController(e){this.__controllers.add(e),void 0!==this.$&&this.isConne...
  method removeController (line 304) | removeController(e){this.__controllers.delete(e)}
  class to (line 304) | class to{static detectScrollType(){const e=document.createElement("div")...
    method detectScrollType (line 304) | static detectScrollType(){const e=document.createElement("div");e.text...
    method getNormalizedScrollLeft (line 304) | static getNormalizedScrollLeft(e,t,i){const{scrollLeft:a}=i;if("rtl"!=...
    method setNormalizedScrollLeft (line 304) | static setNormalizedScrollLeft(e,t,i,a){if("rtl"===t&&e)switch(e){case...
  function no (line 304) | function no(e,t,i=e.getAttribute("dir")){t?e.setAttribute("dir",t):null!...
  function oo (line 304) | function oo(){return document.documentElement.getAttribute("dir")}
  method properties (line 304) | static get properties(){return{dir:{type:String,value:"",reflectToAttrib...
  method finalize (line 304) | static finalize(){super.finalize(),ao||(ao=to.detectScrollType())}
  method connectedCallback (line 304) | connectedCallback(){super.connectedCallback(),this.hasAttribute("dir")||...
  method attributeChangedCallback (line 304) | attributeChangedCallback(e,t,i){if(super.attributeChangedCallback(e,t,i)...
  method disconnectedCallback (line 304) | disconnectedCallback(){super.disconnectedCallback(),this.__subscribe(!1)...
  method _valueToNodeAttribute (line 304) | _valueToNodeAttribute(e,t,i){("dir"!==i||""!==t||e.hasAttribute("dir"))&...
  method _attributeToProperty (line 304) | _attributeToProperty(e,t,i){"dir"!==e||t?super._attributeToProperty(e,t,...
  method __subscribe (line 304) | __subscribe(e=!0){e?io.includes(this)||io.push(this):io.includes(this)&&...
  method __getNormalizedScrollLeft (line 304) | __getNormalizedScrollLeft(e){return to.getNormalizedScrollLeft(ao,this.g...
  method __setNormalizedScrollLeft (line 304) | __setNormalizedScrollLeft(e,t){return to.setNormalizedScrollLeft(ao,this...
  function ro (line 304) | function ro(e,t){const i=Math.max(e.tabIndex,0),a=Math.max(t.tabIndex,0)...
  function lo (line 304) | function lo(e){const t=e.length;if(t<2)return e;const i=Math.ceil(t/2);r...
  function co (line 304) | function co(e,t){if(e.nodeType!==Node.ELEMENT_NODE||function(e){const t=...
  function uo (line 304) | function uo(e){return e.getRootNode().activeElement===e}
  class po (line 304) | class po{constructor(e){this.host=e,this.__trapNode=null,this.__onKeyDow...
    method constructor (line 304) | constructor(e){this.host=e,this.__trapNode=null,this.__onKeyDown=this....
    method hostConnected (line 304) | hostConnected(){document.addEventListener("keydown",this.__onKeyDown)}
    method hostDisconnected (line 304) | hostDisconnected(){document.removeEventListener("keydown",this.__onKey...
    method trapFocus (line 304) | trapFocus(e){if(this.__trapNode=e,0===this.__focusableElements.length)...
    method releaseFocus (line 304) | releaseFocus(){this.__trapNode=null,ho.pop()}
    method __onKeyDown (line 304) | __onKeyDown(e){if(this.__trapNode&&this===Array.from(ho).pop()&&"Tab"=...
    method __focusNextElement (line 304) | __focusNextElement(e=!1){const t=this.__focusableElements,i=e?-1:1,a=t...
    method __focusableElements (line 304) | get __focusableElements(){return function(e){const t=[];return co(e,t)...
    method __focusedElementIndex (line 304) | get __focusedElementIndex(){const e=this.__focusableElements;return e....
  class vo (line 304) | class vo extends(Vn(so(eo(n)))){static get template(){return o`
    method template (line 304) | static get template(){return o`
    method is (line 376) | static get is(){return"vaadin-overlay"}
    method properties (line 376) | static get properties(){return{opened:{type:Boolean,notify:!0,observer...
    method observers (line 376) | static get observers(){return["_templateOrRendererChanged(template, re...
    method constructor (line 376) | constructor(){super(),this._boundMouseDownListener=this._mouseDownList...
    method ready (line 376) | ready(){super.ready(),this._observer.flush(),this.addEventListener("cl...
    method _detectIosNavbar (line 376) | _detectIosNavbar(){if(!this.opened)return;const e=window.innerHeight,t...
    method _setTemplateFromNodes (line 376) | _setTemplateFromNodes(e){this.template=e.filter((e=>e.localName&&"temp...
    method close (line 376) | close(e){const t=new CustomEvent("vaadin-overlay-close",{bubbles:!0,ca...
    method connectedCallback (line 376) | connectedCallback(){super.connectedCallback(),this._boundIosResizeList...
    method disconnectedCallback (line 376) | disconnectedCallback(){super.disconnectedCallback(),this._boundIosResi...
    method requestContentUpdate (line 376) | requestContentUpdate(){this.renderer&&this.renderer.call(this.owner,th...
    method _ironOverlayCanceled (line 376) | _ironOverlayCanceled(e){e.preventDefault()}
    method _mouseDownListener (line 376) | _mouseDownListener(e){this._mouseDownInside=e.composedPath().indexOf(t...
    method _mouseUpListener (line 376) | _mouseUpListener(e){this._mouseUpInside=e.composedPath().indexOf(this....
    method _outsideClickListener (line 376) | _outsideClickListener(e){if(e.composedPath().includes(this.$.overlay)|...
    method _keydownListener (line 376) | _keydownListener(e){if(this._last&&(!this.modeless||e.composedPath().i...
    method _ensureTemplatized (line 376) | _ensureTemplatized(){this._setTemplateFromNodes(Array.from(this.childr...
    method _openedChanged (line 376) | _openedChanged(e,t){var i,a,n;this._instance||this._ensureTemplatized(...
    method _hiddenChanged (line 376) | _hiddenChanged(e){e&&this.hasAttribute("closing")&&this._flushAnimatio...
    method _shouldAnimate (line 376) | _shouldAnimate(){const e=getComputedStyle(this).getPropertyValue("anim...
    method _enqueueAnimation (line 376) | _enqueueAnimation(e,t){const i=`__${e}Handler`,a=e=>{e&&e.target!==thi...
    method _flushAnimation (line 376) | _flushAnimation(e){const t=`__${e}Handler`;"function"==typeof this[t]&...
    method _animatedOpening (line 376) | _animatedOpening(){this.parentNode===document.body&&this.hasAttribute(...
    method _attachOverlay (line 376) | _attachOverlay(){this._placeholder=document.createComment("vaadin-over...
    method _finishOpening (line 376) | _finishOpening(){document.addEventListener("iron-overlay-canceled",thi...
    method _finishClosing (line 376) | _finishClosing(){document.removeEventListener("iron-overlay-canceled",...
    method _animatedClosing (line 376) | _animatedClosing(){if(this.hasAttribute("opening")&&this._flushAnimati...
    method _detachOverlay (line 376) | _detachOverlay(){this._placeholder.parentNode.insertBefore(this,this._...
    method __attachedInstances (line 376) | static get __attachedInstances(){return Array.from(document.body.child...
    method _last (line 376) | get _last(){return this===vo.__attachedInstances.pop()}
    method _modelessChanged (line 376) | _modelessChanged(e){e?(this._removeGlobalListeners(),this._exitModalSt...
    method _addGlobalListeners (line 376) | _addGlobalListeners(){document.addEventListener("mousedown",this._boun...
    method _enterModalState (line 376) | _enterModalState(){"none"!==document.body.style.pointerEvents&&(this._...
    method _removeGlobalListeners (line 376) | _removeGlobalListeners(){document.removeEventListener("mousedown",this...
    method _exitModalState (line 376) | _exitModalState(){void 0!==this._previousDocumentPointerEvents&&(docum...
    method _removeOldContent (line 376) | _removeOldContent(){this.content&&this._contentNodes&&(this._observer....
    method _stampOverlayTemplate (line 376) | _stampOverlayTemplate(e){this._removeOldContent(),e._Templatizer||(e._...
    method _removeNewRendererOrTemplate (line 376) | _removeNewRendererOrTemplate(e,t,i,a){e!==t?this.template=void 0:i!==a...
    method _templateOrRendererChanged (line 376) | _templateOrRendererChanged(e,t,i,a,n){if(e&&t)throw this._removeNewRen...
    method _getActiveElement (line 376) | _getActiveElement(){let e=document.activeElement||document.body;for(;e...
    method _deepContains (line 376) | _deepContains(e){if(this.contains(e))return!0;let t=e;const i=e.ownerD...
    method bringToFront (line 376) | bringToFront(){let e="";const t=vo.__attachedInstances.filter((e=>e!==...
  class _o (line 558) | class _o extends(Vn(so(n))){static get template(){return o`
    method template (line 558) | static get template(){return o`
    method is (line 572) | static get is(){return"vaadin-combo-box-item"}
    method properties (line 572) | static get properties(){return{index:Number,item:Object,label:String,s...
    method observers (line 572) | static get observers(){return["__rendererOrItemChanged(renderer, index...
    method connectedCallback (line 572) | connectedCallback(){super.connectedCallback(),this._comboBox=this.pare...
    method requestContentUpdate (line 572) | requestContentUpdate(){if(!this.renderer)return;const e={index:this.in...
    method __rendererOrItemChanged (line 572) | __rendererOrItemChanged(e,t,i){void 0!==i&&void 0!==t&&(this._oldRende...
    method __updateLabel (line 572) | __updateLabel(e,t){t||(this.textContent=e)}
  method properties (line 572) | static get properties(){return{positionTarget:{type:Object,value:null},h...
  method observers (line 572) | static get observers(){return["__positionSettingsChanged(horizontalAlign...
  method constructor (line 572) | constructor(){super(),this._updatePosition=this._updatePosition.bind(this)}
  method connectedCallback (line 572) | connectedCallback(){super.connectedCallback(),this.opened&&this.__addUpd...
  method disconnectedCallback (line 572) | disconnectedCallback(){super.disconnectedCallback(),this.__removeUpdateP...
  method __addUpdatePositionEventListeners (line 572) | __addUpdatePositionEventListeners(){window.addEventListener("resize",thi...
  method __removeUpdatePositionEventListeners (line 572) | __removeUpdatePositionEventListeners(){window.removeEventListener("resiz...
  method __overlayOpenedChanged (line 572) | __overlayOpenedChanged(e,t){if(this.__removeUpdatePositionEventListeners...
  method __isRTL (line 572) | get __isRTL(){return"rtl"===this.getAttribute("dir")}
  method __positionSettingsChanged (line 572) | __positionSettingsChanged(){this._updatePosition()}
  method _updatePosition (line 572) | _updatePosition(){if(!this.positionTarget||!this.opened)return;const e=t...
  method __shouldAlignStartHorizontally (line 572) | __shouldAlignStartHorizontally(e,t){const i=Math.max(this.__oldContentWi...
  method __shouldAlignStartVertically (line 572) | __shouldAlignStartVertically(e){const t=Math.max(this.__oldContentHeight...
  method __shouldAlignStart (line 572) | __shouldAlignStart(e,t,i,a,n,o,s){const r=i-e[o?s.end:s.start]-a[s.end],...
  method __calculatePositionInOneDimension (line 572) | __calculatePositionInOneDimension(e,t,i,a,n,o){const s=o?a.start:a.end,r...
  class $o (line 582) | class $o extends(bo(vo)){static get is(){return"vaadin-combo-box-overlay...
    method is (line 582) | static get is(){return"vaadin-combo-box-overlay"}
    method template (line 582) | static get template(){return xo||(xo=super.template.cloneNode(!0),xo.c...
    method observers (line 582) | static get observers(){return["_setOverlayWidth(positionTarget, opened...
    method connectedCallback (line 582) | connectedCallback(){super.connectedCallback();const e=this.__dataHost,...
    method ready (line 582) | ready(){super.ready();const e=document.createElement("div");e.setAttri...
    method _outsideClickListener (line 582) | _outsideClickListener(e){const t=e.composedPath();t.includes(this.posi...
    method _setOverlayWidth (line 582) | _setOverlayWidth(e,t){if(e&&t){const t=this.localName;this.style.setPr...
  method cancel (line 582) | cancel(e){window.clearTimeout(e)}
  method cancel (line 582) | cancel(e){window.clearTimeout(e)}
  method cancel (line 582) | cancel(e){window.cancelAnimationFrame(e)}
  method cancel (line 582) | cancel(e){window.cancelIdleCallback?window.cancelIdleCallback(e):window....
  method run (line 582) | run(e){Eo||(Eo=!0,zo.textContent=Io,Io+=1),Ao.push(e);const t=wo;return ...
  method cancel (line 582) | cancel(e){const t=e-Co;if(t>=0){if(!Ao[t])throw new Error(`invalid async...
  class Po (line 582) | class Po{static debounce(e,t,i){return e instanceof Po?e._cancelAsync():...
    method debounce (line 582) | static debounce(e,t,i){return e instanceof Po?e._cancelAsync():e=new P...
    method constructor (line 582) | constructor(){this._asyncModule=null,this._callback=null,this._timer=n...
    method setConfig (line 582) | setConfig(e,t){this._asyncModule=e,this._callback=t,this._timer=this._...
    method cancel (line 582) | cancel(){this.isActive()&&(this._cancelAsync(),Mo.delete(this))}
    method _cancelAsync (line 582) | _cancelAsync(){this.isActive()&&(this._asyncModule.cancel(this._timer)...
    method flush (line 582) | flush(){this.isActive()&&(this.cancel(),this._callback())}
    method isActive (line 582) | isActive(){return null!=this._timer}
  function Fo (line 582) | function Fo(){const e=Boolean(Mo.size);return Mo.forEach((e=>{try{e.flus...
  method _physicalBottom (line 582) | get _physicalBottom(){return this._physicalTop+this._physicalSize}
  method _scrollBottom (line 582) | get _scrollBottom(){return this._scrollPosition+this._viewportHeight}
  method _virtualEnd (line 582) | get _virtualEnd(){return this._virtualStart+this._physicalCount-1}
  method _hiddenContentSize (line 582) | get _hiddenContentSize(){return this._physicalSize-this._viewportHeight}
  method _maxScrollTop (line 582) | get _maxScrollTop(){return this._estScrollHeight-this._viewportHeight+th...
  method _maxVirtualStart (line 582) | get _maxVirtualStart(){const e=this._virtualCount;return Math.max(0,e-th...
  method _virtualStart (line 582) | get _virtualStart(){return this._virtualStartVal||0}
  method _virtualStart (line 582) | set _virtualStart(e){e=this._clamp(e,0,this._maxVirtualStart),this._virt...
  method _physicalStart (line 582) | get _physicalStart(){return this._physicalStartVal||0}
  method _physicalStart (line 582) | set _physicalStart(e){(e%=this._physicalCount)<0&&(e=this._physicalCount...
  method _physicalEnd (line 582) | get _physicalEnd(){return(this._physicalStart+this._physicalCount-1)%thi...
  method _physicalCount (line 582) | get _physicalCount(){return this._physicalCountVal||0}
  method _physicalCount (line 582) | set _physicalCount(e){this._physicalCountVal=e}
  method _optPhysicalSize (line 582) | get _optPhysicalSize(){return 0===this._viewportHeight?1/0:this._viewpor...
  method _isVisible (line 582) | get _isVisible(){return Boolean(this.offsetWidth||this.offsetHeight)}
  method firstVisibleIndex (line 582) | get firstVisibleIndex(){let e=this._firstVisibleIndexVal;if(null==e){let...
  method lastVisibleIndex (line 582) | get lastVisibleIndex(){let e=this._lastVisibleIndexVal;if(null==e){let t...
  method _scrollOffset (line 582) | get _scrollOffset(){return this._scrollerPaddingTop+this.scrollOffset}
  method _scrollHandler (line 582) | _scrollHandler(){const e=Math.max(0,Math.min(this._maxScrollTop,this._sc...
  method _getReusables (line 582) | _getReusables(e){let t,i,a;const n=[],o=this._hiddenContentSize*this._ra...
  method _update (line 582) | _update(e,t){if(!(e&&0===e.length||0===this._physicalCount)){if(this._as...
  method _isClientFull (line 582) | _isClientFull(){return 0!==this._scrollBottom&&this._physicalBottom-1>=t...
  method _increasePoolIfNeeded (line 582) | _increasePoolIfNeeded(e){const t=this._clamp(this._physicalCount+e,3,thi...
  method _render (line 582) | _render(){if(this.isAttached&&this._isVisible)if(0!==this._physicalCount...
  method _itemsChanged (line 582) | _itemsChanged(e){"items"===e.path&&(this._virtualStart=0,this._physicalT...
  method _iterateItems (line 582) | _iterateItems(e,t){let i,a,n,o;if(2===arguments.length&&t){for(o=0;o<t.l...
  method _computeVidx (line 582) | _computeVidx(e){return e>=this._physicalStart?this._virtualStart+(e-this...
  method _updateMetrics (line 582) | _updateMetrics(e){Do();let t=0,i=0;const a=this._physicalAverageCount,n=...
  method _positionItems (line 582) | _positionItems(){this._adjustScrollPosition();let e=this._physicalTop;th...
  method _getPhysicalSizeIncrement (line 582) | _getPhysicalSizeIncrement(e){return this._physicalSizes[e]}
  method _adjustScrollPosition (line 582) | _adjustScrollPosition(){const e=0===this._virtualStart?this._physicalTop...
  method _resetScrollPosition (line 582) | _resetScrollPosition(e){this.scrollTarget&&e>=0&&(this._scrollTop=e,this...
  method _updateScrollerSize (line 582) | _updateScrollerSize(e){this._estScrollHeight=this._physicalBottom+Math.m...
  method scrollToIndex (line 582) | scrollToIndex(e){if("number"!=typeof e||e<0||e>this.items.length-1)retur...
  method _resetAverage (line 582) | _resetAverage(){this._physicalAverage=0,this._physicalAverageCount=0}
  method _resizeHandler (line 582) | _resizeHandler(){this._debounce("_render",(()=>{this._firstVisibleIndexV...
  method _isIndexRendered (line 582) | _isIndexRendered(e){return e>=this._virtualStart&&e<=this._virtualEnd}
  method _getPhysicalIndex (line 582) | _getPhysicalIndex(e){return(this._physicalStart+(e-this._virtualStart))%...
  method _debounce (line 582) | _debounce(e,t,i){var a;this._debouncers=this._debouncers||{},this._debou...
  class jo (line 582) | class jo{constructor({createElements:e,updateElement:t,scrollTarget:i,sc...
    method constructor (line 582) | constructor({createElements:e,updateElement:t,scrollTarget:i,scrollCon...
    method scrollOffset (line 582) | get scrollOffset(){return 0}
    method adjustedFirstVisibleIndex (line 582) | get adjustedFirstVisibleIndex(){return this.firstVisibleIndex+this._vi...
    method adjustedLastVisibleIndex (line 582) | get adjustedLastVisibleIndex(){return this.lastVisibleIndex+this._vidx...
    method scrollToIndex (line 582) | scrollToIndex(e){if("number"!=typeof e||isNaN(e)||0===this.size||!this...
    method flush (line 582) | flush(){0!==this.scrollTarget.offsetHeight&&(this._resizeHandler(),Do(...
    method update (line 582) | update(e=0,t=this.size-1){this.__getVisibleElements().forEach((i=>{i._...
    method __updateElement (line 582) | __updateElement(e,t,i){e.style.paddingTop&&(e.style.paddingTop=""),thi...
    method __getIndexScrollOffset (line 582) | __getIndexScrollOffset(e){const t=this.__getVisibleElements().find((t=...
    method size (line 582) | get size(){return this.__size}
    method size (line 582) | set size(e){if(e===this.size)return;let t,i;if(this.__preventElementUp...
    method _scrollTop (line 582) | get _scrollTop(){return this.scrollTarget.scrollTop}
    method _scrollTop (line 582) | set _scrollTop(e){this.scrollTarget.scrollTop=e}
    method items (line 582) | get items(){return{length:Math.min(this.size,1e5)}}
    method offsetHeight (line 582) | get offsetHeight(){return this.scrollTarget.offsetHeight}
    method $ (line 582) | get $(){return{items:this.scrollContainer}}
    method updateViewportBoundaries (line 582) | updateViewportBoundaries(){const e=window.getComputedStyle(this.scroll...
    method setAttribute (line 582) | setAttribute(){}
    method _createPool (line 582) | _createPool(e){const t=this.createElements(e),i=document.createDocumen...
    method _assignModels (line 582) | _assignModels(e){this._iterateItems(((e,t)=>{const i=this._physicalIte...
    method _isClientFull (line 582) | _isClientFull(){return setTimeout((()=>this.__clientFull=!0)),this.__c...
    method translate3d (line 582) | translate3d(e,t,i,a){a.style.transform=`translateY(${t})`}
    method toggleScrollListener (line 582) | toggleScrollListener(){}
    method _scrollHandler (line 582) | _scrollHandler(){this._adjustVirtualIndexOffset(this._scrollTop-(this....
    method __onWheel (line 582) | __onWheel(e){if(e.ctrlKey||this._hasScrolledAncestor(e.target,e.deltaX...
    method _hasScrolledAncestor (line 582) | _hasScrolledAncestor(e,t,i){return e!==this.scrollTarget&&e!==this.scr...
    method _canScroll (line 582) | _canScroll(e,t,i){return i>0&&e.scrollTop<e.scrollHeight-e.offsetHeigh...
    method _getScrollLineHeight (line 582) | _getScrollLineHeight(){const e=document.createElement("div");e.style.f...
    method __getVisibleElements (line 582) | __getVisibleElements(){return Array.from(this.elementsContainer.childr...
    method __reorderElements (line 582) | __reorderElements(){if(this.__mouseDown)return void(this.__pendingReor...
    method _adjustVirtualIndexOffset (line 582) | _adjustVirtualIndexOffset(e){if(this._virtualCount>=this.size)this._vi...
  class qo (line 582) | class qo{constructor(e){this.__adapter=new jo(e)}get size(){return this....
    method constructor (line 582) | constructor(e){this.__adapter=new jo(e)}
    method size (line 582) | get size(){return this.__adapter.size}
    method size (line 582) | set size(e){this.__adapter.size=e}
    method scrollToIndex (line 582) | scrollToIndex(e){this.__adapter.scrollToIndex(e)}
    method update (line 582) | update(e=0,t=this.size-1){this.__adapter.update(e,t)}
    method flush (line 582) | flush(){this.__adapter.flush()}
    method firstVisibleIndex (line 582) | get firstVisibleIndex(){return this.__adapter.adjustedFirstVisibleIndex}
    method lastVisibleIndex (line 582) | get lastVisibleIndex(){return this.__adapter.adjustedLastVisibleIndex}
  method toString (line 582) | toString(){return""}
  class Uo (line 582) | class Uo extends n{static get is(){return"vaadin-combo-box-scroller"}sta...
    method is (line 582) | static get is(){return"vaadin-combo-box-scroller"}
    method template (line 582) | static get template(){return o`
    method properties (line 608) | static get properties(){return{items:{type:Array,observer:"__itemsChan...
    method constructor (line 608) | constructor(){super(),this.__boundOnItemClick=this.__onItemClick.bind(...
    method __openedChanged (line 608) | __openedChanged(e){e&&this.requestContentUpdate()}
    method ready (line 608) | ready(){super.ready(),this.__hostTagName=this.constructor.is.replace("...
    method requestContentUpdate (line 608) | requestContentUpdate(){this.__virtualizer&&this.__virtualizer.update()}
    method scrollIntoView (line 608) | scrollIntoView(e){if(!(this.opened&&e>=0))return;const t=this._visible...
    method __getAriaRole (line 608) | __getAriaRole(e){return void 0!==e&&"option"}
    method __getAriaSelected (line 608) | __getAriaSelected(e,t){return this.__isItemFocused(e,t).toString()}
    method __isItemFocused (line 608) | __isItemFocused(e,t){return e===t}
    method __isItemSelected (line 608) | __isItemSelected(e,t,i){return!(e instanceof Ro)&&(i&&void 0!==e&&void...
    method __itemsChanged (line 608) | __itemsChanged(e){this.__virtualizer&&e&&(this.__virtualizer.size=e.le...
    method __loadingChanged (line 608) | __loadingChanged(e){this.__virtualizer&&!e&&setTimeout((()=>this.reque...
    method __focusedIndexChanged (line 608) | __focusedIndexChanged(e,t){this.__virtualizer&&(e!==t&&this.requestCon...
    method __rendererChanged (line 608) | __rendererChanged(e,t){(e||t)&&this.requestContentUpdate()}
    method __createElements (line 608) | __createElements(e){return[...Array(e)].map((()=>{const e=document.cre...
    method __updateElement (line 608) | __updateElement(e,t){const i=this.items[t],a=this.focusedIndex;e.setPr...
    method __onItemClick (line 608) | __onItemClick(e){this.dispatchEvent(new CustomEvent("selection-changed...
    method __patchWheelOverScrolling (line 608) | __patchWheelOverScrolling(){this.$.selector.addEventListener("wheel",(...
    method _viewportTotalPaddingBottom (line 608) | get _viewportTotalPaddingBottom(){if(void 0===this._cachedViewportTota...
    method __requestItemByIndex (line 608) | __requestItemByIndex(e,t){return e instanceof Ro&&void 0!==t&&this.dis...
    method _visibleItemsCount (line 608) | _visibleItemsCount(){this.__virtualizer.scrollToIndex(this.__virtualiz...
  class Ho (line 608) | class Ho extends n{static get is(){return"vaadin-combo-box-dropdown"}sta...
    method is (line 608) | static get is(){return"vaadin-combo-box-dropdown"}
    method template (line 608) | static get template(){return o`
    method properties (line 620) | static get properties(){return{opened:Boolean,positionTarget:{type:Obj...
    method observers (line 620) | static get observers(){return["_openedOrItemsChanged(opened, _items, l...
    method constructor (line 620) | constructor(){super();const e=Ho._uniqueId=1+Ho._uniqueId||0;this.scro...
    method ready (line 620) | ready(){super.ready(),this.__hostTagName=this.constructor.is.replace("...
    method disconnectedCallback (line 620) | disconnectedCallback(){super.disconnectedCallback(),this._overlayOpene...
    method _fireTouchAction (line 620) | _fireTouchAction(e){this.dispatchEvent(new CustomEvent("vaadin-overlay...
    method _forwardScrollerEvent (line 620) | _forwardScrollerEvent(e){this.dispatchEvent(new CustomEvent(e.type,{de...
    method _openedChanged (line 620) | _openedChanged(e,t){e?(this._scroller.style.maxHeight=getComputedStyle...
    method _openedOrItemsChanged (line 620) | _openedOrItemsChanged(e,t,i){const a=t&&t.length;a||(this.__emptyItems...
    method _getFocusedItem (line 620) | _getFocusedItem(e){if(e>=0)return this._items[e]}
    method indexOfLabel (line 620) | indexOfLabel(e){if(this._items&&e)for(let t=0;t<this._items.length;t++...
    method getItemLabel (line 620) | getItemLabel(e,t){t=t||this._itemLabelPath;let i=e&&t?this.get(t,e):vo...
    method _scrollIntoView (line 620) | _scrollIntoView(e){this._scroller&&this._scroller.scrollIntoView(e)}
    method adjustScrollPosition (line 620) | adjustScrollPosition(){this.opened&&this._items&&this._scrollIntoView(...
    method __updateScroller (line 620) | __updateScroller(e,t,i,a,n,o,s,r,l){e&&e.setProperties({items:i?t:[],o...
    method _isOverlayHidden (line 620) | _isOverlayHidden(){return!(this.loading||this._items&&this._items.leng...
  method properties (line 620) | static get properties(){return{pageSize:{type:Number,value:50,observer:"...
  method observers (line 620) | static get observers(){return["_dataProviderFilterChanged(filter)","_war...
  method ready (line 620) | ready(){super.ready(),this.$.dropdown.addEventListener("index-requested"...
  method _dataProviderFilterChanged (line 620) | _dataProviderFilterChanged(e){void 0!==this.__previousDataProviderFilter...
  method _shouldFetchData (line 620) | _shouldFetchData(){return!!this.dataProvider&&(this.opened||this.filter&...
  method _ensureFirstPage (line 620) | _ensureFirstPage(e){e&&this._shouldLoadPage(0)&&this._loadPage(0)}
  method _shouldSkipIndex (line 620) | _shouldSkipIndex(e,t,i){return 0!==i&&e>=i-t&&e<=i+t}
  method _shouldLoadPage (line 620) | _shouldLoadPage(e){if(!this.filteredItems||this._forceNextRequest)return...
  method _loadPage (line 620) | _loadPage(e){if(!this._pendingRequests[e]&&this.dataProvider){this.loadi...
  method _getPageForIndex (line 620) | _getPageForIndex(e){return Math.floor(e/this.pageSize)}
  method clearCache (line 620) | clearCache(){if(!this.dataProvider)return;this._pendingRequests={};const...
  method _sizeChanged (line 620) | _sizeChanged(e=0){const t=(this.filteredItems||[]).slice(0,e);for(let i=...
  method _pageSizeChanged (line 620) | _pageSizeChanged(e,t){if(Math.floor(e)!==e||e<1)throw this.pageSize=t,ne...
  method _dataProviderChanged (line 620) | _dataProviderChanged(e,t){this._ensureItemsOrDataProvider((()=>{this.dat...
  method _ensureItemsOrDataProvider (line 620) | _ensureItemsOrDataProvider(e){if(void 0!==this.items&&void 0!==this.data...
  method _warnDataProviderValue (line 620) | _warnDataProviderValue(e,t){if(e&&""!==t&&(void 0===this.selectedItem||n...
  method _flushPendingRequests (line 620) | _flushPendingRequests(e){if(this._pendingRequests){const t=Math.ceil(e/t...
  method properties (line 620) | static get properties(){return{disabled:{type:Boolean,value:!1,observer:...
  method _disabledChanged (line 620) | _disabledChanged(e){this._setAriaDisabled(e)}
  method _setAriaDisabled (line 620) | _setAriaDisabled(e){e?this.setAttribute("aria-disabled","true"):this.rem...
  method click (line 620) | click(){this.disabled||super.click()}
  method ready (line 620) | ready(){super.ready(),this.addEventListener("keydown",(e=>{this._onKeyDo...
  method _onKeyDown (line 620) | _onKeyDown(e){switch(e.key){case"Enter":this._onEnter(e);break;case"Esca...
  method _onKeyUp (line 620) | _onKeyUp(e){}
  method _onEnter (line 620) | _onEnter(e){}
  method _onEscape (line 620) | _onEscape(e){}
  method properties (line 620) | static get properties(){return{inputElement:{type:Object,readOnly:!0,obs...
  method constructor (line 620) | constructor(){super(),this._boundOnInput=this._onInput.bind(this),this._...
  method clear (line 620) | clear(){this.value=""}
  method _addInputListeners (line 620) | _addInputListeners(e){e.addEventListener("input",this._boundOnInput),e.a...
  method _removeInputListeners (line 620) | _removeInputListeners(e){e.removeEventListener("input",this._boundOnInpu...
  method _forwardInputValue (line 620) | _forwardInputValue(e){this.inputElement&&(this.inputElement.value=null!=...
  method _inputElementChanged (line 620) | _inputElementChanged(e,t){e?this._addInputListeners(e):t&&this._removeIn...
  method _onInput (line 620) | _onInput(e){this.__userInput=e.isTrusted,this.value=e.target.value,this....
  method _onChange (line 620) | _onChange(e){}
  method _toggleHasValue (line 620) | _toggleHasValue(e){this.toggleAttribute("has-value",e)}
  method _valueChanged (line 620) | _valueChanged(e,t){this._toggleHasValue(""!==e&&null!=e),""===e&&void 0=...
  class Zo (line 620) | class Zo{constructor(e){this.host=e,e.addEventListener("opened-changed",...
    method constructor (line 620) | constructor(e){this.host=e,e.addEventListener("opened-changed",(()=>{e...
    method __setVirtualKeyboardEnabled (line 620) | __setVirtualKeyboardEnabled(e){this.host.inputElement&&(this.host.inpu...
  method properties (line 620) | static get properties(){return{opened:{type:Boolean,notify:!0,value:!1,r...
  method observers (line 620) | static get observers(){return["_filterChanged(filter, itemValuePath, ite...
  method constructor (line 620) | constructor(){super(),this._boundOnFocusout=this._onFocusout.bind(this),...
  method _inputElementValue (line 620) | get _inputElementValue(){return this.inputElement?this.inputElement[this...
  method _inputElementValue (line 620) | set _inputElementValue(e){this.inputElement&&(this.inputElement[this._pr...
  method _inputElementChanged (line 620) | _inputElementChanged(e){super._inputElementChanged(e),e&&(e.autocomplete...
  method ready (line 620) | ready(){super.ready(),this.addEventListener("focusout",this._boundOnFocu...
  method requestContentUpdate (line 620) | requestContentUpdate(){this.$.dropdown._scroller&&(this.$.dropdown._scro...
  method open (line 620) | open(){this.disabled||this.readonly||(this.opened=!0)}
  method close (line 620) | close(){this.opened=!1}
  method _focusedIndexChanged (line 620) | _focusedIndexChanged(e,t){void 0!==t&&this._updateActiveDescendant(e)}
  method _updateActiveDescendant (line 620) | _updateActiveDescendant(e){const t=this.inputElement;if(!t)return;const ...
  method _openedChanged (line 620) | _openedChanged(e,t){if(void 0===t)return;e?(this._openedWithFocusRing=th...
  method _onOverlayTouchAction (line 620) | _onOverlayTouchAction(){this._closeOnBlurIsPrevented=!0,this.inputElemen...
  method _isClearButton (line 620) | _isClearButton(e){return e.composedPath()[0]===this.clearElement}
  method _handleClearButtonClick (line 620) | _handleClearButtonClick(e){e.preventDefault(),this._clear(),this.opened&...
  method _onToggleButtonClick (line 620) | _onToggleButtonClick(e){e.preventDefault(),this.opened?this.close():this...
  method _onHostClick (line 620) | _onHostClick(e){this.autoOpenDisabled||(e.preventDefault(),this.open())}
  method _onClick (line 620) | _onClick(e){this._closeOnBlurIsPrevented=!0;const t=e.composedPath();thi...
  method _onKeyDown (line 620) | _onKeyDown(e){super._onKeyDown(e),"Tab"===e.key?this.__restoreFocusOnClo...
  method _getItemLabel (line 620) | _getItemLabel(e){return this.$.dropdown.getItemLabel(e)}
  method _getItemValue (line 620) | _getItemValue(e){let t=e&&this.itemValuePath?this.get(this.itemValuePath...
  method _onArrowDown (line 620) | _onArrowDown(){if(this.opened){const e=this._getOverlayItems();e&&(this....
  method _onArrowUp (line 620) | _onArrowUp(){if(this.opened){if(this._focusedIndex>-1)this._focusedIndex...
  method _prefillFocusedItemLabel (line 620) | _prefillFocusedItemLabel(){this._focusedIndex>-1&&(this._inputElementVal...
  method _setSelectionRange (line 620) | _setSelectionRange(e,t){this.hasAttribute("focused")&&this.inputElement....
  method _markAllSelectionRange (line 620) | _markAllSelectionRange(){void 0!==this._inputElementValue&&this._setSele...
  method _clearSelectionRange (line 620) | _clearSelectionRange(){if(void 0!==this._inputElementValue){const e=this...
  method _closeOrCommit (line 620) | _closeOrCommit(){this.opened||this.loading?this.close():this._commitValu...
  method _onEnter (line 620) | _onEnter(e){if(!this.allowCustomValue&&""!==this._inputElementValue&&thi...
  method _onEscape (line 620) | _onEscape(e){this.autoOpenDisabled?this.opened||this.value!==this._input...
  method _toggleElementChanged (line 620) | _toggleElementChanged(e){e&&(e.addEventListener("mousedown",(e=>e.preven...
  method _clear (line 620) | _clear(){this.selectedItem=null,this.allowCustomValue&&(this.value=""),t...
  method cancel (line 620) | cancel(){this._revertInputValueToValue(),this._lastCommittedValue=this.v...
  method _onOpened (line 620) | _onOpened(){requestAnimationFrame((()=>{this.$.dropdown.adjustScrollPosi...
  method _onClosed (line 620) | _onClosed(){this.loading&&!this.allowCustomValue||this._commitValue()}
  method _commitValue (line 620) | _commitValue(){const e=this._getOverlayItems();if(e&&this._focusedIndex>...
  method _propertyForValue (line 620) | get _propertyForValue(){return"value"}
  method _onInput (line 620) | _onInput(e){this.opened||this._isClearButton(e)||this.autoOpenDisabled||...
  method _onChange (line 620) | _onChange(e){e.stopPropagation()}
  method _itemLabelPathChanged (line 620) | _itemLabelPathChanged(e){"string"!=typeof e&&console.error("You should s...
  method _filterChanged (line 620) | _filterChanged(e,t,i){void 0!==e&&(this.$.dropdown._scrollIntoView(0),th...
  method _loadingChanged (line 620) | _loadingChanged(e){e&&(this._focusedIndex=-1)}
  method _revertInputValue (line 620) | _revertInputValue(){""!==this.filter?this._inputElementValue=this.filter...
  method _revertInputValueToValue (line 620) | _revertInputValueToValue(){this.allowCustomValue&&!this.selectedItem?thi...
  method _selectedItemChanged (line 620) | _selectedItemChanged(e){if(null==e)this.filteredItems&&(this.allowCustom...
  method _valueChanged (line 620) | _valueChanged(e,t){""===e&&void 0===t||(this._isValidValue(e)?(this._get...
  method _detectAndDispatchChange (line 620) | _detectAndDispatchChange(){this.value!==this._lastCommittedValue&&(this....
  method _itemsChanged (line 620) | _itemsChanged(e,t){this._ensureItemsOrDataProvider((()=>{this.items=t}))...
  method _filteredItemsChanged (line 620) | _filteredItemsChanged(e,t,i){this._setOverlayItems(e);const a=this._inde...
  method _filterItems (line 620) | _filterItems(e,t){if(!e)return e;const i=e.filter((e=>(t=t?t.toString()....
  method _selectItemForValue (line 620) | _selectItemForValue(e){const t=this._indexOfValue(e,this.filteredItems),...
  method _getItemElements (line 620) | _getItemElements(){return Array.from(this.$.dropdown._scroller.querySele...
  method _getOverlayItems (line 620) | _getOverlayItems(){return this.$.dropdown._items}
  method _setOverlayItems (line 620) | _setOverlayItems(e){this.$.dropdown.set("_items",e)}
  method _indexOfValue (line 620) | _indexOfValue(e,t){return t&&this._isValidValue(e)?t.findIndex((t=>!(t i...
  method _isValidValue (line 620) | _isValidValue(e){return null!=e}
  method _overlaySelectedItemChanged (line 620) | _overlaySelectedItemChanged(e){e.stopPropagation(),e.detail.item instanc...
  method __onClearButtonMouseDown (line 620) | __onClearButtonMouseDown(e){e.preventDefault(),this.inputElement.focus()}
  method _onFocusout (line 620) | _onFocusout(e){if(e.relatedTarget!==this.$.dropdown.$.overlay){if(!this....
  method _onTouchend (line 620) | _onTouchend(e){this.clearElement&&e.composedPath()[0]===this.clearElemen...
  method validate (line 620) | validate(){return!(this.invalid=!this.checkValidity())}
  method checkValidity (line 620) | checkValidity(){return super.checkValidity?super.checkValidity():!this.r...
  class Xo (line 620) | class Xo extends(Go(Qo(Vn(n)))){static get is(){return"vaadin-combo-box-...
    method is (line 620) | static get is(){return"vaadin-combo-box-light"}
    method template (line 620) | static get template(){return o`
    method properties (line 642) | static get properties(){return{attrForValue:{type:String,value:"value"}}}
    method clearElement (line 642) | get clearElement(){return this.querySelector(".clear-button")}
    method ready (line 642) | ready(){super.ready(),this._toggleElement=this.querySelector(".toggle-...
    method connectedCallback (line 642) | connectedCallback(){super.connectedCallback(),this._setInputElement(th...
    method checkValidity (line 642) | checkValidity(){return this.inputElement.validate?this.inputElement.va...
    method _propertyForValue (line 642) | get _propertyForValue(){return l(this.attrForValue)}
    method _isClearButton (line 642) | _isClearButton(e){return super._isClearButton(e)||"input"===e.type&&!e...
    method _onChange (line 642) | _onChange(e){super._onChange(e),this._isClearButton(e)&&this._clear()}
  class es (line 642) | class es extends d{constructor(e){if(super(e),this.previousValue=Jo,e.ty...
    method constructor (line 642) | constructor(e){if(super(e),this.previousValue=Jo,e.type!==c.ELEMENT)th...
    method render (line 642) | render(e,t){return u}
    method update (line 642) | update(e,[t,i]){var a;const n=this.previousValue===Jo;if(!this.hasChan...
    method hasChanged (line 642) | hasChanged(e){let t=!0;return Array.isArray(e)?Array.isArray(this.prev...
  method addRenderer (line 642) | addRenderer(e,t,i){e.renderer=(e,a,n)=>{p(t.call(i.host,n.item,n,a),e,i)}}
  method runRenderer (line 642) | runRenderer(e){e.requestContentUpdate()}
  class n (line 677) | class n extends a{constructor(...e){super(...e),t(this)}}
    method constructor (line 677) | constructor(...e){super(...e),t(this)}
    method constructor (line 994) | constructor(...e){super(...e),t(this)}
    method constructor (line 1160) | constructor(e,i,a){super(),t(this),this._localizeDeviceAutomation=e,th...
    method constructor (line 1203) | constructor(...e){super(...e),t(this)}
    method constructor (line 1443) | constructor(...e){super(...e),t(this)}
    method constructor (line 1851) | constructor(...e){super(...e),t(this)}
    method constructor (line 1911) | constructor(...e){super(...e),t(this)}
    method constructor (line 1939) | constructor(...e){super(...e),t(this)}
    method constructor (line 2099) | constructor(...e){super(...e),t(this)}
    method constructor (line 2174) | constructor(...e){super(...e),t(this)}
    method constructor (line 3448) | constructor(){super(),t(this),import("./c.99c1c4ba.js").then((e=>{impo...
  method value (line 727) | value(){return e=>k`<mwc-list-item>
  method constructor (line 862) | constructor(...t){super(...t),e(this)}
  class a (line 864) | class a extends t{constructor(...t){super(...t),e(this)}}
    method constructor (line 864) | constructor(...t){super(...t),e(this)}
    method constructor (line 1315) | constructor(...t){super(...t),e(this)}
    method constructor (line 1366) | constructor(...e){super(...e),t(this)}
    method constructor (line 1879) | constructor(...t){super(...t),e(this)}
    method constructor (line 2056) | constructor(...e){super(...e),t(this)}
    method constructor (line 2685) | constructor(...e){super(...e),t(this)}
    method constructor (line 3408) | constructor(...t){super(...t),e(this)}
  method constructor (line 905) | constructor(...e){super(...e),t(this)}
  method value (line 905) | value(){return Ri(((e,t,i,a,n,o,s,r,l)=>{let d=[];if(!t)return[];let c=O...
  function ws (line 922) | function ws(e){return void 0===e||Array.isArray(e)?e:[e]}
  function Cs (line 922) | function Cs(e){return null==e}
  method constructor (line 922) | constructor(...e){super(...e),t(this)}
  method constructor (line 930) | constructor(...e){super(...e),t(this)}
  function zs (line 994) | function zs(e,t){var i="",a=e.reason||"(unknown reason)";return e.mark?(...
  function Ss (line 994) | function Ss(e,t){Error.call(this),this.name="YAMLException",this.reason=...
  function Ts (line 994) | function Ts(e,t,i,a,n){var o="",s="",r=Math.floor(n/2)-1;return a-t>r&&(...
  function Os (line 994) | function Os(e,t){return Es.repeat(" ",t-e.length)+e}
  function Bs (line 994) | function Bs(e,t){var i=[];return e[t].forEach((function(e){var t=i.lengt...
  function Ns (line 994) | function Ns(e){return this.extend(e)}
  function a (line 994) | function a(e){e.multi?(i.multi[e.kind].push(e),i.multi.fallback.push(e))...
    method constructor (line 864) | constructor(...t){super(...t),e(this)}
    method constructor (line 1315) | constructor(...t){super(...t),e(this)}
    method constructor (line 1366) | constructor(...e){super(...e),t(this)}
    method constructor (line 1879) | constructor(...t){super(...t),e(this)}
    method constructor (line 2056) | constructor(...e){super(...e),t(this)}
    method constructor (line 2685) | constructor(...e){super(...e),t(this)}
    method constructor (line 3408) | constructor(...t){super(...t),e(this)}
  function Rs (line 994) | function Rs(e){return 48<=e&&e<=55}
  function Us (line 994) | function Us(e){return 48<=e&&e<=57}
  function fr (line 994) | function fr(e){return Object.prototype.toString.call(e)}
  function gr (line 994) | function gr(e){return 10===e||13===e}
  function _r (line 994) | function _r(e){return 9===e||32===e}
  function yr (line 994) | function yr(e){return 9===e||32===e||10===e||13===e}
  function kr (line 994) | function kr(e){return 44===e||91===e||93===e||123===e||125===e}
  function br (line 994) | function br(e){var t;return 48<=e&&e<=57?e-48:97<=(t=32|e)&&t<=102?t-97+...
  function xr (line 994) | function xr(e){return 48===e?"\0":97===e?"":98===e?"\b":116===e||9===e?...
  function $r (line 994) | function $r(e){return e<=65535?String.fromCharCode(e):String.fromCharCod...
  function Ir (line 994) | function Ir(e,t){this.input=e,this.filename=t.filename||null,this.schema...
  function Er (line 994) | function Er(e,t){var i={name:e.filename,buffer:e.input.slice(0,-1),posit...
  function zr (line 994) | function zr(e,t){throw Er(e,t)}
  function Sr (line 994) | function Sr(e,t){e.onWarning&&e.onWarning.call(null,Er(e,t))}
  function Tr (line 994) | function Tr(e,t,i,a){var n,o,s,r;if(t<i){if(r=e.input.slice(t,i),a)for(n...
  function Or (line 994) | function Or(e,t,i,a){var n,o,s,r;for(Es.isObject(i)||zr(e,"cannot merge ...
  function Pr (line 994) | function Pr(e,t,i,a,n,o,s,r,l){var d,c;if(Array.isArray(n))for(d=0,c=(n=...
  function Mr (line 994) | function Mr(e){var t;10===(t=e.input.charCodeAt(e.position))?e.position+...
  function Fr (line 994) | function Fr(e,t,i){for(var a=0,n=e.input.charCodeAt(e.position);0!==n;){...
  function Dr (line 994) | function Dr(e){var t,i=e.position;return!(45!==(t=e.input.charCodeAt(i))...
  function Br (line 994) | function Br(e,t){1===t?e.result+=" ":t>1&&(e.result+=Es.repeat("\n",t-1))}
  function Nr (line 994) | function Nr(e,t){var i,a,n=e.tag,o=e.anchor,s=[],r=!1;if(-1!==e.firstTab...
  function Vr (line 994) | function Vr(e){var t,i,a,n,o=!1,s=!1;if(33!==(n=e.input.charCodeAt(e.pos...
  function jr (line 994) | function jr(e){var t,i;if(38!==(i=e.input.charCodeAt(e.position)))return...
  function qr (line 994) | function qr(e,t,i,a,n){var o,s,r,l,d,c,u,h,p,v=1,m=!1,f=!1;if(null!==e.l...
  function Rr (line 994) | function Rr(e){var t,i,a,n,o=e.position,s=!1;for(e.version=null,e.checkL...
  function Ur (line 994) | function Ur(e,t){t=t||{},0!==(e=String(e)).length&&(10!==e.charCodeAt(e....
  function Qr (line 994) | function Qr(e){var t,i,a;if(t=e.toString(16).toUpperCase(),e<=255)i="x",...
  function Xr (line 994) | function Xr(e){this.schema=e.schema||dr,this.indent=Math.max(1,e.indent|...
  function Jr (line 994) | function Jr(e,t){for(var i,a=Es.repeat(" ",t),n=0,o=-1,s="",r=e.length;n...
  function el (line 994) | function el(e,t){return"\n"+Es.repeat(" ",e.indent*t)}
  function tl (line 994) | function tl(e){return 32===e||9===e}
  function il (line 994) | function il(e){return 32<=e&&e<=126||161<=e&&e<=55295&&8232!==e&&8233!==...
  function al (line 994) | function al(e){return il(e)&&65279!==e&&13!==e&&10!==e}
  function nl (line 994) | function nl(e,t,i){var a=al(e),n=a&&!tl(e);return(i?a:a&&44!==e&&91!==e&...
  function ol (line 994) | function ol(e,t){var i,a=e.charCodeAt(t);return a>=55296&&a<=56319&&t+1<...
  function sl (line 994) | function sl(e){return/^\n* /.test(e)}
  function rl (line 994) | function rl(e,t,i,a,n,o,s,r){var l,d,c=0,u=null,h=!1,p=!1,v=-1!==a,m=-1,...
  function ll (line 994) | function ll(e,t,i,a,n){e.dump=function(){if(0===t.length)return 2===e.qu...
  function dl (line 994) | function dl(e,t){var i=sl(e)?String(t):"",a="\n"===e[e.length-1];return ...
  function cl (line 994) | function cl(e){return"\n"===e[e.length-1]?e.slice(0,-1):e}
  function ul (line 994) | function ul(e,t){if(""===e||" "===e[0])return e;for(var i,a,n=/ [^ ]/g,o...
  function hl (line 994) | function hl(e,t,i,a){var n,o,s,r="",l=e.tag;for(n=0,o=i.length;n<o;n+=1)...
  function pl (line 994) | function pl(e,t,i){var a,n,o,s,r,l;for(o=0,s=(n=i?e.explicitTypes:e.impl...
  function vl (line 994) | function vl(e,t,i,a,n,o,s){e.tag=null,e.dump=i,pl(e,i,!1)||pl(e,i,!0);va...
  function ml (line 994) | function ml(e,t){var i,a,n=[],o=[];for(fl(e,n,o),i=0,a=o.length;i<a;i+=1...
  function fl (line 994) | function fl(e,t,i){var a,n,o;if(null!==e&&"object"==typeof e)if(-1!==(n=...
  class n (line 994) | class n extends a{constructor(...e){super(...e),t(this)}}
    method constructor (line 677) | constructor(...e){super(...e),t(this)}
    method constructor (line 994) | constructor(...e){super(...e),t(this)}
    method constructor (line 1160) | constructor(e,i,a){super(),t(this),this._localizeDeviceAutomation=e,th...
    method constructor (line 1203) | constructor(...e){super(...e),t(this)}
    method constructor (line 1443) | constructor(...e){super(...e),t(this)}
    method constructor (line 1851) | constructor(...e){super(...e),t(this)}
    method constructor (line 1911) | constructor(...e){super(...e),t(this)}
    method constructor (line 1939) | constructor(...e){super(...e),t(this)}
    method constructor (line 2099) | constructor(...e){super(...e),t(this)}
    method constructor (line 2174) | constructor(...e){super(...e),t(this)}
    method constructor (line 3448) | constructor(){super(),t(this),import("./c.99c1c4ba.js").then((e=>{impo...
  method value (line 994) | value(){return async()=>{if(!this._iconList){let e;e=[],this._iconList=e...
  method constructor (line 998) | constructor(...e){super(...e),t(this)}
  method constructor (line 1011) | constructor(...t){super(...t),e(this)}
  method constructor (line 1083) | constructor(...e){super(...e),t(this)}
  class n (line 1160) | class n extends a{constructor(e,i,a){super(),t(this),this._localizeDevic...
    method constructor (line 677) | constructor(...e){super(...e),t(this)}
    method constructor (line 994) | constructor(...e){super(...e),t(this)}
    method constructor (line 1160) | constructor(e,i,a){super(),t(this),this._localizeDeviceAutomation=e,th...
    method constructor (line 1203) | constructor(...e){super(...e),t(this)}
    method constructor (line 1443) | constructor(...e){super(...e),t(this)}
    method constructor (line 1851) | constructor(...e){super(...e),t(this)}
    method constructor (line 1911) | constructor(...e){super(...e),t(this)}
    method constructor (line 1939) | constructor(...e){super(...e),t(this)}
    method constructor (line 2099) | constructor(...e){super(...e),t(this)}
    method constructor (line 2174) | constructor(...e){super(...e),t(this)}
    method constructor (line 3448) | constructor(){super(),t(this),import("./c.99c1c4ba.js").then((e=>{impo...
  method constructor (line 1184) | constructor(){super(zl,wl,(e=>({device_id:e||"",condition:"device",domai...
  class i (line 1184) | class i extends t{constructor(...t){super(...t),e(this)}}
    method constructor (line 1184) | constructor(...t){super(...t),e(this)}
    method constructor (line 2843) | constructor(...t){super(...t),e(this)}
    method constructor (line 2920) | constructor(...t){super(...t),e(this)}
  method constructor (line 1189) | constructor(...e){super(...e),t(this)}
  method value (line 1189) | value(){return Ri(((e,t,i,a,n,o,s)=>{if(!e.length)return[{id:"no_devices...
  class n (line 1203) | class n extends a{constructor(...e){super(...e),t(this)}}
    method constructor (line 677) | constructor(...e){super(...e),t(this)}
    method constructor (line 994) | constructor(...e){super(...e),t(this)}
    method constructor (line 1160) | constructor(e,i,a){super(),t(this),this._localizeDeviceAutomation=e,th...
    method constructor (line 1203) | constructor(...e){super(...e),t(this)}
    method constructor (line 1443) | constructor(...e){super(...e),t(this)}
    method constructor (line 1851) | constructor(...e){super(...e),t(this)}
    method constructor (line 1911) | constructor(...e){super(...e),t(this)}
    method constructor (line 1939) | constructor(...e){super(...e),t(this)}
    method constructor (line 2099) | constructor(...e){super(...e),t(this)}
    method constructor (line 2174) | constructor(...e){super(...e),t(this)}
    method constructor (line 3448) | constructor(){super(),t(this),import("./c.99c1c4ba.js").then((e=>{impo...
  method constructor (line 1231) | constructor(...e){super(...e),t(this)}
  method constructor (line 1258) | constructor(...e){super(...e),t(this)}
  method value (line 1266) | value(){return e=>{switch(e.name){case"entity_id":return this.hass.local...
  method constructor (line 1266) | constructor(...e){super(...e),t(this)}
  method constructor (line 1272) | constructor(...t){super(...t),e(this)}
  method constructor (line 1272) | constructor(...t){super(...t),e(this)}
  method constructor (line 1272) | constructor(...e){super(...e),t(this)}
  method value (line 1280) | value(){return e=>{switch(e.name){case"entity_id":return this.hass.local...
  method constructor (line 1280) | constructor(...t){super(...t),e(this)}
  method constructor (line 1280) | constructor(...e){super(...e),t(this)}
  method value (line 1288) | value(){return e=>this.hass.localize(`ui.panel.config.automation.editor....
  class td (line 1288) | class td extends Oa{constructor(){super(...arguments),this.rows=2,this.c...
    method constructor (line 1288) | constructor(){super(...arguments),this.rows=2,this.cols=20,this.charCo...
    method render (line 1288) | render(){const e=this.charCounter&&-1!==this.maxLength,t=e&&"internal"...
    method renderInput (line 1297) | renderInput(){const e=this.label?"label":void 0,t=-1===this.minLength?...
  class a (line 1315) | class a extends t{constructor(...t){super(...t),e(this)}}
    method constructor (line 864) | constructor(...t){super(...t),e(this)}
    method constructor (line 1315) | constructor(...t){super(...t),e(this)}
    method constructor (line 1366) | constructor(...e){super(...e),t(this)}
    method constructor (line 1879) | constructor(...t){super(...t),e(this)}
    method constructor (line 2056) | constructor(...e){super(...e),t(this)}
    method constructor (line 2685) | constructor(...e){super(...e),t(this)}
    method constructor (line 3408) | constructor(...t){super(...t),e(this)}
  method constructor (line 1344) | constructor(...e){super(...e),t(this)}
  method constructor (line 1358) | constructor(...e){super(...e),t(this)}
  method value (line 1366) | value(){return e=>this.hass.localize(`ui.panel.config.automation.editor....
  class a (line 1366) | class a extends i{constructor(...e){super(...e),t(this)}}
    method constructor (line 864) | constructor(...t){super(...t),e(this)}
    method constructor (line 1315) | constructor(...t){super(...t),e(this)}
    method constructor (line 1366) | constructor(...e){super(...e),t(this)}
    method constructor (line 1879) | constructor(...t){super(...t),e(this)}
    method constructor (line 2056) | constructor(...e){super(...e),t(this)}
    method constructor (line 2685) | constructor(...e){super(...e),t(this)}
    method constructor (line 3408) | constructor(...t){super(...t),e(this)}
  function od (line 1374) | function od(e){return nd(e)&&"zone"!==as(e)}
  method constructor (line 1374) | constructor(...e){super(...e),t(this)}
  method constructor (line 1399) | constructor(...e){super(...e),t(this)}
  method constructor (line 1432) | constructor(...e){super(...e),t(this)}
  method constructor (line 1438) | constructor(...e){super(...e),t(this)}
  method constructor (line 1443) | constructor(){super(El,$l,(e=>({device_id:e||"",domain:"",entity_id:""})...
  class n (line 1443) | class n extends a{constructor(...e){super(...e),t(this)}}
    method constructor (line 677) | constructor(...e){super(...e),t(this)}
    method constructor (line 994) | constructor(...e){super(...e),t(this)}
    method constructor (line 1160) | constructor(e,i,a){super(),t(this),this._localizeDeviceAutomation=e,th...
    method constructor (line 1203) | constructor(...e){super(...e),t(this)}
    method constructor (line 1443) | constructor(...e){super(...e),t(this)}
    method constructor (line 1851) | constructor(...e){super(...e),t(this)}
    method constructor (line 1911) | constructor(...e){super(...e),t(this)}
    method constructor (line 1939) | constructor(...e){super(...e),t(this)}
    method constructor (line 2099) | constructor(...e){super(...e),t(this)}
    method constructor (line 2174) | constructor(...e){super(...e),t(this)}
    method constructor (line 3448) | constructor(){super(),t(this),import("./c.99c1c4ba.js").then((e=>{impo...
  method constructor (line 1479) | constructor(...e){super(...e),t(this)}
  method value (line 1492) | value(){return Ri(((e,t,i)=>{if(!t)return[];const a=this._services(e,t);...
  method constructor (line 1492) | constructor(...e){super(...e),t(this)}
  method constructor (line 1509) | constructor(...e){super(...e),t(this)}
  method constructor (line 1536) | constructor(...e){super(...e),t(this)}
  method constructor (line 1542) | constructor(...e){super(...e),t(this)}
  method value (line 1587) | value(){return e=>this.hass.localize(`ui.components.selectors.media.${e....
  method constructor (line 1654) | constructor(...e){super(...e),t(this)}
  method constructor (line 1660) | constructor(...e){super(...e),t(this)}
  method constructor (line 1708) | constructor(...e){super(...e),t(this)}
  method refiner (line 1811) | *refiner(e,t){yield*wd.refiner(e,t);const i=an(Ad(e,t),t,wd,e);for(const...
  method constructor (line 1811) | constructor(...e){super(...e),t(this)}
  method constructor (line 1824) | constructor(...e){super(...e),t(this)}
  method constructor (line 1843) | constructor(...e){super(...e),t(this)}
  method value (line 1851) | value(){return e=>this.hass.localize(`ui.panel.config.automation.editor....
  method constructor (line 1851) | constructor(){super(Sl,Cl,(e=>({device_id:e||"",platform:"device",domain...
  class n (line 1851) | class n extends a{constructor(...e){super(...e),t(this)}}
    method constructor (line 677) | constructor(...e){super(...e),t(this)}
    method constructor (line 994) | constructor(...e){super(...e),t(this)}
    method constructor (line 1160) | constructor(e,i,a){super(),t(this),this._localizeDeviceAutomation=e,th...
    method constructor (line 1203) | constructor(...e){super(...e),t(this)}
    method constructor (line 1443) | constructor(...e){super(...e),t(this)}
    method constructor (line 1851) | constructor(...e){super(...e),t(this)}
    method constructor (line 1911) | constructor(...e){super(...e),t(this)}
    method constructor (line 1939) | constructor(...e){super(...e),t(this)}
    method constructor (line 2099) | constructor(...e){super(...e),t(this)}
    method constructor (line 2174) | constructor(...e){super(...e),t(this)}
    method constructor (line 3448) | constructor(){super(),t(this),import("./c.99c1c4ba.js").then((e=>{impo...
  method constructor (line 1879) | constructor(){super(...arguments),this.nt=Ed}
  method render (line 1879) | render(e,t){return t()}
  method update (line 1879) | update(e,[t,i]){if(Array.isArray(t)){if(Array.isArray(this.nt)&&this.nt....
  class a (line 1879) | class a extends t{constructor(...t){super(...t),e(this)}}
    method constructor (line 864) | constructor(...t){super(...t),e(this)}
    method constructor (line 1315) | constructor(...t){super(...t),e(this)}
    method constructor (line 1366) | constructor(...e){super(...e),t(this)}
    method constructor (line 1879) | constructor(...t){super(...t),e(this)}
    method constructor (line 2056) | constructor(...e){super(...e),t(this)}
    method constructor (line 2685) | constructor(...e){super(...e),t(this)}
    method constructor (line 3408) | constructor(...t){super(...t),e(this)}
  class n (line 1911) | class n extends a{constructor(...e){super(...e),t(this)}}
    method constructor (line 677) | constructor(...e){super(...e),t(this)}
    method constructor (line 994) | constructor(...e){super(...e),t(this)}
    method constructor (line 1160) | constructor(e,i,a){super(),t(this),this._localizeDeviceAutomation=e,th...
    method constructor (line 1203) | constructor(...e){super(...e),t(this)}
    method constructor (line 1443) | constructor(...e){super(...e),t(this)}
    method constructor (line 1851) | constructor(...e){super(...e),t(this)}
    method constructor (line 1911) | constructor(...e){super(...e),t(this)}
    method constructor (line 1939) | constructor(...e){super(...e),t(this)}
    method constructor (line 2099) | constructor(...e){super(...e),t(this)}
    method constructor (line 2174) | constructor(...e){super(...e),t(this)}
    method constructor (line 3448) | constructor(){super(),t(this),import("./c.99c1c4ba.js").then((e=>{impo...
  class n (line 1939) | class n extends a{constructor(...e){super(...e),t(this)}}
    method constructor (line 677) | constructor(...e){super(...e),t(this)}
    method constructor (line 994) | constructor(...e){super(...e),t(this)}
    method constructor (line 1160) | constructor(e,i,a){super(),t(this),this._localizeDeviceAutomation=e,th...
    method constructor (line 1203) | constructor(...e){super(...e),t(this)}
    method constructor (line 1443) | constructor(...e){super(...e),t(this)}
    method constructor (line 1851) | constructor(...e){super(...e),t(this)}
    method constructor (line 1911) | constructor(...e){super(...e),t(this)}
    method constructor (line 1939) | constructor(...e){super(...e),t(this)}
    method constructor (line 2099) | constructor(...e){super(...e),t(this)}
    method constructor (line 2174) | constructor(...e){super(...e),t(this)}
    method constructor (line 3448) | constructor(){super(),t(this),import("./c.99c1c4ba.js").then((e=>{impo...
  method constructor (line 1976) | constructor(...e){super(...e),t(this)}
  method constructor (line 2003) | constructor(...e){super(...e),t(this)}
  method value (line 2011) | value(){return e=>this.hass.localize(`ui.panel.config.automation.editor....
  method constructor (line 2011) | constructor(...e){super(...e),t(this)}
  method value (line 2019) | value(){return e=>this.hass.localize(`ui.panel.config.automation.editor....
  method constructor (line 2024) | constructor(...e){super(...e),t(this)}
  method value (line 2032) | value(){return e=>this.hass.localize(`ui.panel.config.automation.editor....
  method constructor (line 2032) | constructor(...e){super(...e),t(this)}
  method value (line 2040) | value(){return e=>{switch(e.name){case"entity_id":return this.hass.local...
  method constructor (line 2040) | constructor(...e){super(...e),t(this)}
  method value (line 2048) | value(){return e=>this.hass.localize("entity_id"===e.name?"ui.components...
  method constructor (line 2048) | constructor(...e){super(...e),t(this)}
  method value (line 2056) | value(){return e=>this.hass.localize(`ui.panel.config.automation.editor....
  class a (line 2056) | class a extends i{constructor(...e){super(...e),t(this)}}
    method constructor (line 864) | constructor(...t){super(...t),e(this)}
    method constructor (line 1315) | constructor(...t){super(...t),e(this)}
    method constructor (line 1366) | constructor(...e){super(...e),t(this)}
    method constructor (line 1879) | constructor(...t){super(...t),e(this)}
    method constructor (line 2056) | constructor(...e){super(...e),t(this)}
    method constructor (line 2685) | constructor(...e){super(...e),t(this)}
    method constructor (line 3408) | constructor(...t){super(...t),e(this)}
  method constructor (line 2069) | constructor(...t){super(...t),e(this)}
  method constructor (line 2083) | constructor(...e){super(...e),t(this)}
  method value (line 2091) | value(){return e=>this.hass.localize(`ui.panel.config.automation.editor....
  method constructor (line 2091) | constructor(...e){super(...e),t(this)}
  method value (line 2099) | value(){return e=>this.hass.localize(`ui.panel.config.automation.editor....
  function Md (line 2099) | function Md(e){return nd(e)&&"zone"!==as(e)}
  class n (line 2099) | class n extends a{constructor(...e){super(...e),t(this)}}
    method constructor (line 677) | constructor(...e){super(...e),t(this)}
    method constructor (line 994) | constructor(...e){super(...e),t(this)}
    method constructor (line 1160) | constructor(e,i,a){super(),t(this),this._localizeDeviceAutomation=e,th...
    method constructor (line 1203) | constructor(...e){super(...e),t(this)}
    method constructor (line 1443) | constructor(...e){super(...e),t(this)}
    method constructor (line 1851) | constructor(...e){super(...e),t(this)}
    method constructor (line 1911) | constructor(...e){super(...e),t(this)}
    method constructor (line 1939) | constructor(...e){super(...e),t(this)}
    method constructor (line 2099) | constructor(...e){super(...e),t(this)}
    method constructor (line 2174) | constructor(...e){super(...e),t(this)}
    method constructor (line 3448) | constructor(){super(),t(this),import("./c.99c1c4ba.js").then((e=>{impo...
  method constructor (line 2124) | constructor(...e){super(...e),t(this)}
  class n (line 2174) | class n extends a{constructor(...e){super(...e),t(this)}}
    method constructor (line 677) | constructor(...e){super(...e),t(this)}
    method constructor (line 994) | constructor(...e){super(...e),t(this)}
    method constructor (line 1160) | constructor(e,i,a){super(),t(this),this._localizeDeviceAutomation=e,th...
    method constructor (line 1203) | constructor(...e){super(...e),t(this)}
    method constructor (line 1443) | constructor(...e){super(...e),t(this)}
    method constructor (line 1851) | constructor(...e){super(...e),t(this)}
    method constructor (line 1911) | constructor(...e){super(...e),t(this)}
    method constructor (line 1939) | constructor(...e){super(...e),t(this)}
    method constructor (line 2099) | constructor(...e){super(...e),t(this)}
    method constructor (line 2174) | constructor(...e){super(...e),t(this)}
    method constructor (line 3448) | constructor(){super(),t(this),import("./c.99c1c4ba.js").then((e=>{impo...
  method value (line 2258) | value(){return Ea((async()=>{let e;const t=this.trigger;this._triggerUns...
  method constructor (line 2325) | constructor(...e){super(...e),t(this)}
  method constructor (line 2352) | constructor(...e){super(...e),t(this)}
  method constructor (line 2378) | constructor(...t){super(...t),e(this)}
  method value (line 2385) | value(){return e=>this.hass.localize(`ui.panel.config.automation.editor....
  method constructor (line 2385) | constructor(...e){super(...e),t(this)}
  method constructor (line 2505) | constructor(...e){super(...e),t(this)}
  method constructor (line 2535) | constructor(...t){super(...t),e(this)}
  method constructor (line 2552) | constructor(...e){super(...e),t(this)}
  method constructor (line 2567) | constructor(...t){super(...t),e(this)}
  method constructor (line 2583) | constructor(...e){super(...e),t(this)}
  method value (line 2583) | value(){return Ri(((e,t,i,a,n,o,s,r,l)=>{if(!e.length)return[{area_id:"n...
  method value (line 2601) | value(){return Ri((e=>{var t;return null===(t=this._areas)||void 0===t?v...
  method constructor (line 2601) | constructor(...e){super(...e),t(this)}
  method constructor (line 2641) | constructor(...t){super(...t),e(this)}
  method value (line 2669) | value(){return e=>{var t,i,a;const n=null===(t=this.selector.area.entity...
  method value (line 2669) | value(){return e=>{if(!this.selector.area.device)return!0;const{manufact...
  function Zd (line 2669) | function Zd(e,t,i){if(void 0===i&&(i=Error),!e)throw new i(t)}
  function Qd (line 2669) | function Qd(e,t){for(var i=t;;){if(e.has(i))return i;var a=i.lastIndexOf...
  function Xd (line 2669) | function Xd(e,t){Zd(2===t.length,"key must have 2 elements");var i=e.len...
  function Jd (line 2669) | function Jd(e,t,i,a,n,o){var s;s="lookup"===i.localeMatcher?function(e,t...
  function ec (line 2669) | function ec(e,t,i,a){var n=t.reduce((function(e,t){return e.add(t),e}),n...
  function kc (line 2669) | function kc(e){if(e in gc.translations)return e;const t=e.toLowerCase();...
  method constructor (line 2669) | constructor(...t){super(...t),e(this)}
  class a (line 2685) | class a extends i{constructor(...e){super(...e),t(this)}}
    method constructor (line 864) | constructor(...t){super(...t),e(this)}
    method constructor (line 1315) | constructor(...t){super(...t),e(this)}
    method constructor (line 1366) | constructor(...e){super(...e),t(this)}
    method constructor (line 1879) | constructor(...t){super(...t),e(this)}
    method constructor (line 2056) | constructor(...e){super(...e),t(this)}
    method constructor (line 2685) | constructor(...e){super(...e),t(this)}
    method constructor (line 3408) | constructor(...t){super(...t),e(this)}
  method constructor (line 2696) | constructor(...e){super(...e),t(this)}
  method constructor (line 2712) | constructor(...e){super(...e),t(this)}
  method constructor (line 2735) | constructor(...e){super(...e),t(this)}
  method constructor (line 2750) | constructor(...t){super(...t),e(this)}
  method constructor (line 2760) | constructor(...e){super(...e),t(this)}
  method constructor (line 2774) | constructor(...e){super(...e),t(this)}
  method constructor (line 2806) | constructor(...e){super(...e),t(this)}
  class i (line 2843) | class i extends t{constructor(...t){super(...t),e(this)}}
    method constructor (line 1184) | constructor(...t){super(...t),e(this)}
    method constructor (line 2843) | constructor(...t){super(...t),e(this)}
    method constructor (line 2920) | constructor(...t){super(...t),e(this)}
  method value (line 2868) | value(){return e=>{const{manufacturer:t,model:i,integration:a}=this.sele...
  method constructor (line 2868) | constructor(...t){super(...t),e(this)}
  method constructor (line 2877) | constructor(...e){super(...e),t(this)}
  method value (line 2916) | value(){return e=>(!this.value||!this.value.includes(e.entity_id))&&(!th...
  class i (line 2920) | class i extends t{constructor(...t){super(...t),e(this)}}
    method constructor (line 1184) | constructor(...t){super(...t),e(this)}
    method constructor (line 2843) | constructor(...t){super(...t),e(this)}
    method constructor (line 2920) | constructor(...t){super(...t),e(this)}
  method value (line 2943) | value(){return e=>{var t,i;const{domain:a,device_class:n,integration:o}=...
  method constructor (line 2943) | constructor(...e){super(...e),t(this)}
  method constructor (line 2998) | constructor(...e){super(...e),t(this)}
  method constructor (line 3007) | constructor(...e){super(...e),t(this)}
  method constructor (line 3250) | constructor(...t){super(...t),e(this)}
  method value (line 3260) | value(){return e=>{var t,i,a,n;if((null!==(t=this.selector.target.entity...
  method value (line 3260) | value(){return e=>{var t;return null===(t=this.selector.target.entity)||...
  method value (line 3260) | value(){return e=>{var t,i,a,n,o;if(null!==(t=this.selector.target.devic...
  method constructor (line 3264) | constructor(...e){super(...e),t(this)}
  method constructor (line 3278) | constructor(...e){super(...e),t(this)}
  method constructor (line 3328) | constructor(...t){super(...t),e(this)}
  method constructor (line 3338) | constructor(...e){super(...e),t(this)}
  method constructor (line 3349) | constructor(...e){super(...e),t(this)}
  method constructor (line 3369) | constructor(...t){super(...t),e(this)}
  method constructor (line 3377) | constructor(...e){super(...e),t(this)}
  class a (line 3408) | class a extends t{constructor(...t){super(...t),e(this)}}
    method constructor (line 864) | constructor(...t){super(...t),e(this)}
    method constructor (line 1315) | constructor(...t){super(...t),e(this)}
    method constructor (line 1366) | constructor(...e){super(...e),t(this)}
    method constructor (line 1879) | constructor(...t){super(...t),e(this)}
    method constructor (line 2056) | constructor(...e){super(...e),t(this)}
    method constructor (line 2685) | constructor(...e){super(...e),t(this)}
    method constructor (line 3408) | constructor(...t){super(...t),e(this)}
  class n (line 3448) | class n extends a{constructor(){super(),t(this),import("./c.99c1c4ba.js"...
    method constructor (line 677) | constructor(...e){super(...e),t(this)}
    method constructor (line 994) | constructor(...e){super(...e),t(this)}
    method constructor (line 1160) | constructor(e,i,a){super(),t(this),this._localizeDeviceAutomation=e,th...
    method constructor (line 1203) | constructor(...e){super(...e),t(this)}
    method constructor (line 1443) | constructor(...e){super(...e),t(this)}
    method constructor (line 1851) | constructor(...e){super(...e),t(this)}
    method constructor (line 1911) | constructor(...e){super(...e),t(this)}
    method constructor (line 1939) | constructor(...e){super(...e),t(this)}
    method constructor (line 2099) | constructor(...e){super(...e),t(this)}
    method constructor (line 2174) | constructor(...e){super(...e),t(this)}
    method constructor (line 3448) | constructor(){super(),t(this),import("./c.99c1c4ba.js").then((e=>{impo...
  method constructor (line 3462) | constructor(...e){super(...e),t(this)}
  method value (line 3471) | value(){return Ri(((e,t)=>{const i=getComputedStyle(this),a=e.location.r...
  method template (line 3476) | static get template(){return o`
  method _getTitle (line 3519) | _getTitle(){return`${this.caption}${this.caption&&this.required?" *":""}`}
  method properties (line 3519) | static get properties(){return{caption:String,disabled:Boolean,required:...
  method constructor (line 3519) | constructor(...e){super(...e),t(this)}
  method constructor (line 3543) | constructor(...t){super(...t),e(this)}

FILE: custom_components/hacs/hacs_frontend/c.0681dd5f.js
  function i (line 1) | async function i(i,o,n){const t=new e("updateLovelaceResources"),l=await...

FILE: custom_components/hacs/hacs_frontend/c.07e1d870.js
  class s (line 1) | class s extends o{constructor(...t){super(...t),e(this)}}
    method constructor (line 1) | constructor(...t){super(...t),e(this)}

FILE: custom_components/hacs/hacs_frontend/c.18158037.js
  method constructor (line 1) | constructor(...i){super(...i),e(this)}

FILE: custom_components/hacs/hacs_frontend/c.2442b973.js
  method connectedCallback (line 1) | connectedCallback(){super.connectedCallback(),setTimeout((()=>{this.path...
  method header (line 78) | get header(){return s(this.$.headerSlot).getDistributedNodes()[0]}
  class E (line 78) | class E extends(customElements.get("app-header-layout")){static get temp...
    method template (line 78) | static get template(){return o`
  method constructor (line 149) | constructor(...t){super(...t),e(this)}
  method constructor (line 249) | constructor(...t){super(...t),e(this)}

FILE: custom_components/hacs/hacs_frontend/c.24bd2446.js
  function e (line 1) | function e(){this.connected_=!1,this.mutationEventsAdded_=!1,this.mutati...
  function a (line 1) | function a(t){var e="function"==typeof Symbol&&t[Symbol.iterator],n=0;re...
  function f (line 1) | function f(t){return"number"==typeof t?t:parseFloat(t)||0}
  function d (line 1) | function d(t){for(var e=[],n=1;n<arguments.length;n++)e[n-1]=arguments[n...
  function l (line 1) | function l(t){var e=t.clientWidth,n=t.clientHeight;if(!e&&!n)return u;va...
  function p (line 1) | function p(e){return t?v(e)?function(t){var e=t.getBBox();return _(0,0,e...
  function _ (line 1) | function _(t,e,n,r){return{x:t,y:e,width:n,height:r}}
  function t (line 1) | function t(t){this.broadcastWidth=0,this.broadcastHeight=0,this.contentR...
  function t (line 1) | function t(t,e){var n=-1;return t.some((function(t,r){return t[0]===e&&(...
  function e (line 1) | function e(){this.__entries__=[]}
  function t (line 1) | function t(t,e,n){if(this.activeObservations_=[],this.observations_=new ...
  function t (line 1) | function t(e){if(!(this instanceof t))throw new TypeError("Cannot call a...

FILE: custom_components/hacs/hacs_frontend/c.262db200.js
  method constructor (line 1) | constructor(...o){super(...o),s(this)}

FILE: custom_components/hacs/hacs_frontend/c.2a7cd87a.js
  method constructor (line 1) | constructor(...a){super(...a),i(this)}

FILE: custom_components/hacs/hacs_frontend/c.2aa297ae.js
  function d (line 1) | function d(t){return i.call(this,e(e({},d.defaultAdapter),t))||this}
  class R (line 1) | class R extends a{constructor(){super(...arguments),this.mdcFoundationCl...
    method constructor (line 1) | constructor(){super(...arguments),this.mdcFoundationClass=k,this.width...
    method createAdapter (line 1) | createAdapter(){return{addClass:t=>this.mdcRoot.classList.add(t),remov...
    method openOrClose (line 1) | openOrClose(t,e){this.mdcFoundation&&(t&&void 0!==e?this.mdcFoundation...
    method render (line 1) | render(){this.openOrClose(this.open,this.width);const t=o({"mdc-notche...
  function d (line 8) | function d(t){var l=i.call(this,e(e({},d.defaultAdapter),t))||this;retur...
  method constructor (line 8) | constructor(t){switch(super(t),this.foundation=null,this.previousPart=nu...
  method update (line 8) | update(t,[e]){if(t!==this.previousPart){this.foundation&&this.foundation...
  method render (line 8) | render(t){return this.foundation}
  function d (line 8) | function d(t){var l=i.call(this,e(e({},d.defaultAdapter),t))||this;retur...
  method constructor (line 8) | constructor(t){switch(super(t),this.previousPart=null,this.foundation=nu...
  method update (line 8) | update(t,e){if(this.previousPart!==t){this.foundation&&this.foundation.d...
  method render (line 8) | render(){return this.foundation}
  function d (line 8) | function d(t,l){void 0===l&&(l={});var n=i.call(this,e(e({},d.defaultAda...
  method constructor (line 8) | constructor(t){if(super(t),t.type!==p.PROPERTY&&t.type!==p.ATTRIBUTE&&t....
  method render (line 8) | render(t){return t}
  method update (line 8) | update(t,[e]){if(e===u||e===g)return e;const i=t.element,d=t.name;if(t.t...
  class ct (line 8) | class ct extends L{constructor(){super(...arguments),this.mdcFoundationC...
    method constructor (line 8) | constructor(){super(...arguments),this.mdcFoundationClass=W,this.value...
    method validity (line 8) | get validity(){return this._checkValidity(this.value),this._validity}
    method willValidate (line 8) | get willValidate(){return this.formElement.willValidate}
    method selectionStart (line 8) | get selectionStart(){return this.formElement.selectionStart}
    method selectionEnd (line 8) | get selectionEnd(){return this.formElement.selectionEnd}
    method focus (line 8) | focus(){const t=new CustomEvent("focus");this.formElement.dispatchEven...
    method blur (line 8) | blur(){const t=new CustomEvent("blur");this.formElement.dispatchEvent(...
    method select (line 8) | select(){this.formElement.select()}
    method setSelectionRange (line 8) | setSelectionRange(t,e,i){this.formElement.setSelectionRange(t,e,i)}
    method update (line 8) | update(t){t.has("autoValidate")&&this.mdcFoundation&&this.mdcFoundatio...
    method setFormData (line 8) | setFormData(t){this.name&&t.append(this.name,this.value)}
    method render (line 8) | render(){const t=this.charCounter&&-1!==this.maxLength,e=!!this.helper...
    method updated (line 20) | updated(t){t.has("value")&&void 0!==t.get("value")&&(this.mdcFoundatio...
    method renderRipple (line 20) | renderRipple(){return this.outlined?"":r`
    method renderOutline (line 22) | renderOutline(){return this.outlined?r`
    method renderLabel (line 28) | renderLabel(){return this.label?r`
    method renderLeadingIcon (line 32) | renderLeadingIcon(){return this.icon?this.renderIcon(this.icon):""}
    method renderTrailingIcon (line 32) | renderTrailingIcon(){return this.iconTrailing?this.renderIcon(this.ico...
    method renderIcon (line 32) | renderIcon(t,e=!1){return r`<i class="material-icons mdc-text-field__i...
    method renderPrefix (line 32) | renderPrefix(){return this.prefix?this.renderAffix(this.prefix):""}
    method renderSuffix (line 32) | renderSuffix(){return this.suffix?this.renderAffix(this.suffix,!0):""}
    method renderAffix (line 32) | renderAffix(t,e=!1){return r`<span class="mdc-text-field__affix ${o({"...
    method renderInput (line 33) | renderInput(t){const e=-1===this.minLength?void 0:this.minLength,i=-1=...
    method renderLineRipple (line 57) | renderLineRipple(){return this.outlined?"":r`
    method renderHelperText (line 59) | renderHelperText(t,e){const i=this.validationMessage&&!this.isUiValid,...
    method renderCharCounter (line 66) | renderCharCounter(t){const e=Math.min(this.value.length,this.maxLength...
    method onInputFocus (line 68) | onInputFocus(){this.focused=!0}
    method onInputBlur (line 68) | onInputBlur(){this.focused=!1,this.reportValidity()}
    method checkValidity (line 68) | checkValidity(){const t=this._checkValidity(this.value);if(!t){const t...
    method reportValidity (line 68) | reportValidity(){const t=this.checkValidity();return this.mdcFoundatio...
    method _checkValidity (line 68) | _checkValidity(t){const e=this.formElement.validity;let i=rt(e);if(thi...
    method setCustomValidity (line 68) | setCustomValidity(t){this.validationMessage=t,this.formElement.setCust...
    method handleInputChange (line 68) | handleInputChange(){this.value=this.formElement.value}
    method createAdapter (line 68) | createAdapter(){return Object.assign(Object.assign(Object.assign(Objec...
    method getRootAdapterMethods (line 68) | getRootAdapterMethods(){return Object.assign({registerTextFieldInterac...
    method getInputAdapterMethods (line 68) | getInputAdapterMethods(){return{getNativeInput:()=>this.formElement,se...
    method getLabelAdapterMethods (line 68) | getLabelAdapterMethods(){return{floatLabel:t=>this.labelElement&&this....
    method getLineRippleAdapterMethods (line 68) | getLineRippleAdapterMethods(){return{activateLineRipple:()=>{this.line...
    method getUpdateComplete (line 68) | async getUpdateComplete(){var t;const e=await super.getUpdateComplete(...
    method firstUpdated (line 68) | firstUpdated(){var t;super.firstUpdated(),this.mdcFoundation.setValida...
    method getOutlineAdapterMethods (line 68) | getOutlineAdapterMethods(){return{closeOutline:()=>this.outlineElement...
    method layout (line 68) | async layout(){await this.updateComplete;const t=this.labelElement;if(...
  class i (line 68) | class i extends e{constructor(...e){super(...e),t(this)}}
    method constructor (line 68) | constructor(...e){super(...e),t(this)}

FILE: custom_components/hacs/hacs_frontend/c.3507790e.js
  function e (line 1) | function e(n){return e="function"==typeof Symbol&&"symbol"==typeof Symbo...
  function n (line 1) | function n(e,t){return n=Object.setPrototypeOf||function(e,n){return e._...
  function t (line 1) | function t(){if("undefined"==typeof Reflect||!Reflect.construct)return!1...
  function r (line 1) | function r(e,o,a){return r=t()?Reflect.construct:function(e,t,r){var o=[...
  function o (line 1) | function o(e){return a(e)||i(e)||s(e)||u()}
  function a (line 1) | function a(e){if(Array.isArray(e))return l(e)}
  function i (line 1) | function i(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||n...
  function s (line 1) | function s(e,n){if(e){if("string"==typeof e)return l(e,n);var t=Object.p...
  function l (line 1) | function l(e,n){(null==n||n>e.length)&&(n=e.length);for(var t=0,r=new Ar...
  function u (line 1) | function u(){throw new TypeError("Invalid attempt to spread non-iterable...
    method constructor (line 1) | constructor(e){void 0===e.data&&(e.data={}),this.data=e.data,this.isMa...
    method ignoreMatch (line 1) | ignoreMatch(){this.isMatchIgnored=!0}
  function S (line 1) | function S(e){return function(n){for(var t=arguments.length,r=new Array(...
  function N (line 1) | function N(e){return function(){for(var n=arguments.length,t=new Array(n...
  function T (line 1) | function T(e,n){d&&d(e,null);for(var t=n.length;t--;){var r=n[t];if("str...
  function O (line 1) | function O(e){var n,t=f(null);for(n in e)w(c,e,[n])&&(t[n]=e[n]);return t}
  function j (line 1) | function j(e,n){for(;null!==e;){var t=m(e,n);if(t){if(t.get)return S(t.g...
  function re (line 1) | function re(){var n=arguments.length>0&&void 0!==arguments[0]?arguments[...
  function s (line 1) | function s(e){return e instanceof Map?e.clear=e.delete=e.set=function(){...
  class u (line 1) | class u{constructor(e){void 0===e.data&&(e.data={}),this.data=e.data,thi...
    method constructor (line 1) | constructor(e){void 0===e.data&&(e.data={}),this.data=e.data,this.isMa...
    method ignoreMatch (line 1) | ignoreMatch(){this.isMatchIgnored=!0}
  function c (line 1) | function c(e){return e.replace(/&/g,"&amp;").replace(/</g,"&lt;").replac...
  function d (line 1) | function d(e,...n){const t=Object.create(null);for(const n in e)t[n]=e[n...
  class p (line 1) | class p{constructor(e,n){this.buffer="",this.classPrefix=n.classPrefix,e...
    method constructor (line 1) | constructor(e,n){this.buffer="",this.classPrefix=n.classPrefix,e.walk(...
    method addText (line 1) | addText(e){this.buffer+=c(e)}
    method openNode (line 1) | openNode(e){if(!h(e))return;let n=e.kind;n=e.sublanguage?`language-${n...
    method closeNode (line 1) | closeNode(e){h(e)&&(this.buffer+="</span>")}
    method value (line 1) | value(){return this.buffer}
    method span (line 1) | span(e){this.buffer+=`<span class="${e}">`}
  class m (line 1) | class m{constructor(){this.rootNode={children:[]},this.stack=[this.rootN...
    method constructor (line 1) | constructor(){this.rootNode={children:[]},this.stack=[this.rootNode]}
    method top (line 1) | get top(){return this.stack[this.stack.length-1]}
    method root (line 1) | get root(){return this.rootNode}
    method add (line 1) | add(e){this.top.children.push(e)}
    method openNode (line 1) | openNode(e){const n={kind:e,children:[]};this.add(n),this.stack.push(n)}
    method closeNode (line 1) | closeNode(){if(this.stack.length>1)return this.stack.pop()}
    method closeAllNodes (line 1) | closeAllNodes(){for(;this.closeNode(););}
    method toJSON (line 1) | toJSON(){return JSON.stringify(this.rootNode,null,4)}
    method walk (line 1) | walk(e){return this.constructor._walk(e,this.rootNode)}
    method _walk (line 1) | static _walk(e,n){return"string"==typeof n?e.addText(n):n.children&&(e...
    method _collapse (line 1) | static _collapse(e){"string"!=typeof e&&e.children&&(e.children.every(...
  class g (line 1) | class g extends m{constructor(e){super(),this.options=e}addKeyword(e,n){...
    method constructor (line 1) | constructor(e){super(),this.options=e}
    method addKeyword (line 1) | addKeyword(e,n){""!==e&&(this.openNode(n),this.addText(e),this.closeNo...
    method addText (line 1) | addText(e){""!==e&&this.add(e)}
    method addSublanguage (line 1) | addSublanguage(e,n){const t=e.root;t.kind=n,t.sublanguage=!0,this.add(t)}
    method toHTML (line 1) | toHTML(){return new p(this,this.options).value()}
    method finalize (line 1) | finalize(){return!0}
  function _ (line 1) | function _(e){return e?"string"==typeof e?e:e.source:null}
  function f (line 1) | function f(e){return k("(?=",e,")")}
  function b (line 1) | function b(e){return k("(?:",e,")*")}
  function w (line 1) | function w(e){return k("(?:",e,")?")}
  function k (line 1) | function k(...e){const n=e.map((e=>_(e))).join("");return n}
  function y (line 1) | function y(...e){const n=function(e){const n=e[e.length-1];return"object...
  function D (line 1) | function D(e){return new RegExp(e.toString()+"|").exec("").length-1}
  function x (line 1) | function x(e,{joinWith:n}){let t=0;return e.map((e=>{t+=1;const n=t;let ...
  function U (line 1) | function U(e,n){"."===e.input[e.index-1]&&n.ignoreMatch()}
  function q (line 1) | function q(e,n){void 0!==e.className&&(e.scope=e.className,delete e.clas...
  function P (line 1) | function P(e,n){n&&e.beginKeywords&&(e.begin="\\b("+e.beginKeywords.spli...
  function H (line 1) | function H(e,n){Array.isArray(e.illegal)&&(e.illegal=y(...e.illegal))}
  function Z (line 1) | function Z(e,n){if(e.match){if(e.begin||e.end)throw new Error("begin & e...
  function G (line 1) | function G(e,n){void 0===e.relevance&&(e.relevance=1)}
  function Y (line 1) | function Y(e,n,t="keyword"){const r=Object.create(null);return"string"==...
  function K (line 1) | function K(e,n){return n?Number(n):function(e){return Q.includes(e.toLow...
  function te (line 1) | function te(e,n,{key:t}){let r=0;const o=e[t],a={},i={};for(let e=1;e<=n...
  function re (line 1) | function re(e){!function(e){e.scope&&"object"==typeof e.scope&&null!==e....
  function oe (line 1) | function oe(e){function n(n,t){return new RegExp(_(n),"m"+(e.case_insens...
  function ae (line 1) | function ae(e){return!!e&&(e.endsWithParent||ae(e.starts))}
  class ie (line 1) | class ie extends Error{constructor(e,n){super(e),this.name="HTMLInjectio...
    method constructor (line 1) | constructor(e,n){super(e),this.name="HTMLInjectionError",this.html=n}
  function c (line 1) | function c(e){return s.noHighlightRe.test(e)}
  function d (line 1) | function d(e,n,t){let r="",o="";"object"==typeof n?(r=e,t=n.ignoreIllega...
  function h (line 1) | function h(e,t,r,i){const l=Object.create(null);function c(){if(!v.keywo...
  function p (line 1) | function p(e,t){t=t||s.languages||Object.keys(n);const r=function(e){con...
    method constructor (line 1) | constructor(e,n){this.buffer="",this.classPrefix=n.classPrefix,e.walk(...
    method addText (line 1) | addText(e){this.buffer+=c(e)}
    method openNode (line 1) | openNode(e){if(!h(e))return;let n=e.kind;n=e.sublanguage?`language-${n...
    method closeNode (line 1) | closeNode(e){h(e)&&(this.buffer+="</span>")}
    method value (line 1) | value(){return this.buffer}
    method span (line 1) | span(e){this.buffer+=`<span class="${e}">`}
  function m (line 1) | function m(e){let n=null;const r=function(e){let n=e.className+" ";n+=e....
    method constructor (line 1) | constructor(){this.rootNode={children:[]},this.stack=[this.rootNode]}
    method top (line 1) | get top(){return this.stack[this.stack.length-1]}
    method root (line 1) | get root(){return this.rootNode}
    method add (line 1) | add(e){this.top.children.push(e)}
    method openNode (line 1) | openNode(e){const n={kind:e,children:[]};this.add(n),this.stack.push(n)}
    method closeNode (line 1) | closeNode(){if(this.stack.length>1)return this.stack.pop()}
    method closeAllNodes (line 1) | closeAllNodes(){for(;this.closeNode(););}
    method toJSON (line 1) | toJSON(){return JSON.stringify(this.rootNode,null,4)}
    method walk (line 1) | walk(e){return this.constructor._walk(e,this.rootNode)}
    method _walk (line 1) | static _walk(e,n){return"string"==typeof n?e.addText(n):n.children&&(e...
    method _collapse (line 1) | static _collapse(e){"string"!=typeof e&&e.children&&(e.children.every(...
  function D (line 1) | function D(){if("loading"===document.readyState)return void(_=!0);docume...
  function A (line 1) | function A(e){return e=(e||"").toLowerCase(),n[e]||n[t[e]]}
  function x (line 1) | function x(e,{languageName:n}){"string"==typeof e&&(e=[e]),e.forEach((e=...
  function v (line 1) | function v(e){const n=A(e);return n&&!n.disableAutodetect}
  function E (line 1) | function E(e,n){const t=e;r.forEach((function(e){e[t]&&e[t](n)}))}
  function n (line 1) | function n(e,n){for(var t=0;t<n.length;t++){var r=n[t];r.enumerable=r.en...
  function t (line 1) | function t(e,t,r){return t&&n(e.prototype,t),r&&n(e,r),Object.defineProp...
  function r (line 1) | function r(e,n){if(e){if("string"==typeof e)return o(e,n);var t=Object.p...
  function o (line 1) | function o(e,n){(null==n||n>e.length)&&(n=e.length);for(var t=0,r=new Ar...
  function a (line 1) | function a(e,n){var t="undefined"!=typeof Symbol&&e[Symbol.iterator]||e[...
  function i (line 1) | function i(){return{baseUrl:null,breaks:!1,extensions:null,gfm:!0,header...
  function s (line 1) | function s(n){e.defaults=n}
  function m (line 1) | function m(e,n){if(n){if(l.test(e))return e.replace(u,p)}else if(c.test(...
    method constructor (line 1) | constructor(){this.rootNode={children:[]},this.stack=[this.rootNode]}
    method top (line 1) | get top(){return this.stack[this.stack.length-1]}
    method root (line 1) | get root(){return this.rootNode}
    method add (line 1) | add(e){this.top.children.push(e)}
    method openNode (line 1) | openNode(e){const n={kind:e,children:[]};this.add(n),this.stack.push(n)}
    method closeNode (line 1) | closeNode(){if(this.stack.length>1)return this.stack.pop()}
    method closeAllNodes (line 1) | closeAllNodes(){for(;this.closeNode(););}
    method toJSON (line 1) | toJSON(){return JSON.stringify(this.rootNode,null,4)}
    method walk (line 1) | walk(e){return this.constructor._walk(e,this.rootNode)}
    method _walk (line 1) | static _walk(e,n){return"string"==typeof n?e.addText(n):n.children&&(e...
    method _collapse (line 1) | static _collapse(e){"string"!=typeof e&&e.children&&(e.children.every(...
  function _ (line 1) | function _(e){return e.replace(g,(function(e,n){return"colon"===(n=n.toL...
  function b (line 1) | function b(e,n){e="string"==typeof e?e:e.source,n=n||"";var t={replace:f...
  function y (line 1) | function y(e,n,t){if(e){var r;try{r=decodeURIComponent(_(t)).replace(w,"...
  function E (line 1) | function E(e,n){D[" "+e]||(A.test(e)?D[" "+e]=e+"/":D[" "+e]=z(e,"/",!0)...
  function F (line 1) | function F(e){for(var n,t,r=1;r<arguments.length;r++)for(t in n=argument...
  function B (line 1) | function B(e,n){var t=e.replace(/\|/g,(function(e,n,t){for(var r=!1,o=n;...
  function z (line 1) | function z(e,n,t){var r=e.length;if(0===r)return"";for(var o=0;o<r;){var...
  function S (line 1) | function S(e,n){if(-1===e.indexOf(n[1]))return-1;for(var t=e.length,r=0,...
  function N (line 1) | function N(e){e&&e.sanitize&&!e.silent&&console.warn("marked(): sanitize...
  function T (line 1) | function T(e,n){if(n<1)return"";for(var t="";n>1;)1&n&&(t+=e),n>>=1,e+=e...
  function O (line 1) | function O(e,n,t,r){var o=n.href,a=n.title?m(n.title):null,i=e[1].replac...
  function j (line 1) | function j(e,n){var t=e.match(/^(\s+)(?:```)/);if(null===t)return n;var ...
  function n (line 1) | function n(n){this.options=n||e.defaults}
  function L (line 1) | function L(e){return e.replace(/---/g,"—").replace(/--/g,"–").replace(/(...
  function $ (line 1) | function $(e){var n,t,r="",o=e.length;for(n=0;n<o;n++)t=e.charCodeAt(n),...
  function n (line 1) | function n(n){this.tokens=[],this.tokens.links=Object.create(null),this....
  function n (line 1) | function n(n){this.options=n||e.defaults}
  function e (line 1) | function e(){}
  function e (line 1) | function e(){this.seen={}}
  function n (line 1) | function n(n){this.options=n||e.defaults,this.options.renderer=this.opti...
  function G (line 1) | function G(e,n,t){if(null==e)throw new Error("marked(): input parameter ...
  function Ge (line 1) | function Ge(e,n){return function(e,n){for(var t=-1,r=e?e.length:0,o=Arra...
  function We (line 1) | function We(e){var n=-1,t=Array(e.size);return e.forEach((function(e,r){...
  function Qe (line 1) | function Qe(e){var n=-1,t=Array(e.size);return e.forEach((function(e){t[...
  function Ye (line 1) | function Ye(e){return function(e){return qe.test(e)}(e)?function(e){retu...
  function Dn (line 1) | function Dn(e,n){var t=Bn(e)||function(e){return function(e){return Tn(e...
  function An (line 1) | function An(e){if(!Nn(e)||function(e){return!!tn&&tn in e}(e))return!1;v...
  function xn (line 1) | function xn(e){if(t=(n=e)&&n.constructor,r="function"==typeof t&&t.proto...
  function vn (line 1) | function vn(e,n){var t=function(e,n){return null==e?void 0:e[n]}(e,n);re...
  function Cn (line 1) | function Cn(e,n){return!!(n=null==n?9007199254740991:n)&&("number"==type...
  function Fn (line 1) | function Fn(e){if(null!=e){try{return rn.call(e)}catch(e){}try{return e+...
  function zn (line 1) | function zn(e){return null!=e&&function(e){return"number"==typeof e&&e>-...
  function Sn (line 1) | function Sn(e){var n=Nn(e)?an.call(e):"";return"[object Function]"==n||"...
  function Nn (line 1) | function Nn(e){var n=typeof e;return!!e&&("object"==n||"function"==n)}
  function Tn (line 1) | function Tn(e){return!!e&&"object"==typeof e}
  function On (line 1) | function On(e){return e?Ge(e,function(e){return zn(e)?Dn(e):xn(e)}(e)):[]}
  function $n (line 1) | function $n(e){var n=e.indexOf(":");return n>-1?n===e.length-1?$n(e=e.su...
  function Un (line 1) | function Un(e){return"string"==typeof e&&e.length>0?":"+e+":":e}
  class Gn (line 1) | class Gn{static convert(e){return Zn.parse(e)}static html(e,n){e=(e=Hn.e...
    method convert (line 1) | static convert(e){return Zn.parse(e)}
    method html (line 1) | static html(e,n){e=(e=Hn.emojify(e)).replace(/(https:\/\/github\.com\/...

FILE: custom_components/hacs/hacs_frontend/c.46ab4f2a.js
  function n (line 1) | function n(e){return Intl.getCanonicalLocales(e)}
  function t (line 1) | function t(e){if("symbol"==typeof e)throw TypeError("Cannot convert a Sy...
  function r (line 1) | function r(e){if(void 0===e)return NaN;if(null===e)return 0;if("boolean"...
  function u (line 1) | function u(e){if(null==e)throw new TypeError("undefined/null cannot be c...
  function i (line 1) | function i(e,n){return Object.is?Object.is(e,n):e===n?0!==e||1/e==1/n:e!...
  function a (line 1) | function a(e){return new Array(e)}
  function o (line 1) | function o(e,n){return Object.prototype.hasOwnProperty.call(e,n)}
  function c (line 1) | function c(e,n){return e-Math.floor(e/n)*n}
  function l (line 1) | function l(e){return Math.floor(e/864e5)}
  function s (line 1) | function s(e){return Date.UTC(e,0)/864e5}
  function f (line 1) | function f(e){return new Date(e).getUTCFullYear()}
  function D (line 1) | function D(e){return e%4!=0?365:e%100!=0?366:e%400!=0?365:366}
  function m (line 1) | function m(e){return l(e)-s(f(e))}
  function g (line 1) | function g(e){return 365===D(f(e))?0:1}
  function p (line 1) | function p(e){var n=m(e),t=g(e);if(n>=0&&n<31)return 0;if(n<59+t)return ...
  function d (line 1) | function d(e){return void 0===e?Object.create(null):u(e)}
  function y (line 1) | function y(e,n,t,r){if(void 0!==e){if(e=Number(e),isNaN(e)||e<n||e>t)thr...
  function F (line 1) | function F(e,n,t,r,u){return y(e[n],t,r,u)}
  function v (line 1) | function v(e,n,r,u,i){if("object"!=typeof e)throw new TypeError("Options...
  function b (line 1) | function b(e){return e.slice(e.indexOf("-")+1)}
  function C (line 1) | function C(e){return E.indexOf(e)>-1}
  function w (line 1) | function w(e){return 3===(e=e.replace(/([a-z])/g,(function(e,n){return n...
  function A (line 1) | function A(e){if(C(e=e.replace(/([A-Z])/g,(function(e,n){return n.toLowe...
  function B (line 1) | function B(e){return Math.floor(Math.log(e)*Math.LOG10E)}
  function x (line 1) | function x(e,n){if("function"==typeof e.repeat)return e.repeat(n);for(va...
  function O (line 1) | function O(e,n,t,r){e.get(n)||e.set(n,Object.create(null)),e.get(n)[t]=r}
  function N (line 1) | function N(e,n){for(var t=[],r=2;r<arguments.length;r++)t[r-2]=arguments...
  function I (line 1) | function I(e,n,t){if(void 0===t&&(t=Error),!e)throw new t(n)}
  function M (line 1) | function M(e,n,t){var r=(0,t.getInternalSlots)(e),u=r.notation,i=r.dataL...
  function T (line 1) | function T(e,n,t){var r,u,i,a,o=t;if(0===e)r=x("0",o),u=0,i=0;else{var c...
  function k (line 1) | function k(e,n,t){var r,u,i=t,a=Math.round(e*Math.pow(10,i)),o=a/Math.po...
  function j (line 1) | function j(e,n){var t,r=n<0||i(n,-0);switch(r&&(n=-n),e.roundingType){ca...
  function L (line 1) | function L(e,n,t){var r=t.getInternalSlots;if(0===n)return[0,0];n<0&&(n=...
  function U (line 1) | function U(e,n){var t=n.currencyDigitsData;return o(t,e)?t[e]:2}
  function Y (line 1) | function Y(e,n,t,r){var u,i,a=e.sign,o=e.exponent,c=e.magnitude,l=r.nota...
  function Z (line 1) | function Z(e,n,t,r,u,i,a){var o=[],c=n.formattedString,l=n.roundedNumber...
  function $ (line 1) | function $(e,n){e.indexOf(";")<0&&(e="".concat(e,";-").concat(e));var t=...
  function H (line 1) | function H(e,n,t){return t[e.select(n)]||t.other}
  function W (line 1) | function W(e,n,t){var r,u,a,o=t.getInternalSlots,c=o(e),l=c.pl,s=c.dataL...
  function J (line 1) | function J(e,n,t){if(void 0===t&&(t=Error),!e)throw new t(n)}
  function K (line 1) | function K(e,n){for(var t=n;;){if(e.has(t))return t;var r=t.lastIndexOf(...
  function Q (line 1) | function Q(e,n){J(2===n.length,"key must have 2 elements");var t=e.lengt...
  function X (line 1) | function X(e,n,t,r,u,i){var a;a="lookup"===t.localeMatcher?function(e,n,...
  function ee (line 1) | function ee(e,n){for(var t=[],r=0,u=n;r<u.length;r++){var i=K(e,u[r].rep...
  function ne (line 1) | function ne(e,n,t){void 0===n&&(n=Object.create(null));var r=(0,t.getInt...
  function te (line 1) | function te(e,n,t,r,u){var i=F(n,"minimumIntegerDigits",1,21,1),a=n.mini...
  function t (line 1) | function t(){var e=null!==n&&n.apply(this,arguments)||this;return e.type...
  method RangePatternType (line 1) | get RangePatternType(){return V}

FILE: custom_components/hacs/hacs_frontend/c.487362b0.js
  function C (line 1) | function C(e,t){for(var i=new Map,c=0;c<e;c++){var l=t(c).trim();if(l){v...
  function A (line 1) | function A(e,t){var i,c=e.nextChar,l=e.focusItemAtIndex,d=e.sortedIndexB...
  function k (line 1) | function k(e){return e.typeaheadBuffer.length>0}
  function c (line 1) | function c(e,l){void 0===l&&(l={});var d=i.call(this,t(t({},c.defaultAda...
  class M (line 1) | class M extends _{constructor(){super(...arguments),this.mdcFoundationCl...
    method constructor (line 1) | constructor(){super(...arguments),this.mdcFoundationClass=R,this.disab...
    method items (line 1) | get items(){return this.menuElement_||(this.menuElement_=this.menuElem...
    method selected (line 1) | get selected(){const e=this.menuElement;return e?e.selected:null}
    method index (line 1) | get index(){const e=this.menuElement;return e?e.index:-1}
    method shouldRenderHelperText (line 1) | get shouldRenderHelperText(){return!!this.helper||!!this.validationMes...
    method validity (line 1) | get validity(){return this._checkValidity(this.value),this._validity}
    method render (line 1) | render(){const e={"mdc-select--disabled":this.disabled,"mdc-select--no...
    method renderRipple (line 69) | renderRipple(){return this.outlined?m:a`
    method renderOutline (line 71) | renderOutline(){return this.outlined?a`
    method renderLabel (line 77) | renderLabel(){return this.label?a`
    method renderLeadingIcon (line 81) | renderLeadingIcon(){return this.icon?a`<mwc-icon class="mdc-select__ic...
    method renderLineRipple (line 81) | renderLineRipple(){return this.outlined?m:a`
    method renderHelperText (line 83) | renderHelperText(){if(!this.shouldRenderHelperText)return m;const e=th...
    method createAdapter (line 86) | createAdapter(){return Object.assign(Object.assign({},p(this.mdcRoot))...
    method checkValidity (line 86) | checkValidity(){const e=this._checkValidity(this.value);if(!e){const e...
    method reportValidity (line 86) | reportValidity(){const e=this.checkValidity();return this.isUiValid=e,e}
    method _checkValidity (line 86) | _checkValidity(e){const t=this.formElement.validity;let i=D(t);if(this...
    method setCustomValidity (line 86) | setCustomValidity(e){this.validationMessage=e,this.formElement.setCust...
    method getUpdateComplete (line 86) | async getUpdateComplete(){await this._menuUpdateComplete;return await ...
    method firstUpdated (line 86) | async firstUpdated(){const e=this.menuElement;if(e&&(this._menuUpdateC...
    method onItemsUpdated (line 86) | onItemsUpdated(){this.sortedIndexByFirstChar=C(this.items.length,(e=>t...
    method select (line 86) | select(e){const t=this.menuElement;t&&t.select(e)}
    method selectByValue (line 86) | selectByValue(e){let t=-1;for(let i=0;i<this.items.length;i++){if(this...
    method disconnectedCallback (line 86) | disconnectedCallback(){super.disconnectedCallback();for(const e of thi...
    method focus (line 86) | focus(){const e=new CustomEvent("focus"),t=this.anchorElement;t&&(t.di...
    method blur (line 86) | blur(){const e=new CustomEvent("blur"),t=this.anchorElement;t&&(t.disp...
    method onFocus (line 86) | onFocus(){this.mdcFoundation&&this.mdcFoundation.handleFocus()}
    method onBlur (line 86) | onBlur(){this.mdcFoundation&&this.mdcFoundation.handleBlur();const e=t...
    method onClick (line 86) | onClick(e){if(this.mdcFoundation){this.focus();const t=e.target.getBou...
    method onKeydown (line 86) | onKeydown(e){const t=v(e)===y.ARROW_UP,i=v(e)===y.ARROW_DOWN;if(i||t){...
    method handleTypeahead (line 86) | handleTypeahead(e){if(!this.menuElement)return;const t=this.menuElemen...
    method onSelected (line 86) | async onSelected(e){this.mdcFoundation||await this.updateComplete,this...
    method onOpened (line 86) | onOpened(){this.mdcFoundation&&(this.menuOpen=!0,this.mdcFoundation.ha...
    method onClosed (line 86) | onClosed(){this.mdcFoundation&&(this.menuOpen=!1,this.mdcFoundation.ha...
    method setFormData (line 86) | setFormData(e){this.name&&null!==this.selected&&e.append(this.name,thi...
    method layout (line 86) | async layout(e=!0){this.mdcFoundation&&this.mdcFoundation.layout(),awa...
    method layoutOptions (line 86) | async layoutOptions(){this.mdcFoundation&&this.mdcFoundation.layoutOpt...

FILE: custom_components/hacs/hacs_frontend/c.4a97632a.js
  function t (line 1) | function t(t){const a=t.language||"en";return t.translationMetadata.tran...
  function a (line 1) | function a(a){return t(a)?"rtl":"ltr"}

FILE: custom_components/hacs/hacs_frontend/c.4d3573a6.js
  function u (line 1) | function u(e){return Intl.getCanonicalLocales(e)}
  function l (line 1) | function l(e){if("symbol"==typeof e)throw TypeError("Cannot convert a Sy...
  function s (line 1) | function s(e){if(void 0===e)return NaN;if(null===e)return 0;if("boolean"...
  function c (line 1) | function c(e){if(null==e)throw new TypeError("undefined/null cannot be c...
  function m (line 1) | function m(e,t){return Object.is?Object.is(e,t):e===t?0!==e||1/e==1/t:e!...
  function f (line 1) | function f(e){return new Array(e)}
  function d (line 1) | function d(e,t){return Object.prototype.hasOwnProperty.call(e,t)}
  function p (line 1) | function p(e,t){return e-Math.floor(e/t)*t}
  function g (line 1) | function g(e){return Math.floor(e/864e5)}
  function D (line 1) | function D(e){return Date.UTC(e,0)/864e5}
  function v (line 1) | function v(e){return new Date(e).getUTCFullYear()}
  function h (line 1) | function h(e){return e%4!=0?365:e%100!=0?366:e%400!=0?365:366}
  function y (line 1) | function y(e){return g(e)-D(v(e))}
  function F (line 1) | function F(e){return 365===h(v(e))?0:1}
  function T (line 1) | function T(e){var t=y(e),a=F(e);if(t>=0&&t<31)return 0;if(t<59+a)return ...
  function b (line 1) | function b(e){return void 0===e?Object.create(null):c(e)}
  function A (line 1) | function A(e,t,a,r){if(void 0!==e){if(e=Number(e),isNaN(e)||e<t||e>a)thr...
  function S (line 1) | function S(e,t,a,r,n){return A(e[t],a,r,n)}
  function P (line 1) | function P(e,t,a,r,n){if("object"!=typeof e)throw new TypeError("Options...
  function C (line 1) | function C(e){return e.slice(e.indexOf("-")+1)}
  function M (line 1) | function M(e){return w.indexOf(e)>-1}
  function O (line 1) | function O(e){return 3===(e=e.replace(/([a-z])/g,(function(e,t){return t...
  function L (line 1) | function L(e){if(M(e=e.replace(/([A-Z])/g,(function(e,t){return t.toLowe...
  function _ (line 1) | function _(e){return Math.floor(Math.log(e)*Math.LOG10E)}
  function I (line 1) | function I(e,t){if("function"==typeof e.repeat)return e.repeat(t);for(va...
  function N (line 1) | function N(e,t,a,r){e.get(t)||e.set(t,Object.create(null)),e.get(t)[a]=r}
  function j (line 1) | function j(e,t){for(var a=[],r=2;r<arguments.length;r++)a[r-2]=arguments...
  function B (line 1) | function B(e,t,a){if(void 0===a&&(a=Error),!e)throw new a(t)}
  function R (line 1) | function R(e,t,a){var r=(0,a.getInternalSlots)(e),n=r.notation,i=r.dataL...
  function G (line 1) | function G(e,t,a){var r,n,i,o,u=a;if(0===e)r=I("0",u),n=0,i=0;else{var l...
  function x (line 1) | function x(e,t,a){var r,n,i=a,o=Math.round(e*Math.pow(10,i)),u=o/Math.po...
  function z (line 1) | function z(e,t){var a,r=t<0||m(t,-0);switch(r&&(t=-t),e.roundingType){ca...
  function U (line 1) | function U(e,t,a){var r=a.getInternalSlots;if(0===t)return[0,0];t<0&&(t=...
  function Z (line 1) | function Z(e,t){var a=t.currencyDigitsData;return d(a,e)?a[e]:2}
  function q (line 1) | function q(e,t,a,r){var n,i,o=e.sign,u=e.exponent,l=e.magnitude,s=r.nota...
  function $ (line 1) | function $(e,t,a,r,n,i,o){var u=[],l=t.formattedString,s=t.roundedNumber...
  function Q (line 1) | function Q(e,t){e.indexOf(";")<0&&(e="".concat(e,";-").concat(e));var a=...
  function X (line 1) | function X(e,t,a){return a[e.select(t)]||a.other}
  function ee (line 1) | function ee(e,t,a){var r,n,i,o=a.getInternalSlots,u=o(e),l=u.pl,s=u.data...
  function te (line 1) | function te(e,t,a){void 0===t&&(t=Object.create(null));var r=(0,a.getInt...
  function ae (line 1) | function ae(e,t,a,r,n){var i=S(t,"minimumIntegerDigits",1,21,1),o=t.mini...
  function t (line 1) | function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.type...
  method RangePatternType (line 1) | get RangePatternType(){return H}
  function a (line 1) | function a(e){return e<10?"0".concat(e):String(e)}
  function r (line 1) | function r(e,t,r,n){var i=Math.floor(r/6e4),o=Math.abs(i)%60,u=Math.floo...
  function i (line 1) | function i(e,t){var a=e.length;switch(e[0]){case"G":return t.era=4===a?"...
  function o (line 1) | function o(e){switch(e){case"G":return"era";case"y":case"Y":case"u":case...
  function u (line 1) | function u(e,t){var r=[],o=e.replace(/'{2}/g,"{apostrophe}").replace(/'(...
  function l (line 1) | function l(e){return e.split(/(\{[0|1]\})/g).filter(Boolean).map((functi...
  function s (line 1) | function s(e){for(var t,a=/\{(.*?)\}/g,r={},n=0;t=a.exec(e);){if(t[0]in ...
  function a (line 1) | function a(e){return"numeric"===e||"2-digit"===e}
  function n (line 1) | function n(e,t){var r=0;e.hour12&&!t.hour12?r-=ue.removalPenalty:!e.hour...
  function a (line 1) | function a(e,t,a){return null==e&&(e=t),void 0!==a&&(a?e="h11"===t||"h23...

FILE: custom_components/hacs/hacs_frontend/c.55084342.js
  method _defaultScrollTarget (line 1) | get _defaultScrollTarget(){return this._doc}
  method _doc (line 1) | get _doc(){return this.ownerDocument.documentElement}
  method _scrollTop (line 1) | get _scrollTop(){return this._isValidScrollTarget()?this.scrollTarget===...
  method _scrollLeft (line 1) | get _scrollLeft(){return this._isValidScrollTarget()?this.scrollTarget==...
  method _scrollTop (line 1) | set _scrollTop(t){this.scrollTarget===this._doc?window.scrollTo(window.p...
  method _scrollLeft (line 1) | set _scrollLeft(t){this.scrollTarget===this._doc?window.scrollTo(t,windo...
  method _scrollTargetWidth (line 1) | get _scrollTargetWidth(){return this._isValidScrollTarget()?this.scrollT...
  method _scrollTargetHeight (line 1) | get _scrollTargetHeight(){return this._isValidScrollTarget()?this.scroll...
  method _clampedScrollTop (line 83) | get _clampedScrollTop(){return Math.max(0,this._scrollTop)}
  method _maxHeaderTop (line 83) | get _maxHeaderTop(){return this.fixed?this._dHeight:this._height+5}
  method _stickyEl (line 83) | get _stickyEl(){if(this._stickyElRef)return this._stickyElRef;for(var t,...

FILE: custom_components/hacs/hacs_frontend/c.5d9598b2.js
  function E (line 1) | function E(i,s,r){let d,a=i;return"object"==typeof i?(a=i.slot,d=i):d={f...
  class I (line 1) | class I extends n{constructor(){super(...arguments),this.value="",this.g...
    method constructor (line 1) | constructor(){super(...arguments),this.value="",this.group=null,this.t...
    method text (line 1) | get text(){const t=this.textContent;return t?t.trim():""}
    method render (line 1) | render(){const t=this.renderText(),e=this.graphic?this.renderGraphic()...
    method renderRipple (line 5) | renderRipple(){return this.shouldRenderRipple?c`
    method renderGraphic (line 8) | renderGraphic(){const t={multi:this.multipleGraphics};return c`
    method renderMeta (line 11) | renderMeta(){return c`
    method renderText (line 14) | renderText(){const t=this.twoline?this.renderTwoline():this.renderSing...
    method renderSingleLine (line 17) | renderSingleLine(){return c`<slot></slot>`}
    method renderTwoline (line 17) | renderTwoline(){return c`
    method onClick (line 24) | onClick(){this.fireRequestSelected(!this.selected,"interaction")}
    method onDown (line 24) | onDown(t,e){const i=()=>{window.removeEventListener(t,i),this.rippleHa...
    method fireRequestSelected (line 24) | fireRequestSelected(t,e){if(this.noninteractive)return;const i=new Cus...
    method connectedCallback (line 24) | connectedCallback(){super.connectedCallback(),this.noninteractive||thi...
    method disconnectedCallback (line 24) | disconnectedCallback(){super.disconnectedCallback();for(const t of thi...
    method firstUpdated (line 24) | firstUpdated(){const t=new Event("list-item-rendered",{bubbles:!0,comp...
  function V (line 24) | function V(t){var e=t.key;if(A.has(e))return e;var i=B.get(t.keyCode);re...
  function Z (line 24) | function Z(t){return t instanceof Set}
  class Q (line 24) | class Q extends p{constructor(t){super(Object.assign(Object.assign({},Q....
    method constructor (line 24) | constructor(t){super(Object.assign(Object.assign({},Q.defaultAdapter),...
    method strings (line 24) | static get strings(){return K}
    method numbers (line 24) | static get numbers(){return q}
    method defaultAdapter (line 24) | static get defaultAdapter(){return{focusItemAtIndex:()=>{},getFocusedE...
    method setWrapFocus (line 24) | setWrapFocus(t){this.wrapFocus_=t}
    method setMulti (line 24) | setMulti(t){this.isMulti_=t;const e=this.selectedIndex_;if(t){if(!Z(e)...
    method setVerticalOrientation (line 24) | setVerticalOrientation(t){this.isVertical_=t}
    method setUseActivatedClass (line 24) | setUseActivatedClass(t){this.useActivatedClass_=t}
    method getSelectedIndex (line 24) | getSelectedIndex(){return this.selectedIndex_}
    method setSelectedIndex (line 24) | setSelectedIndex(t){this.isIndexValid_(t)&&(this.isMulti_?this.setMult...
    method handleFocusIn (line 24) | handleFocusIn(t,e){e>=0&&this.adapter.setTabIndexForElementIndex(e,0)}
    method handleFocusOut (line 24) | handleFocusOut(t,e){e>=0&&this.adapter.setTabIndexForElementIndex(e,-1...
    method handleKeydown (line 24) | handleKeydown(t,e,i){const s="ArrowLeft"===V(t),r="ArrowUp"===V(t),d="...
    method handleSingleSelection (line 24) | handleSingleSelection(t,e,i){t!==q.UNSET_INDEX&&(this.setSelectedIndex...
    method focusNextElement (line 24) | focusNextElement(t){let e=t+1;if(e>=this.adapter.getListItemCount()){i...
    method focusPrevElement (line 24) | focusPrevElement(t){let e=t-1;if(e<0){if(!this.wrapFocus_)return t;e=t...
    method focusFirstElement (line 24) | focusFirstElement(){return this.adapter.focusItemAtIndex(0),0}
    method focusLastElement (line 24) | focusLastElement(){const t=this.adapter.getListItemCount()-1;return th...
    method setEnabled (line 24) | setEnabled(t,e){this.isIndexValid_(t)&&this.adapter.setDisabledStateFo...
    method preventDefaultEvent (line 24) | preventDefaultEvent(t){const e=`${t.target.tagName}`.toLowerCase();-1=...
    method setSingleSelectionAtIndex_ (line 24) | setSingleSelectionAtIndex_(t,e=!0){this.selectedIndex_!==t&&(this.sele...
    method setMultiSelectionAtIndex_ (line 24) | setMultiSelectionAtIndex_(t,e=!0){const i=((t,e)=>{const i=Array.from(...
    method setAriaForSingleSelectionAtIndex_ (line 24) | setAriaForSingleSelectionAtIndex_(t){this.selectedIndex_===q.UNSET_IND...
    method setTabindexAtIndex_ (line 24) | setTabindexAtIndex_(t){this.focusedItemIndex_===q.UNSET_INDEX&&0!==t?t...
    method setTabindexToFirstSelectedItem_ (line 24) | setTabindexToFirstSelectedItem_(){let t=0;"number"==typeof this.select...
    method isIndexValid_ (line 24) | isIndexValid_(t){if(t instanceof Set){if(!this.isMulti_)throw new Erro...
    method isIndexInRange_ (line 24) | isIndexInRange_(t){const e=this.adapter.getListItemCount();return t>=0...
    method setSelectedIndexOnAction_ (line 24) | setSelectedIndexOnAction_(t,e,i){if(this.adapter.getDisabledStateForEl...
    method toggleMultiAtIndex (line 24) | toggleMultiAtIndex(t,e,i=!0){let s=!1;s=void 0===e?!this.adapter.getSe...
  function et (line 24) | function et(){const t=this.itemsReadyResolver;this.itemsReady=new Promis...
  class it (line 24) | class it extends u{constructor(){super(),this.mdcAdapter=null,this.mdcFo...
    method constructor (line 24) | constructor(){super(),this.mdcAdapter=null,this.mdcFoundationClass=Q,t...
    method getUpdateComplete (line 24) | async getUpdateComplete(){const t=await super.getUpdateComplete();retu...
    method items (line 24) | get items(){return this.items_}
    method updateItems (line 24) | updateItems(){var t;const e=null!==(t=this.assignedElements)&&void 0!=...
    method selected (line 24) | get selected(){const t=this.index;if(!Z(t))return-1===t?null:this.item...
    method index (line 24) | get index(){return this.mdcFoundation?this.mdcFoundation.getSelectedIn...
    method render (line 24) | render(){const t=null===this.innerRole?void 0:this.innerRole,e=null===...
    method renderPlaceholder (line 39) | renderPlaceholder(){var t;const e=null!==(t=this.assignedElements)&&vo...
    method firstUpdated (line 41) | firstUpdated(){super.firstUpdated(),this.items.length||(this.mdcFounda...
    method onFocusIn (line 41) | onFocusIn(t){if(this.mdcFoundation&&this.mdcRoot){const e=this.getInde...
    method onFocusOut (line 41) | onFocusOut(t){if(this.mdcFoundation&&this.mdcRoot){const e=this.getInd...
    method onKeydown (line 41) | onKeydown(t){if(this.mdcFoundation&&this.mdcRoot){const e=this.getInde...
    method onRequestSelected (line 41) | onRequestSelected(t){if(this.mdcFoundation){let e=this.getIndexOfTarge...
    method getIndexOfTarget (line 41) | getIndexOfTarget(t){const e=this.items,i=t.composedPath();for(const t ...
    method createAdapter (line 41) | createAdapter(){return this.mdcAdapter={getListItemCount:()=>this.mdcR...
    method selectUi (line 41) | selectUi(t,e=!1){const i=this.items[t];i&&(i.selected=!0,i.activated=e)}
    method deselectUi (line 41) | deselectUi(t){const e=this.items[t];e&&(e.selected=!1,e.activated=!1)}
    method select (line 41) | select(t){this.mdcFoundation&&this.mdcFoundation.setSelectedIndex(t)}
    method toggle (line 41) | toggle(t,e){this.multi&&this.mdcFoundation.toggleMultiAtIndex(t,e)}
    method onListItemConnected (line 41) | onListItemConnected(t){const e=t.target;this.layout(-1===this.items.in...
    method layout (line 41) | layout(t=!0){t&&this.updateItems();const e=this.items[0];for(const t o...
    method getFocusedItemIndex (line 41) | getFocusedItemIndex(){if(!this.mdcRoot)return-1;if(!this.items.length)...
    method focusItemAtIndex (line 41) | focusItemAtIndex(t){for(const t of this.items)if(0===t.tabindex){t.tab...
    method focus (line 41) | focus(){const t=this.mdcRoot;t&&t.focus()}
    method blur (line 41) | blur(){const t=this.mdcRoot;t&&t.blur()}

FILE: custom_components/hacs/hacs_frontend/c.5ec2d281.js
  fun
Condensed preview — 170 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (6,868K chars).
[
  {
    "path": ".vscode/settings.json",
    "chars": 76,
    "preview": "{\r\n    \"files.associations\": {\r\n        \"*.yaml\": \"home-assistant\"\r\n    }\r\n}"
  },
  {
    "path": "README.md",
    "chars": 7322,
    "preview": "<p align=\"center\">\r\n  <img src=\"https://raw.githubusercontent.com/JuanMTech/Home_Assistant_files/master/images/Logo/JMT_"
  },
  {
    "path": "automations.yaml",
    "chars": 25765,
    "preview": "- id: '1609360640751'\n  alias: Ofc Desk light toggle\n  description: ''\n  trigger:\n  - device_id: 9a4868dc7e530466fc51a82"
  },
  {
    "path": "cloud_config.yaml",
    "chars": 519,
    "preview": "google_actions:\r\n  entity_config:\r\n    script.lr_air_conditioner:\r\n      room: Living room\r\n      aliases:\r\n        - Li"
  },
  {
    "path": "configuration.yaml",
    "chars": 393,
    "preview": "# Configure a default setup of Home Assistant (frontend, api, etc)\ndefault_config:\n\nfrontend:\n  themes: !include_dir_mer"
  },
  {
    "path": "custom_components/alarmo/__init__.py",
    "chars": 17273,
    "preview": "\"\"\"The Alarmo Integration.\"\"\"\r\nimport logging\r\nimport bcrypt\r\nimport base64\r\n\r\nfrom homeassistant.core import (\r\n    cal"
  },
  {
    "path": "custom_components/alarmo/alarm_control_panel.py",
    "chars": 40888,
    "preview": "\"\"\"Initialization of Alarmo alarm_control_panel platform.\"\"\"\r\nimport datetime\r\nimport logging\r\nimport functools\r\nimport "
  },
  {
    "path": "custom_components/alarmo/automations.py",
    "chars": 11828,
    "preview": "import logging\r\nimport copy\r\nimport re\r\n\r\nfrom homeassistant.core import (\r\n    HomeAssistant,\r\n    callback,\r\n)\r\n\r\nfrom"
  },
  {
    "path": "custom_components/alarmo/card.py",
    "chars": 1298,
    "preview": "import logging\r\nimport voluptuous as vol\r\n\r\nfrom homeassistant.core import callback\r\nfrom homeassistant.helpers.dispatch"
  },
  {
    "path": "custom_components/alarmo/config_flow.py",
    "chars": 839,
    "preview": "\"\"\"Config flow for the Alarmo component.\"\"\"\r\nimport secrets\r\n\r\nfrom homeassistant import config_entries\r\n\r\nfrom .const i"
  },
  {
    "path": "custom_components/alarmo/const.py",
    "chars": 5540,
    "preview": "\"\"\"Store constants.\"\"\"\r\nimport datetime\r\nimport voluptuous as vol\r\n\r\nfrom homeassistant.const import (\r\n    STATE_ALARM_"
  },
  {
    "path": "custom_components/alarmo/event.py",
    "chars": 1942,
    "preview": "# fire events in HA for use with automations\n\nimport logging\n\nfrom homeassistant.core import callback\nfrom homeassistant"
  },
  {
    "path": "custom_components/alarmo/frontend/dist/alarm-panel.js",
    "chars": 377562,
    "preview": "!function(e){\"use strict\";\n/*! *****************************************************************************\n    Copyrig"
  },
  {
    "path": "custom_components/alarmo/helpers.py",
    "chars": 571,
    "preview": "import logging\n\nfrom homeassistant.core import (\n    HomeAssistant,\n)\n\nfrom . import const\n\n_LOGGER = logging.getLogger("
  },
  {
    "path": "custom_components/alarmo/manifest.json",
    "chars": 420,
    "preview": "{\n  \"domain\": \"alarmo\",\n  \"name\": \"Alarmo\",\n  \"documentation\": \"https://github.com/nielsfaber/alarmo\",\n  \"issue_tracker\""
  },
  {
    "path": "custom_components/alarmo/mqtt.py",
    "chars": 10142,
    "preview": "import json\nimport logging\n\nfrom homeassistant.core import (\n    HomeAssistant,\n    callback,\n)\n\nfrom homeassistant.comp"
  },
  {
    "path": "custom_components/alarmo/panel.py",
    "chars": 1135,
    "preview": "import os\r\nimport logging\r\n\r\nfrom homeassistant.components import frontend\r\nfrom homeassistant.components import panel_c"
  },
  {
    "path": "custom_components/alarmo/sensors.py",
    "chars": 14112,
    "preview": "import logging\r\n\r\nimport homeassistant.util.dt as dt_util\r\n\r\nfrom homeassistant.core import (\r\n    HomeAssistant,\r\n    c"
  },
  {
    "path": "custom_components/alarmo/services.yaml",
    "chars": 2251,
    "preview": "\r\narm:\r\n  name: Arm\r\n  description: \"Arm an Alarmo entity with custom settings.\"\r\n  fields:\r\n    entity_id:\r\n      name:"
  },
  {
    "path": "custom_components/alarmo/store.py",
    "chars": 23978,
    "preview": "import logging\r\nimport time\r\nimport attr\r\nfrom collections import OrderedDict\r\nfrom typing import MutableMapping, cast\r\n"
  },
  {
    "path": "custom_components/alarmo/websockets.py",
    "chars": 19656,
    "preview": "import voluptuous as vol\r\nimport logging\r\n\r\nfrom homeassistant.components import websocket_api\r\nfrom homeassistant.core "
  },
  {
    "path": "custom_components/hacs/__init__.py",
    "chars": 9099,
    "preview": "\"\"\"\nHACS gives you a powerful UI to handle downloads of all your custom needs.\n\nFor more details about this integration,"
  },
  {
    "path": "custom_components/hacs/base.py",
    "chars": 35284,
    "preview": "\"\"\"Base HACS class.\"\"\"\nfrom __future__ import annotations\n\nimport asyncio\nfrom dataclasses import asdict, dataclass, fie"
  },
  {
    "path": "custom_components/hacs/config_flow.py",
    "chars": 7237,
    "preview": "\"\"\"Adds config flow for HACS.\"\"\"\nfrom aiogithubapi import GitHubDeviceAPI, GitHubException\nfrom aiogithubapi.common.cons"
  },
  {
    "path": "custom_components/hacs/const.py",
    "chars": 3434,
    "preview": "\"\"\"Constants for HACS\"\"\"\nfrom typing import TypeVar\n\nfrom aiogithubapi.common.const import ACCEPT_HEADERS\n\nNAME_SHORT = "
  },
  {
    "path": "custom_components/hacs/diagnostics.py",
    "chars": 2762,
    "preview": "\"\"\"Diagnostics support for HACS.\"\"\"\nfrom __future__ import annotations\n\nfrom typing import Any\n\nfrom aiogithubapi import"
  },
  {
    "path": "custom_components/hacs/entity.py",
    "chars": 3559,
    "preview": "\"\"\"HACS Base entities.\"\"\"\nfrom __future__ import annotations\n\nfrom typing import TYPE_CHECKING, Any\n\nfrom homeassistant."
  },
  {
    "path": "custom_components/hacs/enums.py",
    "chars": 1687,
    "preview": "\"\"\"Helper constants.\"\"\"\n# pylint: disable=missing-class-docstring\nfrom enum import Enum\n\n\nclass HacsGitHubRepo(str, Enum"
  },
  {
    "path": "custom_components/hacs/exceptions.py",
    "chars": 1363,
    "preview": "\"\"\"Custom Exceptions for HACS.\"\"\"\n\n\nclass HacsException(Exception):\n    \"\"\"Super basic.\"\"\"\n\n\nclass HacsRepositoryArchive"
  },
  {
    "path": "custom_components/hacs/frontend.py",
    "chars": 3233,
    "preview": "\"\"\"\"Starting setup task: Frontend\".\"\"\"\nfrom __future__ import annotations\n\nfrom typing import TYPE_CHECKING\n\nfrom aiohtt"
  },
  {
    "path": "custom_components/hacs/hacs_frontend/__init__.py",
    "chars": 94,
    "preview": "\"\"\"HACS Frontend\"\"\"\r\nfrom .version import VERSION\r\n\r\ndef locate_dir():\r\n    return __path__[0]"
  },
  {
    "path": "custom_components/hacs/hacs_frontend/c.004a7b01.js",
    "chars": 7628,
    "preview": "var t=function(){if(\"undefined\"!=typeof Map)return Map;function t(t,e){var n=-1;return t.some((function(t,r){return t[0]"
  },
  {
    "path": "custom_components/hacs/hacs_frontend/c.01f18260.js",
    "chars": 75333,
    "preview": "import{u as e,v as t,G as i,M as c,_ as o,i as r,e as n,t as a,B as d,$ as s,o as p,I as l,y as m,p as h,q as u,r as f,n"
  },
  {
    "path": "custom_components/hacs/hacs_frontend/c.063631e8.js",
    "chars": 445882,
    "preview": "import{A as e,aY as t,r as i,aZ as a,aa as n,a7 as o,a_ as s,a$ as r,a9 as l,S as d,T as c,x as u,Q as h,b0 as p,a as v,"
  },
  {
    "path": "custom_components/hacs/hacs_frontend/c.0681dd5f.js",
    "chars": 544,
    "preview": "import{al as e,am as a,aj as s,an as r,ao as u}from\"./main-7bc9a818.js\";async function i(i,o,n){const t=new e(\"updateLov"
  },
  {
    "path": "custom_components/hacs/hacs_frontend/c.07e1d870.js",
    "chars": 1399,
    "preview": "import{a as e,e as t,i,L as a,N as d,$ as r,r as n,n as o}from\"./main-7bc9a818.js\";import{H as s}from\"./c.d9dcade0.js\";e"
  },
  {
    "path": "custom_components/hacs/hacs_frontend/c.18158037.js",
    "chars": 1568,
    "preview": "import{a as e,H as i,e as t,$ as o,P as s,d as a,r as c,n}from\"./main-7bc9a818.js\";import{c as l}from\"./c.fc1fab2b.js\";e"
  },
  {
    "path": "custom_components/hacs/hacs_frontend/c.21c042d4.js",
    "chars": 66,
    "preview": "const n=(n,o)=>n&&n.config.components.includes(o);export{n as i};\n"
  },
  {
    "path": "custom_components/hacs/hacs_frontend/c.2442b973.js",
    "chars": 19480,
    "preview": "import{aw as e,ax as t,ay as i,a6 as a,a7 as o,a8 as s,a as n,h as r,e as l,$ as d,o as c,r as h,n as p,m as g,az as u,a"
  },
  {
    "path": "custom_components/hacs/hacs_frontend/c.24bd2446.js",
    "chars": 8716,
    "preview": "var t=\"undefined\"!=typeof window&&\"undefined\"!=typeof document&&window.document===document,e=\"undefined\"!=typeof global&"
  },
  {
    "path": "custom_components/hacs/hacs_frontend/c.262db200.js",
    "chars": 5734,
    "preview": "import{a as s,H as o,e as t,t as a,$ as i,Z as e,a0 as r,a1 as c,a2 as d,a3 as h,a4 as n,s as l,d as p,r as m,n as u}fro"
  },
  {
    "path": "custom_components/hacs/hacs_frontend/c.2a7cd87a.js",
    "chars": 3830,
    "preview": "import{a as i,h as a,e as t,t as o,i as s,$ as e,D as r,j as n,A as l,r as c,n as d}from\"./main-7bc9a818.js\";import\"./c."
  },
  {
    "path": "custom_components/hacs/hacs_frontend/c.2aa297ae.js",
    "chars": 86692,
    "preview": "import{u as t,v as e,M as i,_ as d,i as l,e as n,B as a,o,$ as r,r as c,n as s,Q as f,S as m,T as p,G as h,U as x,V as u"
  },
  {
    "path": "custom_components/hacs/hacs_frontend/c.3507790e.js",
    "chars": 168242,
    "preview": "import{c as e,a as n,u as t,g as r}from\"./c.743a15a1.js\";import{$ as o}from\"./main-7bc9a818.js\";import\"./c.e6921cf4.js\";"
  },
  {
    "path": "custom_components/hacs/hacs_frontend/c.38b86040.js",
    "chars": 426,
    "preview": "import{A as o}from\"./main-7bc9a818.js\";const a=()=>import(\"./c.2a7cd87a.js\"),i=(i,l,m)=>new Promise((n=>{const r=l.cance"
  },
  {
    "path": "custom_components/hacs/hacs_frontend/c.46ab4f2a.js",
    "chars": 26644,
    "preview": "import{u as e}from\"./main-7bc9a818.js\";function n(e){return Intl.getCanonicalLocales(e)}function t(e){if(\"symbol\"==typeo"
  },
  {
    "path": "custom_components/hacs/hacs_frontend/c.487362b0.js",
    "chars": 69743,
    "preview": "import{u as e,v as t,M as i,_ as c,i as l,e as d,t as o,w as n,$ as a,o as s,j as r,x as m,y as p,k as h,r as u}from\"./m"
  },
  {
    "path": "custom_components/hacs/hacs_frontend/c.4a97632a.js",
    "chars": 189,
    "preview": "function t(t){const a=t.language||\"en\";return t.translationMetadata.translations[a]&&t.translationMetadata.translations["
  },
  {
    "path": "custom_components/hacs/hacs_frontend/c.4d3573a6.js",
    "chars": 61807,
    "preview": "import{c as e,u as t}from\"./c.743a15a1.js\";import{u as a,ef as r}from\"./main-7bc9a818.js\";import{a as n,e as i,f as o}fr"
  },
  {
    "path": "custom_components/hacs/hacs_frontend/c.50bfd408.js",
    "chars": 236,
    "preview": "const e=()=>{const e={},r=new URLSearchParams(location.search);for(const[n,t]of r.entries())e[n]=t;return e},r=e=>{const"
  },
  {
    "path": "custom_components/hacs/hacs_frontend/c.55084342.js",
    "chars": 14208,
    "preview": "import{aE as t,a8 as e,aF as i,aG as s,aH as n,a6 as o,a7 as r}from\"./main-7bc9a818.js\";var a=new Set;const l=[{properti"
  },
  {
    "path": "custom_components/hacs/hacs_frontend/c.5d9598b2.js",
    "chars": 35748,
    "preview": "import{l as t,f as e,_ as i,i as s,g as r,e as d,t as a,h as n,R as o,$ as c,o as l,r as m,n as h,M as p,B as u,j as g,k"
  },
  {
    "path": "custom_components/hacs/hacs_frontend/c.5ec2d281.js",
    "chars": 9048,
    "preview": "import{u as e,v as t,M as c,_ as i,e as r,K as s,i as o,g as d,t as a,w as n,B as h,R as l,y as p,$ as u,j as m,r as b,A"
  },
  {
    "path": "custom_components/hacs/hacs_frontend/c.656daa82.js",
    "chars": 31,
    "preview": "var a=[];export{a as default};\n"
  },
  {
    "path": "custom_components/hacs/hacs_frontend/c.6711bf6c.js",
    "chars": 160,
    "preview": "const t=(t,e)=>{const n={};return e&&(e.type&&(n.type_filter=e.type),e.domain&&(n.domain=e.domain)),t.callWS({type:\"conf"
  },
  {
    "path": "custom_components/hacs/hacs_frontend/c.6764b15a.js",
    "chars": 36165,
    "preview": "import{c as e,u as t}from\"./c.743a15a1.js\";import{u as n,ef as r}from\"./main-7bc9a818.js\";import{a,e as u,f as i}from\"./"
  },
  {
    "path": "custom_components/hacs/hacs_frontend/c.67735e63.js",
    "chars": 127047,
    "preview": "import{Q as e,S as t,a5 as i,T as a,V as n,_ as r,n as s,a as o,h as l,e as d,i as c,$ as u,A as h,r as p,L as m,N as v,"
  },
  {
    "path": "custom_components/hacs/hacs_frontend/c.743a15a1.js",
    "chars": 384,
    "preview": "var e=\"undefined\"!=typeof globalThis?globalThis:\"undefined\"!=typeof window?window:\"undefined\"!=typeof global?global:\"und"
  },
  {
    "path": "custom_components/hacs/hacs_frontend/c.80122d23.js",
    "chars": 1171,
    "preview": "import{m as o}from\"./c.3507790e.js\";import{a as t}from\"./c.38b86040.js\";const e=async(e,n)=>t(e,{title:\"Home Assistant C"
  },
  {
    "path": "custom_components/hacs/hacs_frontend/c.8e28b461.js",
    "chars": 462,
    "preview": "const r=r=>(s,o)=>{if(s.constructor._observers){if(!s.constructor.hasOwnProperty(\"_observers\")){const r=s.constructor._o"
  },
  {
    "path": "custom_components/hacs/hacs_frontend/c.90083196.js",
    "chars": 17011,
    "preview": "import{Q as t,T as e,x as i,a as s,h as n,e as o,t as a,$ as r,eg as l,A as d,r as h,n as c,z as m,Z as u,P as p}from\"./"
  },
  {
    "path": "custom_components/hacs/hacs_frontend/c.91b5f3b9.js",
    "chars": 1187,
    "preview": "import{a as t,H as e,e as i,m as o,$ as s,n as r}from\"./main-7bc9a818.js\";import{m as a}from\"./c.3507790e.js\";import\"./c"
  },
  {
    "path": "custom_components/hacs/hacs_frontend/c.9475214f.js",
    "chars": 2806,
    "preview": "import{a as e,h as t,Y as i,e as n,i as o,$ as r,L as l,N as a,r as d,n as s}from\"./main-7bc9a818.js\";import\"./c.01f1826"
  },
  {
    "path": "custom_components/hacs/hacs_frontend/c.962e71e3.js",
    "chars": 1824,
    "preview": "import{a as r,h as e,e as t,t as s,$ as i,ah as o,n as a}from\"./main-7bc9a818.js\";import{e as n,c}from\"./c.50bfd408.js\";"
  },
  {
    "path": "custom_components/hacs/hacs_frontend/c.99c1c4ba.js",
    "chars": 145110,
    "preview": "import{c as t,a as i}from\"./c.743a15a1.js\";var e=t((function(t,i){!function(t){var i=\"1.8.0\";function e(t){var i,e,n,o;f"
  },
  {
    "path": "custom_components/hacs/hacs_frontend/c.9a1f96ed.js",
    "chars": 2916,
    "preview": "import{a6 as e,a7 as t,a as o,h as i,e as n,$ as a,r,n as l}from\"./main-7bc9a818.js\";e({_template:t`\n    <style>\n      :"
  },
  {
    "path": "custom_components/hacs/hacs_frontend/c.a1d7c963.js",
    "chars": 2690,
    "preview": "import{a as e,h as i,e as t,i as a,$ as n,O as l,z as o,A as s,r as c,n as r,m as d}from\"./main-7bc9a818.js\";import\"./c."
  },
  {
    "path": "custom_components/hacs/hacs_frontend/c.a9ee435e.js",
    "chars": 16341,
    "preview": "import{_ as r,i as e,e as a,t as i,h as s,$ as t,o as n,I as o,j as l,r as c,n as d,a as m,H as p,ah as g,d as f}from\"./"
  },
  {
    "path": "custom_components/hacs/hacs_frontend/c.abbcb4be.js",
    "chars": 1573,
    "preview": "import{a as e,h as i,e as t,$ as r,d as o,r as c,n as d}from\"./main-7bc9a818.js\";import\"./c.01f18260.js\";e([d(\"hacs-filt"
  },
  {
    "path": "custom_components/hacs/hacs_frontend/c.ad739743.js",
    "chars": 1410091,
    "preview": "\"DateTimeFormat\"in Intl&&Intl.DateTimeFormat.__addTZData&&Intl.DateTimeFormat.__addTZData({zones:[\"Africa/Accra|,0,0,0|-"
  },
  {
    "path": "custom_components/hacs/hacs_frontend/c.b27925d9.js",
    "chars": 10252,
    "preview": "import{a as e,h as i,e as t,t as a,i as s,$ as o,at as r,o as n,A as d,ae as l,r as c,n as h,H as p,L as m,N as u,au as "
  },
  {
    "path": "custom_components/hacs/hacs_frontend/c.bad50d60.js",
    "chars": 13977,
    "preview": "import{a as o,h as t,e,$ as i,w as s,r as a,n as r,t as n,L as h,N as l,ai as c,a2 as d,a3 as p,m as u,c as y,aN as m,aO"
  },
  {
    "path": "custom_components/hacs/hacs_frontend/c.bc53dda1.js",
    "chars": 67192,
    "preview": "var t,e;t=window,e=document,L.drawVersion=\"1.0.4\",L.Draw={},L.drawLocal={draw:{toolbar:{actions:{title:\"Cancel drawing\","
  },
  {
    "path": "custom_components/hacs/hacs_frontend/c.bd21ff9b.js",
    "chars": 7626,
    "preview": "import{_ as e,n as t,a as i,H as a,e as s,b as r,m as o,$ as l,o as c,c as d,s as n,d as h,r as u}from\"./main-7bc9a818.j"
  },
  {
    "path": "custom_components/hacs/hacs_frontend/c.c28253df.js",
    "chars": 1383,
    "preview": "import{Q as e,S as s,T as t,V as r}from\"./main-7bc9a818.js\";import{b as l,d as n,u as o,m as a,c as i}from\"./c.2aa297ae."
  },
  {
    "path": "custom_components/hacs/hacs_frontend/c.c4f30bcd.js",
    "chars": 2934,
    "preview": "import{a as i,H as s,e as t,$ as e,d as a,r as o,ap as r,aq as l,am as n,ar as c,as as h,n as d}from\"./main-7bc9a818.js\""
  },
  {
    "path": "custom_components/hacs/hacs_frontend/c.cf66b923.js",
    "chars": 2189,
    "preview": "import{a as r,h as a,e as o,r as e,$ as d,n as t}from\"./main-7bc9a818.js\";r([t(\"ha-card\")],(function(r,a){return{F:class"
  },
  {
    "path": "custom_components/hacs/hacs_frontend/c.d5d0a5c5.js",
    "chars": 6904,
    "preview": "import{a as o,H as t,e as s,t as i,m as e,a0 as a,a1 as r,$ as l,aj as n,ak as h,a3 as c,ai as d,d as p,r as _,n as m}fr"
  },
  {
    "path": "custom_components/hacs/hacs_frontend/c.d9dcade0.js",
    "chars": 1246,
    "preview": "import{a as t,r as i,n as a}from\"./main-7bc9a818.js\";import{L as n,s}from\"./c.5d9598b2.js\";let r=t([a(\"ha-list-item\")],("
  },
  {
    "path": "custom_components/hacs/hacs_frontend/c.da8de431.js",
    "chars": 295604,
    "preview": "let t=\"lc,34,7n,7,7b,19,,,,2,,2,,,20,b,1c,l,g,,2t,7,2,6,2,2,,4,z,,u,r,2j,b,1m,9,9,,o,4,,9,,3,,5,17,3,3b,f,,w,1j,,,,4,8,4"
  },
  {
    "path": "custom_components/hacs/hacs_frontend/c.e0e56ec4.js",
    "chars": 9880,
    "preview": "import{a6 as t,a7 as i,a8 as a}from\"./main-7bc9a818.js\";t({_template:i`\n    <style>\n      :host {\n        display: block"
  },
  {
    "path": "custom_components/hacs/hacs_frontend/c.e23b0d0b.js",
    "chars": 405,
    "preview": "Intl.PluralRules&&\"function\"==typeof Intl.PluralRules.__addLocaleData&&Intl.PluralRules.__addLocaleData({data:{categorie"
  },
  {
    "path": "custom_components/hacs/hacs_frontend/c.e431cd4c.js",
    "chars": 36257,
    "preview": "import{Q as e,S as t,b0 as a,x as i,$ as r,r as o,ea as n,_ as s,e as l,i as d,w as c,h,o as u,a as p,t as y,A as m,P as"
  },
  {
    "path": "custom_components/hacs/hacs_frontend/c.e4d174e7.js",
    "chars": 7186,
    "preview": "import{c as e,u as t}from\"./c.743a15a1.js\";import{ef as a}from\"./main-7bc9a818.js\";import{l}from\"./c.46ab4f2a.js\";import"
  },
  {
    "path": "custom_components/hacs/hacs_frontend/c.e6921cf4.js",
    "chars": 1132,
    "preview": "import{a as t,h as e,e as r,$ as n,ah as i,ai as a,r as o,n as s}from\"./main-7bc9a818.js\";t([s(\"hacs-link\")],(function(t"
  },
  {
    "path": "custom_components/hacs/hacs_frontend/c.eb4f9da9.js",
    "chars": 9189,
    "preview": "import{a as e,h as t,e as o,$ as r,aM as i,r as a,n as s,o as n,aL as d,d as c}from\"./main-7bc9a818.js\";import\"./c.cf66b"
  },
  {
    "path": "custom_components/hacs/hacs_frontend/c.ecb39554.js",
    "chars": 69049,
    "preview": "import{S as t,T as e,Q as i,V as a,a as s,h as o,$ as r,J as n,r as l,n as d,x as c,e as h,a5 as p,t as m,L as u,N as _,"
  },
  {
    "path": "custom_components/hacs/hacs_frontend/c.f4178207.js",
    "chars": 64646,
    "preview": "import{c as a,u as n}from\"./c.743a15a1.js\";import{ef as t}from\"./main-7bc9a818.js\";import{l as r}from\"./c.46ab4f2a.js\";v"
  },
  {
    "path": "custom_components/hacs/hacs_frontend/c.f6d57c77.js",
    "chars": 20001,
    "preview": "import{a as e,h as t,e as i,g as a,t as s,$ as o,j as r,R as n,w as l,r as h,n as c,m as d,L as p,N as u,o as v,b as f,a"
  },
  {
    "path": "custom_components/hacs/hacs_frontend/c.fb6ed4e2.js",
    "chars": 1749,
    "preview": "import{a as e,H as i,e as t,$ as s,n as o}from\"./main-7bc9a818.js\";import\"./c.18158037.js\";import\"./c.fc1fab2b.js\";impor"
  },
  {
    "path": "custom_components/hacs/hacs_frontend/c.fb76e5d5.js",
    "chars": 3493,
    "preview": "import{a as e,h as t,e as i,$ as o,o as r,z as s,A as n,r as a,n as c,C as l,D as d,E as p,F as u}from\"./main-7bc9a818.j"
  },
  {
    "path": "custom_components/hacs/hacs_frontend/c.fc1fab2b.js",
    "chars": 43948,
    "preview": "import{u as t,v as e,M as i,_ as o,i as n,e as a,B as d,y as r,W as s,X as c,$ as l,o as m,r as u,a as h,Y as g,L as p,N"
  },
  {
    "path": "custom_components/hacs/hacs_frontend/c.fe747ba2.js",
    "chars": 340,
    "preview": "const s=async(s,o)=>s.connection.sendMessagePromise({type:\"hacs/repository/info\",repository_id:o}),o=async(s,o,e)=>s.con"
  },
  {
    "path": "custom_components/hacs/hacs_frontend/c.ff22e505.js",
    "chars": 18213,
    "preview": "import{_ as e,g as t,e as a,t as o,w as i,h as d,R as r,$ as n,o as p,r as c,a as s,L as l,N as m,n as x}from\"./main-7bc"
  },
  {
    "path": "custom_components/hacs/hacs_frontend/entrypoint.js",
    "chars": 246,
    "preview": "\ntry {\n  new Function(\"import('/hacsfiles/frontend/main-7bc9a818.js')\")();\n} catch (err) {\n  var el = document.createEle"
  },
  {
    "path": "custom_components/hacs/hacs_frontend/main-7bc9a818.js",
    "chars": 595021,
    "preview": "function e(e,t,o){return t in e?Object.defineProperty(e,t,{value:o,enumerable:!0,configurable:!0,writable:!0}):e[t]=o,e}"
  },
  {
    "path": "custom_components/hacs/hacs_frontend/manifest.json",
    "chars": 41,
    "preview": "{\n  \"./src/main.ts\": \"main-7bc9a818.js\"\n}"
  },
  {
    "path": "custom_components/hacs/hacs_frontend/version.py",
    "chars": 24,
    "preview": "VERSION=\"20220714083628\""
  },
  {
    "path": "custom_components/hacs/iconset.js",
    "chars": 3842,
    "preview": "const hacsIcons = {\n  hacs: {\n    path: \"m 20.064849,22.306912 c -0.0319,0.369835 -0.280561,0.707789 -0.656773,0.918212 "
  },
  {
    "path": "custom_components/hacs/manifest.json",
    "chars": 511,
    "preview": "{\n    \"codeowners\": [\n        \"@ludeeus\"\n    ],\n    \"config_flow\": true,\n    \"dependencies\": [\n        \"http\",\n        \""
  },
  {
    "path": "custom_components/hacs/repositories/__init__.py",
    "chars": 790,
    "preview": "\"\"\"Initialize repositories.\"\"\"\nfrom __future__ import annotations\n\nfrom ..enums import HacsCategory\nfrom .appdaemon impo"
  },
  {
    "path": "custom_components/hacs/repositories/appdaemon.py",
    "chars": 3194,
    "preview": "\"\"\"Class for appdaemon apps in HACS.\"\"\"\nfrom __future__ import annotations\n\nfrom typing import TYPE_CHECKING\n\nfrom aiogi"
  },
  {
    "path": "custom_components/hacs/repositories/base.py",
    "chars": 45745,
    "preview": "\"\"\"Repository.\"\"\"\nfrom __future__ import annotations\n\nfrom asyncio import sleep\nfrom datetime import datetime\nimport os\n"
  },
  {
    "path": "custom_components/hacs/repositories/integration.py",
    "chars": 6667,
    "preview": "\"\"\"Class for integrations in HACS.\"\"\"\nfrom __future__ import annotations\n\nfrom typing import TYPE_CHECKING, Any\n\nfrom ho"
  },
  {
    "path": "custom_components/hacs/repositories/netdaemon.py",
    "chars": 3629,
    "preview": "\"\"\"Class for netdaemon apps in HACS.\"\"\"\nfrom __future__ import annotations\n\nfrom typing import TYPE_CHECKING\n\nfrom ..enu"
  },
  {
    "path": "custom_components/hacs/repositories/plugin.py",
    "chars": 4634,
    "preview": "\"\"\"Class for plugins in HACS.\"\"\"\nfrom __future__ import annotations\n\nfrom typing import TYPE_CHECKING\n\nfrom ..enums impo"
  },
  {
    "path": "custom_components/hacs/repositories/python_script.py",
    "chars": 3691,
    "preview": "\"\"\"Class for python_scripts in HACS.\"\"\"\nfrom __future__ import annotations\n\nfrom typing import TYPE_CHECKING\n\nfrom ..enu"
  },
  {
    "path": "custom_components/hacs/repositories/theme.py",
    "chars": 3631,
    "preview": "\"\"\"Class for themes in HACS.\"\"\"\nfrom __future__ import annotations\n\nfrom typing import TYPE_CHECKING\n\nfrom ..enums impor"
  },
  {
    "path": "custom_components/hacs/sensor.py",
    "chars": 1766,
    "preview": "\"\"\"Sensor platform for HACS.\"\"\"\nfrom __future__ import annotations\n\nfrom homeassistant.components.sensor import SensorEn"
  },
  {
    "path": "custom_components/hacs/system_health.py",
    "chars": 1538,
    "preview": "\"\"\"Provide info to system health.\"\"\"\nfrom aiogithubapi.common.const import BASE_API_URL\nfrom homeassistant.components im"
  },
  {
    "path": "custom_components/hacs/translations/en.json",
    "chars": 2497,
    "preview": "{\n    \"config\": {\n        \"abort\": {\n            \"single_instance_allowed\": \"Only a single configuration of HACS is allo"
  },
  {
    "path": "custom_components/hacs/update.py",
    "chars": 5126,
    "preview": "\"\"\"Update entities for HACS.\"\"\"\nfrom __future__ import annotations\n\nfrom typing import Any\n\nfrom homeassistant.component"
  },
  {
    "path": "custom_components/hacs/utils/__init__.py",
    "chars": 29,
    "preview": "\"\"\"Initialize HACS utils.\"\"\"\n"
  },
  {
    "path": "custom_components/hacs/utils/backup.py",
    "chars": 4563,
    "preview": "\"\"\"Backup.\"\"\"\nfrom __future__ import annotations\n\nimport os\nimport shutil\nimport tempfile\nfrom time import sleep\nfrom ty"
  },
  {
    "path": "custom_components/hacs/utils/configuration_schema.py",
    "chars": 2282,
    "preview": "\"\"\"HACS Configuration Schemas.\"\"\"\n# pylint: disable=dangerous-default-value\nimport voluptuous as vol\n\nfrom ..const impor"
  },
  {
    "path": "custom_components/hacs/utils/data.py",
    "chars": 9601,
    "preview": "\"\"\"Data handler for HACS.\"\"\"\nimport asyncio\nfrom datetime import datetime\n\nfrom homeassistant.core import callback\nfrom "
  },
  {
    "path": "custom_components/hacs/utils/decode.py",
    "chars": 207,
    "preview": "\"\"\"Util to decode content from the github API.\"\"\"\nfrom base64 import b64decode\n\n\ndef decode_content(content: str) -> str"
  },
  {
    "path": "custom_components/hacs/utils/decorator.py",
    "chars": 1194,
    "preview": "\"\"\"HACS Decorators.\"\"\"\nfrom __future__ import annotations\n\nimport asyncio\nfrom functools import wraps\nfrom typing import"
  },
  {
    "path": "custom_components/hacs/utils/default.repositories",
    "chars": 737308,
    "preview": "{\"172733314\": {\"repository_manifest\": {\"name\": \"HACS\", \"zip_release\": true, \"hide_default_branch\": true, \"homeassistant\""
  },
  {
    "path": "custom_components/hacs/utils/filters.py",
    "chars": 1539,
    "preview": "\"\"\"Filter functions.\"\"\"\nfrom __future__ import annotations\n\nfrom typing import Any\n\n\ndef filter_content_return_one_of_ty"
  },
  {
    "path": "custom_components/hacs/utils/json.py",
    "chars": 292,
    "preview": "\"\"\"JSON utils.\"\"\"\n\ntry:\n    # Could be removed after 2022.06 is the min version\n    # But in case Home Assistant changes"
  },
  {
    "path": "custom_components/hacs/utils/logger.py",
    "chars": 137,
    "preview": "\"\"\"Custom logger for HACS.\"\"\"\nimport logging\n\nfrom ..const import PACKAGE_NAME\n\nLOGGER: logging.Logger = logging.getLogg"
  },
  {
    "path": "custom_components/hacs/utils/path.py",
    "chars": 834,
    "preview": "\"\"\"Path utils\"\"\"\nfrom __future__ import annotations\n\nfrom pathlib import Path\nfrom typing import TYPE_CHECKING\n\nif TYPE_"
  },
  {
    "path": "custom_components/hacs/utils/platform_setup.py",
    "chars": 656,
    "preview": "\"\"\"Setup entity platforms.\"\"\"\nfrom __future__ import annotations\nfrom typing import TYPE_CHECKING\nfrom homeassistant.cor"
  },
  {
    "path": "custom_components/hacs/utils/queue_manager.py",
    "chars": 2459,
    "preview": "\"\"\"The QueueManager class.\"\"\"\nfrom __future__ import annotations\n\nimport asyncio\nimport time\nfrom typing import Coroutin"
  },
  {
    "path": "custom_components/hacs/utils/regex.py",
    "chars": 403,
    "preview": "\"\"\"Regex utils\"\"\"\nfrom __future__ import annotations\n\nimport re\n\nRE_REPOSITORY = re.compile(\n    r\"(?:(?:.*github.com.)|"
  },
  {
    "path": "custom_components/hacs/utils/store.py",
    "chars": 2560,
    "preview": "\"\"\"Storage handers.\"\"\"\nfrom homeassistant.helpers.json import JSONEncoder\nfrom homeassistant.helpers.storage import Stor"
  },
  {
    "path": "custom_components/hacs/utils/template.py",
    "chars": 1202,
    "preview": "\"\"\"Custom template support.\"\"\"\nfrom __future__ import annotations\n\nfrom typing import TYPE_CHECKING\n\nfrom jinja2 import "
  },
  {
    "path": "custom_components/hacs/utils/validate.py",
    "chars": 2026,
    "preview": "\"\"\"Validation utilities.\"\"\"\nfrom __future__ import annotations\n\nfrom dataclasses import dataclass, field\n\nfrom awesomeve"
  },
  {
    "path": "custom_components/hacs/utils/version.py",
    "chars": 1047,
    "preview": "\"\"\"Version utils.\"\"\"\nfrom __future__ import annotations\n\nfrom functools import lru_cache\n\nfrom awesomeversion import (\n "
  },
  {
    "path": "custom_components/hacs/utils/workarounds.py",
    "chars": 202,
    "preview": "\"\"\"Workarounds for issues that should not be fixed.\"\"\"\n\n\nDOMAIN_OVERRIDES = {\n    # https://github.com/hacs/integration/"
  },
  {
    "path": "custom_components/hacs/validate/README.md",
    "chars": 862,
    "preview": "# Repository validation\n\nThis is where the validation rules that run against the various repository categories live.\n\n##"
  },
  {
    "path": "custom_components/hacs/validate/__init__.py",
    "chars": 29,
    "preview": "\"\"\"Initialize validation.\"\"\"\n"
  },
  {
    "path": "custom_components/hacs/validate/archived.py",
    "chars": 653,
    "preview": "from __future__ import annotations\n\nfrom ..repositories.base import HacsRepository\nfrom .base import ActionValidationBas"
  },
  {
    "path": "custom_components/hacs/validate/base.py",
    "chars": 1492,
    "preview": "\"\"\"Base class for validation.\"\"\"\nfrom __future__ import annotations\n\nfrom typing import TYPE_CHECKING\n\nfrom ..enums impo"
  },
  {
    "path": "custom_components/hacs/validate/brands.py",
    "chars": 974,
    "preview": "from __future__ import annotations\n\nfrom custom_components.hacs.enums import HacsCategory\n\nfrom ..repositories.base impo"
  },
  {
    "path": "custom_components/hacs/validate/description.py",
    "chars": 669,
    "preview": "from __future__ import annotations\n\nfrom ..repositories.base import HacsRepository\nfrom .base import ActionValidationBas"
  },
  {
    "path": "custom_components/hacs/validate/hacsjson.py",
    "chars": 1081,
    "preview": "from __future__ import annotations\n\nfrom voluptuous.error import Invalid\n\nfrom ..enums import RepositoryFile\nfrom ..repo"
  },
  {
    "path": "custom_components/hacs/validate/images.py",
    "chars": 1026,
    "preview": "from __future__ import annotations\n\nfrom ..enums import HacsCategory\nfrom ..repositories.base import HacsRepository\nfrom"
  },
  {
    "path": "custom_components/hacs/validate/information.py",
    "chars": 893,
    "preview": "from __future__ import annotations\n\nfrom ..repositories.base import HacsRepository\nfrom .base import ActionValidationBas"
  },
  {
    "path": "custom_components/hacs/validate/integration_manifest.py",
    "chars": 1306,
    "preview": "from __future__ import annotations\n\nfrom voluptuous.error import Invalid\n\nfrom ..enums import HacsCategory, RepositoryFi"
  },
  {
    "path": "custom_components/hacs/validate/issues.py",
    "chars": 678,
    "preview": "from __future__ import annotations\n\nfrom ..repositories.base import HacsRepository\nfrom .base import ActionValidationBas"
  },
  {
    "path": "custom_components/hacs/validate/manager.py",
    "chars": 2792,
    "preview": "\"\"\"Hacs validation manager.\"\"\"\nfrom __future__ import annotations\n\nimport asyncio\nfrom importlib import import_module\nim"
  },
  {
    "path": "custom_components/hacs/validate/topics.py",
    "chars": 665,
    "preview": "from __future__ import annotations\n\nfrom ..repositories.base import HacsRepository\nfrom .base import ActionValidationBas"
  },
  {
    "path": "custom_components/hacs/websocket/__init__.py",
    "chars": 4140,
    "preview": "\"\"\"Register_commands.\"\"\"\nfrom __future__ import annotations\n\nfrom typing import TYPE_CHECKING, Any\n\nfrom homeassistant.c"
  },
  {
    "path": "custom_components/hacs/websocket/critical.py",
    "chars": 1692,
    "preview": "\"\"\"Register info websocket commands.\"\"\"\nfrom __future__ import annotations\n\nfrom typing import Any\n\nfrom homeassistant.c"
  },
  {
    "path": "custom_components/hacs/websocket/repositories.py",
    "chars": 6918,
    "preview": "\"\"\"Register info websocket commands.\"\"\"\nfrom __future__ import annotations\n\nimport sys\nfrom typing import TYPE_CHECKING,"
  },
  {
    "path": "custom_components/hacs/websocket/repository.py",
    "chars": 9859,
    "preview": "\"\"\"Register info websocket commands.\"\"\"\nfrom __future__ import annotations\n\nfrom typing import TYPE_CHECKING, Any\n\nfrom "
  },
  {
    "path": "lovelace_ui_raw_config_file.yaml",
    "chars": 41746,
    "preview": "# This file is the yaml configuration that goes inside the Raw Configuration Editor.\r\n# In Home Assistant, click on the "
  },
  {
    "path": "scenes.yaml",
    "chars": 7425,
    "preview": "- id: '1609711673759'\n  name: Monitor Light - Soft light\n  entities:\n    light.ofc_monitor_light_left:\n      min_mireds:"
  },
  {
    "path": "scripts.yaml",
    "chars": 22047,
    "preview": "lr_tv:\n  alias: Living room TV\n  sequence:\n  - service: remote.send_command\n    data:\n      device: TV\n      command: Po"
  },
  {
    "path": "switches/antonettes_work_laptop.yaml",
    "chars": 140,
    "preview": "# Mac Studio\nplatform: wake_on_lan\nname: \"Antonette's Work Laptop\"\nmac: !secret AntonetteWorkLaptop_MAC\nhost: !secret An"
  },
  {
    "path": "switches/br_fireplace.yaml",
    "chars": 349,
    "preview": "# Bedroom Fireplace\nplatform: template\nswitches:\n  br_fireplace:\n    friendly_name: Bedroom Fireplace\n    unique_id: \"db"
  },
  {
    "path": "switches/br_tv.yaml",
    "chars": 320,
    "preview": "# Bedroom TV\r\nplatform: template\r\nswitches:\r\n  bedroom_tv:\r\n    friendly_name: Bedroom TV\r\n    unique_id: \"4d692b92-39e0"
  },
  {
    "path": "switches/juans_work_laptop.yaml",
    "chars": 125,
    "preview": "# Mac Studio\nplatform: wake_on_lan\nname: \"Juan's Work Laptop\"\nmac: !secret JuanWorkLaptop_MAC\nhost: !secret JuanWorkLapt"
  },
  {
    "path": "switches/lr_fireplace.yaml",
    "chars": 357,
    "preview": "# Living room Fireplace\nplatform: template\nswitches:\n  lr_fireplace:\n    friendly_name: Living room Fireplace\n    unique"
  },
  {
    "path": "switches/lr_tv.yaml",
    "chars": 450,
    "preview": "# Living room TV\r\nplatform: template\r\nswitches:\r\n  living_room_tv:\r\n    friendly_name: Living room TV\r\n    unique_id: '2"
  },
  {
    "path": "switches/mac_studio_wol.yaml",
    "chars": 113,
    "preview": "# Mac Studio\r\nplatform: wake_on_lan\r\nname: \"Mac Studio\"\r\nmac: !secret MacStudio_MAC\r\nhost: !secret MacStudio_IP\r\n"
  },
  {
    "path": "themes/google_dark_theme.yaml",
    "chars": 4201,
    "preview": "# Theme based on Google app dark theme\r\n# Creator: Juan - @juanmtech\r\n# Website: https://www.juanmtech.com\r\n# YouTube Ch"
  },
  {
    "path": "themes/google_light_theme.yaml",
    "chars": 4142,
    "preview": "# Theme based on Google app light theme\r\n# Creator: Juan - @juanmtech\r\n# Website: https://www.juanmtech.com\r\n# YouTube C"
  },
  {
    "path": "themes/google_theme.yaml",
    "chars": 8755,
    "preview": "# Theme based on Google light and dark modem UI\r\n# Creator: Juan - @juanmtech\r\n# Website: https://www.juanmtech.com\r\n# Y"
  },
  {
    "path": "themes/ios_dark_mode.yaml",
    "chars": 4103,
    "preview": "# Theme based on the iOS Dark Mode UI\r\n# Creator: Juan - @juanmtech\r\n# Website: https://www.juanmtech.com\r\n# YouTube Cha"
  },
  {
    "path": "themes/ios_light_mode.yaml",
    "chars": 4035,
    "preview": "# Theme based on the iOS Light Mode UI\r\n# Creator: Juan - @juanmtech\r\n# Website: https://www.juanmtech.com\r\n# YouTube Ch"
  },
  {
    "path": "themes/ios_theme.yaml",
    "chars": 8724,
    "preview": "# Theme based on the iOS light and dark mode UI\r\n# Creator: Juan - @juanmtech\r\n# Website: https://www.juanmtech.com\r\n# Y"
  },
  {
    "path": "themes/macos.yaml",
    "chars": 10457,
    "preview": "# Theme based on the macOS light and dark mode UI\n# Creator: Juan - @juanmtech\n# Website: https://www.juanmtech.com\n# Yo"
  },
  {
    "path": "www/community/alarmo-card/alarmo-card.js",
    "chars": 76188,
    "preview": "!function(e){\"use strict\";\n/*! *****************************************************************************\n    Copyrig"
  },
  {
    "path": "www/community/kiosk-mode/kiosk-mode.js",
    "chars": 20270,
    "preview": "!function n(o,i,a){function s(t,e){if(!i[t]){if(!o[t]){var r=\"function\"==typeof require&&require;if(!e&&r)return r(t,!0)"
  },
  {
    "path": "www/community/lovelace-mushroom/mushroom.js",
    "chars": 633676,
    "preview": "var t=function(e,i){return t=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||functi"
  },
  {
    "path": "www/community/mini-graph-card/mini-graph-card-bundle.js",
    "chars": 112512,
    "preview": "(function(){\"use strict\";function a(){var b=M([\"\"]);return a=function(){return b},b}function b(){var a=M([\"\\n          <"
  },
  {
    "path": "www/community/vertical-stack-in-card/vertical-stack-in-card.js",
    "chars": 5309,
    "preview": "console.log(`%cvertical-stack-in-card\\n%cVersion: ${'0.4.1'}`, 'color: #1976d2; font-weight: bold;', '');\n\nclass Vertica"
  }
]

About this extraction

This page contains the full source code of the JuanMTech/Home_Assistant_files GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 170 files (6.3 MB), approximately 1.7M tokens, and a symbol index with 6672 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!