From 2cd2bc403c1a15881a8dc57e292ae32498859c5d Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Sat, 11 Feb 2017 20:03:39 -0800 Subject: [PATCH 01/72] Release 0.38.1 --- _config.yml | 6 +++--- .../_posts/2017-02-11-alert-appletv-mqtt-yeelight.markdown | 5 +++++ 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/_config.yml b/_config.yml index d91423a1787..77ab3b7ab5c 100644 --- a/_config.yml +++ b/_config.yml @@ -132,9 +132,9 @@ social: # Home Assistant release details current_major_version: 0 current_minor_version: 38 -current_patch_version: 0 -date_released: 2017-02-11 +current_patch_version: 1 +date_released: 2017-02-12 # Either # or the anchor link to latest release notes in the blog post. # Must be prefixed with a # and have double quotes around it. -patch_version_notes: "#" +patch_version_notes: "#release-0381---february-12" diff --git a/source/_posts/2017-02-11-alert-appletv-mqtt-yeelight.markdown b/source/_posts/2017-02-11-alert-appletv-mqtt-yeelight.markdown index 04eb0a9118b..f3db3571c39 100644 --- a/source/_posts/2017-02-11-alert-appletv-mqtt-yeelight.markdown +++ b/source/_posts/2017-02-11-alert-appletv-mqtt-yeelight.markdown @@ -100,6 +100,11 @@ The [`yeelight`][yeelight] component has been ported to use a more stable and fe - Zoneminder: Refactoring and JSON decode error handling ([@pschmitt]) - Image processing: Cleanup Base face class add support for microsoft face detect ([@pvizeli]) +### {% linkable_title Release 0.38.1 - February 12 %} + +- Fix logbook ordering ([@balloob]) +- Fix AppleTV conflicting dependency breaking websockets ([@balloob]) + Bugfixes: [@balloob], [@fabaff], [@pvizeli], [@mnoorenberghe] [@Danielhiversen], [@armills], [@tchellomello], [@aequitas], [@mathewpeterson], [@molobrakos], [@michaelarnauts], [@jabesq], [@turbokongen], [@JshWright], [@andriej], [@jawilson], [@andrey-git], [@nodinosaur], [@konikvranik], and you if you are missing here. ### {% linkable_title Breaking changes %} From ea0360db0d0483159c638e70c11221586f34276f Mon Sep 17 00:00:00 2001 From: Robbie Trencheny Date: Sat, 11 Feb 2017 23:03:21 -0800 Subject: [PATCH 02/72] Add note about home-assistant-config topic on GitHub --- source/cookbook/index.markdown | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/source/cookbook/index.markdown b/source/cookbook/index.markdown index 56a28fcfbbb..c2d9bb37b3f 100644 --- a/source/cookbook/index.markdown +++ b/source/cookbook/index.markdown @@ -19,6 +19,10 @@ This is a community curated list of different ways to use Home Assistant. Most o New recipes can be added via the [home-assistant.io repository](https://github.com/home-assistant/home-assistant.github.io/tree/current/source/_cookbook). +

+A great place to find popular configurations is on this [GitHub search](https://github.com/search?q=topic%3Ahome-assistant-config&type=Repositories) for repositories with the `home-assistant-config` topic. +

+ {% assign cookbook = site.cookbook | sort: 'title' %} {% assign categories = cookbook | map: 'ha_category' | uniq | sort %} From 0040020c6f1884bee0311b5c60220f5dacc0f309 Mon Sep 17 00:00:00 2001 From: bbrendon Date: Sat, 11 Feb 2017 23:30:43 -0800 Subject: [PATCH 03/72] syntax error (#2013) --- source/_topics/templating.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/_topics/templating.markdown b/source/_topics/templating.markdown index e02c579911f..e2f06762bdd 100644 --- a/source/_topics/templating.markdown +++ b/source/_topics/templating.markdown @@ -122,7 +122,7 @@ Print out a list of all the sensor states. {% if is_state('device_tracker.paulus', 'home') %} Ha, Paulus is home! {% else %} - Paulus is at {{ states('device_tracker.paulus')) }}. + Paulus is at {{ states('device_tracker.paulus') }}. {% endif %} {{ states.sensor.temperature | float + 1 }} From 49b6b63769b1ff3710e9608df1bc9714146ec78e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adri=C3=A1n=20L=C3=B3pez?= Date: Sun, 12 Feb 2017 08:34:57 +0100 Subject: [PATCH 04/72] Add doc for api.ai component (#1888) * Add doc for api.ai component * More examples --- source/_components/apiai.markdown | 135 +++++++++++++++++++++++ source/images/supported_brands/apiai.png | Bin 0 -> 3062 bytes 2 files changed, 135 insertions(+) create mode 100644 source/_components/apiai.markdown create mode 100644 source/images/supported_brands/apiai.png diff --git a/source/_components/apiai.markdown b/source/_components/apiai.markdown new file mode 100644 index 00000000000..7216ad35d4f --- /dev/null +++ b/source/_components/apiai.markdown @@ -0,0 +1,135 @@ +--- +layout: page +title: "Api.AI" +description: "Instructions how integrate api.ai with Home Assistant." +date: 2017-01-27 11:28 +sidebar: true +comments: false +sharing: true +footer: true +logo: apiai.png +ha_category: Voice +featured: true +ha_release: 0.37 +--- + +This component is designed to be used with the "webhook" integration in api.ai. When a conversation ends with an user, api.ai sends an action and parameters to the webhook. + +Api.ai requires a public endpoint (HTTPS recommended), so your Home Assistant should be exposed to Internet. Api.ai will return fall back answers if your server do not answer, or takes too long (more than 5 seconds). + +Api.ai could be integrated with many popular messaging, virtual assistant and IoT platforms, eg.: Google Assistant (Google Actions), Skype, Messenger. [See here](https://docs.api.ai/docs/integrations) the complete list. + +Using Api.ai will be easy to create conversations like: + > User: Which is the temperature at home? + > + > Bot: The temperature is 34 degrees + + > User: Turn on the light + > + > Bot: In which room? + > + > User: In the kitchen + > + > Bot: Turning on kitchen light + +To use this integration you should define a conversation (intent) in Api.ai, configure Home Assistant with the speech to return and, optionally, the action to execute. + +### {% linkable_title Configuring your api.ai account %} +- [Login][apiai-web] with your Google account. +- Click on "Create Agent" +- Select name, language (if you are planning to use it with Google Actions check [here](https://support.google.com/assistant/answer/7108196?hl=en) supported languages) and time zone +- Click "Save" +- Go to "Fullfiment" (in the left menu) +- Enable Webhook and set your HA url with the apiai endpoint. Eg.: ``https://myhome.duckdns.org/api/apiai?api_password=HA_PASSWORD`` +- Click "Save" +- Create a new intent +- Below "User says" write one phrase that you, the user, will tell Api.ai. Eg.: Which is the temperature at home? +- In "Action" set some key (this will be the bind with HA config), eg.: GetTemperature +- In "Response" set "Cannot connect to HA or it is taking to long" (fall back response) +- At the end of the page, click on "Fulfillment" and check "Use webhook" +- Click "Save" +- On the top right, where is written "Try it now...", write, or say, the phrase you have previously defined and hit enter +- Api.ai has send a request to your HA server + +Take a look to "Integrations", in the left menu, to configure third parties. + + +### {% linkable_title Configuring Home Assistant %} +Out of the box, the component will do nothing. You have to teach it about all intents you want it to answer to. The way it works is that the answer for each intent is based on [templates] that you define. Each template will have access to the existing states via the `states` variable but will also have access to all variables defined in the intent. + +You can use [templates] for setting `speech`. + +Actions are using the [Home Assistant Script Syntax] and also have access to the variables from the intent. + +[Home Assistant Script Syntax]: /getting-started/scripts/ + +Example of an Api.ai for the above configuration: + +```yaml +{% raw %}# Example configuration.yaml entry +apiai: + intents: + GetTemperature: + speech: We have {{ states.sensor.temperature }} degrees + async_action: False + action: + service: notify.notify + data_template: + message: Api.ai has send a request +{% endraw %} +``` + +Inside an intent we can define this variables: +- **speech** (*Optional*): Text or template to return to Api.ai +- **action** (*Optional*): Script definition +- **async_action** (*Optional*): If HA should execute the action asynchronously (returning response to Api.ai without waiting the action to finish). Should be set to `True` if Api.ai is returning the "Cannot connect to HA or it is taking to long" message, but then you will not be able to use values based on the result of the action. Defaults to `False`. + + +## {% linkable_title Examples %} + +Download [this zip](http://filebin.ca/3AZSHoXPnbEv/HomeAssistant_APIAI.zip) and load it in your Api.ai agent (Settings -> Export and Import) for examples intents to use with this configuration: + +```yaml +{% raw %}# Example configuration.yaml entry +apiai: + intents: + Temperature: + speech: The temperature at home is {{ states('sensor.home_temp') }} degrees + LocateIntent: + speech: > + {%- for state in states.device_tracker -%} + {%- if state.name.lower() == User.lower() -%} + {{ state.name }} is at {{ state.state }} + {%- elif loop.last -%} + I am sorry, I do not know where {{ User }} is. + {%- endif -%} + {%- else -%} + Sorry, I don't have any trackers registered. + {%- endfor -%} + WhereAreWeIntent: + speech: > + {%- if is_state('device_tracker.adri', 'home') and + is_state('device_tracker.bea', 'home') -%} + You are both home, you silly + {%- else -%} + Bea is at {{ states("device_tracker.bea") }} + and Adri is at {{ states("device_tracker.adri") }} + {% endif %} + TurnLights: + speech: Turning {{ Room }} lights {{ OnOff }} + action: + - service: notify.pushbullet + data_template: + message: Someone asked via apiai to turn {{ Room }} lights {{ OnOff }} + - service_template: > + {%- if OnOff == "on" -%} + switch.turn_on + {%- else -%} + switch.turn_off + {%- endif -%} + data_template: + entity_id: "switch.light_{{ Room | replace(' ', '_') }}" +``` + +[apiai-web]: https://api.ai/ +[templates]: /topics/templating/ diff --git a/source/images/supported_brands/apiai.png b/source/images/supported_brands/apiai.png new file mode 100644 index 0000000000000000000000000000000000000000..735bd31fd6f7473204ec931c95aba916e8af02dd GIT binary patch literal 3062 zcmVPx=ut`KgRCodHTMKYh)fxWJ-OYw2BqTvZd7B4$EY7q_3l&jurUk51ri@@`iikx5 zNdO%>g@l)Z@|5v0Py>WVnHFahOWU!C)xr=NMeRW2fO$Z&k(dw&E$>QRyZ7&Rvf1R` zyYEdlpv^yXa_{+H=kcHOpa1-OL(~PZ&rKgyk)4*-1r@!bVa$LCLx${G>GzY_v_S~^ zsg!5tQbB5dQenm4!qL|&6WR=fWHfu0ZMcY1*AR(kP!wZRFy6;Z>e7_LisMFFZ@v3w zASk1i&aow0qdA`iEfgf812qrh{ng=cXZJ;x&@1UO}JNwEX3SnB_S&z&c zvtt&KvQV$x{;*%89iKkbI_R$ci?FBiAQ-O~4p3uq5~+Jyn$&{yJ!k3zaNp5n7)>rd z&DqUw!)U*Vbf=k}OX1Nr>f5;(g==uzJ7_BllbLyCZw$qsKT?jOWbiE0(!lmYms6N&9Y}?|>DJcQn zYd5s{omSD|9;@c3jTa{KCLqQ~bi~XxD)Fj)h2{GS;6EeURyQff+43x0M`EWsJ|l$r zP-i_dZ_F)Yh)fgo+K+8*Gnzd&W1}Di{=A| z#!aG|l|l@-;Y*hJ3fytuyE^G=ix7QlWu5s_Kcd8mFvKWSO~6zUUHyj;1EDu^fH7mf zo0D8)5Ei0VJCU_s2*IJWDo$ikRD#*|4P0SVD1zO=>vTFNr*5zKz?Ux9Ae}QX$Q|{0K;L@c@7B=dD;5uLCMsDc#F$ns z4Z2=H9gD>cdNI4Z0jJSmQW)*Z zBgym;c=s_EXyOdzAx)d@?GKJp3UIEZY%5#d=FAG&WIka$)JlI;v}t zR|CuFscgLz~x5|#TY{t3NFsP4SICP7F$ z22>pzg|N5{)~?fW5N&IX27Fso+fMgK4*J@ZjUtt{Su||4QTo`zYXpqMu0C~v^ zj~s(f&>O9t4H*mzUSG7tD!;1E&D?aQ_1fzxg{6Cs&K~*Juo&w?h2g6OC1|zc+&U{* zEKe#d`;)|aK5EsB|ZjexG#}`XDZ4)C_X?)x8w~PgowG| zjo`wujPSHZL!YloUDtif1V>@M8c!7axJ!SV$C6`^JJIX>gU{C(+8XpB76bVugBz z2KeFkK*2=FFgYmDc?K^MUhZyJZ+PJg3ME}D`Y7Eo+_+ajG)$j>=Y5P}vsVruNORpF zhZqs;A`p~@>P2QK^L+_!x{~^5US3n5C9tub{W0iig6%-syivf zeND`bn6v26j5f3Z;ivSjp@0zMu#65rcz5Ovg!EQd3JjQTfc8*%ia}K|QTZexY%K=7 z(Xa-xu^J~`Euu9&;8H#mn8);3nOf=!C{G)tv9nqyAm}OA<4u7)fSw&S#RC%pLY{dp zgM}azkhP!Otp>L(e{}RP7}#`yLqN?K?lv63x=C`SjiNVsX|p&8h5lIJ;&p(XWi*(i zD?iY21yM0fP7o52XK{LI0+E~^kRp<2S*Sq@c2wLk$i560RfY*e6sJ53J(Km?WtO64 zj{)bk3KzW!1Wo_cV@UiS0nT9%(D1k@uC$x7+`t#GdIuV9!x>!BZldSN47foo!9<_K zMAu=G$DsTS6j{Q7(UAWGiXU0tDunebKMWd@Sc!^e9@~CFfYJB_JOTRJ0b^m{JlGQM z*@W{`Uf#uAP~$o{f_(AU^B`4pFPjhrSmpe-LF;f#G6rk@0?%Ebg=4TL=-qA5>#bT$ zR4;ReT?BPM6gc%tWV%Xb{FQfMuwR1~vcaUj+iEmLuwhW{AyzNI8^U3~a0N#Ay1D4_|0-PqA^5d@$$z>P3WpN zpzamgf83NA{8zDSp8!)5iadLuv-w^8vJLm^4fr^ksMS!gTRPwf-ZbZx{1w~-f2FK=AOCoS?L2Tv8EM*coE!P5oQ@8gQq%N9NyXjPG`6uS0dLO51++yj!OC8JQW-q+h~pfcfw2P?xyB z1qoA2uUH5(5WdlvOYoc8Z;}hkzMwYM6#Ox$}e=*&b<52&|2%?$MZQ=n!tZu9H^05c!bRp~LN>;M1&07*qoM6N<$ Ef-!r)VgLXD literal 0 HcmV?d00001 From 2606b16a94fc3888ab1035621b38295dab25f5ac Mon Sep 17 00:00:00 2001 From: Fabian Affolter Date: Sun, 12 Feb 2017 08:40:47 +0100 Subject: [PATCH 05/72] Minor updates --- source/_components/apiai.markdown | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/source/_components/apiai.markdown b/source/_components/apiai.markdown index 7216ad35d4f..d2e77064f97 100644 --- a/source/_components/apiai.markdown +++ b/source/_components/apiai.markdown @@ -10,16 +10,17 @@ footer: true logo: apiai.png ha_category: Voice featured: true -ha_release: 0.37 +ha_release: 0.38 --- -This component is designed to be used with the "webhook" integration in api.ai. When a conversation ends with an user, api.ai sends an action and parameters to the webhook. +This component is designed to be used with the "webhook" integration in [api.ai][apiai-web]. When a conversation ends with an user, api.ai sends an action and parameters to the webhook. -Api.ai requires a public endpoint (HTTPS recommended), so your Home Assistant should be exposed to Internet. Api.ai will return fall back answers if your server do not answer, or takes too long (more than 5 seconds). +api.ai requires a public endpoint (HTTPS recommended), so your Home Assistant should be exposed to Internet. api.ai will return fallback answers if your server do not answer, or takes too long (more than 5 seconds). -Api.ai could be integrated with many popular messaging, virtual assistant and IoT platforms, eg.: Google Assistant (Google Actions), Skype, Messenger. [See here](https://docs.api.ai/docs/integrations) the complete list. +api.ai could be integrated with many popular messaging, virtual assistant and IoT platforms, eg.: Google Assistant (Google Actions), Skype, Messenger. [See here](https://docs.api.ai/docs/integrations) the complete list. Using Api.ai will be easy to create conversations like: + > User: Which is the temperature at home? > > Bot: The temperature is 34 degrees @@ -35,6 +36,7 @@ Using Api.ai will be easy to create conversations like: To use this integration you should define a conversation (intent) in Api.ai, configure Home Assistant with the speech to return and, optionally, the action to execute. ### {% linkable_title Configuring your api.ai account %} + - [Login][apiai-web] with your Google account. - Click on "Create Agent" - Select name, language (if you are planning to use it with Google Actions check [here](https://support.google.com/assistant/answer/7108196?hl=en) supported languages) and time zone @@ -55,6 +57,7 @@ Take a look to "Integrations", in the left menu, to configure third parties. ### {% linkable_title Configuring Home Assistant %} + Out of the box, the component will do nothing. You have to teach it about all intents you want it to answer to. The way it works is that the answer for each intent is based on [templates] that you define. Each template will have access to the existing states via the `states` variable but will also have access to all variables defined in the intent. You can use [templates] for setting `speech`. @@ -87,7 +90,7 @@ Inside an intent we can define this variables: ## {% linkable_title Examples %} -Download [this zip](http://filebin.ca/3AZSHoXPnbEv/HomeAssistant_APIAI.zip) and load it in your Api.ai agent (Settings -> Export and Import) for examples intents to use with this configuration: +Download [this zip](http://filebin.ca/3AZSHoXPnbEv/HomeAssistant_APIAI.zip) and load it in your api.ai agent (Settings -> Export and Import) for examples intents to use with this configuration: ```yaml {% raw %}# Example configuration.yaml entry @@ -129,6 +132,7 @@ apiai: {%- endif -%} data_template: entity_id: "switch.light_{{ Room | replace(' ', '_') }}" +{% endraw %} ``` [apiai-web]: https://api.ai/ From 2627f5fb79dda621edaa8340276eba9baad80f72 Mon Sep 17 00:00:00 2001 From: Fabian Affolter Date: Sun, 12 Feb 2017 09:21:16 +0100 Subject: [PATCH 06/72] Move section --- source/_posts/2017-02-11-alert-appletv-mqtt-yeelight.markdown | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/source/_posts/2017-02-11-alert-appletv-mqtt-yeelight.markdown b/source/_posts/2017-02-11-alert-appletv-mqtt-yeelight.markdown index f3db3571c39..9b573c8720d 100644 --- a/source/_posts/2017-02-11-alert-appletv-mqtt-yeelight.markdown +++ b/source/_posts/2017-02-11-alert-appletv-mqtt-yeelight.markdown @@ -100,13 +100,13 @@ The [`yeelight`][yeelight] component has been ported to use a more stable and fe - Zoneminder: Refactoring and JSON decode error handling ([@pschmitt]) - Image processing: Cleanup Base face class add support for microsoft face detect ([@pvizeli]) +Bugfixes: [@balloob], [@fabaff], [@pvizeli], [@mnoorenberghe] [@Danielhiversen], [@armills], [@tchellomello], [@aequitas], [@mathewpeterson], [@molobrakos], [@michaelarnauts], [@jabesq], [@turbokongen], [@JshWright], [@andriej], [@jawilson], [@andrey-git], [@nodinosaur], [@konikvranik], and you if you are missing here. + ### {% linkable_title Release 0.38.1 - February 12 %} - Fix logbook ordering ([@balloob]) - Fix AppleTV conflicting dependency breaking websockets ([@balloob]) -Bugfixes: [@balloob], [@fabaff], [@pvizeli], [@mnoorenberghe] [@Danielhiversen], [@armills], [@tchellomello], [@aequitas], [@mathewpeterson], [@molobrakos], [@michaelarnauts], [@jabesq], [@turbokongen], [@JshWright], [@andriej], [@jawilson], [@andrey-git], [@nodinosaur], [@konikvranik], and you if you are missing here. - ### {% linkable_title Breaking changes %} - The support for [LG webOS Smart TVs][webostv] was improved. This requires you to move `$HOME/.pylgtv` to `$HASS_CONFIG_DIR/webostv.conf` or Home Assistant will need to be paired with the TV again. - Image processing events have been renamed: `identify_face` has become `image_processing.detect_face`, `found_plate` has become `image_processing.found_plate` From 5653c3081b5711753caf8982776d9e06e5a491d8 Mon Sep 17 00:00:00 2001 From: Fabian Affolter Date: Sun, 12 Feb 2017 09:45:35 +0100 Subject: [PATCH 07/72] Add missing conf var --- source/_components/weather.openweathermap.markdown | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/source/_components/weather.openweathermap.markdown b/source/_components/weather.openweathermap.markdown index 0fe9383d56a..3218c4a7911 100644 --- a/source/_components/weather.openweathermap.markdown +++ b/source/_components/weather.openweathermap.markdown @@ -23,13 +23,12 @@ To add OpenWeatherMap to your installation, add the following to your `configura weather: - platform: openweathermap api_key: YOUR_API_KEY - latitude: 46.1234 - longitude: 7.1234 ``` Configuration variables: - **api_key** (*Required*): Your API key for http://openweathermap.org/. +- **name** (*Optional*): Name to use in the frontend. - **latitude** (*Optional*): Latitude of the location to display the weather. Defaults to the latitude in your your `configuration.yaml` file. - **longitude** (*Optional*): Longitude of the location to display the weather. Defaults to the longitude in your `configuration.yaml` file. From e4fff883f9c3176152714e6c6c24c9eeaceee3b4 Mon Sep 17 00:00:00 2001 From: bbrendon Date: Sun, 12 Feb 2017 05:14:09 -0800 Subject: [PATCH 08/72] add automation code. (#2015) the example makes it seem like the magic happens without an automation --- source/_components/shell_command.markdown | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/source/_components/shell_command.markdown b/source/_components/shell_command.markdown index dc6f83b304e..babb6d11a27 100644 --- a/source/_components/shell_command.markdown +++ b/source/_components/shell_command.markdown @@ -33,7 +33,16 @@ The commands can be dynamic, using templates to insert values of other entities. Any service data passed into the service call to activate the shell command will be available as a variable within the template. ```yaml + # Apply value of a GUI slider to the shell_command +automation: + - alias: run_set_ac + trigger: + platform: state + entity_id: input_slider.ac_temperature + action: + service: shell_command.set_ac_to_slider + input_slider: ac_temperature: name: A/C Setting @@ -41,8 +50,9 @@ input_slider: min: 18 max: 32 step: 1 + {% raw %} shell_command: - set_ac_to_slider: 'irsend SEND_ONCE DELONGHI AC_{{ states.input_slider.ac_temperature.state}}_AUTO' + set_ac_to_slider: 'irsend SEND_ONCE DELONGHI AC_{{ states.input_slider.ac_temperature.state }}_AUTO' {% endraw %} ``` From 800e8a78cbd85907fc1921c69b7b9a7fd88c35db Mon Sep 17 00:00:00 2001 From: Fabian Affolter Date: Sun, 12 Feb 2017 15:52:52 +0100 Subject: [PATCH 09/72] 'Unfeatured' Api.AI --- source/_components/apiai.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/_components/apiai.markdown b/source/_components/apiai.markdown index d2e77064f97..88500916adf 100644 --- a/source/_components/apiai.markdown +++ b/source/_components/apiai.markdown @@ -9,7 +9,7 @@ sharing: true footer: true logo: apiai.png ha_category: Voice -featured: true +featured: false ha_release: 0.38 --- From e94a7071c07112371676499daf5b85bef6911f77 Mon Sep 17 00:00:00 2001 From: William Scanlon Date: Sun, 12 Feb 2017 13:14:35 -0500 Subject: [PATCH 10/72] Update climate.wink.markdown --- source/_components/climate.wink.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/source/_components/climate.wink.markdown b/source/_components/climate.wink.markdown index ae5634031f7..5f666b5d259 100644 --- a/source/_components/climate.wink.markdown +++ b/source/_components/climate.wink.markdown @@ -27,6 +27,7 @@ The requirement is that you have setup [Wink](/components/wink/). - Carrier (Unconfirmed) - Honeywell (No wink hub required) - Generic Z-Wave +- Quirky Aros window AC unit

The above devices are confimed to work, but others may work as well. From aca09cff4245d8fb3bc6b42ab5fe88c34420bc4f Mon Sep 17 00:00:00 2001 From: William Scanlon Date: Sun, 12 Feb 2017 13:15:31 -0500 Subject: [PATCH 11/72] Update sensor.wink.markdown --- source/_components/sensor.wink.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/source/_components/sensor.wink.markdown b/source/_components/sensor.wink.markdown index b162dc1d2e4..b5d3343f227 100644 --- a/source/_components/sensor.wink.markdown +++ b/source/_components/sensor.wink.markdown @@ -25,6 +25,7 @@ The requirement is that you have setup [Wink](/components/wink/). - Wink eggminder (No Wink hub required) - Nest protect Smoke and CO severity (No confirmation that this is actually reported) (No Wink hub required) - Motion sensor temperature +- Quirky refuel propane tank monitor

The above devices are confimed to work, but others may work as well. From 6fa3fc385f2ea5efee5453a1523139f32224c7da Mon Sep 17 00:00:00 2001 From: William Scanlon Date: Sun, 12 Feb 2017 13:18:44 -0500 Subject: [PATCH 12/72] Update binary_sensor.wink.markdown --- source/_components/binary_sensor.wink.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/source/_components/binary_sensor.wink.markdown b/source/_components/binary_sensor.wink.markdown index 10e5833a4b2..c7101054e6a 100644 --- a/source/_components/binary_sensor.wink.markdown +++ b/source/_components/binary_sensor.wink.markdown @@ -31,6 +31,7 @@ The requirement is that you have setup [Wink](/components/wink/). - Wink Relay buttons and presense detection - Wink spotter loudness and vibration (No Wink hub required) - Wink hub devices connection status. This includes any paired hubs like Hue, Wink v1, Wink v2, Wink Relay... +- Dropcam sensors

The above devices are confimed to work, but others may work as well. From cd6eede056d6ffcfcda9e4f5e603b025d7aba492 Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Sun, 12 Feb 2017 15:52:53 -0800 Subject: [PATCH 13/72] Release 0.38.2 --- _config.yml | 2 +- .../2017-02-11-alert-appletv-mqtt-yeelight.markdown | 10 ++++++++++ 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/_config.yml b/_config.yml index 77ab3b7ab5c..dcec3d3eac2 100644 --- a/_config.yml +++ b/_config.yml @@ -137,4 +137,4 @@ date_released: 2017-02-12 # Either # or the anchor link to latest release notes in the blog post. # Must be prefixed with a # and have double quotes around it. -patch_version_notes: "#release-0381---february-12" +patch_version_notes: "#release-0382---february-12" diff --git a/source/_posts/2017-02-11-alert-appletv-mqtt-yeelight.markdown b/source/_posts/2017-02-11-alert-appletv-mqtt-yeelight.markdown index 9b573c8720d..1ca9ee5c1dc 100644 --- a/source/_posts/2017-02-11-alert-appletv-mqtt-yeelight.markdown +++ b/source/_posts/2017-02-11-alert-appletv-mqtt-yeelight.markdown @@ -107,10 +107,20 @@ Bugfixes: [@balloob], [@fabaff], [@pvizeli], [@mnoorenberghe] [@Danielhiversen], - Fix logbook ordering ([@balloob]) - Fix AppleTV conflicting dependency breaking websockets ([@balloob]) +### {% linkable_title Release 0.38.2 - February 12 %} + +- Validate config will now respect custom config location ([@balloob]) +- Fix Nuki lock on Python 3.4 ([@pschmitt]) +- Fix login issues for myusps ([@happyleavesaoc]) +- Fix hdmi_cec with new customize ([@andrey]-git) +- Fix MQTT discovery ([@fabaff]) +- Fix Z-Wave thermostat units ([@turbokongen]) + ### {% linkable_title Breaking changes %} - The support for [LG webOS Smart TVs][webostv] was improved. This requires you to move `$HOME/.pylgtv` to `$HASS_CONFIG_DIR/webostv.conf` or Home Assistant will need to be paired with the TV again. - Image processing events have been renamed: `identify_face` has become `image_processing.detect_face`, `found_plate` has become `image_processing.found_plate` - The [FFmpeg binary sensor][ffmpeg-bin] change the platform name from `ffmpeg` to `ffmpeg_noise` and `ffmpeg_motion`. Also all FFmpeg-related services are moved from a platform implementation to a the [FFmpeg components][ffmpeg] and were rename from `binary_sensor.ffmpeg_xy` to `ffmpeg.xy`. +- The frontend core changes have caused all custom panels to break. Docs have not been updated yet. The gist is that you have to use `this.hass.entities`, `this.hass.callService` and `this.hass.callApi`. ### {% linkable_title If you need help... %} ...don't hesitate to use our very active [forums][forum] or join us for a little [chat][gitter]. The release notes have comments enabled but it's preferred if you use the former communication channels. Thanks. From e9b4542b77259e83377b8c7cdbe9a25ddf26b98e Mon Sep 17 00:00:00 2001 From: Jason Schollenberger Date: Mon, 13 Feb 2017 01:55:41 -0500 Subject: [PATCH 14/72] fix typo (#2024) --- source/_components/sensor.dublin_bus_transport.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/_components/sensor.dublin_bus_transport.markdown b/source/_components/sensor.dublin_bus_transport.markdown index 56fabad34d7..d009ea2bef7 100644 --- a/source/_components/sensor.dublin_bus_transport.markdown +++ b/source/_components/sensor.dublin_bus_transport.markdown @@ -31,7 +31,7 @@ sensor: Configuration variables: -- **stopid** (*Required*): The ID of the bust stop to get the information for. +- **stopid** (*Required*): The ID of the bus stop to get the information for. - **route** (*Optional*): Only show a single bus route at the stop. This is the same as the bus number, e.g. `83`. - **name** (*Optional*): A friendly name for this sensor. From 50beaabae22846178b190d7805635b9d41d32ed2 Mon Sep 17 00:00:00 2001 From: Fabian Affolter Date: Mon, 13 Feb 2017 08:02:25 +0100 Subject: [PATCH 15/72] Fix link --- source/_posts/2017-02-11-alert-appletv-mqtt-yeelight.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/_posts/2017-02-11-alert-appletv-mqtt-yeelight.markdown b/source/_posts/2017-02-11-alert-appletv-mqtt-yeelight.markdown index 1ca9ee5c1dc..64f8c1ed899 100644 --- a/source/_posts/2017-02-11-alert-appletv-mqtt-yeelight.markdown +++ b/source/_posts/2017-02-11-alert-appletv-mqtt-yeelight.markdown @@ -112,7 +112,7 @@ Bugfixes: [@balloob], [@fabaff], [@pvizeli], [@mnoorenberghe] [@Danielhiversen], - Validate config will now respect custom config location ([@balloob]) - Fix Nuki lock on Python 3.4 ([@pschmitt]) - Fix login issues for myusps ([@happyleavesaoc]) -- Fix hdmi_cec with new customize ([@andrey]-git) +- Fix hdmi_cec with new customize ([@andrey-git]) - Fix MQTT discovery ([@fabaff]) - Fix Z-Wave thermostat units ([@turbokongen]) From 64e6b4c4240a9665150c17cbf6c5574d5fdc2b17 Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Sun, 12 Feb 2017 23:32:49 -0800 Subject: [PATCH 16/72] Update _config.yml --- _config.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/_config.yml b/_config.yml index dcec3d3eac2..963cefc4798 100644 --- a/_config.yml +++ b/_config.yml @@ -132,7 +132,7 @@ social: # Home Assistant release details current_major_version: 0 current_minor_version: 38 -current_patch_version: 1 +current_patch_version: 2 date_released: 2017-02-12 # Either # or the anchor link to latest release notes in the blog post. From 9a4e0e77e2b89a1293f7772a4137ab8640069868 Mon Sep 17 00:00:00 2001 From: Simon Hellbe Date: Mon, 13 Feb 2017 08:53:13 +0100 Subject: [PATCH 17/72] fix inconsistent virtual env location in guides (#1997) --- source/getting-started/autostart-systemd.markdown | 6 +++--- .../getting-started/installation-raspberry-pi.markdown | 10 +++++----- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/source/getting-started/autostart-systemd.markdown b/source/getting-started/autostart-systemd.markdown index 93f744ea1ea..c9a94abbbcc 100644 --- a/source/getting-started/autostart-systemd.markdown +++ b/source/getting-started/autostart-systemd.markdown @@ -35,7 +35,7 @@ WantedBy=multi-user.target EOF' ``` -If you've setup Home Assistant in `virtualenv` following our [manual installation guide](https://home-assistant.io/getting-started/installation-raspberry-pi/), the following template should work for you. +If you've setup Home Assistant in `virtualenv` following our [python installation guide](https://home-assistant.io/getting-started/installation-virtualenv/) or [manual installation guide for raspberry pi](https://home-assistant.io/getting-started/installation-raspberry-pi/), the following template should work for you. ``` [Unit] @@ -46,9 +46,9 @@ After=network.target Type=simple User=homeassistant #make sure the virtualenv python binary is used -Environment=VIRTUAL_ENV="/srv/homeassistant/homeassistant_venv" +Environment=VIRTUAL_ENV="/srv/homeassistant" Environment=PATH="$VIRTUAL_ENV/bin:$PATH" -ExecStart=/srv/homeassistant/homeassistant_venv/bin/hass -c "/home/homeassistant/.homeassistant" +ExecStart=/srv/homeassistant/bin/hass -c "/home/homeassistant/.homeassistant" [Install] WantedBy=multi-user.target diff --git a/source/getting-started/installation-raspberry-pi.markdown b/source/getting-started/installation-raspberry-pi.markdown index e4e7c76f426..5c58622a791 100644 --- a/source/getting-started/installation-raspberry-pi.markdown +++ b/source/getting-started/installation-raspberry-pi.markdown @@ -12,7 +12,7 @@ footer: true This installation of Home Assistant requires the Raspberry Pi to run [Raspbian Lite](https://www.raspberrypi.org/downloads/raspbian/). The installation will be installed in a [Virtual Environment](/getting-started/installation-virtualenv) with minimal overhead. Instructions assume this is a new installation of Raspbian Lite. -Connect to the Raspberry Pi over ssh. Default password is `raspberry`. +Connect to the Raspberry Pi over ssh. Default password is `raspberry`. You will need to enable ssh access. The raspberry pi website has instructions [here](https://www.raspberrypi.org/documentation/remote-access/ssh/). ```bash $ ssh pi@ipadress @@ -51,17 +51,17 @@ Next up is to create and change to a virtual environment for Home Assistant. Thi ```bash $ sudo su -s /bin/bash homeassistant $ cd /srv/homeassistant -$ python3 -m venv homeassistant_venv -$ source /srv/homeassistant/homeassistant_venv/bin/activate +$ python3 -m venv . +$ source bin/activate ``` Once you have activated the virtual environment you will notice the prompt change and then you can install Home Assistant. ```bash -(homeassistant_venv) homeassistant@raspberrypi:/srv/homeassistant $ pip3 install homeassistant +(homeassistant) homeassistant@raspberrypi:/srv/homeassistant $ pip3 install homeassistant ``` Start Home Assistant for the first time. This will complete the installation, create the `.homeasssistant` configuration directory in the `/home/homeassistant` directory and install any basic dependencies. ```bash -(homeassistant_venv) $ hass +(homeassistant) $ hass ``` You can now reach your installation on your raspberry pi over the web interface on [http://ipaddress:8123](http://ipaddress:8123). From e59ce8b3e7c97cf0e9764dd2797c2a47601417c1 Mon Sep 17 00:00:00 2001 From: Claudiu Farcas Date: Mon, 13 Feb 2017 12:30:44 +0200 Subject: [PATCH 18/72] Update doc - get_services (#2025) Update doc - get_services As stated in this file -> home-assistant/homeassistant/components/websocket_api.py --- source/developers/websocket_api.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/developers/websocket_api.markdown b/source/developers/websocket_api.markdown index 785b907b9fe..0331e2c6bbc 100644 --- a/source/developers/websocket_api.markdown +++ b/source/developers/websocket_api.markdown @@ -297,7 +297,7 @@ This will get a dump of the current services in Home Assistant. ```json { "id": 19, - "type": "get_config" + "type": "get_services" } ``` From 7e2c90d1794f79995ca599c08d219efde069b81d Mon Sep 17 00:00:00 2001 From: qrionic labs Date: Mon, 13 Feb 2017 11:39:54 +0100 Subject: [PATCH 19/72] Update sensor.google_travel_time.markdown Added mode option. Also the doc metadata was corrupt at line 36. Remove the corrupt metadata and simplified it. In their official api docs, Google calls them "Travel Modes": https://developers.google.com/maps/documentation/javascript/directions#TravelModes --- source/_components/sensor.google_travel_time.markdown | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/source/_components/sensor.google_travel_time.markdown b/source/_components/sensor.google_travel_time.markdown index 16c08a70988..4fb24f39d07 100644 --- a/source/_components/sensor.google_travel_time.markdown +++ b/source/_components/sensor.google_travel_time.markdown @@ -33,8 +33,9 @@ Configuration variables: - **api_key** (*Required*): Your application's API key (get one by following the instructions above). This key identifies your application for purposes of quota management. - **origin** (*Required*): The starting point for calculating travel distance and time. You can supply one or more locations separated by the pipe character, in the form of an address, latitude/longitude coordinates, or a [Google place ID](https://developers.google.com/places/place-id). When specifying the location using a Google place ID, the ID must be prefixed with `place_id:`. - **destination** (*Required*): One or more locations to use as the finishing point for calculating travel distance and time. The options for the destinations parameter are the same as for the origins parameter, described above. -- **name** (*Optional*): A name to display on the sensor. The default is "Google Travel Time - " where transit mode is the mode set in options for the sensor (if no mode is set, the default is driving). +- **name** (*Optional*): A name to display on the sensor. The default is "Google Travel Time - [Travel Mode]" where [Travel Mode] is the mode set in options for the sensor (see option "mode" below). - **options** (*Optional*): A dictionary containing parameters to add to all requests to the Distance Matrix API. A full listing of available options can be found [here](https://developers.google.com/maps/documentation/distance-matrix/intro#RequestParameters). + - **mode** (*Optional*): The travel mode used to calculate the directions / time. Can be `driving` (*Default*), `bicycling`, `transit` or `walking`. - **departure_time** (*Optional*): Can be `now`, a Unix timestamp, or a 24 hour time string like `08:00:00`. If you provide a time string, it will be combined with the current date to get travel time for that moment. - **arrival_time** (*Optional*): See notes above for `departure_time`. `arrival_time` can not be `now`, only a Unix timestamp or time string. You can not provide both `departure_time` and `arrival_time`. If you do provide both, `arrival_time` will be removed from the request. - **units** (*Optional*): Set the unit for the sensor in metric or imperial, otherwise the default unit the same as the unit set in `unit_system:`. From bae50112a6b895fb4aa1ae0f9ebcaa0d40f9134e Mon Sep 17 00:00:00 2001 From: nodomain Date: Mon, 13 Feb 2017 11:46:29 +0100 Subject: [PATCH 20/72] Update logbook.markdown (#1824) Elaborated the fact that the "recorder" component storage settings have an effect on the "logbook" component. It was unclear to me before. See https://community.home-assistant.io/t/history-with-mysql/10027 for details. --- source/_components/logbook.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/_components/logbook.markdown b/source/_components/logbook.markdown index bd3d2743755..df888657269 100644 --- a/source/_components/logbook.markdown +++ b/source/_components/logbook.markdown @@ -11,7 +11,7 @@ logo: logbook.png ha_category: "History" --- - The logbook component provides a different perspective on the history of your house by showing all the changes that happened to your house in reverse chronological order. [See the demo for a live example](/demo/). + The logbook component provides a different perspective on the history of your house by showing all the changes that happened to your house in reverse chronological order. [See the demo for a live example](/demo/). It depends on the `recorder` component for storing the data. This means that if the `recorder` component is set up to use e.g. mySQL as data store, the `logbook` component does not use the default SQLite database to store data. To enable the logbook in your installation, add the following to your `configuration.yaml` file: From 8e6d06cef5cd1dc501de05f1b4b1c88db6cbecfb Mon Sep 17 00:00:00 2001 From: xPsIXx Date: Mon, 13 Feb 2017 14:54:16 +0400 Subject: [PATCH 21/72] Create automation_telegram_presence_alert (#1729) --- .../ \tautomation_telegram_presence_alert" | 27 +++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 "source/_cookbook/ \tautomation_telegram_presence_alert" diff --git "a/source/_cookbook/ \tautomation_telegram_presence_alert" "b/source/_cookbook/ \tautomation_telegram_presence_alert" new file mode 100644 index 00000000000..c2c0ff42aa3 --- /dev/null +++ "b/source/_cookbook/ \tautomation_telegram_presence_alert" @@ -0,0 +1,27 @@ +This will send an alert when someone in your known devices list connects to the networt via wifi. In other words, when someone arrives home. +It will only work if you are using nmap or similar component. +I am using the ddwrt component to get a list of connected devices on my network. + +follow these isntructions to get api_key and chat_id +https://home-assistant.io/components/notify.telegram/ + +// Add the telegram component +notify: + - name: Telegram + platform: telegram + api_key: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx + chat_id: xxxxxxxxx + +//add the automation component +//Note: device_name_here should be whatever the device is named in known devices file. + +automation: + trigger: + platform: state + entity_id: device_tracker.device_name_here + from: 'not_home' + to: 'home' + action: + service: notify.Telegram + data: + message: "Person is now home" From 09a174acfdbeaba5e951220b93b78d90477f8ac1 Mon Sep 17 00:00:00 2001 From: Fabian Affolter Date: Mon, 13 Feb 2017 11:50:13 +0100 Subject: [PATCH 22/72] Fix typo and add link --- source/_components/logbook.markdown | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/source/_components/logbook.markdown b/source/_components/logbook.markdown index df888657269..609e9f5bbe4 100644 --- a/source/_components/logbook.markdown +++ b/source/_components/logbook.markdown @@ -11,7 +11,7 @@ logo: logbook.png ha_category: "History" --- - The logbook component provides a different perspective on the history of your house by showing all the changes that happened to your house in reverse chronological order. [See the demo for a live example](/demo/). It depends on the `recorder` component for storing the data. This means that if the `recorder` component is set up to use e.g. mySQL as data store, the `logbook` component does not use the default SQLite database to store data. + The logbook component provides a different perspective on the history of your house by showing all the changes that happened to your house in reverse chronological order. [See the demo for a live example](/demo/). It depends on the `recorder` component for storing the data. This means that if the [`recorder`](/components/recorder/) component is set up to use e.g. MySQL or PostgreSQL as data store, the `logbook` component does not use the default SQLite database to store data. To enable the logbook in your installation, add the following to your `configuration.yaml` file: @@ -55,7 +55,7 @@ logbook: - media_player ``` -You can also use the `include` list and filter out some entities or domains with an `exclude` list. Usually this makes sense if you define domains on the include side and filter out some specific entities. +You can also use the `include` list and filter out some entities or domains with an `exclude` list. Usually this makes sense if you define domains on the include side and filter out some specific entities. ```yaml # Example of combining include and exclude configurations From cd3427f422ac144c55584d1790d0adf1d1a2ed45 Mon Sep 17 00:00:00 2001 From: Fabian Affolter Date: Mon, 13 Feb 2017 11:57:15 +0100 Subject: [PATCH 23/72] Fix filename --- .../_cookbook/automation_telegram_presence_alert | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename "source/_cookbook/ \tautomation_telegram_presence_alert" => source/_cookbook/automation_telegram_presence_alert (100%) diff --git "a/source/_cookbook/ \tautomation_telegram_presence_alert" b/source/_cookbook/automation_telegram_presence_alert similarity index 100% rename from "source/_cookbook/ \tautomation_telegram_presence_alert" rename to source/_cookbook/automation_telegram_presence_alert From 31d363c2c9b45eddbf208a760c97d2d8200e97db Mon Sep 17 00:00:00 2001 From: Fabian Affolter Date: Mon, 13 Feb 2017 12:16:54 +0100 Subject: [PATCH 24/72] Add extension --- ...presence_alert => automation_telegram_presence_alert.markdown} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename source/_cookbook/{automation_telegram_presence_alert => automation_telegram_presence_alert.markdown} (100%) diff --git a/source/_cookbook/automation_telegram_presence_alert b/source/_cookbook/automation_telegram_presence_alert.markdown similarity index 100% rename from source/_cookbook/automation_telegram_presence_alert rename to source/_cookbook/automation_telegram_presence_alert.markdown From 62db81541b77ecadb3e09bf2cb526a273bf0b6ff Mon Sep 17 00:00:00 2001 From: Fabian Affolter Date: Mon, 13 Feb 2017 12:17:20 +0100 Subject: [PATCH 25/72] Fix markdown --- ...utomation_telegram_presence_alert.markdown | 31 +++++++++++++------ 1 file changed, 21 insertions(+), 10 deletions(-) diff --git a/source/_cookbook/automation_telegram_presence_alert.markdown b/source/_cookbook/automation_telegram_presence_alert.markdown index c2c0ff42aa3..634908943eb 100644 --- a/source/_cookbook/automation_telegram_presence_alert.markdown +++ b/source/_cookbook/automation_telegram_presence_alert.markdown @@ -1,20 +1,30 @@ -This will send an alert when someone in your known devices list connects to the networt via wifi. In other words, when someone arrives home. -It will only work if you are using nmap or similar component. -I am using the ddwrt component to get a list of connected devices on my network. +--- +layout: page +title: "Examples sending notification depending of the presence" +description: "Examples sending notification depending of the presence" +date: 2017-02-12 19:05 +sidebar: true +comments: false +sharing: true +footer: true +ha_category: Automation Examples +--- -follow these isntructions to get api_key and chat_id -https://home-assistant.io/components/notify.telegram/ +This will send a message when someone in your known devices list connects to your local network. In other words, when someone arrives home. It will only work if you are using the [nmap](/components/device_tracker.nmap_tracker/) device tracker or a similar component. -// Add the telegram component +This example uses [/components/notify.telegram/](Telegram) to send the notification. + +```yaml notify: - name: Telegram platform: telegram api_key: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx chat_id: xxxxxxxxx - -//add the automation component -//Note: device_name_here should be whatever the device is named in known devices file. +``` +Add the automation rule. Change `device_name_here` to match the device you want to track. + +```yaml automation: trigger: platform: state @@ -24,4 +34,5 @@ automation: action: service: notify.Telegram data: - message: "Person is now home" + message: 'Person is now home' +``` From 660d2c297dae10624834e25e82e65a495cd341c3 Mon Sep 17 00:00:00 2001 From: Igor Shults Date: Mon, 13 Feb 2017 05:23:29 -0600 Subject: [PATCH 26/72] Remove blurb about being able to use conditions (#1664) It doesn't seem like you can use conditions in actions (anymore?), so remove the snippet to avoid confusion. --- source/getting-started/automation-action.markdown | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/source/getting-started/automation-action.markdown b/source/getting-started/automation-action.markdown index cea9bc896c8..485e3514f42 100644 --- a/source/getting-started/automation-action.markdown +++ b/source/getting-started/automation-action.markdown @@ -48,7 +48,6 @@ automation 2: message: Oh wow you really missed something great. ``` - Conditions can also be part of an action. You can combine multiple service calls and conditions in a single action, and they will be processed in the order you put them in. If the result of a condition is false, the action will stop there so any service calls after that condition will not be executed. ```yaml @@ -70,4 +69,4 @@ automation: value_template: '{% raw %}{{ states.sensor.sensorluz_7_0.state < 10 }}{% endraw %}' - service: scene.turn_on entity_id: scene.DespiertaDespacho -``` +``` \ No newline at end of file From c362cab93e1764f3308b01d6f53cf74a47669f52 Mon Sep 17 00:00:00 2001 From: Fabian Affolter Date: Mon, 13 Feb 2017 12:39:23 +0100 Subject: [PATCH 27/72] Include details from #1818 --- source/_components/sensor.darksky.markdown | 23 +--------------------- 1 file changed, 1 insertion(+), 22 deletions(-) diff --git a/source/_components/sensor.darksky.markdown b/source/_components/sensor.darksky.markdown index 153c29cb12f..42f4c040c99 100644 --- a/source/_components/sensor.darksky.markdown +++ b/source/_components/sensor.darksky.markdown @@ -32,34 +32,13 @@ sensor: - summary - icon - nearest_storm_distance - - nearest_storm_bearing - - precip_type - - precip_intensity - - precip_probability - - temperature - - apparent_temperature - - dew_point - - wind_speed - - wind_bearing - - cloud_cover - - humidity - - pressure - - visibility - - ozone - - minutely_summary - - hourly_summary - - daily_summary - - temperature_max - - temperature_min - - apparent_temperature_max - - apparent_temperature_min - - precip_intensity_max ``` Configuration variables: - **api_key** (*Required*): Your API key. - **name** (*Optional*): Additional name for the sensors. Default to platform name. +- **forecast** array (*Optional*): List of days in the 7 day forecast you would like to receive data on, starting with tomorrow as day 1. Any `monitored_condition` with a daily forecast by DarkSky will generate a sensor tagged with `_`. - **monitored_conditions** array (*Required*): Conditions to display in the frontend. - **summary**: A human-readable text summary of the current conditions. - **precip_type**: The type of precipitation occurring. From b6d33e3a17bd0ef7ac7a6883c7cd46496c8fc801 Mon Sep 17 00:00:00 2001 From: nodomain Date: Mon, 13 Feb 2017 12:47:13 +0100 Subject: [PATCH 28/72] Update recorder.markdown (#1921) Updated to include the "native" mysqlclient package as documented in https://community.home-assistant.io/t/error-in-setting-up-recorder-with-mysql/7705/4 - verified that it works as well ;-) --- source/_components/recorder.markdown | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/source/_components/recorder.markdown b/source/_components/recorder.markdown index 7a23bfee0b5..48b9d481bd0 100644 --- a/source/_components/recorder.markdown +++ b/source/_components/recorder.markdown @@ -90,8 +90,8 @@ If you only want to hide events from e.g. your history, take a look at the [`his | Database engine | `db_url` | | :---------------|:---------------------------------------------------------| | SQLite | `sqlite:///PATH/TO/DB_NAME` | -| MySQL | `mysql+pymysql://SERVER_IP/DB_NAME` | -| MySQL           | `mysql+pymysql://user:password@SERVER_IP/DB_NAME`       | +| MySQL | `mysql://SERVER_IP/DB_NAME` | +| MySQL           | `mysql://user:password@SERVER_IP/DB_NAME`       | | PostgreSQL | `postgresql://SERVER_IP/DB_NAME` | | PostgreSQL | `postgresql://scott:tiger@SERVER_IP/DB_NAME` | @@ -105,7 +105,7 @@ For MySQL you may have to install a few dependencies: ```bash $ sudo apt-get install libmysqlclient-dev -$ pip3 install pymysql +$ pip3 install mysqlclient ``` If you are in a virtual environment, don't forget to activate it before installing the pymysql package. @@ -114,7 +114,7 @@ pi@homeassistant:~ $ sudo -i root@homeassistant:~# su homeassistant homeassistant@homeassistant:/root$ cd /srv/homeassistant/homeassistant_venv/ homeassistant@homeassistant:/srv/homeassistant/homeassistant_venv$ source bin/activate -(homeassistant_venv) homeassistant@homeassistant:/srv/homeassistant/homeassistant_venv$ pip3 install pymysql +(homeassistant_venv) homeassistant@homeassistant:/srv/homeassistant/homeassistant_venv$ pip3 install mysqlclient ``` ### {% linkable_title PostgreSQL %} From 313ffba048542ae0b498c9fda4b91ea9c50c02b2 Mon Sep 17 00:00:00 2001 From: Fabian Affolter Date: Mon, 13 Feb 2017 12:50:36 +0100 Subject: [PATCH 29/72] Add pymysql (fix the slalom around pymysql and mysqlclient) --- source/_components/recorder.markdown | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/source/_components/recorder.markdown b/source/_components/recorder.markdown index 48b9d481bd0..14385cba0f1 100644 --- a/source/_components/recorder.markdown +++ b/source/_components/recorder.markdown @@ -92,6 +92,8 @@ If you only want to hide events from e.g. your history, take a look at the [`his | SQLite | `sqlite:///PATH/TO/DB_NAME` | | MySQL | `mysql://SERVER_IP/DB_NAME` | | MySQL           | `mysql://user:password@SERVER_IP/DB_NAME`       | +| MySQL (pymysql) | `mysql+pymysql://SERVER_IP/DB_NAME` | +| MySQL (pymysql) | `mysql+pymysql://user:password@SERVER_IP/DB_NAME` | | PostgreSQL | `postgresql://SERVER_IP/DB_NAME` | | PostgreSQL | `postgresql://scott:tiger@SERVER_IP/DB_NAME` | @@ -99,9 +101,9 @@ If you only want to hide events from e.g. your history, take a look at the [`his Not all Python bindings for the chosen database engine can be installed directly. This section contains additional details which should help you to get it working. -### {% linkable_title MYSQL %} +### {% linkable_title MySQL %} -For MySQL you may have to install a few dependencies: +For MySQL you may have to install a few dependencies. You can choose between `pymysql` and `mysqlclient`: ```bash $ sudo apt-get install libmysqlclient-dev @@ -111,7 +113,7 @@ If you are in a virtual environment, don't forget to activate it before installi ```bash pi@homeassistant:~ $ sudo -i -root@homeassistant:~# su homeassistant +root@homeassistant:~# su homeassistant homeassistant@homeassistant:/root$ cd /srv/homeassistant/homeassistant_venv/ homeassistant@homeassistant:/srv/homeassistant/homeassistant_venv$ source bin/activate (homeassistant_venv) homeassistant@homeassistant:/srv/homeassistant/homeassistant_venv$ pip3 install mysqlclient From b73af61eb93c7f67dbe383bc3f79a2f6e59044b9 Mon Sep 17 00:00:00 2001 From: Emanuele Palombo Date: Mon, 13 Feb 2017 12:54:47 +0100 Subject: [PATCH 30/72] Update apache_configuration.markdown (#1777) --- source/_cookbook/apache_configuration.markdown | 3 +++ 1 file changed, 3 insertions(+) diff --git a/source/_cookbook/apache_configuration.markdown b/source/_cookbook/apache_configuration.markdown index 56f5c693921..02bc83aeb35 100644 --- a/source/_cookbook/apache_configuration.markdown +++ b/source/_cookbook/apache_configuration.markdown @@ -23,6 +23,9 @@ This is useful if you want to have: So you already have a working Apache server available at example.org. Your home assistant is correctly working on this web server and available at localhost:8123 +Enable `mod_proxy_wstunnel` by running: +`sudo a2enmod proxy_wstunnel` + To be able to access to your home assistant instance by using https://home.example.org, add to following file into `/etc/httpd/conf/extra/hass.conf` ```text From 273bcb7059fdfd58010287af62e7d40d98f26a05 Mon Sep 17 00:00:00 2001 From: Fabian Affolter Date: Mon, 13 Feb 2017 13:00:48 +0100 Subject: [PATCH 31/72] Update wstunnel part --- .../_cookbook/apache_configuration.markdown | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/source/_cookbook/apache_configuration.markdown b/source/_cookbook/apache_configuration.markdown index 02bc83aeb35..65e6364bc2f 100644 --- a/source/_cookbook/apache_configuration.markdown +++ b/source/_cookbook/apache_configuration.markdown @@ -10,7 +10,7 @@ footer: true ha_category: Infrastructure --- -This example demonstrates how you can configure Apache to act as a proxy for home assistant. +This example demonstrates how you can configure Apache to act as a proxy for Home Assistant. This is useful if you want to have: @@ -20,13 +20,15 @@ This is useful if you want to have: #### {% linkable_title Subdomain %} -So you already have a working Apache server available at example.org. -Your home assistant is correctly working on this web server and available at localhost:8123 +So you already have a working Apache server available at example.org. Your Home Assistant is correctly working on this web server and available at http://localhost:8123 -Enable `mod_proxy_wstunnel` by running: -`sudo a2enmod proxy_wstunnel` +Enable [`mod_proxy_wstunnel`]((https://httpd.apache.org/docs/2.4/mod/mod_proxy_wstunnel.htm) by running if you encounter issues while serving Home Assistant through your proxy: -To be able to access to your home assistant instance by using https://home.example.org, add to following file into `/etc/httpd/conf/extra/hass.conf` +```bash +$ sudo a2enmod proxy_wstunnel +``` + +To be able to access to your Home Assistant instance by using https://home.example.org, add to following file to `/etc/httpd/conf/extra/` as `hass.conf` ```text @@ -53,8 +55,7 @@ If you don't want HTTPS, you can change `` to ` Date: Mon, 13 Feb 2017 07:03:14 -0500 Subject: [PATCH 32/72] docs(docker-install): Add OSX port forwarding note (#1925) - Add note to people on OS X about how to properly forward ports so that you can browse to http://localhost:8123 - This tripped me and a co-worker up a fair bit so I'm hoping it will save others a good deal of googling. --- source/getting-started/installation-docker.markdown | 2 ++ 1 file changed, 2 insertions(+) diff --git a/source/getting-started/installation-docker.markdown b/source/getting-started/installation-docker.markdown index 198b214eec4..b60c51c92f5 100644 --- a/source/getting-started/installation-docker.markdown +++ b/source/getting-started/installation-docker.markdown @@ -19,6 +19,8 @@ This will launch Home Assistant and serve the web interface from port 8123 on yo

When using boot2docker on OS X you are unable to map the local time to your Docker container. Replace `-v /etc/localtime:/etc/localtime:ro` with `-e "TZ=America/Los_Angeles"` (replacing America/Los_Angeles with [your timezone](http://en.wikipedia.org/wiki/List_of_tz_database_time_zones)) + +Additionally, if your expectation is that you will be able to browse directly to `http://localhost:8123` on your OS X host, then you will also need to replace the `--net=host` switch with `-p 8123:8123`. This is currently the only way to forward ports on to your actual host(OS X) machine instead of the virtual machine inside xhyve. More detail on this can be found in [the docker forums](https://forums.docker.com/t/should-docker-run-net-host-work/14215/10).

If you change the config you have to restart the server. From e2b0c6d0f78bd03bda16cb3572e23bf23ba13fe0 Mon Sep 17 00:00:00 2001 From: Fabian Affolter Date: Mon, 13 Feb 2017 13:08:01 +0100 Subject: [PATCH 33/72] Rename to macOS --- source/getting-started/installation-docker.markdown | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/source/getting-started/installation-docker.markdown b/source/getting-started/installation-docker.markdown index b60c51c92f5..d1c5221b7e6 100644 --- a/source/getting-started/installation-docker.markdown +++ b/source/getting-started/installation-docker.markdown @@ -18,9 +18,9 @@ $ docker run -d --name="home-assistant" -v /path/to/your/config:/config -v /etc/ This will launch Home Assistant and serve the web interface from port 8123 on your Docker host.

-When using boot2docker on OS X you are unable to map the local time to your Docker container. Replace `-v /etc/localtime:/etc/localtime:ro` with `-e "TZ=America/Los_Angeles"` (replacing America/Los_Angeles with [your timezone](http://en.wikipedia.org/wiki/List_of_tz_database_time_zones)) +When using boot2docker on macOS you are unable to map the local time to your Docker container. Replace `-v /etc/localtime:/etc/localtime:ro` with `-e "TZ=America/Los_Angeles"` (replacing America/Los_Angeles with [your timezone](http://en.wikipedia.org/wiki/List_of_tz_database_time_zones)) -Additionally, if your expectation is that you will be able to browse directly to `http://localhost:8123` on your OS X host, then you will also need to replace the `--net=host` switch with `-p 8123:8123`. This is currently the only way to forward ports on to your actual host(OS X) machine instead of the virtual machine inside xhyve. More detail on this can be found in [the docker forums](https://forums.docker.com/t/should-docker-run-net-host-work/14215/10). +Additionally, if your expectation is that you will be able to browse directly to `http://localhost:8123` on your macOS host, then you will also need to replace the `--net=host` switch with `-p 8123:8123`. This is currently the only way to forward ports on to your actual host (macOS) machine instead of the virtual machine inside `xhyve`. More detail on this can be found in [the docker forums](https://forums.docker.com/t/should-docker-run-net-host-work/14215/10).

If you change the config you have to restart the server. From 8f4690e72ec25b9a8f6b4bfcc418e02385398de6 Mon Sep 17 00:00:00 2001 From: Fabian Affolter Date: Mon, 13 Feb 2017 13:13:21 +0100 Subject: [PATCH 34/72] Add chat bot (picked from #1755) --- source/_components/notify.telegram.markdown | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/source/_components/notify.telegram.markdown b/source/_components/notify.telegram.markdown index 26a771c1c26..6145e24ee0f 100644 --- a/source/_components/notify.telegram.markdown +++ b/source/_components/notify.telegram.markdown @@ -20,7 +20,9 @@ The requirements are: - You need a [Telegram bot](https://core.telegram.org/bots). Please follow those [instructions](https://core.telegram.org/bots#6-botfather) to create one and get the token for your bot. Keep in mind that bots are not allowed to contact users. You need to make the first contact with your user. Meaning that you need to send a message to the bot from your user. - The `chat_id` of an user. -The quickest way to retrieve your `chat_id` is visiting [https://api.telegram.org/botYOUR_API_TOKEN/getUpdates](https://api.telegram.org/botYOUR_API_TOKEN/getUpdates) or to use `$ curl -X GET https://api.telegram.org/botYOUR_API_TOKEN/getUpdates`. Replace `YOUR_API_TOKEN` with your actual token. +To retrieve your `chat_id`, contact any of the Telegram bots created for this purpose (@myidbot, @get_id_bot) + +The quickest way to retrieve your `chat_id` is visiting [https://api.telegram.org/botYOUR_API_TOKEN/getUpdates](https://api.telegram.org/botYOUR_API_TOKEN/getUpdates) or to use `$ curl -X GET https:/api.telegram.org/botYOUR_API_TOKEN/getUpdates`. Replace `YOUR_API_TOKEN` with your actual token. The result set will include your chat ID as `id` in the `from` section: From a3295a823426f07767dc9938b6ce5f865c001c08 Mon Sep 17 00:00:00 2001 From: Fabian Affolter Date: Mon, 13 Feb 2017 13:21:49 +0100 Subject: [PATCH 35/72] Add link --- source/_posts/2017-02-11-alert-appletv-mqtt-yeelight.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/source/_posts/2017-02-11-alert-appletv-mqtt-yeelight.markdown b/source/_posts/2017-02-11-alert-appletv-mqtt-yeelight.markdown index 64f8c1ed899..4d3ad5d58e2 100644 --- a/source/_posts/2017-02-11-alert-appletv-mqtt-yeelight.markdown +++ b/source/_posts/2017-02-11-alert-appletv-mqtt-yeelight.markdown @@ -145,6 +145,7 @@ Experiencing issues introduced by this release? Please report them in our [issue [@Duoxilian]: https://github.com/Duoxilian [@eagleamon]: https://github.com/eagleamon [@fabaff]: https://github.com/fabaff +[@happyleavesaoc]: https://github.com/happyleavesaoc [@herm]: https://github.com/herm [@jabesq]: https://github.com/jabesq [@jawilson]: https://github.com/jawilson From 4274df05dac9fa27ada99c2f5bba0b3cc0101dbf Mon Sep 17 00:00:00 2001 From: Joeboyc2 Date: Mon, 13 Feb 2017 13:12:30 +0000 Subject: [PATCH 36/72] Spelling amendments and highlighted opening paragraph (#2010) * Spelling amendments and highlighted opening paragraph * Updated the link to updating the hassbian image * Update updating.markdown --- source/getting-started/updating.markdown | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/source/getting-started/updating.markdown b/source/getting-started/updating.markdown index 2f865889f02..a9bf836b894 100644 --- a/source/getting-started/updating.markdown +++ b/source/getting-started/updating.markdown @@ -9,7 +9,9 @@ sharing: true footer: true --- -The upgrade process differed depending on the installtion you have, review the documentaion specific to your install [HASSbian](/getting-started/installation-raspberry-pi-image/#update-home-assistant-on-hassbian), [Raspberry Pi All-In-One Installer](/getting-started/installation-raspberry-pi-all-in-one/#upgrading), [Vagrant](/getting-started/installation-vagrant/), or [Virtualenv](/getting-started/installation-virtualenv/#upgrading-home-assistant). +

+The upgrade process differs depending on the installation you have, so please review the documentation that is specific to your install [HASSbian](/getting-started/hassbian-common-tasks/#update-home-assistant), [Raspberry Pi All-In-One Installer](/getting-started/installation-raspberry-pi-all-in-one/#upgrading), [Vagrant](/getting-started/installation-vagrant/), or [Virtualenv](/getting-started/installation-virtualenv/#upgrading-home-assistant). +

The default way to update Home Assistant to the latest release, when available, is: From b56629d433bd810f00adeac5d8d934eb4eb7ce56 Mon Sep 17 00:00:00 2001 From: Philipp Schmitt Date: Mon, 13 Feb 2017 13:55:44 +0100 Subject: [PATCH 37/72] Fix links and add hint for token length (#2028) --- source/_components/lock.nuki.markdown | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/source/_components/lock.nuki.markdown b/source/_components/lock.nuki.markdown index eb944582b4d..f24c9e0a6aa 100644 --- a/source/_components/lock.nuki.markdown +++ b/source/_components/lock.nuki.markdown @@ -14,9 +14,9 @@ ha_release: 0.38 ha_iot_class: "Local Polling" --- -The `nuki` platform allows you to control [Nuki Smart Locks](nuki.io) via either a [sofware](https://play.google.com/store/apps/details?id=io.nuki.bridge&hl=fr) or a [physical bridge](https://nuki.io/en/bridge/). +The `nuki` platform allows you to control [Nuki Smart Locks](https://nuki.io/en/smart-lock/) via either a [sofware bridge](https://play.google.com/store/apps/details?id=io.nuki.bridge) or a [physical bridge](https://nuki.io/en/bridge/). -To add a Nuki bridge to your installation, you need to enable developper mode on your bridge and define a port and an access token. This can be achieved using the Android app. Please note that there seems to be a maximum length for the API token, even though the app allows you to set a longer one. +To add a Nuki bridge to your installation, you need to enable developper mode on your bridge and define a port and an access token. This can be achieved using the [Android app](https://play.google.com/store/apps/details?id=io.nuki). Please note that the API token should be 6-20 characters long, even though the app allows you to set a longer one. Then add the following to your `configuration.yaml` file: ```yaml From 37cd4b20997bbdf10526b094c70a225b216889e1 Mon Sep 17 00:00:00 2001 From: Philipp Schmitt Date: Mon, 13 Feb 2017 18:01:27 +0100 Subject: [PATCH 38/72] Fix typo (#2030) --- source/_components/lock.nuki.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/_components/lock.nuki.markdown b/source/_components/lock.nuki.markdown index f24c9e0a6aa..9c00f1c665b 100644 --- a/source/_components/lock.nuki.markdown +++ b/source/_components/lock.nuki.markdown @@ -14,7 +14,7 @@ ha_release: 0.38 ha_iot_class: "Local Polling" --- -The `nuki` platform allows you to control [Nuki Smart Locks](https://nuki.io/en/smart-lock/) via either a [sofware bridge](https://play.google.com/store/apps/details?id=io.nuki.bridge) or a [physical bridge](https://nuki.io/en/bridge/). +The `nuki` platform allows you to control [Nuki Smart Locks](https://nuki.io/en/smart-lock/) via either a [software bridge](https://play.google.com/store/apps/details?id=io.nuki.bridge) or a [physical bridge](https://nuki.io/en/bridge/). To add a Nuki bridge to your installation, you need to enable developper mode on your bridge and define a port and an access token. This can be achieved using the [Android app](https://play.google.com/store/apps/details?id=io.nuki). Please note that the API token should be 6-20 characters long, even though the app allows you to set a longer one. Then add the following to your `configuration.yaml` file: From 583c7c1483b7d82fee333440a609e50ba9ec3613 Mon Sep 17 00:00:00 2001 From: Carlo Costanzo Date: Tue, 14 Feb 2017 04:14:08 -0500 Subject: [PATCH 39/72] Added in pricing description. (#2033) Links to pricing. --- source/_components/tts.amazon_polly.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/source/_components/tts.amazon_polly.markdown b/source/_components/tts.amazon_polly.markdown index e2879e79c09..74a72492ac7 100644 --- a/source/_components/tts.amazon_polly.markdown +++ b/source/_components/tts.amazon_polly.markdown @@ -13,6 +13,7 @@ ha_release: 0.37 --- The `amazon_polly` text-to-speech platform that works with [Amazon Polly](https://aws.amazon.com/polly/) to create the spoken output. +Polly is a paid service via Amazon Web Services. There is a [free tier](https://aws.amazon.com/polly/pricing/) for the first 12 months and then a charge per million characters afterwards. To enable text-to-speech with Amazon Polly, add the following lines to your `configuration.yaml`: From 5dcb6fbd2a278b5e930440dcbf2eec022c43a2a3 Mon Sep 17 00:00:00 2001 From: Peter Zsak Date: Tue, 14 Feb 2017 10:15:07 +0100 Subject: [PATCH 40/72] clarify the usage of the sensor ("PWS" tag) (#2035) As it was not clear (at least for me), that the PWS sensor is the Weather Underground sensor, so a Note added at the bottom (like in darksky) --- source/_components/sensor.wunderground.markdown | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/source/_components/sensor.wunderground.markdown b/source/_components/sensor.wunderground.markdown index e1d439e2693..138dbd0166e 100644 --- a/source/_components/sensor.wunderground.markdown +++ b/source/_components/sensor.wunderground.markdown @@ -114,5 +114,8 @@ Configuration variables: All the conditions listed above will be updated each 5 minutes with exception of `alerts` that will be updated each 15 minutes by default. -Additional details about the API are available [here](https://www.wunderground.com/weather/api/d/docs). +

+Note: While the platform is called “wunderground” the sensors will show up in Home Assistant as “PWS” (eg: sensor.pws_weather). +

+Additional details about the API are available [here](https://www.wunderground.com/weather/api/d/docs). From 779fdeae322704c23e058dd3228ff48326283c5c Mon Sep 17 00:00:00 2001 From: "George.M" Date: Tue, 14 Feb 2017 10:15:37 +0000 Subject: [PATCH 41/72] Update to components/sensor.sensehat (#2009) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Update to components/sensor.sensehat • Have provided more information on how to install the SenseHAT for Virtual Environment installs • Have included directions on making the SenseHAT prettier * Amends to comform with PR --- source/_components/sensor.sensehat.markdown | 113 ++++++++++++++++++++ 1 file changed, 113 insertions(+) diff --git a/source/_components/sensor.sensehat.markdown b/source/_components/sensor.sensehat.markdown index b4c1b377ca8..468e1a4eef5 100644 --- a/source/_components/sensor.sensehat.markdown +++ b/source/_components/sensor.sensehat.markdown @@ -36,3 +36,116 @@ Configuration variables: - 'pressure' +#### Customizing the Sense HAT data + +**Format the sensor values** +Add the following to your `sensor` + +```yaml +# Example configuration.yaml entry +sensor: + - platform: sensehat + display_options: + - temperature + - humidity + - pressure + + - platform: template + sensors: + sensehat_temperature: + value_template: '{% raw %}{{ states.sensor.temperature.state | round(1) }}{% endraw %}' + unit_of_measurement: '°C' + sensehat_pressure: + value_template: '{% raw %}{{ states.sensor.pressure.state | round(1) }}{% endraw %}' + unit_of_measurement: 'mb' + sensehat_humidity: + value_template: '{% raw %}{{ states.sensor.humidity.state | round(1) }}{% endraw %}' + unit_of_measurement: '%' +``` + +**Give the values friendly names & icons** +Add the following to your `customize` + +```yaml +# Example configuration.yaml entry +customize: + sensor.sensehat_temperature: + icon: mdi:thermometer + friendly_name: "Temperature" + sensor.sensehat_humidity: + icon: mdi:weather-rainy + friendly_name: "Humidity" + sensor.sensehat_pressure: + icon: mdi:gauge + friendly_name: "Pressure" +``` + +**Create a group** +Add the following to your `groups` + +```yaml +# Example configuration.yaml entry +group: + sense_hat: + name: Sense HAT + entities: + - sensor.sensehat_temperature + - sensor.sensehat_humidity + - sensor.sensehat_pressure +``` +Add the _sense_hat group_ a group (_Kitchen for example_) +```yaml +# Example configuration.yaml entry +group: + kitchen: + - group.sense_hat +``` + + +### Directions for installing on Raspberry Pi All-In-One installer and HASSbian: +Here are the steps to make the _SenseHAT_ sensor work _successfully_ with the virtual enviroment versions. + +#### Install SenseHAT package to _homeassistant_venv_ +```bash +# switch to the homeassistant_venv environment +sudo su -s /bin/bash homeassistant +source /srv/homeassistant/homeassistant_venv/bin/activate + +# install the sense-hat lib +pip3 install sense-hat +# be patient, this will take a long while +``` +#### Return to `pi` +Type `exit` to quit out of the _homeassistant_venv_ back to your `pi` environment. + +As all of the following steps should be under the `pi` user environment. + +###### Install _RTIMU_ + +```bash +# Install RTIMU to pi user environment +pip3 install rtimulib + +# Add symlink to RTIMU in _homeassistant_venv_ +# Create a symlink using the following command: +ln -s /usr/lib/python3/dist-packages/RTIMU.cpython-34m-arm-linux-gnueabihf.so /srv/homeassistant/homeassistant_venv/lib/python3.4/ + +# Add _homeassistant_ user to the _input_ and the _i2c_ groups +sudo addgroup homeassistant input +sudo addgroup homeassistant i2c + +# Reboot Raspberry Pi to apply changes +sudo reboot +``` + +Unfortunately enabling the SenseHAT Sensor component for a Virtual Environment install of Home-Assistant fails with errors. +_(The Raspberry Pi All-In-One installer and HASSbian both run Home-Assistant in an virtual environment)._ +These issues have been discussed in the repository issue (#5093)[https://github.com/home-assistant/home-assistant/issues/5093) + +This fix has been tested with a clean install of: + +* [Raspbian Jessie - version January 2017](https://downloads.raspberrypi.org/raspbian/images/raspbian-2017-01-10/) + +and + +* [Home-Assistant 0.37.1](https://home-assistant.io/getting-started/installation-raspberry-pi-all-in-one/) From 2d0249ec906298ad7fe93210355aedbc011965c8 Mon Sep 17 00:00:00 2001 From: Erik Eriksson Date: Tue, 14 Feb 2017 11:18:47 +0100 Subject: [PATCH 42/72] Documented encryption config option (#2016) * Update device_tracker.owntracks.markdown Documented encryption config option * Update device_tracker.owntracks.markdown updated documentation --- source/_components/device_tracker.owntracks.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/source/_components/device_tracker.owntracks.markdown b/source/_components/device_tracker.owntracks.markdown index e8562f8b307..f7fc9192a8a 100644 --- a/source/_components/device_tracker.owntracks.markdown +++ b/source/_components/device_tracker.owntracks.markdown @@ -31,6 +31,7 @@ Configuration variables: - **max_gps_accuracy** (*Optional*): Sometimes Owntracks can report GPS location with a very low accuracy (few kilometers). That can trigger false zoning in your Home Assistant installation. With the parameter, you can filter these GPS reports. The number has to be in meter. For example, if you put 200 only GPS report with an accuracy under 200 will be take in account. - **waypoints** (*Optional*): Owntracks users can define [waypoints](http://owntracks.org/booklet/features/waypoints/) (a.k.a regions) which are similar in spirit to Home Assistant zones. If this configuration variable is `True`, the Owntracks users who are in `waypoint_whitelist` can export waypoints from the device and Home Assistant will import them as zone definitions. Defaults to `True`. - **waypoint_whitelist** (*Optional*): A list of user names (as defined for [Owntracks](/components/device_tracker.owntracks/)) who can export their waypoints from Owntracks to Home Assistant. Defaults to all users who are connected to Home Assistant via Owntracks. +- **secret** (*Optional*): [Payload encryption key](http://owntracks.org/booklet/features/encrypt/). This is usable when communicating with a third-party untrusted server or a public server (where anybody can subscribe to any topic). By default the payload is assumed to be unecrypted (although the comunication between Home Assistant and the server might still be encrypted). This feature requires the `libsodium` library to be present. A full sample configuration for the `owntracks` platform is shown below: From 49ff7580a8b09258dcc68fd779b188d57007e7da Mon Sep 17 00:00:00 2001 From: Fabian Affolter Date: Tue, 14 Feb 2017 12:06:11 +0100 Subject: [PATCH 43/72] Fix category --- .../2017-01-03-control-my-christmas-tree-stats.markdown | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/source/_posts/2017-01-03-control-my-christmas-tree-stats.markdown b/source/_posts/2017-01-03-control-my-christmas-tree-stats.markdown index d96dc5b8aef..0caed0cd59c 100644 --- a/source/_posts/2017-01-03-control-my-christmas-tree-stats.markdown +++ b/source/_posts/2017-01-03-control-my-christmas-tree-stats.markdown @@ -7,13 +7,13 @@ date_formatted: "January 3, 2017" author: Ben author_twitter: bruhautomation comments: true -categories: community +categories: Community og_image: /images/blog/2017-01-bruh-christmas/christmas-tree.gif --- Hello and Happy New Year! -I am not Paulus. My name is Ben. I’m the creator of the [BRUH Automation YouTube channel][bruh]. If you’ve ever seen any of my videos then you’ll know I love home automation and Home Assistant. +I am not Paulus. My name is Ben. I'm the creator of the [BRUH Automation YouTube channel][bruh]. If you've ever seen any of my videos then you'll know I love home automation and Home Assistant. I wanted to share some exciting stats from one of my latest projects - [Control My Christmas tree!](https://github.com/bruhautomation/BRUH-Christmas-Tree-2016) For this project, I created a Home Assistant instance on a Raspberry Pi 2 that was publically accessible via DuckDNS. Paulus was great in helping me disable several of the developer services that could have been exploited to disable the Home Assistant instance. @@ -32,11 +32,11 @@ During the time by tree was set up, I had 7,366 visitors from 88 countries conne View counts of the video.

-I’m very excited to report that Home Assistant didn’t crash a single time. In fact, it didn’t even bog down or need to be restarted. The Wemo Insight and Sonoff relays were incredibly resilient, as well. I only had one Sonoff failure and two Wemo Insight failures both of which were resolved by power cycling them. The digital LED strips also fared pretty well, hanging up only twice, aside from a loose connector. +I'm very excited to report that Home Assistant didn't crash a single time. In fact, it didn't even bog down or need to be restarted. The Wemo Insight and Sonoff relays were incredibly resilient, as well. I only had one Sonoff failure and two Wemo Insight failures both of which were resolved by power cycling them. The digital LED strips also fared pretty well, hanging up only twice, aside from a loose connector. I would like to send a big thank you to the Home Assistant developers who have worked so hard on making Home Assistant run so well. This project is a testament to your hard work on making Home Assistant one of the best home automation platforms out there. Thank you! -I’m looking forward to continuing my home automation adventures with Home Assistant and I can’t wait for next Christmas with an even bigger and badder tree. :) +I’m looking forward to continuing my home automation adventures with Home Assistant and I can't wait for next Christmas with an even bigger and badder tree. :) Wishing everyone the best in 2017! From 49278a872635b1019080cf585c58753f6f9eeafe Mon Sep 17 00:00:00 2001 From: Fabian Affolter Date: Tue, 14 Feb 2017 12:11:43 +0100 Subject: [PATCH 44/72] Add workshop blog post --- .../_posts/2017-02-14-clt-workshop.markdown | 28 ++++++++++++++++++ .../images/blog/2017-02-workshop/social.png | Bin 0 -> 104114 bytes 2 files changed, 28 insertions(+) create mode 100644 source/_posts/2017-02-14-clt-workshop.markdown create mode 100644 source/images/blog/2017-02-workshop/social.png diff --git a/source/_posts/2017-02-14-clt-workshop.markdown b/source/_posts/2017-02-14-clt-workshop.markdown new file mode 100644 index 00000000000..3a9530b889b --- /dev/null +++ b/source/_posts/2017-02-14-clt-workshop.markdown @@ -0,0 +1,28 @@ +--- +layout: post +title: "Workshop at CLT 2017" +description: "Home Assistant Workshop at the Chemnitzer Linux-Tage 2017" +date: 2017-02-14 08:04:05 +0000 +date_formatted: "February 14, 2017" +author: Fabian Affolter +author_twitter: fabaff +comments: true +categories: Community +og_image: /images/blog/2017-02-workshop/social.png +--- + +There will be a Home Assistant Workshop at the [Chemnitzer Linux-Tage 2017][clt]. First I will cover the installation, the setup, and the configuration process. The second part will be all about automation. Last but not least, we will talk about the integration of a new platform/component. + +Check the Workshop [overview][overview] to get the details. + +[Reqistration][anmeldung] is required as the places in the room are limited. The deadline for the registration is March, 8th 2017. + +- Location: Technische Universität Chemnitz, Reichenhainer Straße 90, 09126 Chemnitz, Germany +- Date: March, 12th 2017 +- Time: 10:00, Room W2 +- Language: German + +[clt]: https://chemnitzer.linux-tage.de/2017/ +[overview]: https://chemnitzer.linux-tage.de/2017/en/programm/beitrag/356 +[anmeldung]: https://chemnitzer.linux-tage.de/2017/en/programm/anmeldung/workshop/356 + diff --git a/source/images/blog/2017-02-workshop/social.png b/source/images/blog/2017-02-workshop/social.png new file mode 100644 index 0000000000000000000000000000000000000000..71baff1a6ae93fbc02ae41b1991aa7c53125d806 GIT binary patch literal 104114 zcmdqI_ghoT7e0#Rh>C)WC>@n5h)74Oiqeaegx;hV=^X-i5D=tDSE@))Aav2;7P1`?>cIxc8@O%$v>%@P^$nKFTzI?9jJ+U!u_Z}hT1f~KSv z)4Rs^L%(pVN9Dat5=)Z%8diDbJlnbRD~+RDG0^ir9OuqF*7 z9HpP_2L4PvGedjI@_?m+&sQ5PGPdo>|M}7_+4F>S2H?ZR#SKn?^m*-kQTM+qE+LfC zw-AZ{zC?6KTz&N4~?g#Q@a6Cm#c>0iN(~9;&q4CRshUTVZ77^_4!E;*fySR+95LcdNKL3GK z!K4-cvD0c3^u=GSx=B|4>aU(Ko-fJxGxFzWcV@a>U5ZofHA-V$w@Kl>1{w08${T;x zCak5Swo92@;@vdixCEsc5^}e?lo<<^U_7c&GxhLr>HbaDonXzb*LjZ2`Ga2cxo17X zQrUqiy7Q!65$C?7&S5+43aA_pd{}&=cPD*y0y1Y3 zf74IkD;`rM0$mM?Q{Hc?E2GB-OI#rS=!wX)AAp{HquQ$Y$Y}htRs7twpp&xqH^3IT zYAq`E5nc;My)GG?4PdNcDb5$j{*SS6 zl`Zc4pxPq0a}shk!M(NleII8w0_3jTXwwzA)pq=2 z^i0&q?Q$6zS;+s!mOng3*9Tjl*7q3e_E?6Ik=_31uj#%P7#5b#PeHO3Qjf(3*>UzP zg^ zW9%z1M_t*i+ozv*{G}YDF`9h7bM{-<`PYHoc^ryBTkPtVZ~IE7G9Zzs&POqVJeJ}zjhJIGDWwFoqv)THv6%n>2b56kCiE2QWPpn z+<-Q}rmiFXH~`s~9H^eilCF{Ro`Yu#_^vw`nPf&Wl$~urO=RlPfpcg3^(zbpXoGs9 zQ`Zu`ViSi<1IuE-*~7l=jU{RQP8X#n7VC!yel>eTrz%;aMuz6h75tA8Q8frYN(-Vm zM0JYXeX&xpMn^K1$C*VNN8?Lv$M1lXxL1W4uQ8GJDXb4Ag^f~)U0$78Nv+9)He6l_ zia;O~nRGv~-2JhWY7IZW8j({|@(axBab)od>}%sGZH<5VH>Wf>jz?(9-LVxt**pov z{2JIX^J;!CP_Dgx!K!?yeq(`_s!pK$cOYX0y#3^b$C<7-H;b*` zGd;9jag@h<@L`^R6l!=-QyE;OfAQF73D>nUCnCHwuP40U83J-0>`Sdt0HQmNsl7_1BLt`Y1CLh!FC zHq(PY9pzE;2~X)}RBCeMu`KpmzhExCL)1HP)6qW`Eg zMA{5V{JBxOMhDwfQN1e)@6GVsoLzsVkKH=)ooIlHn8Z(VmacFZ631n1vDVcDU%rKK zukmP3#KBh=y8MQW`$L4Mq$Nu)$QBTz?RTVb)2T-x!Khy0Wdr2tp&_iR)G><*+qN`# zFc5nX2OnHZLb%1_sJEI)GQ)+8HqAwK#H2jN*)eDLgBNte?DS3_0Q>W-GQQQ)A<<6xGCp{bP5O@0;i`MC)_zxRPtASvJ2 zw&Z42O=+3--YZYtsh$w(3?NFcYx3m{#=Y*6sQMTIwGO}i8nN|tpr1@zwK_N)Yz;r$ zDZGA=fT32t+Jx`H7V)XU+v z0@eeG(lkzFL2VX!%MMZ&y!cJs{obBkS`pdM%}m2nV8mzh@krz}Ri(ffv8}zg1?$9e ziQv^tXGhyXWtHmBNvSKs;BLMBD^)UjMK$ftMAm5s@H<|J=6p*}p5U65-mrrU#C;8& z_(bnVoIKG1#{~yJcMnF#>rU7CpqZZ?8jcUPx7_mUk7uoE6`KtyK-evaFyAwfpDuPe zT)WT#(Hm{^@JFLQE)06~2`3VFIehnrmyLHv6*?G!3L?p%#zndK*-qC2*h z^k#Va{+!gYG?^~~!1Vj+9AqcHGsLrC>r~ZXYZ{xsqv#<~>bnIsnI)!vzw;fv)ePh~ zvc&46`Z>@OQL=UVEnP`?tkw7AO5lzdO0^xWCovvylHP)yPBm&IYKS+hOOz6}ts7&n zriNPYZNANfS_{WcNEa%Yr^REmTm=MY-SI>n`rLp535a`*MEz>+h_vPn+s1b4d=u%gk4`0aU!IYXQegz}pdz|eF zZ=?cfVdk`;IFl{ut*B(hLYS#uy??pD(0Nnfw(0|iM`L8xH;>12nRJQc_X58K&HzzCXI254UqP z7}_QjV!K`VDi_pyD-PT7*m>uif9IzTp%sAZay?pHMcU}x4I?exs;?gC_TK(%R45(lYBJUFw)0F^R|xe?H_U0b(V|)z z<+Ttj5j-VBJ08HN5~`TW(vVBsD2IL7@6eN}I8bXR!HO2@6o$;tj#MQ(Hpo+4Kdw8! zTC?FA2)9-QHxQ8g9yIjAC7YRa8~xn&sIeA@&H+P{*!8lbKj{$Xnzcp)BIk>$A|xVb z%ldZj+vwf>(m(S>B@~>!qCdoB*4{$I9^t>ibjsOLJqXT*DFmnStS510FwEXe%KyR7 zv4@7s-eOw|d&W&t4ZVa$HXka*rsT|2XSdn|N0GwWfS-C&^(TuJGYT{Y8IXmr*a|c< zldtJ;{v%%#8?jVGgYYtC~ja~-|GJ7@|Jt3QVRCBgCJjh*il$VMx+>srQmEZjImr4Kgvm-L>cQ+ zWEL>iimkgz@;S3CHQe1AU%+dji}^P%Lbn2j`j#5mj*J7$*;N`)kP13=_DmCI(Lw<*oR|k8Vu^s?qy* z`s~vt85TaLr2()csr)`AgRan_CT^(4*oZOmQqfbz$3JT8!kE+!)+bz_+?v@u80+(t zOgq@F@`^ra`L{QM|7jK*-M2^h2QX(p=X=dvt-fMAKe|H-9g=Q}G!C*C zfPl43I6X4^mOplMg2E9z?qc;ku{4REG^48*ocInFRHgTfrS<5p zJfM8j8e8=2vr}#1dr6RgL_RY2S+P2JhRi>>Loj%!@&#V{IL%v9L-o=pTiPo`SNal* z*PbwT$xr-7x-8evt5-8dhwVy3u@?1!9C&$gwk7b20YE^YkyXwLPkec$t@uFnPj zQZj2-$M2E6OgMQ<7xf4Oj~R|CNMhXhshi8FI$mqLe+xh7TDsMV@snukqOP(yOAfy3 zGx3h;XvDV}BC3jtG}Hl5F{keBu_LfSPGqhNNLRimop}B`*aWdv@1^{9M0|c}6{9ok z$CQ8vX4sKIrwKH|@vu(NqjQ{cUeCj8A+G06hlfh(D;xDRuyHfQ65Ium;8{3f(Dm=&Ns@@7ArZ zC=rs_SbcnnOl)L8wT>{3iD4$Vd`3QHT{>WyTDyz$I{CeC%5!bJC{1zw$H~{@;3?fJ z)txeW+peFeYn;*|&ZKcV<<;wEO~Q2xBZ>8GFASA2II8MSKbbDCU&{u#QGvu<;{?4` ze>~3F-YrZgUs6~q-u6aqDf8R(Od*q%`aq_filUmotD~AFzLMC*V2v%S-gQ0?pk@~HkKyO)kK*Dm2etf; z-%}mn8AWluZ#0uOiWBhyt>qB@*NH#Gm`41T@rhrb(CGTq)OnY($kFgWdc=UcMn-08 zq4(NVr(s?yO*$hdGgX1pn`>e_X)gXuwP!jHIn8os`9L3-Y+qt$)wpAMq31o;+DwJ1!B@ zJPGL8?EA>@)e!YHOl~l`+9>11E~l>0rqLp;>aDQRZ%ie;Ey7bBSb z36>bWie(G*Vq%BcW6aOQjydS?A@HFAC$^qh1dMt?vtFX|IJc zS-u&Ygwc`cg|Ml$QJY+qL0FoNt2DClBW3Vn?NI|0|GkGwj;79=0iO&m*8>d;iM@`B z6k0>I#>i|s;T!F}rjNTnsSx`qs4X)U#8(77cL;lTs(N5@Y#QgS0%d#c&QB zP^6+M5n|{MYi4I3SofiJHO@tY~jFrY=nJPEBd&})vLfMqfjXhqzNN?D$6vc zTfBQ7Z+!}!(hGrn5C8>^j;G8>ntNEf6!3V3nWH%i|641?xjUWFv5WLQ{BjwrJ{+fl z=FFnsDIPp5*R;v~rT+@*00m6-b$aGA;&~~ypcl%ISsKbepHaRAtWVpLDS{l6`_yD> zmf7Oe?d~WmY%4o@K)ud))8Z9~FLvH?$?8xNPyh%4gCno|&Uo8Vw7kt(GEz$~gFJHC z0Nm^=KJEVfwDvig;p)F+6y_bmarTjLM@GY==O434q@4bx+;a=z z-xuh~#s=5gp(r6C@(A8qhb_B-K5|hbJx0fWbnja4UMUqZGP&Xb%SC)i$p&inxZgJg z`4s#aWQDQ;5)!{{SFq00K`BBqui?WlPEWysub;dZEia^a{qmwNS3`vP$e$dzxsXQq z1s+svWaLjb>1(CXh$4tht|J%z1p?m!XKIJ&0RrC7DR9J0;LE=h3~0_&YP=u$h{48$ zD=7sYD;W4(__X%y@d3cZ2CM6hAx&0x(T`Pp#AW6j|FK`;FiKB#&(+HQ(OI?h=CK6N zBrv*;(W$Zbb3hA3WPj-1Z+UUQRt{e8Vk)f1zmwjWSez0S!KVME z3(rO%+(m+;FzS$zD;uNb6(Cm54Y-X*hq-W%!7K(afGa^6-l-Y+SUFN*P=9J{;^W%j zd7RZwWn$Yt_n?#toYL(s1zwa*-f{s>2^oLtYj2*D#1c5$6M;a#L%Z?~`I@f9gNSpr zaP3Pmcf6V@mH+vGCENnpdh3;~XBUdnIYu!$t;MG1dCRLO!1Hi66f-M^a+1``VssG5g~qv8bi-^>rz?VY-%+MRrTP%`fVvi=mS4M|QMydjtJ5V^ib+B1UQv9`_#s3hnJ8>dq)D@lX&+ z5y>L{eeM|(KB{TT)%}~V^Bg3Oe>?w!b##sRe1*}Ypf+p9@4eE~zJ|P>CF)u;57cR6 zqraqR9ZvsvJV3DXUBGX+!`Md-q_L};G2;3YHZNq1-1dTX=zTYrddG}7EhPYSIP<(( zGE*=7OXm1h>YuCT;a49qUar`d&RoQ0t#AXa88z7mlJ(ym5xuJXc>xg*xSF=3m z$rT#`i+aq$B_r+3YSu<^nlq_H*sTO9zA_% zY;pyU3K$$rH7Rt2)B%nNGAyiBFk>8s2ZU!Muu0ZA2xlo_c-;usL2IvVdjIU>fP#sG zIN?RxLksV!9@@2+=)s;)R=YB?1aTYPz>_BuvyTG!ib~WZPnkqzq~y2Rf(O^=w{nhM z=GqrfX&=9E%u$hyt7OlNIivbff=^l#?7Ot9%;}6gQ!7to zU{cGCd+NwoHDM#Bl1Nmp*Ej6y-c23mk~?JVRS5-exCsL6wnEox<%1x)J*Io^@v7(d zv8@T!kh#i{k5})SvIk}!C1rn^@RoVf80hyE@i9iWRurY(rF~%YaefWQgYAmRo=hxsQnY*3R|L5t*M|nO=XziWXR*XkeXF=^sz| zsXRZtcwRY!!LxR%owM-pd|-PBadW?Gzkhga_Wu8Zd7Xt^~`P(>{`MZve&WpS{qE2>+4edRut>8(tNA8z5)|6fTRrz=l_DF z@nH!{HE8paIl6Smr;MokuR{Tme46BYGqIP824~nkwGF5HXjE)G;{Mj0j*To~BTLFB zlV|>-d){)S%4%SfN)W`o=TreW9^b8vA^Y&WRh>H@8!vLvK~Dn|=|ebU)=qM|wi%O- zM?c35uO-zll#y9J3kp#IhNw3Bv2pUZBOPnwl(V**&t>x0%m?3LN(Sv$Y+QA?q#?|i z>)hjFhr+&F4W(aF1c%<&u1Yzaif-s-Q{YYPm!g+T>5Fc z!!oC~jr(tdNqWxJ z^;hf{Chhy)O}yjX+p34Hp+lq|(Gf>=;DkAz>%>2aa`%%QVGZTY$0~qd<%!ffGWxvJ z`6k&s@_8pvavm*+eAF$O9OhzL)$)YWPm%LvXu-HG$y2zPTt>K8`{K`Y>Pq`%vGZ@+ zKh9Sr^RR9`+$az-#y|wdzFuALFihdy#|2Adtan%l9!%@F0D34rGqO34;>K6b5L0%o}Xtq<|cJvq4=mAC-{1Pj&X~ca`b9!()LSs5An3rtm*y~nbP+r4} zz1Eb%r@q9Ig<*j0t`FcTjjGcb!P~24c#VoAjqB&kx<8OwmH!f^C(K8w>P#le$EvCwX$+Szm>U7xsIANH ziO?7ph5N|~qY9QgO(3GD6?xV`^=-c6R+V{mOrFlK@-SqLYRFJl2DM>{lflJybc%$5 z@rieQM}+lI}4`xT`{y}aqK#h3lRUH~c7YhVQx)Uf zS&41>1twms9(k*7X-*pzfI9Kd zA54)r`KY6l<8MMzS_Pqllfc@(6B>E(-(s-|F13MdoTz%bh0XdbPy}){eZEjVFmfxt zvoSraoJk!@*(dh)><>F4N)zx8SITC@63<|s03xXmV5)JJn55vc`eYgnW6bMV{&l&! z_&`PKfVyNfF~HCRJuOd$x3R&G>nG^#$joUK#?yG2i}nff%7cn&6(frcBQ?36iCrD2 z;*LM12hNiII~K2%Xee8hXT4Wkq7AAS zLbI+{YZLg#Py89ZCLPG3I@A&=xbL=S>P}J6pn!FrBlV`{U5Tn#Y$!49e|ury3e=M@21~P*535w6>i}sk{I*3I>AJQ+y zqKiEf6xpGDqVE~#jMVc*3HnFmW68Y^dy@p$zQISTTrLWg7Z5UyGfY=bMP-YMw!BIj z4Sn8>&&Now@2c}h1s}3je|}$*UZ|T~MkOE21g{X3!~mG~ z@;*(UEqrUlnu_TONODO6KEPGC^Wk`D0H1_MQ^6*T9B_mEx$}ENX(cR8Lu2rUi3XJ8 z7W+P0QJrfato~>FCwO>7tm4{{8_Wj3j>9EglUA3hteYOlt3B4pB;!#{?W5HHhh7I0 zp4y2LHG=4BeUSaVi&vOEF4%qfArU=<0B6j(vhM3P={dPIwGp-Xl3Cr(NyWyq4p~kR zIs))G@YF9V78~&(^jpu248{83*uG!=cSZ-*42Fzx5A|#>$9=gM1E9!wy67)8{K;+i z)Xin`{U1KZ{r&0g`oE^~M2&?rNeP&~;Pu4QHwNfofaEPkO&r{Megj}F*NWJJjf~f! z9^;R0*i9j`9z1Ay0f#??^yuUX)pyr$Hd;M z{5DqaAkzZ!%Q%rFD%#F9K(6it5H>5u|8bu@rWBFPcFHVXGcZxyYV_M>K2DzObTL~P zzkhW9M`QbmeO{;Fo|vKRtCyS1n!|r0Qy#*c313-krP|cPaQFwRP!+p(scc8l+Ft!l zz8*}T_$ax}V*UcFUB+xa5yn>{L)rIN7?-FRnhrGNXQd5T3Qc{8+OJB|_dG!1^T3J9 z)2Lqn6q3w(hwV9uvChvUWNL{rNH2N%<8Ou{oCq+4;me_68s5WY6oc-_Iwjzo)iEtc ziaO0QD>538!7D|l-@e8l4l^_|$HynQcrF2Yi#imbX29SexqC%QVpy7XYFv?Xbd5fF za8So~|1X>OLw@rcC0Yx%D+n$=n%uU4nQ*O(Rb43J z62Rc#LP&|Z?I`BhE7bRF-xQN*1qc&Bl7mc)v$eV34h!g=chc zLv=wYmGivh;2=qB@?UZX6CP>IKzFH+`}$j%`}{e&vQ=pCthu|5uXp#}X+EYN)dn*S%yDdn~{eV5|gl9|(Tn4^Wdv zvu&sI@fkS$2DSMSp)kT&1~LdZQjCr)tch6~-?R%Hg`n{66#vPfH8DSQi>2hEL35j# zgS7MjaN{>j?+fD-;9m%4Q_fQMJhF%{-FbB?#mn@HDm9*ndD{N!w5V+cK{?+-N1@0_ z=%qBj1R00J!F(84SpiUVsckaQgW~S8V8(s)_2e7KjR|YT(h!}nJ+qVE>8vJvB9h^Iy1dvtUlMKewP6Fz+YYiqZtK~ z5;AKzp4YyEejEFD9 zM2XJ4&q)skJJt6aX~;Oq*EQW@93xlb8Wm2cuCoVO z3MERR88)Jt`;gG;TM+h?wN9XGi_i|fRDqZA&PcIWstv(u%$8RC?Geq1)Vrf;7P%N{ zcIRf8jxDFIckKESNQN@B2F|4xr^4_T{63q(QF9~$$@hD>8-H`4rdJs`k(ZQ|*?P*U<|?|T6tsjn57vh#{FC#U zx1%_C-hUx2_0y%8`_Jf$63^Q&<$t;aF^ac)g%J!)GS@6lj&P8?<6UP?lWo;$=?T@O z)$@2!cvl}Ui|Fp0`(i(zY2uQTVl7adoLcx)pXvR}6w-91>Hy)qN|?XhxI~9G%$D@* zDyn}NBRc?*Huq}dcPWUcv0pGE!<k;i%0>zP_rV!LDmPdq2O~m zf7@O+?4^5d+`FEYNXS~u|D-A=XLmGCu8Y*b{^)q3PrGC9j0E9^V7on`6qc1%&_R5f8yqu`jxg(oXts$jkUcapp3?r09H zm%V}G=u{yU^^#KZDeycN?rW^b;QT@{IeCH0uDAnMBAjW{ZzEWN0Ff9f_AGePA!j8w z^j`hHhTh}nK_Mf1TE;t~T7q!v%Bi9yI*8`!OjZ^4;)sb<|4oy^n4?DHoInTpLTF?0 zwIavr;o^32thI^8-T_Gxy9~}7OXK}qibEA{m2{87)Uw?Py)~#rYOGjkT1*rNG{(1*^q$L&i20BV4k?g zN5p5nJU2SrCADek{;^R(Z#m>+BUe>~xOq;f@_)vnaXJRJ~a*%$ummeG&-rrJZ3FONi`884F;>X(gn&h5T#6W4tIOmHbce<6s4O z9!IO$<~cf8*&27H2xZv|#JxC+c}qK*u7Y_58cxdVB3^-gSn+CTolI#%bcRQ^i;CUC z@b%n)1e6Uql>Vira7f?y=bH0j$STp>uxRcP@ESH^_RaV!YFzEk%bj+sXjJY zbXpImCq?@jhJT@{@@|K+RFbpb>>lL>u(_bddo3^WaGtClN;U1c!LL(uh7&^@tms}B zri@r^Wf!7(yKy4v6iPV(L85JwYf_aRl|I#LMyp3m$qlZLTVC@@Kk-%ciPm--J`OmC z0kuV-uvgCA5fJ_0V9S9^ZEUQ&pD0w%ufqRhCsIQy{~`iM579KN(9OGdmvryW%b<{- zOeNxW38u$Y-TKqG_xd>M7aLH%h}4<T>ZVrqLHNMiU`YQ}SSwL|?7_-MG4#RXt zl@5H9{@BG_%7Uc4vhU)N3+VJJ0j`8Kz!&3qL(fAN`PVOvQGk=M%d=XPSYR@JHHu}C z$O;(F^|vZH&*Kri*JRQm>|2Pl_@1A+qELa~LzFyFCj0B`{eac~6q3rOMsGK@hsL5y zCSq|~K2=Wk54YrezF}?ZlKSz&I&NU&QC*`K5J7!^jeWn}{PL$n5IS8RH~9)x)=fr@ zaCj)Z;tY0?9Cz0C$dyRvN=&C@q7Fn+C+-FF)1Q&V&@yw=^geYwO?LLFcb?93i>i@o zP=0;jrl2lbiM=R-4?P7`SoHi2dl|YfTMC@((b1N#g@GlEh8mKFla=ZKKb~%$Gd|({ zn8|RmpiVy@%k2@HI2tAr&-5@xhY4+z?boQlBU_KKd(@@S#Vt1sk;g}Riu#XL)4w#- z`oHIxc1QQH<#b0>X-bsp*%1+(Mwq@HlHVoAfFQ+3}*DqDt|nq%SG4 z>z`j3YmIiIpG-fQxmiN3TYQ}t6F87`4DI3`*EVCPGauPuUmKUK$Mwy%XkD_OC;S}_EdE0W6rZEi!@Zu_~EfQzZ#Hbt*TxjC;K#Eb~)mo)a%`SXu*=DpFYA2QWx%S0lNxk8{Y>Yto@@qwF#|Uj&*8|!lz)9F_)GkW2alNqEbneB-ipx z|8i-m6ChC_qM2AkSa8j@c<-F2=+IXSTML;=LYG>O^uzyPMkpD@v8G#8o||2#)aBx& z;|+RU4&pDYC#R-Gp9{1&FS--pwjyR&bJv~sm?hc!E)bK$w}&@iZ1{X(E| zaU#IH&`XAZ(*v6lIsa&5Tw``sS2$A{Bs0@2zqAU9zzsOhuH%!LO*w*Uvi)t+o#lX* zmg4U%ajCBw0_C?)4qr!r!{LoGTX3^qm?au#Qv7$@JpaY9kJOOtq)gP%4|Ep#YSg4M zN~vx-{I>2|F2UPkJ*!H8L!Y;N;T~yLiwH7``elhDh{->(XiYxNmjNC&k33ny7iAB5 zV>Kdr|4nJxm@+aK?~ z0rgW9h7~`iO&USw`kd;~hSIdKxJEzc>(vlwAME_UZScGL({^F{8*=n_iY}t`3)S`R zk?vgt2V5_p++3 ztsFdZ@rnK%o9nU&@(pb0br4FZ^;NG$alk;m@aeBp-RN*p{?!|$e?|THa_OHJfZbRc zsgWv&Digg$#ZBX@hI(7@sj2ikqLOTz85;o`u^ps#@0ATlER*ulSN2bv?bnr7^cu9wRj{$VuOHKoT`aVU2y5&B)fq(#eIRmyf1 zdMA=m;1TID-M7!($$0G%m4`U`*-ai>Ia2NLK3t`w>`5C%(XtZFt^enyCkBE$Zgm2< zgJSU_rkA0<01ADYKJbbf*`u}oJJYRmcjOqiqoQ?o3OUv;4iTj%tMB^}pB!6~UMM09 z+ITG*#M`OhCd`=}ARU{SM2Nk#sMGxe+hSK|m4MEj{u5~!zp43ZBg%YU-Hws9cG;!5 zyjuyXX;J)u=M_UB$(Mfp3_Qk?cL(r9D3m@$5%ki}JFzipHZ=MV5ibhitRM#v=`*8B zv(E{&*WR6PCPc?tvth!6ADOeU_BdYBjcetaxn2db3RZ;YJy0aMe~$EK+-us4x*zy1 zlKhpP2K~z+O_XNwzfomeS2BuDlRaobIaw@dy1fH0zG=E|-3-vllYz z%fI5m7s>hWvl)U}gGHpY?oy3)dI7yEG?M%2?Pw_Dnnjxp+-}dt#v`x=R|rNvn*k$h zeI>UCQWD*PGc*s4xlqci>k;f-XmZD&6M6Yt-4h99ENID$)=_b!$yS8uqX0nt~i_)+u4ajNdJ^l2nPzDTEJx zNy^S{($1NC>pP^Q586ZJ(mcWFdj=VaHWK~{;B?JZs@t*p6BMtL!7#E<;>;CPS)q5G$TP!?X}2UV z-+nb(Z#rt&^E#x$x`|rHxT@1VW-5;pRyg;I;yM_hKnETqq|=u_SeaNk6(c}(Eoj3Rce5$4`IzZKO#u&&XNPC6i+K)K_J^qxRwyrhO3Cyoy zA^%<}66$`^A`q8yQP)pEE6R)hQSe&Ipz?dt+mz4jyz8W20`H67dAdZhyp8UVH~MrI zer6()tPhH&zZB8-kM;@MRS0KiOY4vv)u&76i)1a}*n(IslP`(y(AZCVS35=q#Pp=* zJCv_%zkxe8EFv9X*^I1!tTrUQKl+Rwg#oL2?GkC_IuRW}tEdd)Q4R?C7b_1XK51h> z#M-%U2i)&eFezX_Pq{LiO!t@U(13AVf*EkC@bS8y;;X*{X043p&Tn)*i4&)Ddi(?z z)x9eK5zb{n6v8z=Hrar?TbjJDJwF032^OYte3*WwpXVac`Ajq++VYTC*y1Y<%KY4F zjw=!$a(?O4DI)oI7z^jyY25S#I8JYv!J_;~(TjvN!&*R)$^bAaEs(!gt3FqCh_??$H@!D6+)HQVb$%mrzJeH8O)s&hu4N;4t%;lHtsbqsn zzGKz;zMZbizdB9Yy6sel+MX8_!n4QgG@u9~Fh=I1|adR!@LYK@r*X3~Xuy~)q-0emgy4>`oi?Ms-zBwJnIgLmQ=9f^4 zO@++jS6KPA(*R^vtqf@raA@oxPFul`R1z+MDAAYq=3F-b+4L{RVS%#>kXuEZT^-?m zFLEE24>{GvLbdcePe9EK;hA%9X?;PLy`DV+O!Mr^P1D2?2i_So9;$=mBsny#a+?Cy zdMvJ+);2C8l~X%yk7pQEOL=n}*xcXJ>X_%&^1VVQazA3d2u6EGks;nkA97S%a&JDX zn~kA$k1WRDoBSi(m%iDFwqT!L3MM(OMu&lg>@2iv?~k#Ije}rZkP&MOH=TJ-ZA!fI zYv5ZBhS^4S1~>IL&;{~U`raNJ z;Wm(xca0pYB5AqzbEvjyVg&z?ws58v2r-RKG;Xeu_4hQFC2YRy3ViPnTod6pq1dUt zk~_{*Jg?wEFeQ24`WHcv2OgZwxk^;z&~*?%5@bhHZ~WR_ z_nl_mutBD4<~KjEoT0rUPojDwHmx7T-IjAv82VU5$O7;zG?tR6d*``mWU6~T-6rj- z#1KH*0kh0?n6CFu+8$B*fSr-|x%6*acOJdzQRfHB1k!Up0y*`)A9PUrP>!a^B@b?s zSQDS8LrdAVdTD!k)!w$rp8r;L)9KYHS2-!aW779%JxP+CQ?!2v5pHXG>4M63%`nM6 z^!T*{>L!CXXA5whG;j4DC-znFH$fPm<>T{gbzhLO+>NW}pkFv*pQ?QDmv@aC{Br|B z>7e#AA1(*1V&c8O;7LjWXgrH7N`!_&m8B4#Ew}pJaJ{ns>jh{4-Xae^-uOX3Bi7(s z`idcSm@5dKdr|&f1+lvlN;7>f!zV69_x?&Gj10k6)NlP}gT8RCGf~%aCB@t4w>w&+ zuTT1(keoP_Kjlvp$WRc$H3A=LLXT+W*7n6FkaHb(iMKpNIHZ9em~7s=Oa+&rrKtvv#Kx(H39N?QqNyPP((a zL(rqj$qw+8$zF=mIW%y|3ANVtS};YsB}}U2^X=*PY+FN^;_ZSuc<8~@V@&6ZZiT15 zv(EfJ(zug!zeWy#m=t8ng<1BWT$EZ^WH#tykTPBA`iYn2v7|k(ekj-XkK>}T3mYoD z4W7b4UYmHn#A7%8gbx;Gn~bWz%-YvUp>*szST)^C&>ZPe6t}rC{JBOTTjks+h?+~GTB~;P;h;rC5WFhv zE5z2``$FP_U$iC7?~&=?z|Be#I9#8hu}H*=f>E9q)h(zw%Hyz(9NfOma3T-IQvctE zC~)8lrGC2i)~;rWu7VU>g;!dVuQmOm7>y;h&G5V^Qh6^z`HoY-P)^q^x5`YqYk?Mo zpT2W31UX38V)^~&#&(X3?Zp;T@msmRb;ObfJR*OAv!?`$)#YCB?v@m-E}(eRvzYM< z+|fU1b#Brsb|K_A*9UYrbD%CcpyMF3I{POlE^H8cZ<5Tu)vGc=gVW1=zH>R%3>_O~ z49$p__i6~{*Kw;9xh6>QoaBV9F5be? zXf6`I@l^S8t49Pgka_)2f7h8ScBJp&jno~ zA($3q<{)rEYavkCRANuD-@;RKX>3>h^(3>_X1X`9x;sN!ob0iQmqy_kW;6>LfnMjJ zXkoh=7s2f-v)yjxvv1v}(hBI0q7f!lZ7{yK`%G)f*X60{-hLRo{*=V{v^bIi)5I@$ zhRX{rxA`j`UXgLsC=yczXSaJXyO#r4Z^x=atO6i(LGVPK&d_io;lSeIj)rARNi{JL z{b<6_mn6jO-h*PwqJ39uVAX0OjA(&6`68-U9ca*vGIIO!Svp{)Q<2GZRg&2q z{I&mr?k{b0!oF`{;oPdm4LgPVqfOVd#SXi`Ben@C+l~s}GEiQ5MdCRt8 zVb-4RiNh!-!Is|o)?(^%e-aKKcmXx=Pd@j0|-88sux8H1Sllzn8&b|Y!BMg>6k0Rz1Z7Ni?3Z_Dh&i- zO8T7un5dKwK(*?mwu@69IiUtW7Y?*=gEV?;7$XE~GWL?6gZ1$BV(=C*vnA~t(3F9b z3g|6R4NCkd_M3MF=b!#eA3J%jetVq#P@L}$Ys$jvU9S9XMt>f@ z&+*@qZQ#5Ez4tMJ(^q};ih~*aQf}t}rcR=#A;~44k6W;3uT&e+ifyEriFq%5A1(BeN8JTNSprm9H6>=hhYeMZ^% zp`w3?79wpDKyL)D`>3NO@fk~;JOiekY1An6rz$R66`|chu*js<>}<6^9R)MdfwCWW>cANldZKaTkfm2wCp=Oj3m& zTdTj?vf=p8d2C;rVDKr*KEEg=`F2&ydERziqF{B5pKYM6ck13vb2Z$y8bhEH<9nv* z?ETz$a>jFS%OjR@{Wmu)#RRo;D0w*yEL{`y@O#PNXIR2uN}a{4GC3)-tsLwQQiGpx zgU#Qpm_6^SR&Q5-zhRKEPsABIFw6CP6WL>hg^U@`X~KuK>a}HV!%@QS}8*0iD(!}8HoakPe$B) zVpZ$=i_{I)CE02k$xUzFi>U}7kl#2Dsf}Qr{5^fVNfyi!TYW(_x%*@Im(@l>n1$l) z?4Jkr5{YRLVri`%TDgr>N-fWO+h!Zg%tou8=#L6lMqEF*iN8~@IWe%9b2_GbO)}ki zdOkmLF6lS8sfg}s@nTH(sBMHn}Y0h7)xX`O^U(bKDa0JqGpvrvxv`pG2wB~3%^7SgY zKHQ0PoqAQW9ZE0?#iA+9d^#VkVCa;_?%@BJT=;hb8I&}LYZF{r71yICBqlT2&R$uW ze5N`wjw@Mep7PH2Qv6dy`dV73OdX0+(nET4ld8oJyEeGpkoVu-`sIS$!V;Fq z{=16ckX=ALWrsRe$s_Di)VVb?#s|uiVmfMDmiE7Wb_NZS+9&|ejQ z_Md9dW~+=ra#$x{-=t|hg z_~bv-jseq}ljnc^Ys=LuWHmttq9`m z4e}a8YU0wvYYXiM`X!am8^7M6;Hc z+D%OJH@`%e;JGCW8eyc3rhR%Xaibpib#U3QY8vka$d)B&Lfe5?lh%~H2QU3ChYJl( z$v138!LX9vq(7G&&8I#ktbSj2WbV-ta1l!W|7K?(j(b=q)JUACNtL~iL6amh{P=rn z3(B_SKgU0BOyi~q)}2ye{E+5NUaa0Ypq;8Mcr=UO4Vx|fhQaOJ<3NjVxc!eZg60Q3 z4dMw2Wnr7BgEp9zIZunn%WfwJyg*mxjTsq~ANrrEHFJv-s#LHe zS~?Cjja=}0^1`O<1rx$U-MiEsQ=hm|t8YG2#;g4hNwL6slPuD#5=3(`9&pT4K{}Ps$;RZAjbSPWr<*An#bt;aI;bZYFvHE^FyXT5k zwz0L5xSQ{rRCT@~7vwllG2;Ao0%o*7NOUKRxj`jtZH|hWZJy+cmpq^yK?tGl_ zZfCDZx;$=m@b|~s%y?TvXIl@8cb+*NPaN2>TnF#2D2{s#yu4Ekzwi`5C&<{tvj=+DH?5j z%8%kV)c6pabey^q=;DWo|1z{}oe)39q&bsin6uj+q<-Pc7H4@J8)`IL2JCv|lq?VjVbM(V9gNde6@7$id(4`(33)lUmFYf4sAk0+KASM$0J~Xof(> zlD97M@JQ1kd7vBH!Dtnl0?k=H@}=$5Ozqm%BpT{C`pFRxhKYwno&=?&V$`ay9QhMs+YtuBPUq#fssKc9Osd>@i#l(NJ zEJ62VzJW7NZxqk=@i*_DIkmj?r#dYEWwAj`m3R`6UU*>*A6p#~rw&=Ro*3~Q11632 zDhf|OA^Ti!Soa}{98dZ2sFP+YY*E{NgpOhRwJaH=an8rpXuJkdIBAB0Az6?@c$9|4B z784X1Qe4Lh3XgnVv1**vMtg6V^(T7+JzhfgFW(As@+k)PW6Bu)nc;eapZQmVm3%S( z3DiV`20`WMY_s8zgxQ1{Ibf53BHeI%z@Jq7u@TLSYvW-#M5GO6eXxhGK(R3~w^T=q z7le^cO*!e6g@+pdG8YXx4{5?yc}99UoxrqD(l1%27a;bWq{|%NJF)egZVF`K6x^QhPoF_7`j`SjVC?F&)anct2gNI$ruhfBlK!dfWFU6;-le%jSP3zkKy>D zTCQEQn~%XR;yBu$z65KAMACY!{aEg5?Rj6=r>Ik0adoPr%$KI^&H0~iHsd`FVJ?*m zII5p^N(u(zskGX}K@HSrs>%fiMy7dl-|ZaitR#T! z*QEGBZyph;-#Z}=Zfus{3sKd+~CBfkmXO*y592Sr9Q`8-h8K-_{^WC_d!G9KfYTF%zh>qj{)Z>L9X#aP+|oafD!7VimOX58|T6KNJ>+KbfH0EYUo~b06fv`!noH*5c+f5=WEJj^Q4f zlYDQMLac(g`Z*(!4BL($yF>gyKruGwM2kPZqMUi)Y~uw%71yoxC!1+dAq3e|F-A)2}9kMNz*f2S-9;dg+R#iV!VE%^|cNAZBMmcO` zoP#vtyf{HO3(s>yS61%ZQ0qVE!GN%<-WT{~_^igy-0*xexSe`le>-?H5kY{8qpW^$ zV)o6hb^PhFpPW33w88zC-;(Yo4_?pN`*@wZO=*Bl`M@k>HK@XKyue{+gcziVoj!7q zB^lQsK(JC;-TC+v){Zz@P#CDS;<2+vn!kazs=yY@V2oM~&!6&tg4t2Ri^~~B4`>h) z#I`JXl@as#Rx!a9T)4x|JsqPVI;k0Qw>yp7Zh%WNJ27^WAbcvmBwarsQqd95KlLfC zo>D;Zp>pcZj}#fD#jvmi2Rp2>uU8qL(hFD99c{U-4W1#FYpA6FcatBGyUzh z{l`c0&Ps$dbOK?pQ^btr+c& zdFz$B#>+l6k&-(I%csAg8A#9Ah1Uc^k5T*W{8B`e2oAF9E>H$O=dg}}!mWTbSl*d5 znkyIM+2v%n4Xim2l!A5Nc$jE1J`ffD`aF(ITGyHF11^dd8pBc4$p@Z&9W90w9N=`| zMWv!8jki@%^pWU;QJ%oAtbeoP(Yb+($d!sWIC)#T*4XVScEMr3k--nwns0-}7^!Nz z(#lFvk>BGI6y3gP5Y#5&aRY*lbe=u3C{?dI30F7W8cG;So&)+F@h2;u@xMEA8z3 zq()G2|11kZK;PSY@UNW-O(dV}X6gr*a{F_LL5`3|0h()=CGANi4&qXMti|o~ z0o$4`{EBglL$xv{=DQW;JwZ5cR%)`7?#}4E*=|J>2rFRH$}AeLWO3lP*&wH)NU$>N z?cn;t>WU1_HPHsYA&dtP5v`L6-y8rUO@E*G)>YI5GAy92f)zcwySc)vq3>iVH79Kw z(DWvFbZ}?A`bbu_prhCKSor}U+BpA+CnfFbnoS4uUdwA7D{gG@a8PvrcWxKby;^Of zMmgOlAUA41^E5IbiBlnzbg6NLB(#j8IZ;x-JJSpeZ3ED{*h7fpi~%?HDFvO-JJw_Abs&W~f`9)%({z1Wxwvgc-V9sPPgchGayk+0OxC)R$^DSN~^q zCVq0ldkO=Y4~A6Mo$HK8?@^iD>Oan3g94!gIhPAjQJvj!akUOn_bi^1XY$Ck`hfjO zj}2de@dRZVOMoQh!v=2&TEaq&0z5r#v)@#?>Zn$9!dyJA$J$EMTDM|G|fW&-=` zSCwwC;ij%(gQsUQ`_{k84n-Y#Vvy+-l94ff?@w;6l?rA@LjJQ?i4Du|f@fHVEt=Nj ztKycU*3yv(j;F7J&wTx63Q_TQct&(4fTck83poW4jP!00`l5c+APyUc1(@eS2Q=6B{F%_ewv~urWDrZTFuA zJ7x(0bg0dTIbR0xxZr<;s+Xi`?&%J+ul2eIrWF2z&n)^?C9mx>1wU`89u5hz(L%e3 zbKh5a8F7&M@LP`E<8OMvp}V4h#m$9ClKP_9LKX<5MdJ{U%-`Rcgx@;=KMXsU{+XGB zvw4(4d}eXHgtb#2V^1L|ZI$+Bjz;UDIk~SKzUZWy9>H+QHexikjN>Y4@$MTD=|cn3 zLOt%?cit>2x2&WN{Mky}Wnl(jE2nj;mS$xZ?E{yVW5rCP`b<~TxkM>Gzu5Otco*Z+ zAFv9x(;MQU!!M!pPi_Nl0TO^+1PXHH4qYb2llLJ;>$ov|J!h}Rc#LR4a@gA8SSf`! z3Lh+ZwgPe91W&wj{LrBAu+*4rjEl6G9$eC0Ulg*I7Fp8`ahIeupBy0a_G*1?Yl4zO z8M-azoHZM6w!S#RTeLKFl=Sio*}@>r!l0IS$bY#0(_we(-A?+T0_;}WMKeFKwc!Q< zqeWJKsH5BkW?o?d=1Qf5ub}1n7G~TX@+8i&)NV)`S*?*ynD%NEA7a4_BqoRxj3=Qa z`xxV&)gt?E?(_;GXb-{AiLvT($OJ;O%`A3;Q>!s#`AhK3Uu=^Vp)UpF#(7f=x~6}Q z{QQjr6^rYeHA`57nxZ#^1#}cC5x3^AcGYR+=aA3bqa2~@?gZ_IdDc9~r1PJubJ!*i ztRFQef9!*`9NO>B)Zv&X(r;^4RqU0^RJEt>nSk9ccYSzc&v8^&jJ_VtMnHzU%dHqD zIAb+H-k7C66q>sDL#iKsey*T^Zr$g+A0}*%78@pQ>0F*j$TV2urc4{Hd15H6$$Tr1 z#(Vrjgv0C(i;nlB+hO{TzWIKlAAIF;R6kXpmNmbHrCo0M0ktu-8Zy`2&#$Ww5WnN& zF|lh6%b&?a9@HiL9RGJH&PoON_mJI$HrJ`z$TGs?LPw)ZeLuKNuDoEULJs>CL0H3W zv{P#ttd?qDiG!cZc&iCu0uIx$X&0QkehlMGOea4YQr)ZW3`qMne&an+(%7+m8>y#& z8e?HbBdeYMHi9%H9BkODLl?W!O9eC;bQXgRYhZZ;v(b0HX)SbQjwCJq|5*Tx1lZzA z>!15Cg&7_A-_2Xnh+9$#Ak|_fcrX|a1~Da;SU7Sgf9-o zbPN-?yU^$y)iN)vG~rV_a>YqTaeAb^352t0pNQA{Y6EF@J16fvntP*_l@2z=N8>?> zP`O^gdJ{MXyf@XSAdQ+(lzN@3eS zRhrgUjzh^IDiU+g>6V6G=hZBHDuVVs$C!Rtj(KO|BZFAlxiJ=Q4so6~r4Hf@#b%?P z;W_PS#uGT(E3j~YAM25G_%T!~TKZEB2_9U0`v!GIZABCOUw07=6aL7?qM$qu!;jITuoHck)((ieeouYb)iYrGE zw4^N)PkC(T`nj5iI=n{trVcfIT_x31qdnx_B#*d_arElAPOw%_+2>?wdT-x{mbxUi zuRWuK@w22eqi(Zy!OqAW{~DVHVD=-1Atacy_SDT|Pqo7{3?M5uVXaf`1GG8nfh}2l zL}@{rfCG7p^>d*{I<_@2;x=&VEhZOglHzs0b5{j|2LD@+n_sNL#68oa&7vb|W@6)A z5Lyqrykw{9L8`L#Ccmuwsb21w0Gp zQ$7NVgL`P<%PtmU7Z+_Tel)_pWqZ`3J3T#_a>3r1a>8}>Xcw6Br~WX`0A$$|oqmW! z2K%=cT_etsLz)1oV4g*z0s_#yIa_S{cnP*P`3@}#Y|$yqfKe-vU!U7}<|%%p`By@2 zE)N8YkVrtt$rHi%)J^^FQejQm!?o>uu6R97i4o>(Q_2v^+3NupafTT_C<2^ zWNP|MX{1JD>8pL zWxO@Cb57ZoSeWp7i&p({g{nT}6+hO;{jJ#UD2{6Sl$2rzJd$GR!U*GgQ61_`FH+7(dECa2hhp4 z9gfjlBLl?jN&c`RZ~r@3b$Xy=<15hs+Tx&h z?X6vY&~emYZ?ZWQP!A?^yBmA_;EZRIbDNl|gWc7#GqXe6Va3~gXzi@wny7~RuCh`M z#YtLThnd=>)2;$0y3w$Qd53Jn%#h+XByn*o>r?amfL@%oz3F``$}rNa8wp7%l;K}& zXe^A>ckJxgeo#jqdGZFN{1Pcd=UYUK`w?V`EzO41_OJwD2F9uE2IX$lS7P@m$Qc_5 z>J=g<8GWyHi_g!M3HCD0_I7eh59gi`E!HI1l$Lh}YzN<^6Mk%MjWW$eUX9eXM?w#R zkGgNRGIcC4wg>^Mu!_TQQ*WcN&jRWdRzoaHoFHWuORTc!@jlm8!S8F=o~CoYe_ei? zgN~tQW-Hol4!wCB(60Dbw~#bAz0|bs1@WSCSEhkltk=_4`rD}Vexn;?BOk@N=YVib zz^hf)>LGEEoUBPTMTWgfE*a|9gl{_xr?R0Z9x3gwq-JQfmvv}_;J;a5WdiZ#cYSB zO2gj~azg~MFOPt~j6ucWCL0IL1-7X5jH|QMqj@c1m%|G@?NF`TcvwV-Swdw>CPMS1 zvB5+lE?l#AFrsVFMAgYm&`OLz*y4NsRiHtA)(@sKbqjAW{{a(bNiP!JY>45*hr)a2 zy(O-7sQA~Z-j%ZAc!C0KyON11D9l{K!5 z*G(y5*;L$oKqMb2qMyqH8MVn~Jb&Q1V>5!^6M#!VOC*}L&BlrYYkrH;=SQ8$AbByh zBAEy+kP(VbI7?)Ml-YnTZk8(zOxu;e9zQ_D0WHhnazitDNFv@(`oiz^ogC?T+mkT? zRHbI*DC%SvGN6G9NW;E(F_8A-F~Dx6o!dFXKuy6t$vxF1css%bKc09k(SS~pvA19C z%h*>GEycWyh$gk1(1%dGx53j7vf=SL1QVf`bxt<9tJ)pE-MhXu#NYPOGS1n0Y<{Cv z9&I*bT;vzpsek$nD)QRBmWyPYLviqgs&ABE?8$pKb{2DhwVoXICITh(FX$9gm##N_U54A&r|9JX-wi=YuQZ_j$hjarc8&ZfR! zI8ct!X*(R=wcySGFBm3J=y@p-dD2L3(O@!)>$FUGsdOUX!zb^tzbQQet0B zuLPO}DzA+?$+~{f#1J2$a(>{BmgsYN=>Fx7jl5UR3Y;pVb6a(SgA|}FIG$P#{Y^6Z z3{ACq><~O75!>21kGKvy#sSaTQI-rlfLK648;+B6m>i*;HmCzfbIkhQ5hH!Va0J%} z^|^pe_ohdZRBZCjwb*~jch1I4xq5@hMlc4>g7CK&UPqr8&}|Y$6f-FXpOtk3(Hbr) zWnVQ122je{PD}8uftq6itzm)6c2>+tcW$ox{ArQT9zzlKmK|eSpU9vNtVd#+vqLLt zgBOLnvOz;Ge&CF5;D%V{G5jS%vZMH`D-A$=P+KthpJyfi^wQ{!^w$+{Q6JlVGVIg= zXIhu7();Bo3V^fE=zs4@9|f7OpQJkpsOt}VI#J;Qg%_@A>kfKb6{yYk_GyR1t;2$9 zv{#pX2o!*@^k-**gW#^4_KnE;jBX(aWYeD2-MmRl+Q>4YkYjn}>?!p!;h+mTkDG^!mvTPoRq3-1iax-dDd- ztmEfg127V0e8OwnckTH+*}fOjD&t(FEoCN;$Zd1^YPJ;<4)NsLuoUpL*|2s}Yo9an9ciJr1@M*S{|sh~A8DI6&Q%$K2`|Xko)wqf zs@Jj+IHm=_XRRj!k(Ua(pEZJfXFtdO2<21Z;`P|r2jMQ4g(6r zQzFLj3V3z-N`DdQ$)O!c-1>YQGu519;Tn&FD2y=9CteB25i8x7G4I z#ypsdchK{yj$fVtt@rp}Wm)}}5<()w=5us1JPMAeXt z7zUVO0f=#2^ju-7Xx(XZmB#Qlat%IAcozk9Izf@hZgvN8^;8NVi+9K``%A*bNCd#f zNA2%y^VJpm{)u~c^-xYP;A3q^tVI~CMw~QG5VUI5Px7}fAHiKII;~lz_`eh$G*e$> zU<$MCchlC7g8n6WSA*F!uZp22)$RX$4^WMPkmo{Mq)e>m1he&~i`K)8!`{_JRCa0{Tp>ifnc%PnO+Iy?46dkQS#r>*wXKwWpV6LX>irT9Dz z(J2>ZR}PHjNAtlGTe7nCG*3=yI)8Z@*t0CRM4wlx(mrjz%>dbQdXfK#RAHn@wmrf| z^4$|oK0+>OJ8bRw(q3dhn+lK`JXO_oYZ_AcoC%gK8{Rn|uLxO|I%>t9cQIXi(|Xm0l27kACGs$`8>>Sl7h zgs=DBHFQC|pWYd^#O(@2yT(VijUSJa&1%wnaEUraz`Rz*mSHKHRERU~$-+ueOWm;g zUhF9)0w1a7xvV2<`MZYY8yY~I#fF83?3M{4IK@JNAb09z*N!q^R0V3#4)Km3d%p`X z>lwnO5N$w0^k0mAM|_I^QZ3KW{N8^j76Wz_V~7_B1eJd1ZM2>#1Ohy_&5X;y~Ldq@=w_-5b2E9!w&l zy$4*CC%zA4rxG6?2-=2PjJ?sov0?t#&a`aK0qX(nl@%xZL zRMA5RJhz2jXLm%!`sNY4ummrNM8(cGys)-qxObHhU6YP0nr?)D1yJIPZg=kR@;Qk1 zzGBTLxvuxc8`}T@QvKEDYvCvGLsgBF`7PeBU6A~ zt$;STJ61tAvDUKDO`oZ*eHB_t=Ooc?Y^n09Y4unM}xH~8rGYUi}r z+Q048R+%#`v6g+&&7L2zg1AN|w17Dg=lmMhLk@bZT57xFgjwV^Ui6 zw9G8JBW+T0*Y;h1*sldE+#MmTyw1d40G%pSo#U+vXsy5F2?u5)X)jt5qc~B*)jk;i zxl2zpbqFxLAx%V`Nen6^mi>0+9$4S50Al-49HVEVulNcHbOLFWn*u^}^**Cp$b5lF z>F778xcM%~bp-F&aEV=c{dMpU*b=AQM0#u!K`^}F6jfdaCBVek5x}ptwk+2G{d%`% zB=-$wbjH0pOQRe0#ppHz5lc+eV3tS+0O=`aR(eLB5slCEJKVpOdRUBeZZKsfE?ZOS za>ngn6&u6n2)7|J^)%J8e;SRCiM8Im6{jfQCg9TcIdY-!JObX3-*yVBApoi4cndFF57NxI$DB2Re@r`s0nRU zQoSb+K;_!fnveOYgRZi#Wj3uqIf01w$iLH*CKSpSE<)`wSC08=Dm^CDpmG5M zxJi#$nMgnBnRDx__e1$ch>~yWHhQNW4wc)%w+zNPLr$GoHOlANf8rkJ|N72t9s7X$ zWtjwO2W8Afj<3G>DX`}WMUC@jwyN!fI2jjFCK)*RWABBoFb3w9haoBv>cgiA|1R+o z8MvZU5kGn2_4i%bM{8zBSVb^NU+D#t4Ay(u4_IYp;`cT(EJWCz?r#(i{k)MU%Ex!U zi|vNZZdY6W@9`a21+`Ujj&(rc!hvd~j>DVg#ybvoG{!kA^L0>%t&LiUva_m)5n`oMoR=lRS=l3Q7XK~mZ;qpnH+B_@7q$EZ8dXcuk(da!WdWNLAIL1_ z%N0CDzR6vi0sac@Rr5&Nq+$R3C{xP8irG?7>T9@BsWRfezIkA96c6^@Vw=1b81t4? zwkn8$z0LRdKu;;eW{`RHMcZE03&dR4vc;S_i?-rrYXLW_z8QZc6mpDxKFp|r1zQjgQ|E+4{j0Q-88GN89xs&C4nO$MiDOt zFs-Z)(zk1X6#KT#o&}&QU$m0nUCD5AaPn!*3*lJ0#s2J}65l#f0?scnv5 zY+t5}7@@i#P=&`{RMDBFMd=f1Deb++T6SAHyprp?9{t}@8UvG%-FndwclBeE;cWH5 z^sosVj^DH;z1ulK4q&|Fpv|L**ur63#Z|SuQPWkz2aLAYPnB{bBn>ubHBV?>MV}E_(Ul1slDdMc`N@G zf%%%xU7&iCl0*m$xSb?}yP`~1^~pEPp00V&5Lb&6R!gla z+Zd)skuEf$>c9MWYe#k}Got)vQy;(zo@KI{pe9U+5y73&2@4Asj<~VEYT#NLe0HK5 zH;NnJ68NA5s8_u2dpHlIP5NvkMz}YUGaPZrYY6d3X(_#_e|$SwJaxjIn&fqF^UhRO zf6ZcPYl$h0+5ROjXo(&Lz!Jp?rTwFz?gNf1#wtpusaP%eT)^J0kuI&ds9;qB6UN6U z_daMbbrh{7EYCVoDBpRM!sPM6p(*^W49Q;3@W(-51o%3msv!7!CJQ04e=&OjacJKt z{@#+OAWX4Y&cg*L{Pjy#`NbCBBdbowqxhtD?o`Pg$GdwS>`V?ss2g1L7hr|L)z~sO z$hj&UOR3XTiKu@{N{f;r_=QeA+U=VxLSUJC?8$;SO53l9aLKK4cmrp0$K5TqcRq-f zz6nNVt-FzhWr)Q}vcv}T`L*d`y`h)o{jp(XE9s%#wvxPA=rOXe^6tCvY8 z+LFZvJy*Q~L;_$07kNpy`X<;~ka+7pMhs079Z*tMt+HpS&bm$+Wa7OQB z=B}I4ibjj{L9r}DgQ8^t0%G{V{sYS%><4s+bnKw$ZV!L_41BJINXs(cy;wh*jLV(2 z#(w%5v^533ueezP{zN=c~E)>&hCJiOlzW&ZIv;g_=Jb+znr<8jk1xfFpKLdHGnUVw09vP$w=!w}Ib(-NyQo9? z4UI9-m~9|r-P0EXw0=AzYDqTrhgRf2`!HydU14&csn)8H9^%^b8(D77`%p+#PfnGb z)l(hTU*J|x`QjQtaeqB$I^rP5_2bh@n`l}|ZnNen5 zjy3Oz?E~f3G3q!4=mrKWab&arxbORpw;T_19rCe??S=tT=-YPg!PMMatf|+VG~HL6 zO)nxp^3*gqh^klHKt12C82Y!a=Gd{Q&p3M~7~Yb71-eC08!|Xq5j1c{Zh{gMcu$dG zR?5Vq@LBFJ_PBvBr$CTEv@t%%QSoE&=UkI7e*%1c_89|+SsdT<3aHLM4u8KM+DYL{ zDRsDKe95a}+dVP-#40Sq51#eQA&CQSjob&gv$=wAIuV% zktR*^;0q=WK&WnTM1+%%!4R+*BUKs12NvRGHfc&qZ5U}tkEJF;^D}C)lM<5|{1&Sy zLLeG7x05-pO#Jd;2|M^L@1T=UrGKb#!i#qg;qm?IagQGw`kT=?(k`(Vs)IZYmlsb- zTKtaL#G6G&Vi$zuK+K)aFJxs^j%GodYzGI%;v8i84JQ1BJ45V5TH&4jAAaeIbEtX` zsPKb;CZ4Dp&=wFs8A_P7vfD9*KjkzS)eD0&iX89NbWUQewx>k_1H@Me1tdiQFkez7 z!H>8n?(mA5F`1@#rV+eUgTo4UkHD@K#Y1ce78q-1WK}Nw!X3WPFLe#M{Ec2{pGzbA z?HOp!+~LhYzwCdSabw?nvP7KCw%AcN$~)lb?hUzFl)9l3uWt&?MiDtqIN|F|RHC2~!E zD1#Mv{V|^k;Q76XhRK;$2!vb#w`~lIO4ph06bRn;Ub!w zWaCi->LNGz9+%^+=wz<4A zr{S~P;@f;RPcJzyA*aKh98Fm+HPs$_GiBqkS;K{2MXQ*GJqb^?6nb00u1WP-vxsfX zw)-@k!JE$Lx|1&IABhQ;nbrPM*W1gC8?+Hf?jDR0pP&}5d%CNJBw~wBBf3W^u&e1gw7~@_BojI z$K*gw>TAQ7=5s#c$xM8zp>Qo-l}n@CnpdCtd|%u@xiD;K3cWc^Y>kONx?jop zk~YNS0_WmX>t=Umolt(o?FIZhpxFF$D#V`^`#hf~69g_sF{f_^n40=(jyJ;l>O&6y zrVb*fm5b9D-08eA0S_x5c3Pz0C`1T?W#xH`3Wa@1oEHJg-L&e;1o*$oHfb#L%U!5= zk@Az0i=aX*5uYUMx24O9_O>f+=PG_sse={!r6DchxV*8N>#ekHvdfLS)=+tpEGfz* zcmKB7X12LS_lw_~Rn-ZY>NYIkZWXJcsIQ|ijc9u&;D+HOfBO>}nEimF>htRJsO= zD+EFsd6NF^M^(qcT=0bXqh*BV;OU9H@_WLq=b*OB1F49%6KA6i8bTq-8!AW5#lz-U zq&+S%peclNDdt-&c`Qd#gw5Arz`kV=neeRB%fyPE)u7 z!B2Y~p2ppK!@(3A^Adr@w3>u|S92Ub#BJtNCcC$8VR$u%eWQpqHWHU@}>=Q$x39% zP&b56(%^T*S6d-N{5Z!zcUIEs7c#W^ZT&m!%=TD8xqU5Nx~`>}S3l^2jsJFX&Qq`d z*?ksaPQ9{wHLJD1+4gTG1Fu{&5NZE@x1}!3T}q^Tz5^0Pyk*P16t>V9+%z+wZGh~c zlo4Y85Np9Hu?udSrWv7>A;rcGQVAxoAv3cozoJr?C4!hY<1ObK_rON8S3v7l2enZk z6MgMtkAIG2dHNx8j+713ie+G~6L-Iar$M~<^bmMa*>VYI#x=$TJC--o&jzpAl{E%z zY{#vl{NEd%I*~v8&b`Y7KH|P)O+01rUpXQA!rBITQrd&yeV+U+Hl`_RL}#sHA(7${ zW7%_#m=`Q+B7WLCYxnedPp870C$ks#9rm5k!7;H0MB>ohvisjxXrSWdOq}?b?z9Yw zOk^3@@S>GP9$ZQH7$Ae5cUrVPyzu9R&3`*f=WU8yLuOfq92o`-Nq?YB`r9A~j3uo! z7;FHAltX?^1Da!FhERYHDG!V1X@Rp%y}CReGYn}MFC&A(nL50dS7TwW@aXzE_VIRD zU`$C9(hVmSM;@(}K+d5^aJi@FzW2b$pUz%#>T-7XEVAtq_h#Mw8sC2}e|PEARn^Of z@|4srx=&j7<8e+yGOma(``d25TGoAZ%pE*1Y>LQcQ;UJVB3UU#3+(#xO5wE_3P6(IE8Qwv&kEWapkSk7hOH7?mn&+gJLTL1cH8P=?frKjYLYG0S8i>r<-C5Es~q9R z?@5Z%fu*J%J2=h1NcdClZ$V(+QX7Kft`+x~*z1aT{$h_v>U5p*;w8oVPLP`Ex1|ro zv^Ih!Ij^yvf&;yMeicY3kl|wX^s8geqzp{y?gAm8*}Yfo{n3Qb&Vo+J(;yM3@dVQV zG}Y+-sBO3Qj)37tB+z~OLRP;;FuEK2f#T2C6;;wl|CVqEitU=6+zIqH>1^#>P>r*) zhT8i2_Z>W(!rd37x_6eImB6q9Whi~T=!4r4-f!=fnuBe~n0BUj2<1hZC>OKE0=PKg zaNYX4swg(-*tXe}gvd)BT{tj63?oLI%?CAajB=u_DPH|nsZ+H@&*GYPZ@Y=GSsYOI zU{5JuwZ6jZncbd$rGn;}dyL~c2#>_n`aWK28AgDCihqA{QUbgJde+nQuKIb0*H&k4 z!RlLP2d@0rTb-4`N{*>d`?A+GT$}FC&lvXb_#M35%N2H$q(IWq8ZDn(uX~@C`X8^I zUVD49oij7uFIR{Jxnj<$@L;3hjxJu|NGX~yT$LMIV#?r&KaX4YYtZ}A<*gAsEfvu? zCzBPmKjhUuPf0blpUltoFkF9cIvt+LK=2M4m--%_#OD_0>FOYtYc4iV<9OzKHp^`n zhbQ?awe$c{6JcWvb7KQR)A(i`yl^)E!sldLWpDoFOUh^{1*uNYh7+FDzn-Sk>BQZ) zW(^_PY;oNW{r1L)ug@5K2x)BWeEvkb?*lj4Tb!rXji$t5P4w99V)j|PAl$#X^xwU; zyW)X2cYZU$&=|(kTpOabTl&_lFdXUs-d$3pJHzh+^D;%sn~-5Qoe5Vz^K&=x4w7eu z#>kh<=4qZFdC^*papETGX}>UG@>L z3j`c@aisO&Ve8EfJ>a;wm=ukrWdi#>Xrtc5HV2AZ4>^h_7n+>b*0Dx>P6SNZ(P_Hp zf+1tkdv|-KX~F;fT$eLGHuIPL`;k^8OKbicVf*nsb3KSJ%=q}+jV~@I#F{)VT7317 zLr=4W-Sh z?LWfQ{0$!50db}NGL5uUsZr+60R!+2_C6m`%4x^NUi3sWO#84_Cbo0+{Sm`W?x}kF+z44Fo1s{0lDmtjgwA1v5vp+igzJ`!);b z)NVqF>8JiY-c){TCvA}nXIE|AGrQZ&yx99r2hRQj^GlHHzip@Pr#nVc-GDL48D_Jk z8%%uce%Sgi*ZcGz5KoORrx%{*$NO<_v6uGPU#>DN3Hxov?rrb-Mj;nqCdQZFMPgoD zt`jcwmS1hb>wShtl$_Q64o=vq{dLnqXWR8k-L3Syq%JR{ zB8{#l(H~-7eC_qW?rmZ{wZFOWkMh54x*_*micujA@z}l=z5Z%+DSF*ybXxJUZ9%tZ zLml(~czVmQxSD8bG(my|_uvdJ!3MYBFt`MFcY*{RAV3K2?ry=|A-F?uf(IMi2@ZF^ z=bZ08&-@zg>0N8BT219^5=XPUF2E@)F z!=Egu`1HW`%J(w40mYq=e*b14UHZ<${~r5gXN4k{g|+KG!KlC5?+9S|^HW-@CqN}n z@jGQ!erg7ayy#1_=&uVKitf95qe1`YBhlv>trerE`Jp%8LVT=%@RuYaa??fmpV|}R z|C({Pvf+uVcLdyFtn%0G#-F~|OaCV-KbVm(q5u72&L<6EbDJFLmgw_tcUaDA8HM-t zqw=Kp9sTRm%96f6#kVbrrw8Tjp)M%Jx6RFcxYtL~`-In=PF~-58vZjbid(+Rs>j3j zl9<-tTyHGjn0~>gd>c-K93LOqAFrEGS!l5Br^|J6Dq3UtXwiL^UO8UKEeHNEkb!`r zg7Ee&sp*^dmhW71gnc!%v=)7LvWQb2{mv`O+r8V`1VHU|qZIYx7;X8~AR!^4RsV~w z?v%5qZ9z%7Kp6jH$8FQAHVeVnbgIWHH{2NR9=c&GGWq$X2R+WPSi5dE*0-#j*4Wh-VvuK@n#8Ln zDq<%zV#R-><_ij?@(>X-o%_6Q!H6jsIaS6_+M+Yu5n=Jth6FgUY z)7UBKCF#c9L;cg!ltG6?$1=N~hX8y6)|Z!SzV4@@m;fN1MdV!0jA>zYMc@tAGr8*F z&9riDKTW+pr||J}OH$>ux*ogIz?7mcoVqT&y8fZ1cy9G_WczIa$H-)TCJFwAtKRoC zLzrV;xw?5z$d*83`G$+pTabQ34HbB^GB$m|iOxFIDfx(tIfE$% zYtw5o`Y7$j06Hb*_RnbCiims(2gIvJ#Vg`eqCL#X7dv!Idf7VuvIo`4(I1q61SsKE z9i6v#-@87YIz5pRQly!?wbYnBx)hE4=IPOR13a;L`!Yc2T!@|b^G1^%^?1^q^uzeo zK}^o>#g+PwD>>n$l6`i@S$hU!sC%txtv1Uo|LZG*SlLdoI;$;jcopTDo72o%LpAg< zUAIF0)?-vwtmnj#Nu3QVb^l$-(9vvg6J1mDTpYC`=r*4jYpW;X?RzT(c;SBmcJ%4H z@N|2q#+=NlqjIb8|ERk*QOTK62v*YdSS_9zS;=~O8JK%-8TRTEQ9Z(Oc5Ne?MOy&2 z5)5VZSoC%9WN2K$uGB;zi(zinn-`_bxM;cFckX4kbSw+hOc!6bvNpDITTH_(fc~8& zynB7QLv&=VfG@sW8>q*9TBsK3tA-xnz)Rt#X_Pmo8U6g?V43F97<|?)@dFz z*BGkrxv^6!PVZKAS+-j-io}2DyW8n8B2F0!^fi)>#Wnu4dZY@f=uLEplt zZ5u(PLxlzpUG2n2pzoVyL(1p-t#XE5uIVm~h-3xV3=rgA&nwRr69uAyjDzn0T+f#U zxu8!Y36U81yal^Fe%*#PGuH3=YsHaEdEwVzHVKk!BU*zw$LzSbJjXKq%(R^gjjbuW z3$mIX)D!M^QE#L_)h6!ZDravU8F{6{viY02Z|xh>S{n!F(=3vc%QN|S#_zedGx<3n zgC5SLBlol0Pg^i@*cvA6eq^d@rnKps!Ln)}s6=|?l$yy_5KEVZK>ikyg}sbeKHzlZ zd;Q!l?{gmO$=c$a4`n9Agj(Uy`L$t8WoWiIMFTXUYfP^v6ZI)=t{U7wlL`9r4XO2} z4nx7xyLw@~5hFSE2-UNYf%v>XK#4kS9F>$R%|;h{Y=)yNIet2?H(E9mJ#nF;YBB0l z?NIcIJ=Z*ebDf=W#IHi6WM)Obe+%e_{vOFRszT5Ga$T4ALuXhd@8tQT72mr!SOzmd zh*)+7dWY2Unv3Q;uLr^Y4<}l8>u6^j-5MrtrN7vqFV23Cc2k!()k2-L@5xB^(&S6L zZYqh_p|1oNALrj94r)U!I(w82J4bizBJj|NMIOibvs>LPhnfb&lijhL&D@i6I=rLo zcvFbUK3=ZUPhDKlE1fR=yW63pFa8m=aV+fEOQWivp|b~setnIag?Z^OEzwt+66MI_ z^9o4f)_9mIIlu5E$=PZL%ujgA#G$iiL-Z9xt2pIuYsz59$bb7PL!9zgV_r@QFhRtC>3wMHnM^n&o5S1yZ8i(I?K8`G zyA<>EoI{(q(JTZUaA^2*dX0S^VD( z;r9?{{`UNm;LkWqVIe*biG=`luaVqE3bef1$X_Y(N9a=KMx11*-&Z#zbnT+>0&C-_ z`y@P2wRa&214&HIna2gaQ!-B7P3xN*&plU9*EdHjl?%uP-^UgSRUub@tfn}4I+Aeq zA3qlKA-d>bR)Up9o#SIfy<9>(@ug6vy6@fs^u#D%pc`W%c26z1yA+)Efn-yw8)_p{ z)VZA?ktxhS>Z7%%YI{rackfBy^+MUde`>v>rx!Ax8o0O|iJrp8!{2f+gg7{R@OnQb zx;b%csZ-4}a`&;(J7Z)TXM5%66MCXcWHesnmrLxw)exJm$3BnyQ?#>-Lp@&Yaxj3K zni~Dx#qLXR&dc2&2Ub=hl8@{nYT%Rua+AhrJV~+sC_TG5y|>#1wE3P^J8A{kUv36D zMSWb;Gp>%zp@c=;5S#cV4X(^=gA)y5@W!I`J0a%_zSqkf(V^cC)81h-&?6tGb3*^y z56uK)G+|pibL>WbryNRTBuyf!R5yb{*mA(I zX)P(^DgU9O1!59|0q(*@B<12juxw$?fs(IMVJ@*9C!-7rzCi%s#FzlmGkKc1e^w2ONUoqRXJbPtEQtLQpNXJp)}4N9NlO4_pNt z8;{Y~6#tGoW5dN$uHHV=AneqwldWsL5hI$l50=i|cPWIlE^H}xJ)=5x3kQvRma-RX zI&pzhVZDFC$l#LSK!RDak2YK4~kesEQ=*6zlQbsk^|F zJW;0Blv8v4l+hqnk1%ar{i;i=jThpSYS#FE)cn+uTCr^3hxdIF_gQcYrfH%NM=3g~ zM({G?M6NEjp;N*>*#T;fG6DuvDXmtnww3qOQ&pEK8(vWvu6F$=q52#{qqNT-KoLr zdX;9k7N-j~V;cgX8`8L5JiorM7+jW|da>62Z;Cy<)z3B9$^Vu0u<{Xb>(b+-f|gv4^LX*NgI}3@50G%&tTc7=C~yyWO?s1A`?o8Ple$*Wx!?MnvKb(6-NaPP*hl z5?ik#X}65Uco5>Biim3iQpT|Fl*qUXqv*IjO};Z{#}1p<`XP~4k&C?G{`nh$Mrof# z2ZP1GexqBmR9_0gi?<(PXR={#=0orO$FPj}Hr?=gGzI%zgN? z&Mz}~@233!;TrmxrQd{yDP<6`a)_wWsG>49_ZKMpKe5DQ<>Zq|G8AzH*nXJ$%81W} z=g1W^WhopU{N8+ZQs+$QmK~CsrUx6n#;Hd;%B7mc#x26bJPyLINGj{_NL%Q|nQ`SU zm}Vh}C^AZW*mCt*c2ssQ8FG!+%x}vUP<2DJLS5s|a-dKD8AZfT8Ub4x*PE?k=h+lH z`Sxh6Xig)H!DmuiiF}OK3G&0VHI-uWt=>e1dcFDu_hrrfGjxgV*QeSvuks%#uXNV> z!o-&5cwKCuW$5j2)s0JAYuEYFO_EaA;Lk>myt=dF*G|XrZl^Pf0a7!N6bOaJ=Lj^2 zAy;tIi6%K5?O8`v$WUb6SfHqWo>gKS{Tb48XB`%|g22LvxDBEml!5q=^u0rSk4X?2 z>bwY#FUzQyo{A;Q7>aArpJebN4XKaXhtk>JI`I0YTz7svTj&~h{t#128R@b1?`6+s z3smrnXNPGztfg&@*>>BzVHrEYEC~9d4!dtOf`(gt%sNH3k@igQY8~Bp?puN0hMd*3 zs7Wz4GKxoI5IP+Rrb8z;=AWLc%(OY|)Z_#iq0L4FMc_)x{6DBDfkYdw&IYaXS`_Rp zHI2G--jAr92^?h|?ke@#EWY0dD=x@dZ&pu!enX`DEQUH@n=+n>B-~Th0Z6H(X~v!0 z7$}2C@+Dm=g8L%cv|8-TX7z`b6*^6WC;$G!flZ@w#AyoIdJ+Q9Mb^dJ;ppn9zp6gE z6JUg<9wGC^B?z=Y>LZYzTp-1l^4pKv_m}0O#Y}R2+imwF%tf@*(Ef4GdQ1Bx{j!Cyr>1FU4ENaSYj zkKzTYu}SNw5fsM#a!RqjH+s$41>0=>h&&8~qI$hHb(tabGC)ob<(tgbQ>SVgbdMyh z`P+Faur_7Gjv%Bm)H{B|KiPBxpt!+`hCw~%~!vn6wa>YG@v6kq1kg&aLRW2C9 z2xiw9Rb?@6ZPY%sg(THF&S)^P+D7s8WihZ6f$fs${O>)gFMG$dhAlb`VruIN!RfY* z15tYAVBMao7bBTs%vzu3X=uam1q^BzoftOXJ=K>#)zEl0zrAU)&+k(fZG~R9EME4j zjkY?O(eAPjcp=1jmAZE7m5pb2@r&!(9G_`Ym=VMxuds317-{FdBW^`9c~u?rk2D=9 zYB%Adj4PHbU24Qc5;kRn7n*+N0STUhw5$}&rEfq=6T157UF&J2tTdfwPoO_xsy7R{ z&aOlevQc{{4UN+sD7;ZoZ-QIM%O|%PRF4+9q%kKGdwj#hg9$SDNovcCpw~oz#wgv8 ztY2&8%y1MsHx#&*DoSbUIEgKM+jBHe{m)J8TuiaVPywVwbFVNCBhP>xa53L0^$Mfb z>74R-xs4AzjHP^JZ#G;_Bt3n^ND7?4dFRyWAE69A1_wJZ>cbbY7`=|p&K){*JwG?| z%q|w9+>${i$ZBXzx)A^<3Dq(h+MqW|XPiBs3%}es8SX{hT805Tm#BimxqssBHh1Wn zSycLk{9dwtr=MoHMd9b21{96^if&^37H6^q$vB#DQ!0r;4;`KAg2d%7`-gJv)(CRc z0Qh$0l_y=Gg<_NP|L_Nlfi4|00!p{nsn_>3L;;Po-2BVOh@wr>cNNM;^aZi9KXth( zIM%weAV0PrPr^Cac$jPJ^E!SR`WYmn6npG%e%z;gIbpc6eQ|yvZP+P99kHPqSGwM~ zS)0e&WAGkKopVYb45bDQ3v?2?VvfqkZSx2C$S%_J%dn?mui6%^EXYw`kPfivr|M=F3)!jiUM+32z@OX5TiIb-5%tD?!d zxzM-Dz)VidDV22I+hORw9-zN3dELRy6yoW)_o$@YxonhrIXqJ_Gokx`YXOX4D;xf3 zQ?BPt_el0!l*F7!;TaNk8#oVJEIrLRwD z|B2MC)(-#v4T&6Haj1(fqw{0~-NrK$9XMZq&Nr#5#QfgGv5)fOsqfj{mzr581}};{ zQZ!rR&e2qoh}rnW6~}scGVakyi0aoBspDkj1@DG$g0iTud&oD$V%zmjgO0Q{k2;+9!{6zMO@I`E9K+6 zXW-*ze9@au-LE`netbihx>+=lvDsrwvSF?zL!NsxHX>ISGTPc@mkC*%u zfs;37yzrxq3uKFSw$RxB=(E;F+TX#-&ka9DYH^B8lP#Hd?2P=v{hv2{vw;px@TE%E z?&36wU-}2?(`AZ?C6l7N`^Tc(b!2V*vdi@(uf60^{jRQIT*7DvO-ty`9Ffsuusi^| zr#@wo&C6??quqBjsG>(4{35@C>v5r5BkDlfu1DT{ed_L>xI8|Tu#slu?kXR)kF=P< zkOyi`%=s_Z1hT1b!a72AF~}8b^g(-EAc{$ZcHeJIk~(b>3%?`t66+Kt7qHEDdgMUk z0)b%)PFA3R&KMStymU3D>J_<-X9kc5qcP{o<9>iIyPi%fWF%b!F?!9q>Q8$JC2R8M@R+& zjEg$d)XHe;Na8Pf>yqZJLHOE?Oax4uEA8@f0-Jr4j1+WRW`E1YJ{>quW|K-W;}Y9+6w^$e zuqg{NTCMea8WY2xr);!LQutlbzU+$n0CClvm;xaBseI#wR4!k|yTB#yUXPLXPh-EaWY zGjN)`M1J0E!o~OuG48IAR$ua^Ddde~%dI2IEM9aqU2wb5^c5szsC zD5o_*+88+RgnA^URrXDDuu|u2n2pI;3)y|2fIhn0=Y=f&B$iF|mLcbUr&Y1u?afe} zpiqRPmAgsS;zsL8(t(BU3G&p};k%E)9o<(tIk$r3pS@+yTuHY(8(df38xEzCIY`!% zG%wthpLIx+(*CEy@23uB90rlZ8B<6R4QSZ0CeH9hACsC{4)NTtX3f7RV;nKp$GxdH zTVbttW{*3HHbbZv{Fkvdnt`9iGhyLDUcW61o%&Nd6~%M;oMn+$gtx=<^wYRL3Ls)n zJQ6SBlk_Q9QA;g(C|)1!cHj9wour8Uf@KT)ulO}bm#0qswnu!AzQgEH&eu{;fdV}{ z9ZL_Zefut)pEElG)y$DK@t)2987E0MV#@bW2oPQXv%}c{X|dDe{s>Yjmr3Im*>-9@ zBrYPsW7e?k%$l`^wzEv@gRb_+Xp~l~Kl@h>LfP!s8WGj0)GEs|k;< zPCB*lPOKzh{s<&RrK~<;X749vv1-DrT8?~qld;QEhy3vx;c50TS^^ucnbGH{C+y`n zJbs#&8q@v;G+ar|FBK6;{KpaSdiV?RGcBvF0|g9!0SH0AI0PK=YH2g`{-;+0c0=gG z;OffP!muB3i8KAq;#dR!iIlrhHh$*`m_S04BpRRzGX*r&>tm*9kPQ+CK-YLJwNMH? z<#Vx%A;$Ii?1J5s2iu^zjJLs=Q`ZytOpQFM_D})nRGy~O6`+Iz#Eu}D8F(2s6{*f- zi7mcqFB$w5qVJfRB;zbzIlXs+>B!OC5)Hv~POPajggs2)D^XD7;Y+?xtQ()K#+9!1 zl12%@3UtS+?aWp@7!2Bn!H5E*ntshw_vL}+x)b#D~|5ySzC@l5;SF02&0Nt#^B^pD@>ijq7Qdz99T6C#;j)JbhS&eEl}*l{*6IR z$_TK+t1Q^Y-%d;zV^UqI-6a z3JjPNI%-Jhghq4g0Ox-%-GvZ}ZvL0JGfB-n*{7CdEXG_vCtbF@{5m8*$a&O`8=&Y-!{A`sb=SmJo zYS1Gs%cw-tX+4b2;>3>i{?v*?ie~DbB=GJU?#{nDeaO(DD4y{{{Eu zNVFqrrHqD13gu{*ju*CY4#h3ok(G;QNY*-fddcY?_J5pygdR`hW~P3~*BIXN_@1ZB zWxTh*1cbpH$=m7 zW_YlNsjGruX^Gv^T$_CdQov zrV8Eq?hX3nrbZZLolsM^uvx@gwe9nTS$_RpFcjooL! zSGppG46p=4-^rlHOHSK|RA{9GCWf|tRXVH_wkZ(r&9(WTkau-7>@Y+m%@Jk!ZGr5S z6#;PlZmU?noa~{hIXaMh=MWxhC)hY(?m7TY>9a5g$0t1 zKk2(cc4!&Xn!0u$D!);N@^({+g9Gf1&p>04bz*%OxpzmkAW~pPvH6kEUQKU}Kanu23S(Hfvr8!(PNo5ov0v zk)iYj*coS=2N>`Z69_P1GD?nS!0H~(Be2_3!wUIO8@Au3k|<qVe@{(kf)t=DMnp zZa);goh)Wa%6I8>WF7((Y*tfOiWT3yH~D-V+1fX2G0u-1-?JRPMy)lk z6;~sghzr`EGF{3t3KU;wxndLuHnp$tFOoReHdENa%7d|nqph1Y|2($`<9Qq}I@9pW zs-w)Xj3fWJ5;y$tX3kx(?;{m_SU!24DCBPwe3){C zu?VyVX?D~B$^Z24psz-+)>~KBuf{(mbiCU=9qH2TN8tdu408a9`Rt#F!Ou$LTIHw} zDVb}c3FIHXt`jq#;M97*&go2pjELnxp#WiVX$_iWdvJ~5iGNUo|V=Ak)?U{9v zWXBajGm2)CZ4D2Ow49dbLoSyAXYIWbkv|$q$Hlt0`y238+fO!5X?6Fbi30bkOnWf` z%!isxV?tV}sBI+ae`?tiiuMPQZ5N+B4f;dpnzA+yeC*p>*G?Wg7x^PrUe#B@q4<`%MBNwVsd0EB`Hb?LDB3sZfll}W*ymd@&T4K zeefmz$@)F1|MpN4je3*QkAEvKFo-lVzFdH_sOk z_U?dIBHNf|cIA%}_e{lg+8s5bf+Zp>B7P(UE3ZDQ1Jt6On8_-e2?DD|B`OV!3xk^T zDTcW6VXm*iO?#9U<@{N22x~M8dqT5x8g4}`kac|7cI5x~KVbUS+8g0ID%d-L@wgNR z#O6Yo;)-oL*`tLjC2#w2i{|=*6F|mH&Hfw3&$-|3|MiqLG!b&*Oybj)T*il}q@Gqq zT14h13sN&_Rw&Y#>n?hN%{qp><$!UL*J$V}yNgoSlOARl$-0|mx+7qIE)-GOPxSlW zAJ%?|B%?c(cTnV4;7d-3wD4{(ePMVf>}<_cr1LLk#eCH%Fi zPbl8j%T3s<%;YubsALkoA%=(=v5t`628guN&ROo8JVv=yzO|ZJf<6B&jRA_)rmGBo zFM4%Z(x)$+R_i}RkH4Bpi;$W*jP(={WR$t5qZw!s1)Vo04unR2AF+2zIgaC;)_U#* z*fa~XdfDKDVja#$JX#>^a+&@Vi4}nu+#b`-DSEjLQNWGxm&Vv|;nBZ5_S-&{a^$O3 zTQe(OfAf_zp80_pX`j{ft?|gCZ4>Vo@w>mX!g*z&AGGMQwz;&a`rDm zx}sHocE_M6)++x!Dkfw0M#|o!mPENR*;m^*9ipNvX`am@Ho(!bm?Aup56I8D9`Xfe zV`ol|bzO+#|GLPOw3)}P&I^&MpwwtPB3JCBn<>8B?CZs*`&_e`dO^2cLu{~olKeS6 zdl{alO;9a@ndg1gjYMl+;}1#~ok|NG2H3PNrQ~h2lwAM_KSn`=myV*qy zxP1R2>f#cNT?eG*Wugm2iLNE^>d9_unrpys!<{CG=y%(O)bUr-44227*P4kr1TFX=o~W zgG9V>qWHLpDHJg@Z=g2MSJu`pmHO7qNeCoyiPMAq|kcb;EJwZ;61J zu&vQMDxpH6Ws5G0-W1otl?-8a1t-&;!j~tQY!sr8igYb1@6gn$RUm}8{`x8NENo*( zmtK^t^h_#*qQl70LN_|P@$a&vB*AD6CGudNdzQ}oK&)F?NTKgS2|=?p?r#!v!V`=_ zNDfQTyyLVqTUUZe@cj;awvSsjJ%!%NE^XF3G7q*(+o38mmA5rht22}JJLSq#>>NuC z5quFvT7BgN46H3*D#k~q1+okNQCu>8Lyr(1>&pJx-$cxkT(z$5voyFi<%c`bf;;P zFKLPxCcsWEzeb~yo{Lo0VZ*U8Qzog^2B*(RbWM4L{7!()o7~-hJ@n-eKR;sQ_V>c) z-Y4Zu*`KUAtv7H2E?5S5HKF<+9Aez}9f=2yR;=_%q>t9<-r_xelqny-Fci|lYfAWS?Y*kcibFeNt9{!^PJmZWRWfADSJl+W&XP>N z4SE^PFedJ)}jz$>a4 zX#d>1TPTN>@(7b28F?7>LtIRL_B#2Wa^5T0BeFykrPx(CMi)fMa>eGCvLB;q!VCT) z|C-37sx8I4b~fU{^u?X)n59VL@H*o$B+Yv0u zS9JK(;o3e#X9&oOM1s)27yN$Pvsxp9&P>E4K(4Lo)4DCCfBa}(-y9qSwn14y8dHnn zHe<}l6?ALoe^q)ZpCueQ%N^!I#Z7E&SZ;Vw}%= z8~&@X51&+Qom*8?N^5iUMZk$&BnfT}x032e=uYSpya`-w6XsJ;XKKBoaqTrNj&9!A zP0`!r#c*T9ibs+w>J&ZP&xwb9C;SE{6N)5?THR_+!mY6x5)>^ z-?-CGe7{ed<|1RXIAtrM2&Bo+$M zWa?Dl%IkCe+{HGk`e{&fE;G45M56EnjTtDva){`434_NE9N7t!71#@g>F948XtNT5 z8~i~diWcpL98Xym=qhOv^7ZVext(5EWiqtI%8^90b%rF3g{-kYjo?TASpLlyE0}S)pgN;W0vo>fE`k0{L63{!l%wI zg*a1_EU+*j{yvK6{~rdD0bvag=UMx61i=_|Q8igh5gv0k{Xlvm7Xo!HH52WOtUn6U zrtX&qDbdlYKO$(Of$j1*j@Mar>lf}b373&0$>KO16wSaO9n^RUT%8#RSSTq$cw1@Id7^#SV+X?r6zph5bdak$Ui-00@#rCnyszMX1& zuS=;$H$mfoidn-)F?Id1*D7eY=`dnoBbUC7ymeL3IqYiE5%|$FeCCvsVMnhM?B>CGZRWD05OFlg`ZDSj|)f z>C-K}uPIhD;=_Clu{+mo{%rCXAJ5#Pk{D^x-<4A$rFAZ=>OOI6>q;tL@tX91Keel* zrem-uAfjy(=NehtWZ{9JCq0n8`r!Qi{EWq zhF@xF)WaAmB%350geMR~!Ns=GUTr9XDL~HzO!tgvi_I}u7ThRXVyVyiEfDRi-KA}D z9^7RW2kk#vbFu*XsB`LO1Gu87npC&(N_a#QxCu$z@=8>PXUS6U?I4SpH@EBJ@Y%)< zL-T(QYb|N_W6HJN5Z6$D{TxWwQ=I3R%AOhBT}aS7nGjm2(9bnKYz-+xDk7 zVo}eFV&m8H_&QKq)LQ?-y^9x?x|4l7Up|EG1h?2g2v@6|| zmblvgCOaTlwvU?3C$z2AhpO#6F_<(4=?Tm9;^}WIa6rEDk@=m#;lRD0r)YypoZQ>QNI2e3c4m9cEC$==iDfH}8DKrn$G~ z9c^U2DIUjVhh?wc`3a$!X-d{BxlDkmZskD)WtgAX{Nu1}Zj!FPucLDY3?D zC|QR)G96W5U~8AoSXSA%BpIksOc`xSHj5ELdsDS8N79V5K$T7!D#&KNyvD7f68-B? zi%bK3`K5%{bq_g&Y*x;+m=}~Fo@NBo*HD{##ohH)L(B%RYjx60*Ze-r zdHj{I>E7c(t8qM5^X#W>Yc~j;{z|o;KsUk5Ph<1FQ5*LkWzwQciw+7Nt6ixj)~Akl zHxwB;hR~e<%gAr(x!=m$nC)fDm$|pTfqc}+@AD0)i{8}MWY5GFW`oa(0|+qjgf+o( zdZP-3YhQ4?s#)BVq z40jVn>@l`K-P(bgifg7SkoB=(T87-Ov$Iu}jYe_xpG~cHGzQ%7KuI|q+E{USTY*AB z3_;G$XFGIAiD0gc!{uQT4h>|9W6snIxy9zRgS_NO5xj#&@IW(h(uL&t){MC4B2z)Q zZr^Z+tOtbHQ(E0R&uOTG6lEK3dhm`|CiZKtZ%S!eAT!aKGcrUk4HfFky&rlibi^zS zNz+#r`vr#^=ANpJS&5l!k%I;|&bNSxuR$?NJ-e<+5J4LppaoG}h!_E?s74tf?fj>F zb6d7Pva$)ULMTRYOBmfYUGc8+&aSDkuiEhy-wOC1r;r&rUnM@lc^8urHpvL zXGqr5i`F^*hK%h{>%ZaG;#%Br0dxwa#Xr*bgpRkzOb-~#P_-S3 zY-rQf!pk4tP7xtf5CAYN>!3U%9j6UvR?szBpI6|W3&5^j9u56q!>iX5+;~3ePjTtP z#-~ZGe%ZCLKgb;p?ia>6rM6&leK1gpam7eOorZvKwAI}lT4Yle2oSPRYm;PWm4MZ} zlLWhY;cj*`>8;6iNl1V~QIzuid{{E+_2j5}=DoppN&t*+!U*(@KJ17>&u|tAkcO?= znmuQAu_Q5+McPKs{9fSST~VnOTlkoYS0%QH;!%^WUz!9XU_FV1?h;)) zn#_M{ms}7OETohRsKM+T3%-A@+NYJmPS;xPDCbo8zMXuDRaura!8c%eJhmDXRKul_ z&UK_sm#sI$5t&ulLCTacNv#g}Q!Ju3|DDxkVGdX*ZfnJQI9-4bDK$_xveht~Fb@Zrtz+NC zcim1BjUi9snH#a%0x3-zB2qyS32xGa3o>lm_$z-^FKl4T0#b|OT#ZWlq<%DunrUED zMxNuH`i4ANIP%tvm?WT4%haL&))H=BNi}d!crH_=XTELARBmP}KszoltvDZWvU^-8 zFfm(CthP7$Kdv}TQO;x`?hVGAxDZ5KII10!3nvbCW_%KK;ZgkE9z&-Z@4nB8C2bk` z+d#m5By0L3NzS^%YZJ%I_usayb9&?-&Pk;P<4UlKPmcB$cGIr+ZSXbmQL(6~5!y50WVRAlc{Z8W=@Y=d# zT+KqE5?IBDP?;Deq1znIqA(ZaOW+9X=$fj~w{NHQkvE;7W zhx5o<8^lxGtuJj!%bX1?o(2o=-AJR37=-AlVDyP~R0H;s93*PvQh4>)@U5|VYHwbe zj=o|I+?|+3fVXc(y`zE7x%`GDs!2xB1%*1qedjj@84j&;(V(j$NlP^K+0c6eIO%W) zX?X|f2nW>Q;mG<617L3_D@V=B)Nmov30-p(;~NLcj)dK?&!`HXW8pR(> z(zD4B37N2cM`E3*s~^02csEg$U{Rq(6kEp2krU#-71xmLj=qjaO8*l|vZ}2-wWaab zIH%>q*&-(nDfz4Ql}Om%6j&u3f77!}qcTWQfo;cx-M?IjEW)s>;%dPBG4bK(9^0nn zkIF)WZ_Jf0`gg?;?XPFFDcFPK`8`R?g`}%5ov6LT3gKTyZ@KWP^~cLym6w)$G5fm-by%hkNky`oeSL^YYihnJE9b-pIat zg??F%%_Wtfk-T^65{f{vQNZBg=g@_1)pD8@5fD#B>L^(~3CRMY8)Y=DGqqfzv18@1 zAg_$q%>y6BBxbF~h^nJy8ILcM;;f;`@g{$GCPl(jzxi|Mv}wky8TX{}=N8Y3@c}c7 zNkz?6QhWDF1JI7r_7ekm!)_rrUw#|K(=iZMSbB&&>nKMZhI>_kZZ`7d9Z-%Y(IF_< z+g=Y+U_-A{8&k8p2gAj9uYkgLt9$aVRR9n`uT}jUmy{8_I^9v}t+u*C1Fj139)~ zV(zL68_XGP+%a^ZHX&KRdU_V7z)O9D5StX3izJ>+nH3%o!tKhWMrzX=ec<0})?paK z9S5-zQ3(U5l!vP$isfPcg!`V=AjWKXf{htiJVx=fy$$?>z?C8?FFg71KcUrr&>tmA z)$D5aXPFJ&D&==iC*@YHLZS+lyAp(Tep`}iqruRvW1JkQd0M^t{F=H1P3+q>ybd>u z@RVwW%Y`V8;*@tlbd@5JpZunRkZwt0(OO>AIYUj3Yt~~m^hD(6NqM!xJKTLUoh+y? z(^7%i@4DV$?Yg{vA0u4X^=eIzS+!2Ib(`ZKs5?f#{S_7k5p-!`|GdX5>YKC;LKkY5 zhYv+N+I=tj{3X2EN;-{=ux+LUhnB%Yf;_F_e1LwB&m+H%3(^~~SRH*uDBAf6i@z*X zK8zE8e=<_*exStB<)8VyC+^qBa)CH=t>O^Rzn!=WY?!~_uU6%#>Hf(i~jZx8HKqGFl!?*0Za|YXWCMPPzEnd?Q>JRO$i|MWcgT z*+2h9iE{D@o^!mwz` z$!tR(z8j)VT>YVh&Df$ScOO+6aD|d~2$r9nJXcw}+r*Sr4gyejklPFcu)MXTYE#}n z1in49mNK$YxVGZrz`yw!M|Y|rb%NNa?OIgKpOhk8{oT8Jh=2As7#Bdh?>PtBABs-@ zOo|R)oQ;#oTwo%BOFgNe!OyGOs{YF*7r(W`Wr9UIx!eokAwaz>XxPNG2E|$_YM#%h zqRsVmO)e)?eB?$isKd`UlcLKbQ>$9}{O>B(*t`%8&U9ENPA_Rfe+R$2J{QVd)_xcb zPtu4j>qa3yEe_6z-T)5(`>S1{9D`KY%)#eqbl!95SN{Zel!zoD|Ep1cOuT3W6Yo75-q126>2`1l z_70S(8VYLe^=hPDspFHUmAZIW{5W?z>xkk}TgPKzg|*hP_v>*LbU-cQa||*zM|&x6 zEC)&3>+uiTRS(oq-6eS(BL6^8dOcTCD-meoJua!V_CmC^+0I`oO|perfodfHXx}Y5 z19pq_ciR+3h0EhuxFYT@Ny=G9zfJ~K8d*Q9AO`L>l5#QA{ufSqyn~*; z-jSGu|G-=$}w$rGw zZ98df+qP{qwsG6{15Km%qxkSTc1Iz8ZoBi_n7gGM_h*3u`R|`n5 zM$PZDdfbLBtCOV$&9-g!33ga*E`JWVC2qYIHa)LW7Pq)ry?;bxgM-By*>rSElgkU> zx*XJUrVGd<;_07R72!FT36h5bAD~*DS;wF=ov)e+dl2CV-On;(Xajds$OSw5((x)m zk4#S62-Y^m6AjICK7^6PXJQ5dT1S)iQKe$FYgVa8KC1%e1Mk~Gtk3fbCC|?arA)T< z3uswsSgjJOLlU5bt`>?-hmH5{yxgLeo5Mhx7Q;Mm3mxA+Zso5o&Y+&P!Hzuz&PH~K zoQ?vYHXyUVrG9uBdxzM*%WiY0$?K|bFJ*O1+VVdV7mJ@tN<30ni2Fz7&JJHa+Ggxj z>F`Y5US{R2-f@C2dAeL~3akxTxhJEh=n!n5>=JExKI0t~k9xkZoW8BH&hh;+$b2-B zcv@MIs`Xw^G&Q1i8urfGl^SFA(d8CbU&{!LuDeB$uE!zIREB1eG7KV6kad1X6A5Ew zm|8v3*>o4dp0O6v2YvnV;{C0vK3ujDC-^mN*|p6Hmo;vMIgE2gu6^H%&DtR|*pKj0 z&y~J&xtD*pNGveskqbei#Kgu!wIjd@p7-PrPWAZp#7{kIDIYd^OC3<$Slpp zi(*aKZkdYQGn<}4jVMw_OxO(P=B!y2%OcNgT*8ew)5)N0mYYBnz~{3Xj8rc)jjS$q zE*>ZQB8N*sV1-l)gC&fT2sqSXx_sh33eWwMI7<}AyrGuKC8OSuQpzm@em}gQ9y& z8Z9g-wRqp8S13)LAa4k)LGDe(6}3{<)@kFKbR4R;xUG{&a^h;j{9GkYbAG$gNK#{v zz3ON}yxBP;;#3V!C`E`xfg)x~J7VfITv~F$!nRt}Vi-qMxW?OT<{LD#jZ|Zd@K>m* z=%JasZ^wS86zxe(CHA&^`Etpr;^SxuzF3CcJ1vyDib92w;acik9-FhfqV@C4xXdNs zu?q2e{TjUUx*tA^w_%!2tJM-;I-*;{mP&jz1ykAV5XHF-Y7C7jc4G}CP*|e+Z%7mx zJq&(Y2J7P@H}K1>M1B%oDD-)eVJ=>uD&(dPFx5pg>l$PCnax@x6Iqlge@on-zbCIt zgH|t85xSFCF`98JyDNl#AfSs@>hZ;U#zUuBUZpYqTm?-!viVJn7L@B>V)z3K_eM4M z0UEsl=_JXS7y>+L#mEcn%IT%C!4{zD;s{D9W40maWV7wB$4Dp<#kM z5A^rK2B!%|#NE=1U3tFYMIKcY$~x};yUohT02(LUA_o87j51%y^a&&S-KwBr`6Y{iY{$-#>>qNX$C5(2kC zjg$bc)55O=EZ+l(unXZtwlMD2WB zZH0+ zuF=vXLy*;`EiK0!+k*dKP)oxPScuXtDi%DEvB1`opGsU_9wB-=#37nO{;V>xquU^6 z3Pm4aLtDw1YDgsbs3H`Ekj9iQeyFnG{mv7;CtN4s@enKaHoYG?X6R{W7*lGyf$Ta};yI*8!IPvaAyi{R2vgh?Q%jca8CKq#! z?+(>_hf;l4*j8b+TuWxK)5qbLF-@N6lkE2wckjm*+O-zznha7{8wSj$Q&)r=NI~uq zkEP%mI4KTPvR^RlspKQAwddJoE_wB~8Y)XN*g67&Jw8vTlx}-BDUHzSD6DJ8G=Wt{rthfUvao3h&{ACwXqsPs@st8o+sv28GGh<@v6((<;VN9FoY z5<=|D31^e4pZ>0>s~sYEX8h%#hB@cjr+VvahNsr|Z7~N&x|BKkHK)w~W$mjE;&p6m zZqJ3rl1O3Q@~AI`wniq%qeiD2(T<6B%|3N)QO*`J99z14KeIttQl8=(*jVnWqoqn1 zR`^#o`$T8aMH*}!e%?v>$?w;X_|HK;UEl_D`8fU-*E8U$H6)WgHB8Jq z4I$DZ3UFivZMQQ?Bg_!!=2erRTF}zsJ>&5>8Ja9sOah4IQ?#IG1|T_gJ+71gf{Cnb zX4H`KR;RbBVkz1}rkihT0{L45evSblRUb#BY~|{~GVQ&e2j3`J>9}boz6PbzD~cj1 zXMp}7L?F+u+(xl>?mZm?!&p?#qS^hCv8^Z;k7Tdcjf^*pi)D>7N7hP7@iiZNee>K; z0^BV&59j2&Zz2-TOrN1GY~lroIs&?k0GG)0=`lj*PbJ99^lXwu+kh}y=)ohedy8(!xV$nWVXT}WlcaFw2(TZ}ec;Vq_EbwAP@Q13u+zxuVqGc;@-+-5U zdVA?Z2d~a>@O14l*Y0f|QFzanDvLzxOJ0~$b$q)J@9253kB9n7!{bj+F0Zscg<~Q{ zMXtU&e%+f&EzKU>W00u}Twl^x>$PPiUI2R8^?FF$dHaIA*~u4XEw;arLz@AnEe6Jp zE9H>jY}0WaAqBexVtxPH(y*sCDQlfx#Y{_^oM7 zUMLR;4^80j;)&|v_N(>}@)y6ZE$_AyP;-C|sOE&jj#v|yOkkTpYgeOLV>!d0afDOc z6d{z!^T5h*gg0~u=}mZqbu0tF@a4f|#8e{C+C;%)#L+6d;G?w~MwdNY71jBwO!^>O zvt?>oXxx;W7H;j{xiSl1YnLRrr$7Y9R|2 zCjLa~3lC8%DVnT_=*@I-sEx#GttR^oAyY%=9#=NGk$*jGo09TbP51NnRF=l%2W0$`ZWW?G4qJ=76LPbJD2RCgm(sh!~G3 z(LHC|u)?CRVKZ8K_q(Y!Y1vXnFIc)#jCZ706g-CA2U&OocYHUPP>V1Lk?V+O2M>nz zOLrbg^ZDddTl-xTp~q%e-w;D{iF}`EeJtB$!-Pn~My(N!woqMCZ-Js(!g8#10gEES zHj+#t*2dYVZ&cl!N*Mu1LTy(;rOG}Q#W_%9)R3_=z&hu7{REQDzX&&b5w{-A?@JMS z-~XWkd>Vj?W_0q1Y&50yjPMH1R7@X5S_H9j20hJqypHe?2R|gHaYlIji6U$FFi+`n zcNN66c~H8x!hgbFTE)edq<(s<5$k+@9?MA68JHZ)TVsC;~kZT6>@e^RoZw*YgKrAqXvZDdgnCgKV~Ds;J`RB!rqQM-rpwvf{s_9Ly_iN z6QA?s%dn+8)*nHTPs<5PH<+M?vnt6VCUWz1hU%BSl8WtR97%1}Sy(5<8?~`Xx(!Ee zwPMmVYb1^@Tndtw5byj_aVViPHx+QJA{}<>MyW>sQ>nbWK}!M-ySceZ&q-FJ`4sUae5bIbhm)DNXe(XOvk4^@g_7popYJAxVo)=FlQ6 zGRRv!E>4YF(aF^JKppufWj|BvDG57#;8JyS?fh8av-hFe?YG$F1>q^}U=!1NS@~g8 zgvzUQppWOrTN3RaLD4HI-dp`^0zie~I9D|^{cbhA-rz*M25>I2H0W5wp#+;PB?tN8a z6Cow95;(}9w>f+QdWPH1ySYiyFQ#wp_z;>u5Gw4RRV8#qkDId=xAt@-3v8^-T1W)}2%|9x{8J^A8TXWhF7AJNRsZ4D3g={9= zZp=oj9-KSAKP2UVKh89X9b6O|vPp*RZwb1phOtWYL(u?-SQuKSzdlufpQ9sa`!9XJ zEw>XKcTUN=>Rs_K@9xn)4+pmiCkU8FuO-hIilNI^zmjsHNc>$*g1DI!cW;Ln8G|t0G1<5o~p^4-Q~awRDdA*vL#GG9gdl(?@z(x~}(~JKu)o1|clg`gOuKpi97{ zL(d^i=~W`kKEjEfw{7&LE9oAtB^U)pKku5hjz%QZy4xUw`T`FY@IGG=36C%dFGQhQ zIh@+}%(9YyE$n8dB7fX666~yN2}Y3{Dv3#vn*~6yun0lNfXIfP2JCPA7B^F@GD+iP z0vFN$iLw@P$%`dI3^$UB>z@*|>nM@r#!zQB_L6y}!)FgNW_i1t!RoA!;~a}mVhFR2 z6^aI~RW`a@F4>?EuPzZTuGyOco1|9)y80S9cro5{Lr(V#Q9@<&M2BNJ2#>r@s$TZ+ z&ST4lvM#{;C3XL78On)ZPN&;WJVse`p+ez@`Qa;j!KxBIo>GD2jMsFM_&_ixq}y{Z zmo7KE%qEcMIBgoATQGUjHsi7~AV2gQOP5=vuAb02Nt|9q0$AB*mk;?{rOd^)hg5|7aMsg^||IY#xDPRT7ddzUF zbZOBVIMa@Wn^Hax#xJ?wERRy6!pnv0ThASy(~`DdeXuR5{;HP6wk)2OFSEB5>}t{- zdud=b+8$!%B@*qCIih?T<3zaaIs3vswP|0J4U&MyM&h4=>R@LO{?RT$j2h!C61D;{ zU?nsOeI*)y?+{c9Ty&(a?3Lcq03uU}_rpk!?Pzs!QIQ{_p|!6tP{8}4hs>YfIg77$ zHdg4dAG-Wkov}M_XkcDq`|eTvv|`|Zv;NeQ@fkPIf&#Nz)^(t@ey*Qx&htskOE6(0*mC-@wb}@%*A8ECdRS%_G^kGC}1j@xP-XR;JJj zbQu7?{dwZ>cl#S^uGX;ndx}uI+on`ZwXwD)+LQy8scwGE=jEA{&t5N3)Uc2j=3((t zTBO6`cD0bX^L><=CQFV(d@Vs4WGw*?duxA;()Old$i%*ugEy?ziZb-6qQf<1&-7ALB};Y5)OGQBCbau*BbSQd$OV$bTG35-q@Y&b9lb9o zo9%o+UVCk-S3FDHtUvADh0()>I87V1jo+<$rO>`4;ox8Y2M|9f(P_|i2BfHdehNyr$2-I>dN+iNFy z;Xx!YXthfnrHUP#Gn@p`fwWIM_q>x>gPHiVF&vKvEVcJcSBbMI_zVP_Ce+rS^ovS2 zG-6@FaZ6?bUeU@jHCNZ*M!Xg%zpM3YR41#eb@VK%^Ro4dlMYfKH9n0Tk)zKvkJ7Wd z;JP){#Oq53!j2$_0!X0bl4O2%J}wf&*mN&tXMm$BPvbda=9O+w>G1dJc6r6r9_66b zuwyF-k%14$_FwY5hHiOWkVKKraW53ku~^XjF)|~f8xiW+J6@)U_eXz$5dZ~`_VpXm zo5|-qQW^%^&$vngk-=G`DbHD{CkcU5ZK_>Yr+2XL%!a*v*V4YwFFX8lj91T5ZYm88 zOapG$x@=0say`wH3z+^xj<*Wh{I|O^G#x$t2Ik@`1j`IGBKQDQ7WF%<^9p8#t6?7E z$ms&DrElB7tPme4L{7;83qs#X;kl)~uze|^VT3%yfO$JO4F-68HAQ>6HjXQZAXAOp zh`LYW*4sFH=fg4`fTvlN%i~=|9c)6X6IE?!DkR5vi052Vcd~dShB&!7I(w=F9pW$B z?Nb0I@^f{3M;&<)VJhBS5+JmFD_^!8 z2qK-y5)2;p6w|zBm&!&_$mfUR)pJF0m0~IPINhT{C3nrCerga|0)*hJUL3$WP$AW@ zPb#)(6unY@o*cZ|;_pw;=D#=^I?1z%#OE4hnnp8RM^f6@8Tm-L;>i-uI%QQ@R0=A> zbaZ}smKBn36qc{-k(7`8o67>A-Z~$*@SeOO1^LXKO&(Hy_VIF%blnEU&^4X(u3++> z#6kgq6#RYv72(OPv!hi9#5zl{B$<^%tw`HgX81sJDqy17KMWET7cEx9KbL_eeGyTo zHs9&In%UUrT&GzoRJ?8v@QV3wAD1};aUl>ljnGsO$-T0kUbiq(SlsB`+g zbWmai9j)e1jxvUWR?(8fZAewk@|5gGu>a*R_`5ICHL2VUb+;q|c`4R*W=`RZ{0{Lx zHv{3GAIl(I6Q5MOs+0@SSD8U2!$%-DfxmZV{*^#=MMwnd^-T-(XqG6MYhw{iZs=3% zk%M_|^gm&4zenZfndk?ulLS<`#UFpyHDm12G(SJ`RubDmlzt2{9e9;9?KOcg=|9U> zf0pS*T!Q=A4|4dQrO&%H^56H?ItF0J7tkca{5l5pH_A7BlBaC~th+;KQIue&mQ*w- zizKgO=A+qosl+CTjFuv?POg^)>jRCcI4l|J%D{m~RfG-z(a-rTcA=LJA_)PjD-&BB z!wz~mp>|(j2w1&vy4l9j-O2#AOGVq=jT0IiFouA$ze)lQy!D&W0ehVerb*1GDORqW z^W0=pkLRAhpzS_hAq@@`jd+#ke*8?&<2~rW1?>V8HKCDgx20=~#D$?w3S2Jzu{Cm8 zyp7$M-|4QNK2#nM6Pe*#GQsCbW&#z`Laf$1bG-Oo_0xd7QaT>q%C2ixYVP400O`j8 z!jk~Vv-xhmq2~Qf=JQ5@1|}uRfSA;fd1k|&3SEZ#)7#yKa7i^RAlBDfyv9_np>4jKAI0D`bfw>UOR!UQ6es zuOV;ws9!tzt!Sh92YXBV@(?d8sg)J=Q0Mo`rmF=b;NZxd~hz;KAUbccc}m;76N zdhQvQ&8}Yt%Xd(OR1?c-8EM30Q_ayY}qcuB_ODuJ#?hco|FY+A1K(@F|1^- z@v8Q!=myVUg2T0uFbA$%7+!*H7E8wNUIYr0!Q=Rb8cN8*DZ3kd!UT)Uz@d4*zz}$G zXK!kOic+#PQ zX7N?`c0H{ITP?0H-&Sih*DeDycmVq4mY|D+4^aTn4l)G24zR-0pVcc$Bd7aoNV0fp z`){MSwo^rATB+m`)$n!v!GK1)yYdAOYjby6J(Sdt9ALCSAr9;-1OiQfw1fRykY*;y z!qD4#WW_VpBXM^C-6F{k*6P>5$KsaO`MLVM^EWO{d@xK-$MH&ZrJcQe)Z9xr_#|0i|0?RLYw29K>Wq`=xTqc&wPMN_TR z((Koq(TMUpi+fmVX`Jo#PJC6yy#RG(yl}plPfwO`zrDdynG&zLg>3&}6f^St_Atl# zHp$A0=8;~ma`pQWAJlFqwNIv8jU^);SI@fvikJK)pqGVgNiFQ{W?kT8$1ypDV=Pps zOSKpyY9a@a%&X|tZ(2ot(bc%KlrbU*k=sNnmGaUQ{zeqGuWZz2k;^Ma&uZJ#8>t~h zJ^C5za*8j*4*&Ga4d~tPHQDwGL!*AM*`W#`*$aR}<0}fH;d9puJRHJ57{5;$T6X=%3!>oxZ%* zl-J$^W+dPR|6CtOl|oLhpg9e)Qf7I(+IZ*laEk3SBv&2#`LBFwF^6j8LUEPM8Z15> ztB!IMVN#?Y;pz_nfG4mOy(yD**owuULQ)>A$As zlXqB#x#w;f>7`T?M<3vM-OtC(X;gLy$bJhh;sa68sYw-;%C11DD~+bEO(<_^;TDz7 z`mmZF`_+jpz@U2j`fkVg<5^8$-&K&)F+4P+xs3k8kef`CnOm!;h9n5aIRvE~56lfd zKHG?bMP^U8{psx)_! z^v}%>jtJ{f{HF9SuSyBUY27P#&rcYi$2wL%d$)s&TO2lF%WC}b^@;r{j+#1JOyc(q zO31Odd`7K(&g|B(1iuK>SbGr`7so7i8{A-*Xo)YWvi(ZINzZHYI;Qz2H-qFAXQ5@W zUwx%I^vz*+B&?#OVWdwH)RJD*mxuSjP0BMNH4*7yR(=Cm;HJy_R_?o81qbXpB;U}4 zJ61pt#X+1#dU_`0(&$f}F0MhqESqo^y*Pe*@*O#fqPv;ua)|ny>);79aR{2z**=vl zKUt$Od2@L1gT(yU<2-6IkR;9z*HUbeQwsvd+koZ(_*jVwKf=*kIH(O}bK8(zc)++A zs0|BrINF8j^qTi+ZiOB>F;0BvA2(820Kp!(K470-AuC|WXn`-bXNO6H%2Yi z)RJq|D_o%8-Lqpiae$^N>zM3vsI0dZ*BK$7eQrC|X5FB2O4)Pi|AiCR-pVt64>i4= zl~uYR0-xIB;tft12}jvWlhCw`id9J5&ah$lK9S&U`df(`W*ZR;lF0Sh3?O-(83PU9 zFEQRVE&%b{+p#5G4fV1zNR_n-mzQ(O$^wY5so~K(WG6oxYNws`$ViEEmd`GP|G=+y zuo{r1u&4D{a=?&cho;q4Z~9jpwbl|(rk<|m)FN@&o+3;E7UPLSJ$;Y2T%4C=pit zZnAK9p=LV=i%6fhz;K|-0LE;v9)E)PlkPx$dEC0Jc6YQhZUVuwuLF3ZH;B*U78&)V z_BQh2-$7M%i#mL)1HfEhhDT3Fp<}3TP3Grm0B{dIlfo5KrrBfAOp|13PIzauUv3sp zyuYz*ZjAi}d7uc5aLHi~&IARPoT4~&E-!H<22)^I1FQioHt+89P}MEaMvpx!ASawp z*x*vM>2GGAp&L&S41%TE7qn8cBu8L!gzJ&dU2Ic+ zXXn__UGle~pWseCGXpdoenE9WY;hi3oiY*0{%1&p3DlO&eMT_8r{r7=pk-M)VG5JX zoRrn;EPdVC$WnSRe?2Fccc`m;2(YdW{Hit`A49`H?x<9-eA*t+%|_-g7A->YuVpRUa#+&?IwrFGqLKitydUIj%h66|np`vDl)Yzec7 zdw4QUd0UOAe8+`b>&K56xU%p`BRu-$ZJ5MP_CIdv-;x5E=$GTu8Bqej{YC#fO#lb^ zxQQe!Ph?FIN1MYcQx8_A!EfiE*4zUy$J?RO67Z;d@x{iDS zDGaj#|m1!pS?Mcp^RBAvJ2SoV*L!Y0lLFYj*wD%o7v(E`8qJylvU ze3Mm9(Bi*&v3C>n{~O-&LiT2a@q zhTy54)$i+uFrGcK+j_6B;px=8Yw;!7^PK}`^`~9tGhyg*ts@($ork8h&tS}P35f2r zY5x2|C`=nOStvxt9IV*m!<3dPK5%J zmUpt_RO`)V=blqhjtOyV~k~4WD^CB5)B7aQvFZyKd3=X;Q7O) zJfx(DWhu!6@IvKa&XmQ7>S3rNWUZ5>XShYWgA89eo-aEefIk)#?zP|bkVT;yq}N(n z>`1~`DY2}o?Qv$cPudEyiVC2f>69slwP6}g5M8Q5Y&~3}^o9W~ty;zPj~j=IeAniO z(mftcr`$r_pLy%j&PYOaHW7buBa%YBjuXWa-fL%~_PsO|SAuBB+f(;NTI}ASKtpx| zkh5#elo*LZxb zQ`)ex=-ke5%d3AlQ!n91;8XDjPBU}ew~8***?N5kspjD)T-EM3m7AFf28;DmC{s;`$UkziW-=Q zlM>DE*octK{tqs?XAjCd0YIC?{|yG{iCEN*HkFg&?Ec8{?6O}Kv1`CKi_&o7CX`Y=G3BF+ zfv(U(6M)o}9?#WRf+eA?zDf*o0AyB}dFhKIrY<4`Snfz6VACw!wknyysmkadTh*>K zfK+MY7@GZXWea`HA_X(bi~&q#qyTZNEnQ7L__yf-MJGuqwo07QlnvpIb>JpJ^e| zftlh>L&hU&&8lF<_P}7jAd*db>>7uitWltTGb;`Ooap5h5^K%4kscUOF~WxFb=$Km z7siX_+~Q*@5`3(7+k##-`3dGW)&1bh3sZB}rE!5%JPl@I5n#r#e;jRjCL5xrx7L~P zIJYZL{sBhS0{o2H9hLbv=_-WcTlC!LuGYH96vDSV3+UZ}InFq4Q^+t~A&vjKp zCsA*GPOVJHwLUg8=~m zo7o$eBnL+F0qKH?G?|i8$1;vm29+)G5lv~DnKJ^$G)E=2zDa=>&Y6-!q=_l3ZxHBH zi~X7r`=J)A&5$qz@9v+QE1?WJ9(luh_N+rD3y~5X^BFdZI996kMn>!A*AcidOyrgL z`dHV}Jbsc2_jvq^(Br0MxQG2FImfQ6uJ!I^byEJCzN)f=$X{1YVPC9zOwuLG4Q}7} z0x-?!V0AaN^Il|3Lia5<725PAV(9*A8xzvnR$bhC6uE zaCtB`HmW$vXo!;8f3JbsU_}(RIvq?kj6dp2txJE`+Y2OA?o-p2R~i!wbEHwYU|~0+ zETF@=o_O#XA?Yy>joZ^;vsUy1b)|0_#K1E#5$n-)Oo9(dKJT9ptbl zPUFR?2}jR%rK#TS5I~wvx1ElMefYK{U6`|2ePsw^wd@hxmWO`S1c;Zy4JFFwxHR1=L?RV zV@vnnvcC3T_8G}jz&gO$7us}pB$&Pg^`KrhvZ9)%C_yMWn$C^0`ceZgM`E-N?(D4c zs+JmU8{!0M1pvl%%T{GZ1H!t>*6i)Eehrd1OeymI+LLwA`XqP@XgQ}|eTJDKh=17mm9Wan`7Ggwg6v;vhk|5|dP{SJarsYi34rSCO zN7m7(75fJ%>gfVd))J_#?_(mkyZ0bfpD}gcV;cU+)+=DA7{ZHDTr8@)Wk9@YbkDKX z%(6hVZtXDkW@k_u@t<=4`4*1a?&J+p0tO<+(Dn#fk8E)uOC{D`N`n6^W?LydMZg^` z4Q&C;@f7p%T?wK>U&3_@gJ~P}4TtT->WSGB|VIbTZ31%;ZEVoeLt?r$8aYC3N4oD7tbh)u zHpktBtM6|G1sHxmfB-Dfr4GJWq2#T!tsoN2QV%w#qE19#t2ZR+L!#N@KCQh_^5Gt zP=V5VwfaQk(!oM_@PAAyE&XAq``9l8?xwGsKrpj@k}S0Twg;+`#oIcp_I;9>TSqEU zt?hibHn;xo&FTR2f9Z)|E@2B5bV0<cTEn_B*nmXQoE3 z)4?Gsmw*x9U;CGD2aqlE`Bcl^xm(Z&a$^~|d%48T9KBjv z;hc&At%#aAqNDZ$mV|oN#N|;zxew_^8c06W>hEwKIdBR~g9hXwrv=QK*}gux^nm|`)^W28v+Z(702Cgog^X{!qf+EC zitG9(ry;=pOoE9M(s3o)BttmD-oRk|15yGS+5Rq1GQIX zo?@g`vA&!Ucrxuqjil<@I$wd_Uy{|!?I^vDTr3!6%|s!P;WR%h$aJ!Dw=ikU706&z zg$ysWvCe`d7Y$NV7;%=7KUIsK3qR7YY(y5(0D7>#c>q zxpyP}2;b~%Onw9D^12@rNYcKB4W{{wU@0QZU9m?EGKO!veO_p+@PomnY36P*(JC6? z@s6V6zfL0%ZOz4GlabXcA_`_YaR#hJX)RsmthK)g0HN~(-YUW!fZPM}cuJ5(xPxPQ zhDf|BeeVnwLIVd;|>wTdJnK|F$BK6IqPB zBj85L4fi8rbKXgJP$xu0#p&!J>~iw6?eL69v;9l->4GUAl&3s#70j6Rjr!@*XRn-M zjv%JHR`#C}d=y0=;|eM(+K}1Ytou!x=(ph>E*{=yFAI8`I0@AkP=>9uJ=;zG?y1S| z4qk=Ji|u8ql|C}|;AwAXW3LhSDu2f~kH=o`4n1ESyl)>N_TJF}Bm3EP%O`A9HK}|~ z{J~Vy7u}#SG^U)LE-z^Ma_cAQeAHAT5)dae%9Px)HPFh^ly28{(+~>ne^pl(>2})e zPOjY>4GfwmOIjOTMC5NgcBA+~u1vRJY>+A>MWSq1LDNR_YC)IJt3VOT_Dw5)3ImP| z4XJZ~1oC3=xjL7!$Nrj(uBhJt0G^8LtOY1wv5m+@Pgo+ozV{7qg8aOIc18j0V$5^Q zf`t(FDLm!&tl;{;z4=RJaaE53VbtOMymPHe4??R7zf`AkJHP7n*1+ZGwj5 zNMY@`+pEZc-XXlTLmgf~wD%1Udo_=9Y1uhaQrR(raIH()XH(|vRkPysMQC$-U3LCC z&x2Osu3<(enX_TMeNMQSlV5C7F*G==>Am@+wv0~8>)%X%z)Kb#u)tZ5BCda-fu1K# zq}jYcE}C|?lZtJHb(Tu`Csh_m+UpM3A*GcBUZKJmg19}dGW`o*GE6?AO8Xkeg&0f# zk)s@~CU*~$070K~r~z4j350S%1#mN*u+BVr-KwhaTAR(u`trEAjr^h?LZYbZwmJml zA+qaO3u=ncaJk1*<_;EriYI}78x>*e;8xzhGlK#tAuS81*5k{&Peb_54=M`lEJsCd z=S{C<4z7wTAWsb(t9J4D?$vu3Ixz;+m>SXcZY#xBUfvug7P|@vc>=A2{!Zr?hmQy4 zW%kF?VIzw_p3BY#0WHyW8CrYVVgGGL@;phPVpdfZq|Q_SS{Lf*$u!l$1-$ zoC>*=OKwcO`r$~c@V-kHt`o^bOn`#w;GUZd%+4fg!-lk9@bMxX+u_mc`~UQes?3z) zuI+ed5jrJPEpF9(~0hOpC z6OjigK<>0W1Qqqvb1(E14|i)G@0#J4TkbTC;*yOE$ag=tj(1%EFci`9XxM?Fl*qrT_GYsn(G!3O1Auq@Id;9yO5u3m|07tzei|;u8n#N?a0jH;`rX)(+3xk*iEN z!^%=E;s0~~)sj8z=%ny|j8#14m*d_5Hsv$n$09aCrpAy{;-v5ze5^c7t;?|9Okd-! z%4ABA2u;tz0YPO28eovoglKyT10OyxVvBsavmfrH<#e+G)#AKM7A=~`{hdzH%JNJB=3=&nKV@wBdG>B}W zgHT8DHLuYRnD~z#c^E{YE4W)pjc_~@|4n5?0Fp;ef1@Gg$8J)iV`z8K_xrr^r)=(= z&F4*b#>#ufKY@>btc1V*eA`C@6b~X9X#tm!_G^&%a9FSMgjya=njm-7ZxDf2{<^#Z zQ^|xKBO`yEWi`(kc7;V4Fj@GODJ&(3_B3r}MNy=BaFYiCGY3rnk7jB822Ua!pe)qL zr47}*V2L1$LvSv^0v52VzKNpe`uVmR(>_Ih))Uvf$bu?+v?ZA>eVb#g1@4s1lRq7P~iV@vG+~H&P_vTkF`BP$ZBLsO-;wnTdgtw;g6Qn zf%l{^akJXi#KJ>OYG@F>zw2d|oWGt%QmMT^cF2sU7E5CpXl!gNF`qWqAl=V*x$fm; z)SAtOSFdI2k<;js9TNB&}K71ghY^2Lj5 zZSOPePSdu#jx-Exl1T_Z6nSBT2lYfH9oWup9)rZv5BUXpBKh;heco*zoE-Cu{-Z)nZ19x z#3@b)OU(pr|Ah>;mbQQoM>K(a9$BH*X<>@OOriE&0PpuFOqut@MaRC@{vIpLytW-q zd6-JTAnLCzBcNVnP+v8uAg^6z!HmSZHX(vb!MSw%FCJsEveB{R4>AT^)9l^S!QlQwu5L7{;l z^ooXSoZ9>Mn|(cMh4SLeMWCIV#&bV5NY-Th$K!yNG1-=mnExi7o21KhQm&IRs^O`A zzLcJ}#xd}N!HZvO6H#S)pca}K#Z^)NRvoW*)`@}?))qS|(@;dpzW=k-vfG_94ipg{ z#H)%nUr*A5tZ#7W-capm40nT-Kzj7z&f~U$OSq*4iK&w+XW{qxItT< zDk1fczvmRq7{sr-<&IGJve!&@_P{9O)F63PFbhGOEQPi6vx+R#UB)SH8lTp}8%?X4 zr}u}BM87v@Q1g^3mNs%j(i*~KAb{z^bNl%J;N>&qSb)980(1z~G&$`WnMK)Q}ZERNS~E0unjp5Pn?90A$6a~nN6G=spaNv^|%JZ9jo<4`>Ry=IlS^#KJdix~YueaCil((oHn1bD2?e)MhL%%fO`Zvy z8*$IO^rVLMU+!w96LY#d*iEP@E4Dymv$j-5A3l%`8>WCKW%ls<8Ar8A^}UfO;AZjor6R9 zTgc-}=9W1xL&S;-u*6H^f1PGf=qUeWVvmqv=HWro zvOu_i6zk^ETToxX_f-<5$I#d;s98@i{5SF{Y2V<)2BB-<+{;SCp!JRH0Ew2?u>+5Q z(L8<7-;PtR0VL|<7w!Vweb7Q8Oc5`qOLcq7o+gktPCk05(Xk)l`B5I=s|*a0QuBP4 zNVm;3HnjVoftGa8b~lr-zI<|E^|`#lB=T-n3Pokgr0kFgxhC!_4NGHP1B3{psvp@8 zkMeoP&;EXh;34UNSwO}5KJJGj$i(eoh*U@f1@C>7T81asZg07gFtM~2s7&9G*nIC{ zym2^wPrR9ieE?8_V{*vtGlU+o1X6F7v_+CcaO7xeg2O{M0w_#5@~Fu|H2QTR$kQ#e5a*U9gXB`KaKQ^(AU*@aMh zM4`b0stU+PihJ2LGgbA;hzI%pS486rUdcXTiTtC6Al!k z6w=;A_fURv_SfWDzg8Ga(}|KKE>q0q9b!S`_5e~Ruxw=hadPgjrE}KDgqB2XNSZB( zjvVpuKSX_VcwW)+bz>)u)5f+NHH{k^jqS!Z8k>!6>y3@Zwr$(~PVVpC=leVFlXLdj zd(W(ywPt3{MgN_~T9d%QYIMRo+%JxqJYr%8rtls>!^q(l%#%6-Nh{(fYYhqq-IpnMt4g`J1Tv7}uZhg`$oo2FyQ;P^+0Oct7%V7*ph4_n>$ z?3F#=M$DWQ%Sn~;+=@VWoqx(%MgE@$R^u6!Y9WQ-{`&n6exL_j2&m{04eOX%{7Rk^ zT2*jj|G=UnhrBA>@EQZV^{gHn5HOMmbF<3_X4{;8o{s(*^97gK@avQI{Z)W%{SkXN zk7K)=S%Qy%?7YO40es4G9DI3eYq`r=EEglZR7U1`mdcuE|<4_N`b)y&;dLESMl3ih$MX4CM}6 zz@o+kvPJ*Gh~$=Nie}C%vWOvp$ZiXt92>xU{4oBM@$n5C;$IH~QU0`&52U2D(l6*D zOvY4{WWim;$9;H$-fn29dg?D!4~FTV8LK|`phvH{MWvY71J&2wFT>jw%J}U!2hvY= zyg+4`6+<(thBz3Q#V>q7oIIS5mx%4oWp5BX%}Uy8@0gT7idRq0t?c0O{Wv#DPmgr` zW78>33W}cY*cq{5zGjOPqub~MwW-|9uiS(n6iT`h`t&FQ=^)Kg#-X_oRdllE4gXVfSVH6us%O4n4gtm_> z2=pX~n6F|ghs;ET$2l#%Y$6Slu9IdAM6INkghij1B4q;f(R7ea2;Jbzs(i|V6(;k;uRXu|rS|K0C66fK82vQQ>NErEa5^OkrFnBH zt96F^S=0XO?(>^=y60>d`mzMZe5ze{jnoQr_8gMPy+RS!0;#PHZ7GNu6-LX8d-LA- zBz5rZ)QS@FA)<7AK=7YbO-H<~<$BNwydSyn}$~#yfLKIv7j(XdzxlC@s-C{0{^kGy4c1 zQd{Mp6D{dzr>Ip1Td^ychB;Y-@WRuK_bMCea&Zt}L!K|c3{qT^2G zG)o1KBbwdM)eusub!?KJ%1<4zk&&x)|Le&{Sh9?G?`*C-+YL*#?PblFaVuj^p&i8B z;S9aWdiqKl3!B{mN!{e@i$pFe=im@HD?@v)%B)|}rMplmmcDB1U>MQ9MP-*Q$kBd< zX=;B7^f6;@P$xSl-&u+CO=Oyy&xxH!?g*=EWk3nH^c~3l@?8m+x44$ww=>=IdOAu+ zlVJD#;Tl0Rxde(an0!sdLS#6G*^WNS-!6_XFEFkG4Z6z`e>#dhb+1De zT})L|c6B!q#YNMSFlWL+d}iaH6KQdLg3o?~P95`}B=Tp!*D`mdoArps5_^ph$^NV` z&8Kg_L3d0OPGG;bpy?5m?quvyoDeBHOpyw&sXSQqYB?9sgY;SHUR z`x8)4WB&ajtTxH!ZG&aqKh|7@ZIt3y_(_Y3YgR%t}Zbg1tQ5B)MzG) z9IN^~EuraTay*^Ts<1d;e%o&jpzWhDSU&_hO7y4`V&_BF)%V-22K^4ZxB9uFN@wrb z{*QY;=*y|O{75fnWClmZ-`L>{Em0Fw@?zo7i~b?f7|Z@3=`{5jb%KTxa=-#yY~BzN zu6#8tt~h7@m(aLqAlfH=kI!G5IOT+v*KDBMK*d$Hw22iDo}N90@Jb`kM0mm|ThL1H zHm7HqKH;FgtlKIo4X2P_Q+f9_a)Q?pQ^f=nk7wE0o@&921^&B7)32+_J0^OZ9FL%Q zQYHAidWOS1=L)idB?XHj*ocMIOn%?;myj#xNtv%Mf z-fAkMLN22P0SR>BVX78q?xKe_f&KcwIr)14Vl+ zJPkCD!GF=s>E_^-aJlHd|CQHQgI|{blsOlL)&#qC4Jh_bW&zkTqjoNhePTMP?fL_{ z31I9s3R_2l0g^SZzzyGi(hmrz1OHvHZs8tMIRiA9UHrYLg7ET&GCpDT)FK4Aj*J1U z=n{8aD;txm)!h@PuzQr*U#_u!N%cA2*SP}a`tDZGGIK94?h2UR`R7ePi3c275^UEa z+(7)RPrm~FxSf!D$S+*pVWdpsjp(6e(kOf#u;p~vDl}^7mIb4Vam zF?fE@3f(Nx^veVxVV*S|pPj}^9v`>CR%X=oq~&g|$r@(sb1gyK&6ms^>4pJFd{ySSJaP;N3g-ej{Cq8O>j$6weQ^ zbY#Ho1CiO9efXivRsZXtgygSg2ewSl!xbTju8ey(hVfDRPpT!4u&I%wj6D62AsGIk zQBl@cU~eSev{HXUoFH-B0zp$8^CWLDg^;*%8a`#4k{>p7UU3 zTkz2KZL0-rQiXL$#KtV^sUQ?Gx|1#D@n!X_lE!9p-La)M-`Vt$FU<40Oi7(Mo1J1h zVGu${(6sdb7Kl&vsv6|IYH-y!K*&&lYfSTgpGMbAuKY}nto~x-QvhV;ExH z?h=xlYwrBM`!np1Y=-KVBtpZ(WRRj}%3&d?WUI!~B@SL=zH zzKlBCHL#+Ke_Ve*q4v7FQT{uPs*7Ui-zLnqolXEm&TGGwP)96^Ebs42A;HMmdu zdSS5YPkddl4DyvL;zoNrOI+XXRje795u{-iKWFQZySV4|4td`+x3;$_inKf&tKtb0 z@VC0zG&I`F$mLdj(iU8kyjUF#r|XYx7Vl)>OTR}dCbMX1h*ff+<37?xbP%%{T4YK= z=V`*8Mem*BWwj!_aic`8s6nHi(?_pr!3w`0Xl%new}|=aEaFq0J4_vwKsTmDC!@J>Tip zJLr{c(O{+Uo|BG$1tYyha=Lk`yW{b;Etv1wAlEWL^3d~tPknOjNvC+imPXL z=Qnx1y_9#izKxMdz+a4z&pr|<;2y{#v2%K74J|_avXc>vb@Jw;J-c%0BsW^_AF)@I zk*>I?E3CY{HK_!MxAM+a`9k(li35ej#YT;ldTriLIEWYhf7g_IkCZx|LHm*8=zVu0 zT-n*Q4N=dl2MefO5~agm657il#`-ajMeN!R!zq0N_+w6TSqR3b7J-2j@&(gN-?w?p zB&rx_%W;%1FhA-U$B zlo?&dQZ{;`s^vmP7(~rA*lC5JG`c9Yw&ORmED?o=5 z3!HrJQ|_-0WtZ`B2_8@GH1!U9zlujuv)oJ4q6SqZP)eOdvLP{9*u5jtLD|8S<(Y$y zO7=rd1Rj}L-9saF8v$3LOxkgM zJFyB5!_x%}lc_GNDT|D!3;ZGAni--}{C|h)Z%m}GAlK&14vh(N8IvZQSpLCpxIs@8 z#Sl7Dez_6yMyF;^@B}2z3&8Y0?yr0K_SUr`Uwn7#s0Nz6??;VauX{eK;C-#&TR|ZE z?OI-@KM_??3SW1?-@o_fu-e2Cb|XWw>RI!!t|RTyH6p9nP`!hdt$`t?sHgM-{lYdMgC`wF8e||RDWIV zquW}bmx{$phu*n^|2G`OKr5!T^_^5kO_E@X_SZ3DJdI6@nto{#`YELiuGnz^y4Yoj zm!H}Ktu!=-jZTmoJiMceNa5%i#_uoFol&m-N}|`27Utr&C{Wwb4<3kxC63En1I@UE zy_sjU*-#|vkq!wFKTwd4>k;(FiL;_lyjaaMSi}HdB|ZVL3!lp?2H@wddAw&0^&Ew6 z<>csk0YDkD?(xR*siT>zb`!U@oVfx+jC_DARwc7hoSg7-zvG8s`RNvyoqPYN&t^Nj z&JPahG&mK$cFwL72~|&y?y%XSDtvhcEQnTpXjtgP2xy$}am$uodY} z-wIED96 z_T2nT#Udr8&{IY#MBuk#C3YROI2UfLQ*YdTy9h>4 zoA}Z4+MX>UKlKBwSaW#e$q|bN_}&iTygY1u^HXF2 zQQp^2g;V-fGh4IQ4KBMUh}#CzTHhb2o|`Zt!)G2ubsnP4x=otZPadK%?3l|ZHf6nR z{e`;OfYv4hJ^Tp$F;Pw-To`U+3B={FD|DP|Z0oz-DWk+vvG3MLs z{n+KS9Xn9wUcTTpr{jcr7{iNs0d6D1tjZ<>d(78q(5xc6!6m)Olq_S%vBS$Q(f$eo)VcpdM( zufw-LfG`&aVVL}?w`xB}Flj-I8iy*tf^%Q)#=fJoy1kM=J!_s;NWfn z{QY|U9S#u6>@J_bi*dd2Sgod#jyO3V;{ij@lqz4jCh_63_8S#4Yet zoS`uE?=36hrxx32>`WJ8nGQV@hhWZ-QX8NsC4K8unOBv+H4vx#E`0I~(~{^#JqWM4 zAPxx2PP^+qghI$Z`W-mrWMBd=!N`a({oC^IWZHq*+_oi&xQ1ivb}_#*v}3?n^oY?` zJZc$1TEYLBcponAU%MR-Cq`JuP=F<-2D;Y=m(3KUHW1`P7SBXozG0c5D7hZqAnG*P zq$iG#^P?VFs<%`p!357yMO%kvBmpyWn74*=X9n z#-M@w5$RQQ1Hz_dt_1Q!D`r04&riSAvzPV2BsUjqTq`m^(ivfe`wy|sfAxviK5HZ5 zFKr-v=K6rhMD1d6>Mt9w5K<~(ROHPJG-7}RGFq&QpLyqD;j1jZ){eQX&h~I-Q^vKEjHA6GPY#a%3{&;MK`t-+Yhn%aX; zXx+wIV%45CjB%~~&s3+=CV$i?8ydiztqx|9;~8n&8;1CFMfC1;93H+4fimf=FP*XYv%ULM$VWc z>4Dj@h~bsC77h_6QS?lc>nDe4js$mvH%-2ww5qTe_C6;ipr`aa_$6wL^s~19Ka{Gj z!MgM&-KJ42N@gKB&EwUTfo@b;Wi@yyfTSB2H~ecBqCuk)3%=D68>iY&k285}k#d=#zp7{DHv zomPQ!#8Su;CWt$5T_i#S;()h}Tg8`4Sy^2K;kDC~2GB9sHIR|&<8#{;f^Yiieb$f6 z`v+3{J8PJNy1$0yo?K|8n;u*?tU>B=80OmnC8f@f0?e7s;m1Q*6j^pIE|gHsM$mx9~p@)Fyd6J#7~_2fd1-*tTU-4zP8; zs6FiF(ovis?nIw_heJnl!p+62OQ>Wie!d^d`-F&^JHWqwJadP6xZ@6TeeH%TiSSU7 zWa9QApAmskriOa$jW&s-zX0NXZ7%Nazd?yqi6lJU?s*72u^40%LyWyV5S7z;ss{F5H-2j=xw(u^b)y z{_4WQz$@Ye9|xa5i#UAIHsM(?w2Ush2jC?V7#rFBZ)s0@kA1IhC83tLU)*14KcFvKK+gnJI;Q~-WSi{ZT@2^ z9!P8X)-4-#eHO8KvTPo3oQEIMpg?`&Qh>E9*kgiBf31<((j#eN%*E3rs6#z66En&j zs<;}%G`crqkoZK#E?{Az&AIg#%nt^;68Ykp@5d;Rxixg8j~eJHl^F$3R=) zM@?tz2R(6WSagj_0hy&q^UMKaiBp(!lj2S%Ol)MvttD!MSLwHt(cBM}mfJD}1{X&! z+7YM+D&5j3h71dsqR@^7{O+>Oq~fyauYFpIs-9U@c85`XY9?jyTz|0;C9fT<0WLN7 zg2052FTTBTiA4VAtNd$@Vs;NKb5|f31OPzx(#3B`hVqGQ%;s-3CQvSsd2wM>JNgn{ zBf4BWKsbcHT^f#3i&I>S!vG_N_|4YNE;r7W2bWI90!V!3^vqEzIqcavTZ(fL^0-0I z@m$zZ2ZCek)#WXP6-HDl_~w>B{!)wUJ?7RVce7 zGB=`E7HdwFj%k1r7X2X?Vz`Kkxa&rmT=6rs&QrOMbx-3)wL`zlK^>x&a78SN1pynt zgVJy(QdL7HzVX(nGCr%YDcIn>7DUpdWPWLT(-24uzYkdXA=4+ zgv~&K^VfIz`b;{CAKv;I*>}lb#*cMOxl#WW7nDC^EZJGn zdH)gkc=kq5|D|np^Gfl47zzqUGT9S{Tk8DbPCuW37$;Z&oiejbP(j+z`jm@G$xa%N zMe0fK!T7o}O6Fr8W(0IK5B$u;R$nk&d$585jHH`Jr+t~*X8^1W_&*qu@3>0&Osen? zfUNJa>ca+ZO+7Hve!wH3?YhpetNhzVC}C3QA}Zv^MAJ2B;F0D>YGNZxwN5Bc!n0)In%v=H8?Rx# zPRr2T+^|WHGKNmlp$BlLud26C?VEkt!V?0WZO~8Jhn}xqCLw!InI+tBHl7*q**2Eq zU9uN#kn7TyZT|WU##uOa79J76hNUH!UG-!eA&0YfuCl<8@#tiJR|r?Bf}$MuHOou- zU0MPEDP&4pwU+^^46FI)rB~o3poAiD>N0HS zkcQJQ=0;hQt-7KUn4C11UYsTO6{$Ijw5h|Q#exu~XU_M7?yiqD>)O0FF+N~~=1e#e zgI11Ph`U0iq*SKf*^)hTP(0qI0SZ!96w7|EX+j+oCUP*_&YxYL6j<+#e|#= zoU0R%YfjIf4!bd#Nw!JgU1uluMi`XQONFw-$j&L$Q`p49=0#BFq`*^8RJdIwUy zRp;IJCoH?v2HbOg<4>xCveM+9ASU`5-9BvO{P_u=5 z*Gl5hB2T~FebU@}@ACFHqKmIrgUS~gI}NGp21Wkl3wK7jBpLJ6d0U;Ry*o`JxM|r8 z@9{bPUz3xIy6u+X^DX46`S4~S5;073=2`_(%`b@DBAs>$Z@>ru*S!VsR4D%_XP=>w zA{YIvV#W7!3f)~aAgCFB^c(I8nN6MwKkrC7zkrJ5P%2F6VTqq{7?^ct-Bs~LzyDi9orR%D_? zdbZq1FNPi5;|cC1Kyu9J{sj_LKt9Iav~jE}`#a#LI0NXY5}Y$-$@%t*Ny9!k8sv1k z&k9lA+W6v&^NX~&f;w19du{&qFbQ91>Oge(StZEp26VmtznI%eUhty2SFOc@rHC8PODEA?e-?WkJb+TLPk z-riMu`G?nGw7GP%S4)s>LgwOQ($(QpdB^#-3Aq;*tEU&yIwnOJHh?*c7m?vh;iW~= zNi?4Gq+jSome)t^WtTTYC1=;uNAG>w=d7!OY;+3U&vU8hsUffUyT#Sql5;F3(UjC> z*Qv{_n}soZ7stslMa4}gTIqznzP7|}v_8F6Wg zj=yY9xMVnm2KnY$bB;qB9?Zmr~?xg4#a+ z%p3WK97C9I&y;xYz(?J=olTa|HVyOhpQ@XtAFdXd`bpYUmzy`A2xU<0=&wV62eC)+ zC(`#8=R=hWis=yNDFh!d28Q1rBKyhWtC8qPIi%i`akpPgN0IO6OGSK3QfJgsz|T zy(E#6vJH97c!G@0MH2q#6Bnq4b8%*@db7GSk|dR40qNCAM6IQ4X>N3dTB=&a8_kl$Y671Pfk(pAoFdeR zZn@Od&wL2HMKFg*K6F+LRjjB#RP|_t7NAf^%TjZ#Ujv`CaaWLGJ~h0)x2@glanP?m ztOmJ`T3&3qkTDB(xp@Ee(eDJhlmsh=DXEL)LloUA2uK!1*oh5K?c&yx4>lDu#7ope zo|wUe$1DZx@5*yTmIPfJS620M{O*sO#~0b8(n6lsK@`u6|Dt6wPrbBn)@`9-@zqKr zVaiK$5j$>1z`B*@}gaCAoqq|*jxAKg%u;h=i zcv}_AALVEMX`G+*^mv!Kn}8;8T3N*2`ZOoWRvuv|o$tv+-fVb1_6YLZ51l^cpyKvb zOy-+&c>cR97$r#OILBWRw)+0m+Jd0!s=*X{98vS2UZ%Qe(sxSAmF_t$nLsf0)1z{0 zIj2yIu-{|YP}MQSsl>EU{iL#2y)!ib3$~wLAyK`>=X{K4UkPVxi)@ZQZZiJ0Log4g z@cLXT7dR-|#gVEOjpT@C(g!V+DngOQr8DNGFb%pI%axYx0xR!&{Cu94GiCTfURO)+ z96T$IsK1^;>O_YgSf@e+Q3}529elk}ylG_O!u{MgNEkw6_(d#ohz+7H9jU>!+L7(E z+tMpWip0F04C{_#5>BgbdpBFskW4#pPnxNZ{49h;{cm?21hh0-7~egf&%Ak$5ZtnL z@+F+XmSxq@+L1_kthgVDD7Kyh02+-~QKa<BNB!Ora|xAC1E* zuDGsM>;6k^rt*-kcw*zOeF)qMq07aBhMG9EUz74Zo~klk}qYa4Yzw|1!LLk%aCi}eP2d@04(0?^MMxDJ3)~?76S6FCGp$p^- z;}l0~F=h`YxsS_5nBvdZKnZvPYgi4AN@b0{*#xev^rGqXEh|Xjk62A>M=H*2sOwR2 zT3vEuViGL@7^dW*$~kR4U)B2g6|qd2PI8cv=tC64yzj8FAG$kug=xxxMffflmsR$1 zWONJx?8#s<1Z^9VDI&CA*MuwG>%-+Uy2taW&oBjZhg$Cl>fx*jPY1J!q5o-zr ztF|X6dR>fbgu6Q4=XiutC{{0yg(J&al6DTYeVZ{U4Da7gR$ix_T8pjWBI6;uLHfaKDWp%{i@g>;pEk9^e+ zux+BO5Z@r^brzKOoq7}i^^l#Le*E@!={*la_uZDoJs7O+H%c5E%RTTx{fCVl!SZ2n zWom>Y9!V3OTaq4YiqL$|1k4#pTbuNFPt$1cc_<=u6r^QI_#OrMs5-e>iP}py-60Kt z8~sR1BQAHk1#weD6$9Ldm||E;Z7{Z_vIYSl*xMOj`|(egTDK98X>NTgs-0r{l^!}2 zOqh@O`~x}#X!??4$m;{C!RRl6h-1TNRnTq z#eJlVfItZUI`!Pp$?Bz95xJ*sLznov-;6J*aYC$FL*xK{HQBP$PY}fn29t^KtkOy^ z@{est1GohINPUD0lzP%FJ*loGO!mwwIBrM|>hV}fOp_YGZTx2$PM-t;7oLz`RTE?` zi2)GvHMHcwyAap$|3<$V>;n2-BNafW0$YH?&_Mmj+TOM047Yo$T`(M|-n(dg{*JxB&U9Py68f4vo!?dd9~gN`luJt?w=75;=3 zxb|5RHZO;OcBvR^13kYb`pbXUfY<^CmYfy81uDLU)onVfnHst5DkrAP{w(NBhhcH3 znUsw|)gw}nsE`#mF{dW+ZbyurdmwXfmk$Y0|9h(O*6lVS#Xt>Mg%jAA3{RDpirgVO z9dzg-{~9Z8aYj)^Lgwv#Q7yeZ)4K9AP0}hd7c-CuQXe5z!cNV3M)YY$f zF&`rNT7@>5I<(-tOD)!qD+-*HlX4u0S|UtIg!ltHp(X~g;**A%)i*r~8@T+}71pj{ zG*OX=1>P(oQUo^?03f+?=ObBLM3uV$?&<}98ag3~^P!UPh>Hd<$5C9)lN=5`+ z{>Pz(?#>W}UDb2u$YUli4mdBsBT(B;HbB7RZY=PuM6)Mw{yt{KDK_s*3Kga&`)p9& zn~E(=h3VtJstJcFrn&(5NkBHlG_P@60zyH&dRUgS`JWcRGMmsyRL&-A2i9ZRP~8zC zfC0gx05Hv_WX*Y8F%-`W|9L#{77N8a*+M$JTL7!M1q9lTd-02%=kRF`*!eJVcwNQS zSzmt>m!_L_UmNFKw5{T1GeXAd63$|(CEL0)vWY^CoJ^ug&rhw{Lc!2P5}DkOHCT4U zP|+*Yp`{yP7I>7%X8zwoKc4g@PXWkslKM&Wdb=$OE_kw zH-WCC*`-gE3|C8iHNk*cb@Y)L4_^+dzMhvXnLJH)Z}~D0K8_ZLPsQn*LwZ3crKZba zWhY_c%8tffT^1e{|G%eIwWxCV-M9IFC>@=3ntK9B!ybAuNLYDWpbFDz5^zJwRhZ)E zyDlm?Z2&_V<|QjHd!X*@YenMo$bU*JOYwgKgkMa{Yi*%^KO6A%Zun9;j}TO1Ml)Ug7|*18};zSI#2Zox@=oAvT)HY?_K)o zK}MN$LBFCEI~LR6C|b8VV3wyEaj!ztZz|)?avK}Kf7Z;xxIPznY~^Fy4 z99G%aWZhXYhrswlz=8ko*5LoV8{ncIC)C+UW%L^1(0NJnVD`D&JI8TCaXuBqk!+ld zr4#mra23cjmoYC?izJIM^cEgL_d2f$-gD9oDTt2{ARZIWGI$y*(|18MgV>Z1%*{#UB-MXC9*O8Wdh*epub71 z+os{P^b-ALcu6YQ`n64@7Sw$KZ+V&|B#c?rX9J{tsix^%xiHLG&je4lH1s&PGB<{x zQ1vLJD^K?tx~g?_PQi^Yy(QO|XwhOUD73<)bIHmDidkK{2RnkK{`!q*7x|P{o8J`@ zNfwN=7bVhEZ!k$RfGUZf-mGCnBaI&htU|QQrfC$&XD9gusAniIPn);q^Hb4D>cLf2 zX9gTtF;pmlQ(KSMDuhJr=7ryLaIvUwKRnR%_nW09m)M+q>q0^{e%x|hFQYE#N(_Yo>fQ)L+VEazB%Yw-LYVk+5BqP=TUu!&zpJ zLgHFInlR5KpD0BnAk)y&bfL?}p@V6)vq}L}N4cM2Yp&Zolj1t7$y^zG?G^CxK2EjX zy>&bJ2U$Iz(b|>031-C*uUfJXhYn1yXa7+!mx*3HJb3;KjF|Vb+jH$bk`PK)BQz~> zYXPl4mNT*kgxQ_{XZr824Bq;8S$y9JVbi8!bYep8u4?SHN_-V0I~fSDBH>QY)G zF=3HD86!%)eO`s)C7jv+S^O2?0oppCQt5>fay|0Zy_ZL2^Zt#@@WC zr@X`~qZkXIKc;%1$#q{ds&3baK4FlcgX-5f<~-|X`n;=kV)aRv&8udN?WzWQ_`@#W zC}0AQKDZ3UzqCLOAH$v*U}2om({1Z6)dP9zINVpTfdO=-@I){XKD5(Ai)!P(b`lK8BJqRt94;#|QQP1L=bf6@fIFNkN7uar)~_+i z1KOX6@!<3dTpDMCX4kK0PHBN{Vbg=y2nvl;(R59|gRNL#h|Mc@zcarypt$(@5IpCW z_l52rboHxc^~S`uBpdCjKbf%FJ8$Td>;7xNvB9+W$@xkxC7AF(7dRoLge6wY{pQWn zXNN&fTM#V?Q0vBf$G`6;yp4(T&va?)ak?}F^-RVAyh$H&EcW_z6?y;dWIU+~mr*?o zGvX)n!Ef)f*Od@yFobN9711xG|3R{7(LYVVcn3hP^;swUgQyr57nYBgcnxIb|Cxr?5diHkNFM%-v^ISSYZH>_9w&KJT z2Y7ZV+iOdpUw&xmYnffb!o1oa_b&*iQM3E-Sb~H4rZ1rX;aR{|FmBx(MJyF>Z8ztv zqf6~V1$fHU|BAq?J z;M@8WpdV`?l7pQ&EvWggzYEm1>?3IEu9-eI&>H=j9+RfKvflEhn(ZH;>n%KisRCRt z&u>g|H8_{dMn3o=VA)EX`uA~~SQcHAIl2RiBlVcKJw>X3IP?sc@_&HRNhB2|ss=xZ zre>-+p2}#Y0p}9RUAkW#aku?y2gI^{cgh)6@T00`Sd3J@7VTA2w)PKOGB%=H3+Wa* zeRy~l ztU($#663ypP+?tZ`W5A>A@OjkNP(Wg=LL|U(T;~<%7<6Nv@WzP6<+&ymj8o12bc-@ zuq3Hw-Tk0lq0^qU^ebYFs#vIj+;-iObsn&*bb+^_4>|83+*Li?CnuVaDK(#%nFuKT zVuGeTtG1VhulZ7Y^nvy*g)a@J2$6}9v@!bZa^IxCCv;Vvvr8(#TaE4!jU?Z#{r9^r z`+)x#_yrmHYO{DTCi6^J?7LVG%mMx6YJ&|m5CSaix%gSF3kbaW{LLs)X~lrvh(fHh zUdjR`-@lgjqE&E^O9D+8-|;UT3Ws{-sy`o8ivyPSJ_ZeFDi_3q*Dsj#k!Sq4CxL6E zMAGD^L?S$fzr$-3`4p)(&9I1Mu^{8MCZH|3R=l;w`>w$aJnKdUzNpIqW1Et7WePdr)<7TsI*$uOA^`XR+;B1f{7FrM!Ox`?Ey8C1;S&#-B4iy|A~u+lrX;_ zx??0u;4N<*Uc)>-C1wzvyBo{>_YBqhC@}ZG-@bdGP-8Bj5cqJlY<5#SI8CeP;S9fk zoYZsr1+z@gb1{%54^C)Fb#4QH#u%ymelJnak^JSX&~)VXcy6cs#vQxNQYB--icr(4 z{9IFNu}R-?X-rPKAeD1ahdSA&x?(jRd;z@g6+<#5IL=jV=DZ-08tlCahrFL&2a&%Q z4kAi@m$F##LP{p>=Y{&q_m$)Q*R6P0tWqSretn0ckpr6m1>*jZ7n*r1`dkdeJM1K! z(?ZQ5Jq=@-4}jKv(oXhU?+-J*lc3YbU&in&h^AkOPW9?T@sK=%WKZlzplLC2@+iEzQ!wq`EjooH(@4P z>laKGL-t!Dc9eR#+6EtYyl(KBz%%}ZT_-V=NXj$_RWHe7E5*@5fcSiKUlVVCx{{U} z)BKiQK5d0P^7wq)6*)dO>UiP4HFE3cm0zaTR)lkfBAtuJU2$&f#SODW0N%My$}Zna zuZCE$%hnB9WxGvE?%G5Ky`+qyIBl?L9qAS)xy;QHS-c>T4L(AD-6c=rn*>jRPw z4f&~)6nC&`5VLLBvQbNg^qMpE13~*aZ>?C-{x6UDV+q&`O&C7+S6TN6vY0ZqrJwRw z1Lls$4d|z-HJLcq&K1~;6-~O6yWZv? zlDN=1F%#8ZJ8MTLl}?2s)rcv4jW>73|8u-I7&SgQSh$#gD>P*+Pk#JWv8K8ARBkl) z^%O~-Un0a(&0}u_!z3z-m3``7&SyxyZ8YN0sA5G`-?mAn1~Z2x*Hsc0`UyVm$M>OY z?8vQ!J>HdDPh--JsJ9bo?dPt_Mi(Q3VKjd|L2vT$jt8B$(nxsK*;!~6D+c@9Jv7N# zX!%$}{nD{d+-^3(lrplmE@shb`)l{N|EM;n>RcJLllPAz$V<%W&2HK2jQ=ReU1$Y9 zg@q%jaC#ZWC1&yo=(s-rEc+I(nX0{&JAAF#(&VpTp~-DaLyc{p#=|>yXkZW?;qlbS zp-#O1ekg3brxKC_*;BA9j6;c+hO-mDFU!KN+1C~{kd{a7ed%}q2+%3vL;NvJQk-r! zNu)4=F3)}%FW27J5K~H5w~RbpAfaxl$lFsjFmq$Q2uYRwCKtzyfZgw<=9WjJf0)8S zmSJ7(Bz_RW$l)j#z1T9gJDn3k9sU0l(xZUV>fJsx73-s0S=g=%-4KHy5l&abxa}a( zB$okmtKy}NC3;V-Un;4PdWeDulaZFpY-{7m+uLc}T(+`$H1VOkvw*sLP}oXJWzZFc zkhf5QIDh96LG&F4P~u z2HH~yKgkD^)he9ED~CDmcfM|=)&q`?h4y`wzTq^Kma54YXnoN!-g*XD01Cd5YUYA{ zmEsC^wbBN)@;caV$YL_0;BClxN7!6oIEI#8kEe3W@$|2?*9$D`R{QkF{I9nnokQw> zjcG|j(LaCB?Wv|imPWqXJwP1)VT;or2k2m^$?HTq_3H#2ZKVq>{J&o_gm3kGy`nIV zU(Q==?j4N^VSaMIc(a#iNBT#zw<2l6Hi9%{g{jL0L-}) zaxCu!o)%v>C(@^jb9h2A52Aix=oO62_CZ^J+k9@lIk9cOX!;wD{L3waI5scVoFnn^ zO_t&6FGnR&e9u_30=c*ZD0=&0Q}3^q{6@`G3)KesPaHf zCf7*vwgDm%#u>FPb#anTN!JJou#71QKc<;|kMcE&b`WH-p%qAkJD4x#unya0A2>9Z z<{dk8C!y`o%BkNph)4NFP4UA)SlFGu+?z-q*vQg1d9h zeCi!D2Lf4Hpv8KQ$lHh<4{*1Sp7@bVe$Y~!vIaa74K+Xi4q|1;AwulzTTkzmHa`3P zPBb=AB>f})Nd+858X80YmtV091ZCuMOACf)!5S__`8vz*_qtF+U}AQG`OHKpg)uy; z@4*}o`CruAa$c`cjSq$!B)^+EJJc|SqVX+iCrGh<9p5Xfhb!d?QBJ{LkF{$`dzd-z z965iUinp!i?)LbtVuoa&FIlcpyx2H)tQS2qIB;iC(@t?OD3)+d80C#xeQ1s#y1AGV z)e`4r;(u|;_)c*xR~1G4S1Z#(kQRV zxrJ0a6J{G5W^Jv4WjmiB_4j@`sSViYe$LTdkC)Pns|J6V_qiqMM7W`zeu!6nN(dPC zu+YUWiI2bDQl~jQXK?;I$-1Y|oI!Z9vsphVs}5emz__``y8HF>X}ursr6~|Xq*adc z4A+?I4IhOPq3tFYlm zmJKSBp;->LTey{TgfqNXBYnrmq&RlhP)oe;4@ks$U&}V+zuTXpiCKK0lu5?i4rTGX z+kM?w&xQee%_C>BhuT5{wReo)TEenX2LIIbW!{WXry=kWn%evf(%V<#KNnU(1@Dvkiv$c z%Dn;*p-JbfvNI2I-Oiq0ApWl`=u>BxK8Ru49ONcU3HMam`&3+7n4~oGWJC-OA_FT= z$wdP`?lIRSk`}T*Gw%z#tOaG!g1^`_rG#B=z%pD7)^QKH<&}vJ1`BJ6vhUCZGKOu} zi!qaUcOQmJp-C0IQ!6;po1V5J(SuQIMJKk=Si_4=c`8Bgo7%) z;Tsn4yWadveBC1Eekw1@U9`EtjuQG!1f%(z>0wd#%S;%l_(C^#;Wfg0(eKc|K>2o1 z!pOitJ<`qThyX*9cWlj_Oq2Q>GCbm|{kNe3oAJ9{c)n>CY(8;X2S@?WvR83px7pSI zN5%7wd&2@twxGw=6X`i&ivn&qS`(`i%YBjxr-y?0!3_GS{mN$7zY^p9u7_xxDUaC4 zWy;$Ix_2+T@^D^{m&Ct9%iVtzhhu`9JC62CsG-C23$vwCKHlv}2VIu_nf9nk(JkGk3ll@o@nk)b%H>jQ z{7D5;1&3DR%d=`MuBuit|J1~5V#!BK;e+u}1sE_ERV*t8ak&gP1>p zT``=SV(5A!N{cauRJHuYn~ZQNe~+YrR?NAh&zeV{)&9ih(}6xJd~3d~YC~gSNlue7 zV~ak!19{gR?53MI47wez!hHgNFMk%-<#11ceqW;#i@RqCN)F&Y z$4S#$&a4?tG%_i2&KH%+4a)X0T5$jm$1Az+Z?j^|Ttka~mjEJIoPvW;aA{(^iplRX zY)u}zGJgthUC<{CHQu=Qmb|OUeY&`)Hfzw+b8=xNCdK*km{wZpj)Nne#@IO{3w$*` zHS$Z1P3ZN>arx|`54}kE$Rfr;A76IBAq#(6qh!aRnQyp7p5oBwcd_HdO{+EXFQnsg zjP?r+k|T{DyMn{y9)`Uh{z`_pW@hvuriZFK@6-pC25cNl3tH(x3aeO%R3=Qyw5Gpl zGrxY&+s2RmY6)c_kD;Tt>+)OIwgv_~;dT0xa=4iOAt{C=6=vKw=^eLwQ+Grx%a)Xo z#q_7&RP)tOo=l}|Fh@zk^EPaK2(z~uwA>6tRSg3EKO+Vnhcud7@}q)xE~6KeTx%^Z zI`GTYTpFEh#o%qqmFsQ?P=p?L`EWonNi5Btw>GUS zZc(IHC|?}oV}^xapO|w6XXTx&&6na22QE0PyF7DWpM^ggwDaM6SCI{`?JyhQZLJoW zHvV1^W)ErvAux_?9(O}K1vn?-h_vw!xcT-O63m;nJgDu zGz*Y>;eb5UI74%HvyXIimT`#8h6D#Y$sgL?y#@;u%D|b7gG#8*dyk(X5U5D^9|b#! zasv;m9Q+RzP9*zFG>uTIM|WKi&#r?Gb8RpVp;;riZ;_B@0>!l`@JH)$Ux6D7ZrAzJ z6maM!6A@Fx%`NxLoYtW6>jjb0528Nodz=^iRwa3JuE4v!kaqWG)N5u#R-C(mty*0v z8V=;xaT8p=0JJ2ffyIV~)GEW+;VzYY6{z`=op5IgoZwj-kO+1n+0SK6h0odQ{WTso zasJ#qD`-OybeeB?ERStEKHpU<2R}yz9pA9>kB8X0ma9jhsXqhpHN2}3SFRD$xc{Z`E6?Sru#ku*pV3s(nE1ceBj6n5 zesk=!vULBS1&DM1+8@*kj)I*!UB5lIwJkOlMa~z0nJ!x_7`HWa@Myo$AbAc+h87(< zLgJApm*)H|Ztk{9nA7sQP>rU?Yc9vm$v1Mz!GoKV5zYQfZgdRi;V}8+X5$AXGSsix zDNZ!_KUe`D2X7yGBhs6lEkh%Zya#9wGRJo5_=qJ3rR8MF9TSxXN~;y8<_&t)|218# z<~w+vDjYNuFTl}2`t4|dH}v*5DjF=56gH$CVBo&~ zo^B2UDH|##o%=t_emp&8CTT0Fjy?C^p#w@bn*e95CBDg_!o)sg?p!%BMqj{Xui$y?(~=vUd*gfmfh48&u7-s4Qt{ei&}=t;qLUTnzQ3Z>{^D_y64-32ybAb< z+p;f_mqin&RtJsP9vqsqDc>4giw$MfE7>h{z2vi|LX;4#j}mG_0z&fg+*^y zNkSseD>g$zU_eF7raep6)n-4J#kUu=Q|MhKb(@&~$&s&WCo2`52$zM&yk-3-FZta)r-ms2JWSp_2@U~w{i$Q!nv0HeqFmQ%5LXzEA z-lsWk?QXm5Zr3o>#rxn<9C$)h1K}(YwrC4_DMQ8J{qQf$h9o<{U1bqy$;kzUQ<EVqamMeO_ax2krwMLXqH`{Ov$uA^6A!v zzos?`w<=6sri~3@FfxUW>=AvncQD-meFU12HkFA-;~X$jNb-5ygM5Lp@*~OW@Y~+o zf}6@`1?minJ!uLt@Zx?nkFWaW3m8d_7BrM)3Gy%3IAVM_u}czY5FYk3?B;a8f=Q28 zMsa=+IVXQF4=)Ntd27~g(n73}Jm^c)yoUogppG!CV5D~D!>A>qWv!}B@ctvckzZ?k z?l|m!LljXo1y40nu9=?WDstIA6USD3(#C0hx+kozJBG#u3S0^2i0hG|zTDeOk-(}I z^Hi%Rzt=@ziCv7`GoNBIpBjTn#k&_@q+%~;!1IN|xQsDXM5whBIv0nPEyvQ!KFxkz zRD{mA40gg;Po5||DN`XgaSHEmXxMoKFvciMNL8JlTW}{^ySu~k+fs?_%&IfLs{JIM z1jf{|aCY`FN4xU;j+XuWXdP2p(eATThu@r9YK%gE=++$n}fu3u;cQ~jmlM*V~#@Tg-IbUq$sxY?uu=^J! z;Bpz^r9bcvaRYKp=F^Igow*T#9u+rnXc3;6h=*Q=D>+zL%-7REfbsN9Q1bcfmv2Wc z2D7GW?~XnnSs;^<8arp^jw~U9Aj*I=55Vq_K^Rc zN-DqCtcYUEw{o0j5o_u8vDdsFlc;*Pi`uqad1~Dtq%mel2Y?`aIo-5|aQO%V6V^5s zX)Ow-Vb_Kr`TO~6Z7Ika{{iq_rib|GrBzX_I%lVLEa{i@n83(b^_h0utByS9X1ld} z7P^O8tp<9MaO3m9GQ&qcF=sK^`SelWsjleZw!_2@tq(0jBo!3QrOTu*I#8tz1^4`0 zp)pu{#dkyMw3vBJ*aAW1)jw+pO9RVsKZS;hf@cnhw~c9?h!{A7PGEm@v5TRFj*jkK zgbZQw;x&PB)@W;Z$TxEA$G4iCa*8@yvT*X2J7q$FU9V4%fZUQOxjp_t6Gihz=XDg> zgwxQb`MyF8B4HKa9vOOI^x%>uTwt+Gvd?9?`ITbO$~`djV9?T*e;xrGxS?$Q!C!C; zb?ue@Sd7N2vO4v&W9(_aih~pyba1_1%OKELA6xAoKms~&+d9VO2`>g)L~CgGAK6zG zI>~d4q1Y;j8z*{w3QuGW!Pc1vdBbgEOlgNw6D-;d{*P0Eb07DurX7)Q#aJSyf zFdjxY$TUUb*WM)O`_}McB=@rXjs2G2yE-l_wR$Q2tb9V!qujO*<)(I?6b@rtefG(2 z>C(;49-(4W41-77pjel!W7?%3^`%coa<8Ayi91Fi4276=iQevL;j_+!l;U{E9 zx+!Q*E{)pyrZAvV?z6*0fd;!bDYan-@QCvY1D%sF4qz$RdT#+ZmMb*b8&}1I8RfW3 z(-_?DGcwKV_cP+`&gUb^VNrcYT=63&SOVFC(gY=b!gaULLx|5MXX+AJa!`DMONiGu z1o+FBo~FF~TIPmPpDB^}{f_)zAZ(5@$;xM39vd4cr*#w+%lOwO4;kAUo6`LEa{bL1 z=E^>U&eQuz4Hpo46ONVy(yQYWGg;8TB>to+v_y}`r*(AIgq9a+%_BDay(CcVszc_xG#3^SV;Fy*@Si28rJenp=vHfe9> zEl?MiSkflY?4*ZI5__j>oOIiRKv|w-x5IHNw=W>;rZ7o3vq&4uW{&Sp!+FdImLYpY zMhp|HEt6nUJ)YExOqPcilU3IK5O`Je!EYxzzTU|iE-G@v9j_??opA7AGxt9OCZy2Xb8^ine#hr+(gse# z1EU7qecDOB&X((LBQ;n#;29y)KCv0J#ZNp_&l@gnU8*!lj@s7d|0`+80vG?^ z*M{p@7NPN`*9X!n#ktR*iCqQknaQ#W+39JWF^qqWoBw(W9;iMwWsG4yTsp;Z@EC8d z?j@F*+a684jpDJ|#MT>eU(suaEnaq`nM;_FFMIPywib_qN(;?!&2;$yd>~NUl-D`W zBX|x_9|GBlWG1s5^`aj%dN@*&EzeJ`V%4sor`qXo(oF2p=A@}$%IfJ_OvL_TQH`2E zO5`D>zfV_;g@)FNPWQff+&5|wuS|_Ejr2mBeph7|8p1K8E~)#?H3zh0U?2q zgh?k0(W|UKI_{A?(@fMhv|T3pY;=;Sq()s|xwSR>m?ss|fI_HoakI9qt8;z7!KalqQgf3^8}!IyeGuXvSL;z zMef!A6B+YVE=9xc?m4@m-i;_8X^YP}OAXnX5FGIA^!W~IY^6=B8LMN_rFBYOTsxB7 z`}e+td3E;`mBr;qZ?<9D!*99_x2>`9DyN!w`^0!r8o-B%cI+JK2S7vIlddM-*=}GX zTo`Ob31=DSJtMEzu0w&sBJDNAIPPAv>w82;kfB=Pc} z&kp2$Iw;=lav67LM%OG&bW<`%HE(&NzErOU_2$VXN+g{jx zsuIv>E106Sk#vg3K@L@%vqjBp0v%gz!?319K*4`{@}zl~su<+;@Oj5ziV>}^QL-)2 z*%kscY!+i5+X;&MbwOcLVjgcZCmtt%_eh;pa%8H)9XE@8B#SypL`l@%NgIc90JCYe zE*}G!n8BLA${l1`CkY!-!W(EA%8?$9ho4Dh><)khIzDDmT+7dU*UbIfRdI=j__-vk zY{^9`H>G8*z>yjyW;eHuZ*bW1@>oe!x@+Xm<{Hj=H?+j`nyaB9uMLmNaDb*-|5ER##fu?ldXS zu2rOs;~Q2Y?$*DiIwwD2pfq1Z5&QgMCa`c?o0gD1xq4shKyY)*$sxc!*mv_JejnH&C+Awu231o^kT_WT)fHN#GUY1mRzQ%8j;^#6(X%+nI%#zT8eN zfLjJwJFfs0cHj8@;Z8%M_J`T8qiVXl{{3)EMGoCb0#Ia|%`bw+z;DZE*nqmCH0Ez5!wZ@q5o+#34fq;r{QROZ3!aGS zTM_hkcmk(?yom4oM>vL}X;<^;C>X)=!`#Fs%DBrryz6C)-{6R3@VEOPkpeOs+sf^{ zz*i){=WE}x3MFR4imaa?YEeEshIBsWAB(q8zz9(%R|`FeB)3C9vg4G=2M&FngsH4g z4~LBDTMz9MB3Dq3!;m>B&b41{JMyJ3H39YT7@~lv6UKTBuZ56UJb)SFU_w$!uRdua z`~=5oEXJ0w`&9augG53|i@sBvkzi9M!=19;Q3U9*=nLEm_oL0shl+^oRAfM!yj53< zc!Q)la?9D&i*cgS`wzv|u9#6qWy2RQxol#1kQGiI4OQcM1r^2u;Wp{z|KTA`-`d8ew;Y86t4@9k)Pwi#FlMTbGxM9x6vl#^8B`V%*_wbhoy~2s4A$u;;#G!+Dvs5M z-@g%W)K!X_eLD>ICBrxdak+mFUY{Y-Z!n*OgEthEsGwtiRC=J?<(l9W;1a0Yp5*F) zkA_H&+IpQX?R7gg1AzE9YH9$?uj7&}vAW%DZs>P<{qJEqx(yg2TTWVTrvJs_!$I#o z|2*`eO{uSJSHY`h0G>%i z!J<@ml#v!wX$xw#(aH=?p#$!$xumRWkvSbE0d(zfo?y4Gw(~L!Y7YO1BPUrJS8-<- z4^4qmP&Cvk+5&1Cyna~0;BAkr6$j){bSI!cI*Bz=Zg~W@B8z%5tkI(H%#W&fve40{ z6&q%(h_R|gAs1rc0`ZL^0s09bK~S6=qF_eI;iX#oJO9OhT|r&n4l!TA&C8;($__17 zk{8Fy^RRJCLT5vo(OFXW#FdN7A>MrJ>u*%;sC}Ho zG&Q^!Kni*9^$R{h7IF=CjT_U_ccvTIUe2^ht_!u}-OjcZ&0Ml|*rn)g>kFGQg=&R-DkA)b9UL%w$hoIB?4Y-3IJVqC~+E;tJ zEYw6`8#;YOjHZ}HtSGo5Tp7@)e7T~izQ9%S3cQU-@|&=-qckL;8rckFZJUut)s4eH z*GDC~pMl@3Xh#qfpwRFcj+;|Q+7uM5@$mBc?>|V;O*%Qs%uK0ClRH+mx}{S?r+MpJ zCDEq7!xG?haOvKMyvG5>vGeA{DrBAiqjJi$2wWx`LE>!+V9TtDr22cc2rDY{Iz}fo zz~PCa0_Uj2#+BUPs6fBQ_G=Za%J@7Q40GvX`QBy91=96;<`1+eSwLcwq1G3H2k@1+ zZyV%z#1}HY@Uhm-?j&j>@8ogR;tKhraxzQvVHPP+Y}H)&R!)F%mtnrjC4aZFn7-%5 zkmxs;rrXOfeB22}vk*$GrhsQnIup@tQ^0}HxG;C(7NFxrNp{))Ag)*ZNb+~9>)F~k zzo86YJi0xX*@%F_w=4|Rtdm~I@@k#?>_4IOv@8Dd6043$h?H@|5ASsWVi$ljwcGQU+q5?hT3d4z8i$FE}+~y)s>1OA$iLBb7J_%>l zixH^8jFMwJkY(@u1;+l}_gi{+<aHe5q9>P{v8}Edz?`NH&{JF2c^U0mYYg!kko?#k zEi(Oj!<`P3QI<&v$W5$lg35<5@V=)bC)l7iN_5cEbc12@-F9QrNZ1u;({A|T9*W8LkK?bHc<{E(DS&+`G@RBVbW+Y=k^Cab$qAql}( zbuy3PGti3M%s{yWR8eYs|pHsBy&61egFXpFkG3Ysmp>j$I^X z{-y@NMfP=Ou9L6#uRUm}Z&n}xEsY(s&~6$~HZbBnnE1FaK0G=psk%RDMt3vxyZ9^p zh^^~g_j`pZ6rWj?&331kvbH1I@UavQeB2AMx2-mwS-^s_;($@gCD}a>@QC4A=T`=D ziu8CIuU_%)%;q4hq-h4wdqF1(O4fyfSB(&dOxU@jhXR)`cA%{mnkKgUeOuTFB;3|8 zcYok235DH4aPrO=((9EJCa%w>Mq-r5(i?;}u4Vg}a(Nf!m92a0PU!XYo9ecoNGaia zse(;)u7=$VNk;S*)eE^UY!|))JSf0K_cip$BCCs&%Tn3{b#ZZKLCH?Nq1A={4ZMrL zXGr)QLt(tuf{wHPGQwbQD}Q##TGl@!JO=mhTi&<2g`$- zh)%+g2Me*k*Ay^Za2R*rLLnPc7`x-)XH#V}r1^Vc2R{SZaIwhPFb6Iz^1(I3!B3H^Jq zRh^$-d0rRfNP5)rDx)|~{f724vGU*3;#wi1)Y&Siky$|dOqS6Z0v`%u=g__rbS=nh zOv4AbU&w=oaF^c><~dQvp9c$A@df&%#G2`x+QOo=9DV)Iu613MLN+$V%dgDJQ!1asyuW*8KW> z_|67-JnL;WwBin;q)|(-ISvhfSC(21eE`N5r#kKuXi+X(!|;)zibC4E;13-FjfFXJ z^LlEsZC5?f`EM#yej|0yl6>zjBC~H})8*AQzcv%T4E8Xlr8i@+N)m$yK};%is#wq7 z5IA7{@euvG#Y_^WjWq?}RsR6TcY(Y9P5rajkM5gc`=g?k6L-BB$KCn77xH&~e!!r( zMxqaJyy%P?+_v(&oWZ`%0E-x;fdhOA==F-hqwIbv{JT6~x68MW$PC2C^^%!x%vDGNKyuPU(4feuhG<7zf$G~pklbgFF?gG( zHm#Fa(8=wwQ0ubx&5nnf*WcwkxXgRo1!)2mU}m>k#8(b&s#JLt-#jmNB(wW|-?cY8 zli8sW3==j;p%nk1arV!%{F;Cy$x6d)N8R=#y*V5Hd~&BOVDE_iMml_~KoBge&8~&) z0_7oy6?MD+#(>1$GqbV_X&*~bgZGIX<3>}UB!-tXNeH{-0FkU*?b5Y-O(lCfyZY~e zUEW61VfzQ360d_H%Yf^7-8#t7j^qL-XyXSXoH3Gu!r1j=+d<)(ad_N;bWTg>W&a=q zkl%~>h*;pt^HYjqi1Q|IU5cP5SUmQ9YkZyAP3z6=kOq}doWa*q9!M+fw3vo3cfbI9 zzlb$0n|)d4{RmeAAmi9?b%A5O+hxy!F^X0X4>#`udV0#`Ofq39cHG{uGOw>~#^W+( zE{^l<0Q7>R0(%~V7URhN-+t48%SQxeV-lKl&nXX8Y^Z0_ZcdL-v5{r&{w@7 z5Mp~QgK(JvzE*ZT5PluOsg-+W%60?v-uysk^vJ%+LO4Ui1%NafH^jH{V;5(4l-^TP zOOu>tjX}P)D@XTxY03G!wBGqyUOBCOy#1X4$>3yuO5}q`k^4Q9$?8Y)*XN4w^||YjZte6IkbyGgdkOgkyJM4H zwW#Ug9o7_obh3u-NM+hD{pbZo-64Rd1w8AYex(44`kVUd>J66wNQO*R z4TOs`lFHT;#kQ+#R%9jP8@s3R%$Hl2C(XIWdMrsJ&pSn<>hIyj=m3eUC*DYKz?Z}r zXvM43#E`sz1KpSHY~?i%`?t=LQtSgHWYx>m^n2!Gs4|r|g5GM>yN;ab z9@^vxh;mUYc}DhJV^m7keF;NStf&Z4vIK+N^jW>&yN5?BVj=j}Z&vy$=EpHu;?zWu za%LK|^YPc((hs-#*0{|=ALHPpz-X(S!`tsg&}2Y2@otbScxcm`L4cI6vQ#!+NxD`V zw}9;aC4EEj86)DOF`bt6ihm_7?UI%hg1|?N*2<_UYEojf&A+)duXCz}L^bJ+K9b|K z8@d~Q5ImkeNS8w);Y2E@$J&`(cU*scKpdP{B}EnwMe{Q1rm=Rs07sq_#eECbP)q{+ zEr2A&E|e%s~-&-TnIU@6j#= z%TE>OPgy2H`W8OigOCvls(UwC0n7CI?5m=fk7#=f33fHFA7g<7;Zd1g0BZiJg)l=Z zh0N?wr!f*uRV3~kU>|V&sJND;p4F|;|9y%2b=P;|gKENAGjU6Mw6-%^S|ms|czTT7 z*m=kT$)H0ByW!lB{Q})xRM8=8ys@>;L0uJn|)~ALvcZs^uA>}|F7dA!- z;JtH$!tQm@t@Hf+Mg*%z5|bAoy>K`#ge0n23|6aVzRDaC_xCCL02vARgtFl3&?N4U zxk|>DafNia(n`N)KCflmk_(dn^D)Pc+$aOIouG!HYv zDKo%i2F8uEHCeSX39z30g3Fh}ZVZf0Rs@t7cS-i|-*s3Z=g2KvgrK>J{?^-X7n4|P zVs*^XKgMTUG0+nE?pH`IDkb$*H}Rql7EcFYsP>-CwRwH&^0qE{+tqA~9I`{xK6PMU zJe(=LT;>T+yqQpppB{0;9mH^99zCxcl2lW^BRhGAuANoY8;H;qeki;SLpm^gB+zfe zhrDA5?q8yaKj!uPm=w(weLfI3nJq|FZT1r1UDF0aca4|l$an3{A^`IICw(^xXX%kYL1 z?w>4;s}}fCC}VJ_@}nBD;^FgSvJilg*TE$g*7te7SMM*IzIreo4|<*JFo}GADXsqU z383+%gBpDVSiaY(Xt|y&sou{ zQ7}(5*5bo5*Z0I=5n7XO+@0I;5&~?HGDT*n2G}&An-whQRGBs2B^DL}!o~ouLq~|7 zANcauta0ia8EOZRu!e{5G(|-WOTBNn{q9nQ1r_dy?(cMb` zRdX_C7wONy0P0!S%WQz zw%L+fkD;r^=KQuGYrwznKBazAlg)lyw%{FMO#N-Ev+uvb66-;CcYZ|vsVQ@Um*H$1 zTP~6s`ZA**aJlZ;(a8l5-Z3e*Kddq%i?>nz2JN<+&Z7O~BN_wq6MXDrOupO42T*(w zU}ff#m&ZGEh&-|SL%$6?V#c4^P$b6+ zAZfRPNWa8wLf!*0I`Xo5>o-7sU|TBh2Dk{p&9UdwFRsdePxit7`m*}+6lzP=Uiy+00Pqfo`53Lt03$L_OVKxpU`cs=>(0$+*ZSPI z?uaZt$XQVLxp&gm4pi)$sbp6cDru~Y0pROEUFfT)gt#>PW&JNTXK2t|WHyeK+ix~O zAb%bJkO#PV+1YZ6=&=d`(_v>W^;?|LW6|W)0m$&WuagPBfUzjUa&rD@lX}d7so`mg zgMX>5u;cHC-_s|Zo3V2%bI$VLKLOPCVpqvEhzL>Jbv?sja%JxO*9e(xfImKU+y(~v z!BK-w&iVI>D4JBSWplzRC#?f%<30eSk#^EH=iO0y2V6~U5yxG5V$`0+`h6Q3Q4F2wI&( zxAXDJh`P95r#S9B0!Z|u69=-?=2R?8Tzo(x@Vkw_W9M}{Sp*(S0K6-d7@j;G3!$6c zxy%6178TbuRQ-1bAa+`_D03V-eGL+{)S4P$^p3i z!EpyBgLZBJ!_WcVIX2!LNsPpYg*DYTk5i)u&(v(fOUl8gPYBBqjnh+l^3Eg$BogF~ zXmWRdZQ3Hbv94x!1c5o!92dWnBuPOB0J5T<(jBe3^q8q}{GC@3?W2L=u^L~PdKxt> zk#U`{#iS79_ZOG>Zi+nSN7_1Yy>SCuddq zU$2A%(w+P+UC>=lI>)z~11z-KhdIp@F&2w!B~%cC4+#PnZgK1j&yeVP8gHnI_(pQH zhiSzJ8<9B;_3LA14Ay&Go=bnJN>O>I;iXrYRQn6f2xhiovGDb8>j94gL0uSteV>5_JKmm+x7p5{Hthe|Ak(zop+i3*GNqm)6V=Ib59MOwa<#ge+x^Yoxt z+rtdH9N#_nKKpBsIjy|e{1-NPT`N1;6j4j9-B!D-?rCI3x6_3n(koBj1oplLy$@++ z=9!Vc#DM4H$iiN7p_kQtx}tqNwKa{w8#@Xl?Kd{=SzT0MhkuzN^#ks;GF3-=kBd~R zYXdlsw_%H;>+uQgs#>WxI|nQWr$4uLnl)3}Q& ztEpJaN+BlVdh$2IRsr+fzpXU6FA~K5T!3|HR#(;18L&D2zXbqp$M>C~?Wk;arxOl# zQ2HMZK3(*DsafEuFdIeymk+7eB3z0!>n13)kU3o5j(zb{0R$Z2p#{FADYNew60cPh zWHJI`jcvzLDEKiRfg|;AW2vB6vU>`p<&wr1`M)H5ZhqOj3s)>&Qh* zizJJW;{G{@RA+n~J6Zf%gDXRw;?ic8tPW49U7rM&R(aQogFk73RIZp~P!`!=_&Bc~ zZX%s(@|lEPO~W_J>=xdz7gcQBh&aEKTawW#P5&pu|E+00!kvC#D)||ch(r}eTIVP*E>3p4^}RiWQb-ZSAp*NwVpZewUN)t0oQCU8x`*AB}lHqmyoD`ve9<_^%% zlbMq>9$*n>jSmGn{k=(~$W#E0HTA4hWJLG>7A5e*+LvsS)5Ulji}rnm0;%bGgaiz^ zl0J?O6mfVl1@!N}1(t-5L2S~Q%nU+pUS!C-V$?*Uz5>VPB|7|B_CX|w;YjEWW3*Zx z#*AwO=l>#Q-=Y^-#ieuJ&VPDWh1TA?*_GgR3(GHo;fQ3tsQCn@9aM*kRmOrdzbK9- zB95aS!U`m+sBEI02m>o)|HS$YWzf@T{5KVZFeu%Fio>_CdAnRQ#SzS(L$t-C>#FCG zcw*YCQ@n~)R?P-d4Msy(MSy;xJec@XrI9_MN!B(>^jV|aX* zbC~BiF`q^Nm%$t6>jbly{-WjO!C~Dhoo;F{>A_$Cv9J6$ilZi=0iRn41QCHX4cpta z3dhB8(xQ4}ZwxL8!EzO(vWh_y`eHByQP8RF*sl*Q5|tMFNy+$s84zZ6T?k#tKjf9l z@99GXoLgcB<(2~iK@UWuYjeS>(`reK133%4t28Pfy^c5(Uwsl&9X;*8S6;iM3N=sk zIjFB90ZqM4DS%0{_~*D$*Ei-J*yoA2ylp?TI3-Nrv)qbdAiDbbqcrz>WA8MyPTCDK;WU zttjeikigEZrE5T1IFSILtvWf8??V;C)6jFpKh@^_JQ__#KkaJLXa8@3bie}HM}0|m zH2QEq8}+c`sE4FIJi>G+;d&d>0hOKNzcnt}?qt2=CLlqgU@nvb{7;o5q767hT7e1u zQa$|VJbGo3RLT3X#?4mrn*UwAVkCM^8X1X1_-^VDW+^*NYpDX*Fq!GQ?Fo&E;%71# zP5x4qN?x@;p%j@ezyo~2`x$pbbH2XlQix>9_;-xgreGJ4jf}Z&e^Dz z`u{h$^A|&DXA&&oDJ>Xom;%JAV^FmKKD??BPGLMVXu31D~(KS;sT zyPxUVITTiWk*|dCp7&SMWV&eHrHa+AkG3WuU6b)#k)cwM*{!Fq4n;iJ(Hcdd!(MM? zS#}I~1QpT2$p0^h?13O+-u0KQ70dkC2y2IB3`CJx@GatkA0A#)gj|;zEiqz#Xl=pn zszG-%g>H3`4m{-t-pI;sq(^ke-Gy-imDErFYYEw?R3>XM2)pzt!B`6mzB$n?!vMpNAYcQuCVn&UW+ULyRr-5|=~lb?Zk<9W zaa}IdH_*;#{&#~^?1_O}hbn;3f+*=gx6{LCNrfUB(h=}}xt-;$CTMOxEg!xdP} zFcJ2SIJ>}c-wQYRZWT|S{}l=KeB#UVpp;YwidmS7yB>6^ox58(R`|%eYQG{N58_{n zndiTnPk2?HEVG2$)i3BApB4WvazHxLC_NouIH1JDHt@le&tuN&zGdf$oE6aZ#4a=Y zbPv)BgDe#NYBXT-{}(1LZx0M6+)^s(WV%%kbPc0T;v07jjV1$PrOexx5 Date: Tue, 14 Feb 2017 15:11:18 +0100 Subject: [PATCH 45/72] Fix notebook menu --- source/_includes/asides/ecosystem_navigation.html | 2 ++ 1 file changed, 2 insertions(+) diff --git a/source/_includes/asides/ecosystem_navigation.html b/source/_includes/asides/ecosystem_navigation.html index ed30ae7c1cb..24285c4f0bf 100755 --- a/source/_includes/asides/ecosystem_navigation.html +++ b/source/_includes/asides/ecosystem_navigation.html @@ -5,6 +5,8 @@ {% include asides/ecosystem_hadashboard_navigation.html | compact_newlines %} {% elsif url_parts[2] == "appdaemon" %} {% include asides/ecosystem_appdaemon_navigation.html | compact_newlines %} +{% elsif url_parts[2] == "notebooks" %} + {% include asides/ecosystem_notebooks_navigation.html | compact_newlines %} {% comment %} {% elsif url_parts[2] == "cookbook" %} {% include asides/cookbook_navigation.html | compact_newlines %} From d974b0377ca4408d8a6d46d14d8c5046ab9eb0d5 Mon Sep 17 00:00:00 2001 From: Fabian Affolter Date: Tue, 14 Feb 2017 15:28:18 +0100 Subject: [PATCH 46/72] Add content --- source/_ecosystem/notebooks/api.markdown | 2 +- source/_ecosystem/notebooks/database.markdown | 2 +- source/_ecosystem/notebooks/graph.markdown | 2 +- source/_ecosystem/notebooks/stats.markdown | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/source/_ecosystem/notebooks/api.markdown b/source/_ecosystem/notebooks/api.markdown index eb6d00aa6af..bf20faaecb3 100644 --- a/source/_ecosystem/notebooks/api.markdown +++ b/source/_ecosystem/notebooks/api.markdown @@ -7,6 +7,6 @@ sidebar: true comments: false sharing: true footer: true -ha_external_link: http://nbviewer.jupyter.org/github/home-assistant/home-assistant-notebooks/blob/master/home-assistant-python-api.ipynb --- +The [Python API](/developers/python_api/) allows one to create [interactive notebooks](http://nbviewer.jupyter.org/github/home-assistant/home-assistant-notebooks/blob/master/home-assistant-python-api.ipynb). diff --git a/source/_ecosystem/notebooks/database.markdown b/source/_ecosystem/notebooks/database.markdown index 9c62f5c79f7..5b0cd3cd556 100644 --- a/source/_ecosystem/notebooks/database.markdown +++ b/source/_ecosystem/notebooks/database.markdown @@ -7,6 +7,6 @@ sidebar: true comments: false sharing: true footer: true -ha_external_link: http://nbviewer.jupyter.org/github/home-assistant/home-assistant-notebooks/blob/master/database-examples.ipynb --- +The [Database example](http://nbviewer.jupyter.org/github/home-assistant/home-assistant-notebooks/blob/master/database-examples.ipynb) shows you the details about how you can work with stored values. diff --git a/source/_ecosystem/notebooks/graph.markdown b/source/_ecosystem/notebooks/graph.markdown index ce0dc91cede..257d5adf4b9 100644 --- a/source/_ecosystem/notebooks/graph.markdown +++ b/source/_ecosystem/notebooks/graph.markdown @@ -7,6 +7,6 @@ sidebar: true comments: false sharing: true footer: true -ha_external_link: http://nbviewer.jupyter.org/github/home-assistant/home-assistant-notebooks/blob/master/graph-single-sensor.ipynb --- +For graphing this [Jupyter notebook](ha_external_link: http://nbviewer.jupyter.org/github/home-assistant/home-assistant-notebooks/blob/master/graph-single-sensor.ipynb) should get you started. diff --git a/source/_ecosystem/notebooks/stats.markdown b/source/_ecosystem/notebooks/stats.markdown index 35582c9abfa..542d7dbb18c 100644 --- a/source/_ecosystem/notebooks/stats.markdown +++ b/source/_ecosystem/notebooks/stats.markdown @@ -7,6 +7,6 @@ sidebar: true comments: false sharing: true footer: true -ha_external_link: http://nbviewer.jupyter.org/github/home-assistant/home-assistant-notebooks/blob/master/database-statistics.ipynb --- +The [Statistics notebook](http://nbviewer.jupyter.org/github/home-assistant/home-assistant-notebooks/blob/master/database-statistics.ipynb) gets you started if you want to create statistical analysis of your data. From c789873c812230f5697ec02952217b270a4a42e8 Mon Sep 17 00:00:00 2001 From: Carlo Costanzo Date: Tue, 14 Feb 2017 11:20:30 -0500 Subject: [PATCH 47/72] add returned values into the documentation. (#2041) There are many phases of the moon. This sensor returns 4 of them. I listed them for automation matching. --- source/_components/sensor.moon.markdown | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/source/_components/sensor.moon.markdown b/source/_components/sensor.moon.markdown index b1795b040ce..bcd2c780121 100644 --- a/source/_components/sensor.moon.markdown +++ b/source/_components/sensor.moon.markdown @@ -23,4 +23,5 @@ To enable the moon sensor, add the following lines to your `configuration.yaml`: sensor: - platform: moon ``` - +This sensor will return one of the following values: +`Full moon`, `Last quarter`, `First quarter` or `New moon`. From 536d0b539a2ed2985f91469f8f9f60adc50470e4 Mon Sep 17 00:00:00 2001 From: "George.M" Date: Tue, 14 Feb 2017 16:23:08 +0000 Subject: [PATCH 48/72] Amended a typo for a hyperlink (#2036) Slightly tweaked formatting. Spotted a gramatical error Fixed a hyperlink error --- source/_components/sensor.sensehat.markdown | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/source/_components/sensor.sensehat.markdown b/source/_components/sensor.sensehat.markdown index 468e1a4eef5..2e0791555c2 100644 --- a/source/_components/sensor.sensehat.markdown +++ b/source/_components/sensor.sensehat.markdown @@ -36,7 +36,7 @@ Configuration variables: - 'pressure' -#### Customizing the Sense HAT data +###### Customizing the Sense HAT data **Format the sensor values** Add the following to your `sensor` @@ -102,10 +102,10 @@ group: ``` -### Directions for installing on Raspberry Pi All-In-One installer and HASSbian: +#### Directions for installing on Raspberry Pi All-In-One installer and HASSbian: Here are the steps to make the _SenseHAT_ sensor work _successfully_ with the virtual enviroment versions. -#### Install SenseHAT package to _homeassistant_venv_ +###### Install SenseHAT package to _homeassistant_venv_ ```bash # switch to the homeassistant_venv environment sudo su -s /bin/bash homeassistant @@ -115,7 +115,7 @@ source /srv/homeassistant/homeassistant_venv/bin/activate pip3 install sense-hat # be patient, this will take a long while ``` -#### Return to `pi` +###### Return to `pi` Type `exit` to quit out of the _homeassistant_venv_ back to your `pi` environment. As all of the following steps should be under the `pi` user environment. @@ -138,9 +138,10 @@ sudo addgroup homeassistant i2c sudo reboot ``` -Unfortunately enabling the SenseHAT Sensor component for a Virtual Environment install of Home-Assistant fails with errors. +Unfortunately, enabling the SenseHAT Sensor component for a Virtual Environment install of Home-Assistant fails with errors. _(The Raspberry Pi All-In-One installer and HASSbian both run Home-Assistant in an virtual environment)._ -These issues have been discussed in the repository issue (#5093)[https://github.com/home-assistant/home-assistant/issues/5093) + +These issues have been discussed in the repository issue [#5093](https://github.com/home-assistant/home-assistant/issues/5093) This fix has been tested with a clean install of: From 0f2fa10f79ad5041bbde5bd0a2b1d0cbdb6d85ca Mon Sep 17 00:00:00 2001 From: Fabian Affolter Date: Tue, 14 Feb 2017 17:41:08 +0100 Subject: [PATCH 49/72] Update the formatting and move the customization part to the end --- source/_components/sensor.sensehat.markdown | 109 ++++++++++---------- 1 file changed, 52 insertions(+), 57 deletions(-) diff --git a/source/_components/sensor.sensehat.markdown b/source/_components/sensor.sensehat.markdown index 2e0791555c2..a8c29b00756 100644 --- a/source/_components/sensor.sensehat.markdown +++ b/source/_components/sensor.sensehat.markdown @@ -35,11 +35,55 @@ Configuration variables: - 'humidity' - 'pressure' +### {% linkable_title Installation instruction for the All-In-One installer and HASSbian %} -###### Customizing the Sense HAT data +Here are the steps to make the Sense HAT sensor work with a virtual environment. -**Format the sensor values** -Add the following to your `sensor` +Install SenseHAT package. Switch to the `homeassistant_venv` directory and activate the virtual environment. + +```bash +$ sudo su -s /bin/bash homeassistant +$ source /srv/homeassistant/homeassistant_venv/bin/activate +``` + +Install the `sense-hat` module. + +```bash +$ pip3 install sense-hat +``` + +Please be patient, this will take a long while... + +Type `exit` to quit out of the _homeassistant_venv_ back to your `pi` environment. As all of the following steps should be under the `pi` user environment. + +Install the [RTIMU](https://github.com/RPi-Distro/RTIMULib) Python module: + +```bash +$ pip3 install rtimulib +``` + +Add symlink to RTIMU in `homeassistant_venv` directory. Create a symlink using the following command: + +```bash +$ ln -s /usr/lib/python3/dist-packages/RTIMU.cpython-34m-arm-linux-gnueabihf.so /srv/homeassistant/homeassistant_venv/lib/python3.4/ +``` + +Add `homeassistant` user to the `input` and the `i2c` groups. + +```bash +$ sudo addgroup homeassistant input +$ sudo addgroup homeassistant i2c +``` + +Reboot Raspberry Pi to apply changes. + +```bash +$ sudo reboot +``` + +### {% linkable_title Customizing the Sense HAT data %} + +To format the sensor values, add the following to your `sensor` entry in your `configuration.yaml` file. ```yaml # Example configuration.yaml entry @@ -63,8 +107,7 @@ sensor: unit_of_measurement: '%' ``` -**Give the values friendly names & icons** -Add the following to your `customize` +Add the following to your `customize` section to set friendly names & icons for the values. ```yaml # Example configuration.yaml entry @@ -78,10 +121,9 @@ customize: sensor.sensehat_pressure: icon: mdi:gauge friendly_name: "Pressure" -``` +``` -**Create a group** -Add the following to your `groups` +Create a group for your Sense HAT details by adding the following to your `groups` section. ```yaml # Example configuration.yaml entry @@ -93,7 +135,9 @@ group: - sensor.sensehat_humidity - sensor.sensehat_pressure ``` + Add the _sense_hat group_ a group (_Kitchen for example_) + ```yaml # Example configuration.yaml entry group: @@ -101,52 +145,3 @@ group: - group.sense_hat ``` - -#### Directions for installing on Raspberry Pi All-In-One installer and HASSbian: -Here are the steps to make the _SenseHAT_ sensor work _successfully_ with the virtual enviroment versions. - -###### Install SenseHAT package to _homeassistant_venv_ -```bash -# switch to the homeassistant_venv environment -sudo su -s /bin/bash homeassistant -source /srv/homeassistant/homeassistant_venv/bin/activate - -# install the sense-hat lib -pip3 install sense-hat -# be patient, this will take a long while -``` -###### Return to `pi` -Type `exit` to quit out of the _homeassistant_venv_ back to your `pi` environment. - -As all of the following steps should be under the `pi` user environment. - -###### Install _RTIMU_ - -```bash -# Install RTIMU to pi user environment -pip3 install rtimulib - -# Add symlink to RTIMU in _homeassistant_venv_ -# Create a symlink using the following command: -ln -s /usr/lib/python3/dist-packages/RTIMU.cpython-34m-arm-linux-gnueabihf.so /srv/homeassistant/homeassistant_venv/lib/python3.4/ - -# Add _homeassistant_ user to the _input_ and the _i2c_ groups -sudo addgroup homeassistant input -sudo addgroup homeassistant i2c - -# Reboot Raspberry Pi to apply changes -sudo reboot -``` - -Unfortunately, enabling the SenseHAT Sensor component for a Virtual Environment install of Home-Assistant fails with errors. -_(The Raspberry Pi All-In-One installer and HASSbian both run Home-Assistant in an virtual environment)._ - -These issues have been discussed in the repository issue [#5093](https://github.com/home-assistant/home-assistant/issues/5093) - -This fix has been tested with a clean install of: - -* [Raspbian Jessie - version January 2017](https://downloads.raspberrypi.org/raspbian/images/raspbian-2017-01-10/) - -and - -* [Home-Assistant 0.37.1](https://home-assistant.io/getting-started/installation-raspberry-pi-all-in-one/) From 27c7cff2fdd399d247d17f98a253b78d91c6bb6d Mon Sep 17 00:00:00 2001 From: brahmafear Date: Tue, 14 Feb 2017 13:18:03 -0500 Subject: [PATCH 50/72] Howto install pyatv. (#2042) Added sentence describing how to install pyatv package for atvremote utility. --- source/_components/media_player.apple_tv.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/_components/media_player.apple_tv.markdown b/source/_components/media_player.apple_tv.markdown index e9707203e10..9b49da82a6c 100644 --- a/source/_components/media_player.apple_tv.markdown +++ b/source/_components/media_player.apple_tv.markdown @@ -36,7 +36,7 @@ Configuration variables: - **login_id** (*Required*): An identifier used to login to the device, see below - **name** (*Optional*): The name of the device used in the frontend -In order to connect to the device you need a *login id*. The easiest way to obtain this identifier is to use the application ``atvremote``. It should be available in the same environment as you installed Home-Assistant. Just run it like this to scan for all devices (try again if a device is missing): +In order to connect to the device you need a *login id*. The easiest way to obtain this identifier is to use the application ``atvremote``. It should be available in the same environment as you installed Home-Assistant. To install this utility, run ``pip3 install --upgrade pyatv``. The run atvremote scan for all devices (try again if a device is missing): ```bash $ atvremote scan From 699523f56a19bfeb29f4caec54b7e1de293c136f Mon Sep 17 00:00:00 2001 From: Bart274 Date: Tue, 14 Feb 2017 19:18:30 +0100 Subject: [PATCH 51/72] value is needed instead of return_value (#2040) --- source/_components/switch.command_line.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/_components/switch.command_line.markdown b/source/_components/switch.command_line.markdown index f62e5bc67ca..5c8574118ea 100644 --- a/source/_components/switch.command_line.markdown +++ b/source/_components/switch.command_line.markdown @@ -59,7 +59,7 @@ switch: command_on: "/usr/bin/curl -X GET http://192.168.1.10/digital/4/1" command_off: "/usr/bin/curl -X GET http://192.168.1.10/digital/4/0" command_state: "/usr/bin/curl -X GET http://192.168.1.10/digital/4" - value_template: '{% raw %}{{ return_value == "1" }}{% endraw %}' + value_template: '{% raw %}{{ value == "1" }}{% endraw %}' friendly_name: Kitchen Lightswitch ``` From 0ef1e5a5d288b9b4775e07991567bd82024c81ea Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Tue, 14 Feb 2017 21:43:38 -0800 Subject: [PATCH 52/72] Release 0.38.3 --- _config.yml | 6 +++--- .../2017-02-11-alert-appletv-mqtt-yeelight.markdown | 9 +++++++++ 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/_config.yml b/_config.yml index 963cefc4798..f7727a097ab 100644 --- a/_config.yml +++ b/_config.yml @@ -132,9 +132,9 @@ social: # Home Assistant release details current_major_version: 0 current_minor_version: 38 -current_patch_version: 2 -date_released: 2017-02-12 +current_patch_version: 3 +date_released: 2017-02-15 # Either # or the anchor link to latest release notes in the blog post. # Must be prefixed with a # and have double quotes around it. -patch_version_notes: "#release-0382---february-12" +patch_version_notes: "#release-0383---february-15" diff --git a/source/_posts/2017-02-11-alert-appletv-mqtt-yeelight.markdown b/source/_posts/2017-02-11-alert-appletv-mqtt-yeelight.markdown index 4d3ad5d58e2..32d16dc972e 100644 --- a/source/_posts/2017-02-11-alert-appletv-mqtt-yeelight.markdown +++ b/source/_posts/2017-02-11-alert-appletv-mqtt-yeelight.markdown @@ -116,6 +116,15 @@ Bugfixes: [@balloob], [@fabaff], [@pvizeli], [@mnoorenberghe] [@Danielhiversen], - Fix MQTT discovery ([@fabaff]) - Fix Z-Wave thermostat units ([@turbokongen]) +### {% linkable_title Release 0.38.3 - February 15 %} + +- Sonos: fix losing favorite sources on disconnect ([@pvizeli]) +- Google Calendar: fix timeMin losing events ([@happyleavesaoc]) +- Fix Wink PubNub subscription ([@w1ll1am23]) +- Z-Wave: getter not to ignore label ([@andrey-git]) +- Moon: remove unit of measurement ([@fabaff]) +- MySensors: add version requirement to notify and device tracker ([@MartinHjelmare]) + ### {% linkable_title Breaking changes %} - The support for [LG webOS Smart TVs][webostv] was improved. This requires you to move `$HOME/.pylgtv` to `$HASS_CONFIG_DIR/webostv.conf` or Home Assistant will need to be paired with the TV again. - Image processing events have been renamed: `identify_face` has become `image_processing.detect_face`, `found_plate` has become `image_processing.found_plate` From 2480d5dc252c26a2985d931a69bcbb66e339aa5b Mon Sep 17 00:00:00 2001 From: phlet Date: Wed, 15 Feb 2017 01:24:51 -0500 Subject: [PATCH 53/72] Warning to check the firewall if it doesn't work. (#2048) --- source/_components/wemo.markdown | 2 ++ 1 file changed, 2 insertions(+) diff --git a/source/_components/wemo.markdown b/source/_components/wemo.markdown index cd19cf8bdc5..bef84e45338 100644 --- a/source/_components/wemo.markdown +++ b/source/_components/wemo.markdown @@ -34,3 +34,5 @@ wemo: Any WeMo devices that are not statically configured but reachable via discovery will still be added automatically. Note that if you use this, you may want to configure your router (or whatever runs your DHCP server) to force your WeMo devices to use a static IP address. Check the DHCP section of your router configuration for this ability. + +If the device doesn't seem to work and all you see is the state "unavailable" on your dashboard, check that your firewall doesn't block incoming request on port 8989 since this is the address to which the WeMo devices sends their update. From 4febae0416a2a4180be51b9c72fda08f677380f1 Mon Sep 17 00:00:00 2001 From: Fabian Affolter Date: Wed, 15 Feb 2017 08:42:47 +0100 Subject: [PATCH 54/72] Add overview page --- .../asides/developers_navigation.html | 2 +- source/developers/api.markdown | 18 ++++++++++++++++++ 2 files changed, 19 insertions(+), 1 deletion(-) create mode 100644 source/developers/api.markdown diff --git a/source/_includes/asides/developers_navigation.html b/source/_includes/asides/developers_navigation.html index d821918c437..6cbe7071ff5 100644 --- a/source/_includes/asides/developers_navigation.html +++ b/source/_includes/asides/developers_navigation.html @@ -62,7 +62,7 @@
  • - API + {% active_link /developers/api/ API %}
    • {% active_link https://dev-docs.home-assistant.io/en/dev/ Home Assistant API %}
    • {% active_link /developers/websocket_api/ Websocket API %}
    • diff --git a/source/developers/api.markdown b/source/developers/api.markdown new file mode 100644 index 00000000000..7bf8bbdc620 --- /dev/null +++ b/source/developers/api.markdown @@ -0,0 +1,18 @@ +--- +layout: page +title: "API" +description: "Home Assistant API" +date: 2017-02-15 07:00 +sidebar: true +comments: false +sharing: true +footer: true +--- + +Home Assistant prvides various APIs. For detail please refer to [Home Assistant API](https://dev-docs.home-assistant.io/en/dev/) documentation. + + * [Websocket API](/developers/websocket_api/) + * [RESTful API](/developers/rest_api/) + * [Python API](/developers/python_api/) + * [Server-sent events](/developers/server_sent_events/) + From 558bc3607aa5f3e72043ef8afc576c0778d6630c Mon Sep 17 00:00:00 2001 From: Fabian Affolter Date: Thu, 16 Feb 2017 10:02:49 +0100 Subject: [PATCH 55/72] Add note about the attribute names --- source/_components/binary_sensor.iss.markdown | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/source/_components/binary_sensor.iss.markdown b/source/_components/binary_sensor.iss.markdown index 545e4ecb5c6..8385023fdcd 100644 --- a/source/_components/binary_sensor.iss.markdown +++ b/source/_components/binary_sensor.iss.markdown @@ -28,6 +28,11 @@ Configuration variables: - **show_on_map** (*Optional*): Option to show the position of the ISS on the map. Defaults to `False`. +

      +If you set `show_on_map` `True` then the location attributes are named `latitude` and `longitude`. The default name of the location attributes is `lat` and `long` to avoid showing them on the map. +

      + + ### {% linkable_title Show position on map with camera platform %} The [generic camera platform](/components/camera.mjpeg/) offers the possibility to show the location of the ISS on Google Maps. From 44b7e5fca381dae9f53c7eab0e4f2151872d2e12 Mon Sep 17 00:00:00 2001 From: jumpkick Date: Thu, 16 Feb 2017 04:06:55 -0500 Subject: [PATCH 56/72] IP address without protocol, otherwise it errors (#2053) This is the error if you provide http://IP_ADDRESS as the example shows. ```ERROR:homeassistant.components.switch:Error while setting up platform tplink Traceback (most recent call last): File "/usr/local/lib/python3.5/dist-packages/homeassistant/helpers/entity_component.py", line 151, in _async_setup_platform entity_platform.add_entities, discovery_info File "/usr/lib/python3.5/asyncio/futures.py", line 361, in __iter__ yield self # This tells Task to wait for completion. File "/usr/lib/python3.5/asyncio/tasks.py", line 296, in _wakeup future.result() File "/usr/lib/python3.5/asyncio/futures.py", line 274, in result raise self._exception File "/usr/lib/python3.5/concurrent/futures/thread.py", line 55, in run result = self.fn(*self.args, **self.kwargs) File "/usr/local/lib/python3.5/dist-packages/homeassistant/components/switch/tplink.py", line 40, in setup_platform add_devices([SmartPlugSwitch(SmartPlug(host), name)], True) File "/home/ged/.homeassistant/deps/pyHS100/pyHS100.py", line 78, in __init__ socket.inet_pton(socket.AF_INET, ip_address) OSError: illegal IP address string passed to inet_pton``` --- source/_components/switch.tplink.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/_components/switch.tplink.markdown b/source/_components/switch.tplink.markdown index d2a6a8053cf..9d70ebb1466 100644 --- a/source/_components/switch.tplink.markdown +++ b/source/_components/switch.tplink.markdown @@ -33,7 +33,7 @@ switch: Configuration variables: -- **host** (*Required*): The IP address of your TP-Link switch, eg. `http://192.168.1.32`. +- **host** (*Required*): The IP address of your TP-Link switch, eg. `192.168.1.32`. - **name** (*Optional*): The name to use when displaying this switch. From db08498ef75fa03fe209889379c2ebb538fe08ba Mon Sep 17 00:00:00 2001 From: Benny de Leeuw Date: Thu, 16 Feb 2017 10:17:10 +0100 Subject: [PATCH 57/72] Update sensor.rflink.markdown (#2050) According to the source code of the rflink sensor component the value 'sensor_type' is required. --- source/_components/sensor.rflink.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/_components/sensor.rflink.markdown b/source/_components/sensor.rflink.markdown index 9a07fc001d3..f07d86606d0 100644 --- a/source/_components/sensor.rflink.markdown +++ b/source/_components/sensor.rflink.markdown @@ -53,7 +53,7 @@ Configuration variables: Device configuration variables: - **name** (*Optional*): Name for the device, defaults to Rflink ID. -- **sensor_type_** (*Optional*): Override automatically detected type of sensor. +- **sensor_type** (*Required*): Override automatically detected type of sensor. - **unit_of_measurement** (*Optional*): Override automatically detected unit of sensor. - **aliasses** (*Optional*): Alternative Rflink ID's this device is known by. From d69ecd8102e409d520e287438b7c925b06c4a1d0 Mon Sep 17 00:00:00 2001 From: magreen24 Date: Thu, 16 Feb 2017 12:22:24 -0500 Subject: [PATCH 58/72] Update BloomSky conditions (#2063) The rain and night conditions are binary sensors and can not be used in the main Bloomsky sensor component. I have removed them from this list and added a note referring people to the BloomSky binary sensor component. --- source/_components/sensor.bloomsky.markdown | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/source/_components/sensor.bloomsky.markdown b/source/_components/sensor.bloomsky.markdown index d085060f349..a975a0300cb 100644 --- a/source/_components/sensor.bloomsky.markdown +++ b/source/_components/sensor.bloomsky.markdown @@ -25,11 +25,9 @@ sensor: monitored_conditions: - Temperature - Humidity - - Rain - Pressure - UVIndex - Luminance - - Night - Voltage ``` @@ -38,9 +36,10 @@ Configuration variables: - **monitored_conditions** array (*Required*): The sensors that you wish to monitor on all of your devices. Select from these options: - Humidity - Luminance - - Night - Pressure - - Rain - Temperature - UVIndex - Voltage + + +More conditions are available using the [BloomSky binary sensor](/components/binary_sensor.bloomsky) component. From 2615bf9547e39cdf92ec003e2cddd7278d19626e Mon Sep 17 00:00:00 2001 From: Robbie Trencheny Date: Fri, 17 Feb 2017 20:52:23 -0800 Subject: [PATCH 59/72] Fix CLA to get code piece of QS. Closes #2067 --- source/developers/cla_sign.html | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/source/developers/cla_sign.html b/source/developers/cla_sign.html index 38e98f55b18..e6b7b2b9a9d 100644 --- a/source/developers/cla_sign.html +++ b/source/developers/cla_sign.html @@ -418,15 +418,21 @@ footer: true }); } + function qs(key) { + key = key.replace(/[*+?^$.\[\]{}()|\\\/]/g, "\\$&"); // escape RegEx meta chars + var match = location.search.match(new RegExp("[?&]"+key+"=([^&]+)(&|$)")); + return match && decodeURIComponent(match[1].replace(/\+/g, " ")); + } + $(document).ready(function(){ populateCountries("country", "region"); var spinner = new Spinner().spin(document.getElementById('spinner')); - var codeCheck = window.location.href.match(/\?code=(.*)/); + var codeCheck = qs('code'); if (codeCheck && codeCheck.length > 0) { $.ajax({ type: "POST", url: "https://cla.home-assistant.io/github/exchange", - data: JSON.stringify({"code": codeCheck[1]}), + data: JSON.stringify({"code": codeCheck}), contentType: "application/json", }).done(function(data){ var uri = window.location.toString(); From 8599732ce09a1e93cb2d91635bc84df479c170f0 Mon Sep 17 00:00:00 2001 From: Andrey Date: Sat, 18 Feb 2017 11:09:47 +0200 Subject: [PATCH 60/72] Add note regarding rake on headless mchines (#2076) --- source/developers/website.markdown | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/source/developers/website.markdown b/source/developers/website.markdown index b407ff48e0f..4dac1a51fd9 100644 --- a/source/developers/website.markdown +++ b/source/developers/website.markdown @@ -36,6 +36,12 @@ Then you can work on the documentation:

      It could be necessary that you run `rake generate` prior to `rake preview` for the very first preview.

      +

      +Site generated by `rake` is only available locally. If you are developing on a headless machine use port forwarding: +```bash +ssh -L 4000:localhost:4000 use_on_headless_machine@ip_of_headless_machine +``` +

      ### {% linkable_title Create a page %} From c13426230996ce3254ce6c020f29a8f3a7dc6cb1 Mon Sep 17 00:00:00 2001 From: Andrey Date: Sat, 18 Feb 2017 11:41:22 +0200 Subject: [PATCH 61/72] Fix markup --- source/developers/website.markdown | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/source/developers/website.markdown b/source/developers/website.markdown index 4dac1a51fd9..75632231ab2 100644 --- a/source/developers/website.markdown +++ b/source/developers/website.markdown @@ -38,9 +38,7 @@ It could be necessary that you run `rake generate` prior to `rake preview` for t

      Site generated by `rake` is only available locally. If you are developing on a headless machine use port forwarding: -```bash -ssh -L 4000:localhost:4000 use_on_headless_machine@ip_of_headless_machine -``` +`ssh -L 4000:localhost:4000 use_on_headless_machine@ip_of_headless_machine`

      ### {% linkable_title Create a page %} From b1421923027e49f5a2e01dbd14624b189f472637 Mon Sep 17 00:00:00 2001 From: Andrey Date: Sat, 18 Feb 2017 12:17:08 +0200 Subject: [PATCH 62/72] typo --- source/developers/website.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/developers/website.markdown b/source/developers/website.markdown index 75632231ab2..4650540a8d4 100644 --- a/source/developers/website.markdown +++ b/source/developers/website.markdown @@ -38,7 +38,7 @@ It could be necessary that you run `rake generate` prior to `rake preview` for t

      Site generated by `rake` is only available locally. If you are developing on a headless machine use port forwarding: -`ssh -L 4000:localhost:4000 use_on_headless_machine@ip_of_headless_machine` +`ssh -L 4000:localhost:4000 user_on_headless_machine@ip_of_headless_machine`

      ### {% linkable_title Create a page %} From 246e56dfc4b9691058eb78e9cc1970427a8a9a49 Mon Sep 17 00:00:00 2001 From: dramamoose Date: Sat, 18 Feb 2017 16:45:37 -0700 Subject: [PATCH 63/72] Add Effects (#2081) * Add Effects This applies to the changes in PR #6083 * Re-Order Page --- source/_components/light.flux_led.markdown | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/source/_components/light.flux_led.markdown b/source/_components/light.flux_led.markdown index fbede854c20..2bc1e393ecb 100644 --- a/source/_components/light.flux_led.markdown +++ b/source/_components/light.flux_led.markdown @@ -29,6 +29,9 @@ Examples of controllers: - [SUPERNIGHT WiFi Wireless LED Smart Controller](https://www.amazon.com/dp/B01JZ2SI6Q) +### {% linkable_title Configuration Details %} + + To enable those lights, add the following lines to your `configuration.yaml` file: ```yaml @@ -116,3 +119,21 @@ light: name: NAME protocol: 'ledenet' ``` + +### {% linkable_title Effects %} + +The FLUX_LED light offers a number of effects which are not included in other lighting packages. These can be selected from the front-end, or sent in the effect field of the light TURN_ON command. + +| Effect Name | Description | +|------------------------------------------------------------------------------------------------|--------------------------------------------------------------------| +| colorloop | Smoothly transitions through the rainbow | +| colorjump | Jumps through seven different rainbow colors. | +| colorstrobe | Strobes each rainbow color in a loop. | +| random | Chooses a random color by selecting random values for R, G, and B | +| red_fade, green_fade, blue_fade, yellow_fade, cyan_fade, purple_fade, white_fade | Fades between the color as indicated in the effect name and black. | +| rg_cross_fade | Fades between red and green. | +| rb_cross_fade | Fades between red and blue. | +| gb_cross_fade | Fades between green and blue | +| red_strobe, green_strobe, blue_strobe, yellow_strobe, cyan_strobe, purple_strobe, white_strobe | Strobes the color indicated by the effect name. | + + From 58a17d34b58186788f1e142947c8fa251f6a5d0d Mon Sep 17 00:00:00 2001 From: Adam Mills Date: Sat, 18 Feb 2017 18:50:34 -0500 Subject: [PATCH 64/72] Revert "Add Effects" (#2082) --- source/_components/light.flux_led.markdown | 21 --------------------- 1 file changed, 21 deletions(-) diff --git a/source/_components/light.flux_led.markdown b/source/_components/light.flux_led.markdown index 2bc1e393ecb..fbede854c20 100644 --- a/source/_components/light.flux_led.markdown +++ b/source/_components/light.flux_led.markdown @@ -29,9 +29,6 @@ Examples of controllers: - [SUPERNIGHT WiFi Wireless LED Smart Controller](https://www.amazon.com/dp/B01JZ2SI6Q) -### {% linkable_title Configuration Details %} - - To enable those lights, add the following lines to your `configuration.yaml` file: ```yaml @@ -119,21 +116,3 @@ light: name: NAME protocol: 'ledenet' ``` - -### {% linkable_title Effects %} - -The FLUX_LED light offers a number of effects which are not included in other lighting packages. These can be selected from the front-end, or sent in the effect field of the light TURN_ON command. - -| Effect Name | Description | -|------------------------------------------------------------------------------------------------|--------------------------------------------------------------------| -| colorloop | Smoothly transitions through the rainbow | -| colorjump | Jumps through seven different rainbow colors. | -| colorstrobe | Strobes each rainbow color in a loop. | -| random | Chooses a random color by selecting random values for R, G, and B | -| red_fade, green_fade, blue_fade, yellow_fade, cyan_fade, purple_fade, white_fade | Fades between the color as indicated in the effect name and black. | -| rg_cross_fade | Fades between red and green. | -| rb_cross_fade | Fades between red and blue. | -| gb_cross_fade | Fades between green and blue | -| red_strobe, green_strobe, blue_strobe, yellow_strobe, cyan_strobe, purple_strobe, white_strobe | Strobes the color indicated by the effect name. | - - From a7f2172b490c77061986ae7f7af784c92bff9581 Mon Sep 17 00:00:00 2001 From: JudgeDredd Date: Sat, 18 Feb 2017 21:03:04 -0500 Subject: [PATCH 65/72] wrong directory (#2080) following the tutorial, it seems the folder should be /srv/homeassistant, not /svr/hass --- source/getting-started/z-wave.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/getting-started/z-wave.markdown b/source/getting-started/z-wave.markdown index 1e02d9d8f31..098cadace68 100644 --- a/source/getting-started/z-wave.markdown +++ b/source/getting-started/z-wave.markdown @@ -58,7 +58,7 @@ With this installation, your `config_path` needed below will resemble: If you followed along with setting up a virtual environment, your path will be: ```bash -/srv/hass/python-openzwave/openzwave/config +/srv/homeassistant/python-openzwave/openzwave/config ``` From ce6d578576f6b557247431f62b8b204e5a3ec84b Mon Sep 17 00:00:00 2001 From: JudgeDredd Date: Sun, 19 Feb 2017 03:14:52 -0500 Subject: [PATCH 66/72] referenced python-openzwave in virtualenv (#2087) added cross-reference to python-openzwave in virtualenv. This change is dependent on https://github.com/home-assistant/home-assistant.github.io/pull/2086 --- source/getting-started/z-wave.markdown | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/source/getting-started/z-wave.markdown b/source/getting-started/z-wave.markdown index 098cadace68..bd59ff1ee4a 100644 --- a/source/getting-started/z-wave.markdown +++ b/source/getting-started/z-wave.markdown @@ -13,6 +13,10 @@ footer: true There is currently support for climate, covers, lights, locks, sensors, switches and thermostats. All will be picked up automatically after configuring this platform. +### {% linkable_title Installation in Virtualenv (python-OpenZWace) %} + +If you installed Home Assistant using a virtual environment then please read the instructions on [Installing python-OpenZWave in a virtualenv](https://home-assistant.io/getting-started/installation-virtualenv/#installing-python-openzwave-in-a-virtualenv). + ### {% linkable_title Installation %} To allow Home Assistant to talk to your Z-Wave USB stick you will have to compile the OpenZWave library and install the related [python-OpenZWave package](https://github.com/OpenZWave/python-openzwave). This can be done as follows. _(Note: The Home Assistant docker image and the All In One installer have support for Z-Wave already built-in!)_ From 201f99eac965699ff5cbf19f9c4a88ec967f6f31 Mon Sep 17 00:00:00 2001 From: JudgeDredd Date: Sun, 19 Feb 2017 03:15:18 -0500 Subject: [PATCH 67/72] clarify title for proper linking from other guides (#2086) clarify title on for "installing python-openzwave" in a virtualenv for proper linking from other guides --- source/getting-started/installation-virtualenv.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/getting-started/installation-virtualenv.markdown b/source/getting-started/installation-virtualenv.markdown index c8596abe41e..ca8e8205980 100644 --- a/source/getting-started/installation-virtualenv.markdown +++ b/source/getting-started/installation-virtualenv.markdown @@ -103,7 +103,7 @@ Upgrading Home Assistant is simple, just repeat steps 3, 5 and 6. The [autostart instructions](/getting-started/autostart/) will work just fine, just be sure to replace `/usr/bin/hass` with `/srv/homeassistant/bin/hass` and specify the `homeassistant` user where appropriate. -### {% linkable_title Installing python-openzwave %} +### {% linkable_title Installing python-openzwave in a virtualenv %} If you want to use Z-Wave devices, you will need to install `python-openzwave` in your virtualenv. This requires a small tweak to the instructions in [the Z-Wave Getting Started documentation](/getting-started/z-wave/) From 8590bba08e187492d5f263790f8e81bb2f79d562 Mon Sep 17 00:00:00 2001 From: bbrendon Date: Sun, 19 Feb 2017 00:16:35 -0800 Subject: [PATCH 68/72] incorrect definition of comments fixed. (#2085) --- source/getting-started/yaml.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/getting-started/yaml.markdown b/source/getting-started/yaml.markdown index b8eebda211f..7a5fb2cb7db 100644 --- a/source/getting-started/yaml.markdown +++ b/source/getting-started/yaml.markdown @@ -32,7 +32,7 @@ Getting the right indentation can be tricky if you're not using an editor with a You can use [YAMLLint](http://www.yamllint.com/) to check if your YAML-syntax is correct before loading it into Home Assistant which will save you some time. *Please pay attention on not putting in private data, as it is a 3rd-party website not maintained by Home Assistant.* -Lines that start with **#** are comments and are ignored by the system. +Text following a **#** are comments and are ignored by the system. The next example shows an [input_select](/components/input_select) component that uses a block collection for the options values. The other properties (like name) are specified using mappings. Note that the second line just has `threat:` with no value on the same line. Here threat is the name of the input_select and the values for it are everything nested below it. From ff30813af6330c6d5df74952380ac8ef3160db2c Mon Sep 17 00:00:00 2001 From: Greg Dowling Date: Sun, 19 Feb 2017 10:33:01 +0000 Subject: [PATCH 69/72] Correct iot class (#2078) --- source/_components/sensor.loop_energy.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/_components/sensor.loop_energy.markdown b/source/_components/sensor.loop_energy.markdown index 544a09e862b..f78fa70d7f2 100644 --- a/source/_components/sensor.loop_energy.markdown +++ b/source/_components/sensor.loop_energy.markdown @@ -10,7 +10,7 @@ footer: true logo: loop.png ha_category: Energy ha_release: 0.17 -ha_iot_class: "Local Polling" +ha_iot_class: "Cloud Push" --- From ff3aed71bdb73613c9d4297bf805edc7cf850d7d Mon Sep 17 00:00:00 2001 From: JudgeDredd Date: Sun, 19 Feb 2017 06:15:29 -0500 Subject: [PATCH 70/72] standardize use of chown as seen in other guides (#2089) --- source/getting-started/installation-virtualenv.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/getting-started/installation-virtualenv.markdown b/source/getting-started/installation-virtualenv.markdown index ca8e8205980..6bedb686379 100644 --- a/source/getting-started/installation-virtualenv.markdown +++ b/source/getting-started/installation-virtualenv.markdown @@ -44,7 +44,7 @@ This can be anywhere you want. As example we put it in `/srv`. You also need to ```bash $ sudo mkdir /srv/homeassistant -$ sudo chown homeassistant /srv/homeassistant +$ sudo chown homeassistant:homeassistant /srv/homeassistant ``` ### {% linkable_title Step 3: Become the new user %} From 6116ee55c30185e8968b13687c4a4b3bcc3be668 Mon Sep 17 00:00:00 2001 From: Andrey Date: Sun, 19 Feb 2017 19:19:34 +0200 Subject: [PATCH 71/72] Add cookbook entry for generating TLS by owning a domain. (#2077) * Initial file for getting TLS certificate * Write instruction * Fixes --- .../_cookbook/tls_domain_certificate.markdown | 65 +++++++++++++++++++ 1 file changed, 65 insertions(+) create mode 100644 source/_cookbook/tls_domain_certificate.markdown diff --git a/source/_cookbook/tls_domain_certificate.markdown b/source/_cookbook/tls_domain_certificate.markdown new file mode 100644 index 00000000000..fb0d98e31fb --- /dev/null +++ b/source/_cookbook/tls_domain_certificate.markdown @@ -0,0 +1,65 @@ +--- +layout: page +title: "Certificate for SSL/TLS via domain ownership" +description: "Configure a certificate to use with Home Assistant" +date: 2017-02-17 08:00 +sidebar: true +comments: false +sharing: true +footer: true +ha_category: Infrastructure +--- + +If your Home Assistant instance is only accessible from your local network you can still protect the communication between your browsers and the frontend with SSL/TLS. You can use [Self-sign certificate](/cookbook/tls_self_signed_certificate/) but your browser will present a warning and some https-only features might not work. + +### {% linkable_title Prerequirement for this guide %} +* Your Home Assistant instance is not exposed to the internet. If it is - use [this guide]({{site_root}}/blog/2015/12/13/setup-encryption-using-lets-encrypt/) +* You control a public domain name. The domain doesn't have to point to a site. A domain controlled by a *trusted* friend will do. (A friend you trust not to MITM you) +* Your home router supports custom DNS entries. + +### {% linkable_title Run certbot %} +```bash +$ mkdir certbot +$ cd certbot +$ wget https://dl.eff.org/certbot-auto +$ chmod a+x certbot-auto +$ sudo ./certbot-auto --manual certonly --preferred-challenges dns -d "mydomain.com" --email your@email.address +``` + +* Agree to Terms of Service +* Choose whether to share your email with Electronic Frontier Foundation. +* Agree to your IP being logged + +You will get the following text: + +```text +Please deploy a DNS TXT record under the name +_acme-challenge.mydomain.com with the following value: + +deadbeefdeadbeefdeadbeefdeadbeefdeadbeef + +Once this is deployed, +------------------------------------------------------------------------------- +Press Enter to Continue +``` + +* Deploy the value to TXT field using your domain registar. + +* Go to a site that queries domain record. For example [this one](https://mxtoolbox.com/TXTLookup.aspx) and look if it sees your brand new TXT field (Don't forget to enter the full domain: `_acme-challenge.mydomain.com`) +* Press Enter at certbot prompt. + +### {% linkable_title Make mydomain.com point to your Home Assistant instance %} +If your router uses DNSMasq (for example DDWRT) add the following line to DNSMasq options: +``` +address=/mydomain.com/ +``` + +### {% linkable_title Edit your Home Assistant configuration to use your certificates %} +```yaml +http: + api_password: YOUR_SECRET_PASSWORD + base_url: https://mydomain.com:8123 + ssl_certificate: /etc/letsencrypt/live/mydomain.com/fullchain.pem + ssl_key: /etc/letsencrypt/live/mydomain.com/privkey.pem +``` +Make sure the files are accessible by the user that runs Home Assistant, eg. `homeassistant` for a HASSbian setup. From c644446fe798cad17f48dbafb8f953bf2f05b260 Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Sun, 19 Feb 2017 12:33:48 -0800 Subject: [PATCH 72/72] Restore old config format docs --- .../customizing-devices.markdown | 72 ++----------------- 1 file changed, 7 insertions(+), 65 deletions(-) diff --git a/source/getting-started/customizing-devices.markdown b/source/getting-started/customizing-devices.markdown index e17083c63bb..1fb92f1b2a7 100644 --- a/source/getting-started/customizing-devices.markdown +++ b/source/getting-started/customizing-devices.markdown @@ -11,31 +11,26 @@ footer: true By default, all of your devices will be visible and have a default icon determined by their domain. You can customize the look and feel of your front page by altering some of these parameters. This can be done by overriding attributes of specific entities. -This format works for version 0.37+. For pre-0.37 use [Older format](https://home-assistant.io/getting-started/customizing-devices/#older-format) - -`customize` consists of a list of attribute customization blocks - ```yaml -# Example configuration.yaml entry homeassistant: name: Home unit_system: metric # etc customize: - # Only the 'entity_id' is required. All other options are optional. - - entity_id: sensor.living_room_motion + # Add an entry for each entity that you want to overwrite. + sensor.living_room_motion: hidden: true - - entity_id: thermostat.family_roomfamily_room + thermostat.family_room: entity_picture: https://example.com/images/nest.jpg friendly_name: Nest - - entity_id: switch.wemo_switch_1 + switch.wemo_switch_1: friendly_name: Toaster entity_picture: /local/toaster.jpg - - entity_id: switch.wemo_switch_2 + switch.wemo_switch_2: friendly_name: Kitchen kettle icon: mdi:kettle - - entity_id: switch.rfxtrx_switch + switch.rfxtrx_switch: assumed_state: false ``` @@ -50,62 +45,9 @@ homeassistant: | `assumed_state` | For switches with an assumed state two buttons are shown (turn off, turn on) instead of a switch. By setting `assumed_state` to `false` you will get the default switch icon. | `sensor_class` | Sets the [class of the sensor](/components/binary_sensor/), changing the device state and icon that is displayed on the UI (see below). -### {% linkable_title Advanced example %} - -You can also specify attributes for all devices in a domain, use wildcards, use several entity IDs as a list or comma separated list. - -```yaml -homeassistant: - customize: - - entity_id: sensor - icon: mdi:kettle # Give all sensor the kettle icon - - entity_id: light.family* - hidden: true # Hide all lights that have an ID starting with 'family' - - entity_id: switch.wemo_switch_1,switch.wemo_switch_2,switch.wemo_switch_3 - entity_picture: /local/toaster.jpg # Set picture on multiple devices -``` - -Either `entity_id` must be present in each customization block. - -### {% linkable_title Older format %} - -In the previous version of customize format the keys were the IDs: -```yaml -homeassistant: - name: Home - unit_system: metric - # etc - - customize: - # Only the 'entity_id' is required. All other options are optional. - sensor.living_room_motion: - hidden: true - thermostat.family_roomfamily_room: - entity_picture: https://example.com/images/nest.jpg - friendly_name: Nest - switch.wemo_switch_1: - friendly_name: Toaster - entity_picture: /local/toaster.jpg - switch.wemo_switch_2: - friendly_name: Kitchen kettle - icon: mdi:kettle - - entity_id: switch.rfxtrx_switch: - assumed_state: false -``` -This format doesn't support comma-separated IDs, wildcards or domain matching. - -The formats can't be mixed -```yaml - # NOT A VALID CONFIGURATION - customize: - sensor.living_room_motion: - hidden: true - - entity_id: thermostat.family_roomfamily_room - friendly_name: Nest -``` ### {% linkable_title Reloading customize %} - + Home Assistant offers a service to reload the core configuration while Home Assistant is running called `homeassistant/reload_core_config`. This allows you to change your customize section and see it being applied without having to restart Home Assistant. To call this service, go to the service developer tool icon service developer tools, select the service `homeassistant/reload_core_config` and click "Call Service".