From 8184ada7a15a0c32ef1128a0bcf98f1f84e3b6f1 Mon Sep 17 00:00:00 2001 From: Edward Firmo <94725493+edwardtfn@users.noreply.github.com> Date: Sun, 5 Nov 2023 09:32:22 +0100 Subject: [PATCH] Improved boot sequence Restart with hw button 10s hold - Helps with #1224 Restart Nextion if not connected to ESPHome after 30s - Helps with #1224 Prepare for future support to 921600bps --- ReleaseNotes.md | 17 +- nspanel_blueprint.yaml | 4 +- nspanel_esphome_core.yaml | 955 +++++++++++++++-------------- nspanel_eu.HMI | Bin 14899044 -> 14899044 bytes nspanel_eu.tft | Bin 7244256 -> 7246820 bytes nspanel_eu_code/Program.s.txt | 4 +- nspanel_eu_code/boot.txt | 57 +- nspanel_us.HMI | Bin 14731244 -> 14731244 bytes nspanel_us.tft | Bin 7252084 -> 7254648 bytes nspanel_us_code/Program.s.txt | 4 +- nspanel_us_code/boot.txt | 57 +- nspanel_us_land.HMI | Bin 14551129 -> 14551129 bytes nspanel_us_land.tft | Bin 7244256 -> 7246820 bytes nspanel_us_land_code/Program.s.txt | 4 +- nspanel_us_land_code/boot.txt | 57 +- 15 files changed, 654 insertions(+), 505 deletions(-) diff --git a/ReleaseNotes.md b/ReleaseNotes.md index 37d9d70..8cbe64d 100644 --- a/ReleaseNotes.md +++ b/ReleaseNotes.md @@ -46,7 +46,7 @@ Since in this update lots of input to the blueprint changed, we highly recommend - SSID - BSSID - You can still add these components by adding the file `nspanel_esphome_advanced.yaml` in your ESPHome settings as in the example bellow, but please have in mind that these are not used by the blueprint and will be using some memory of your ESPHome. + You can still add these components (except by "Exit reparse") by adding the file `nspanel_esphome_advanced.yaml` in your ESPHome settings as in the example bellow, but please have in mind that these are not used by the blueprint and will be using some memory of your ESPHome. ```yaml ... packages: @@ -58,21 +58,28 @@ packages: - nspanel_esphome_advanced.yaml # activate advanced (legacy) elements - can be useful for troubleshooting ... ``` +2. Very long press on hardware buttons +If you have a custom automation using very long hold (more than 15s) of hardware buttons it may fail as now the panel will restart with button hold for 15s.   -## Overview of all changes +## Overview of noteworthy changes 1. New Upload TFT engine -2. +2. Hardware restarts with button hold for 15s   -## Details of all changes +## Details of noteworthy changes ### 1. New Upload TFT engine We rebuilt the Upload TFT engine and now it will be using less resources from ESPHome during the transfer and, in addition, will provide more logs for troubleshooting. The original engine from Nextion component still as a fallback in case the new engine fails, but it might be removed in a future version. -### 2. +### 2. Hardware restarts with button hold for 15s +Now if you press the hardware buttons for more than 15s, the panel will act as the following: +| Button | Action | Details | +| :--: | :--: | :- | +| Left | Power cycle the screen | It can remove the need to power cycle the panel when the screen can't stablish connection to ESPHome (`Nextion is not connected!` on logs). | +| Right | Restarts the panel | It is equivalent to press the "Restart" button on the Settings page or from Home Assistant, but is available even when the Wi-Fi isn't connected or Home Assistant is out. |   ## Next topics we are currently working on diff --git a/nspanel_blueprint.yaml b/nspanel_blueprint.yaml index 05099dc..b2c9250 100644 --- a/nspanel_blueprint.yaml +++ b/nspanel_blueprint.yaml @@ -33,7 +33,7 @@ blueprint: 🎉 Roadmap can be found here: [Roadmap](https://github.com/Blackymas/NSPanel_HA_Blueprint/labels/roadmap) - ℹ️ Version: v4.1dev3 + ℹ️ Version: v4.1dev4 source_url: https://github.com/Blackymas/NSPanel_HA_Blueprint/blob/main/nspanel_blueprint.yaml domain: automation @@ -3588,7 +3588,7 @@ trigger_variables: variables: ##### GENERAL ##### - blueprint_version: '4.1dev3' + blueprint_version: '4.1dev4' date_format_temp: !input 'date_format' #Avoid breaking change for existing users with legacy type format date_format: > diff --git a/nspanel_esphome_core.yaml b/nspanel_esphome_core.yaml index a5dbff1..b707d73 100644 --- a/nspanel_esphome_core.yaml +++ b/nspanel_esphome_core.yaml @@ -12,7 +12,7 @@ substitutions: ############################################## ##### DON'T CHANGE THIS ##### - version: "4.1dev3" + version: "4.1dev4" ############################# ##### ESPHOME CONFIGURATION ##### @@ -32,22 +32,22 @@ esphome: timeout: 60s - wait_until: condition: - - lambda: !lambda return id(disp1).is_setup(); + - lambda: !lambda return disp1->is_setup(); timeout: 20s - script.execute: exit_reparse - wait_until: condition: - - lambda: !lambda return id(disp1).is_setup(); + - lambda: !lambda return disp1->is_setup(); timeout: 20s - lambda: |- static const char *const TAG = "on_boot"; - if (not id(disp1).is_setup()) { + if (not disp1->is_setup()) { ESP_LOGE(TAG, "No response from Nextion display"); ESP_LOGD(TAG, "Turn off Nextion"); - id(screen_power).turn_off(); + screen_power->turn_off(); delay(1500); ESP_LOGD(TAG, "Turn on Nextion"); - id(screen_power).turn_on(); + screen_power->turn_on(); } ##### TYPE OF ESP BOARD ##### @@ -139,90 +139,90 @@ api: then: - lambda: |- // set alarm icon on home page - id(disp1).send_command_printf("is_alarm=%i", (state == "" or state.empty()) ? 0 : 1); - id(update_alarm_icon).execute("home.bt_alarm", state.c_str()); + disp1->send_command_printf("is_alarm=%i", (state == "" or state.empty()) ? 0 : 1); + update_alarm_icon->execute("home.bt_alarm", state.c_str()); // Is page Alarm visible? - if (id(current_page).state == "alarm") // To do: This page constructor should be moved to Blueprint + if (current_page->state == "alarm") // To do: This page constructor should be moved to Blueprint { // Update alarm page id(entity_id) = entity; // Alarm page - Header - id(update_alarm_icon).execute("icon_state", state.c_str()); - id(disp1).set_component_text_printf("page_label", "%s", page_title.c_str()); - id(disp1).set_component_text_printf("code_format", "%s", code_format.c_str()); - if (code_arm_required) id(disp1).set_component_text_printf("code_arm_req", "1"); else id(disp1).set_component_text_printf("code_arm_req", "0"); + update_alarm_icon->execute("icon_state", state.c_str()); + disp1->set_component_text_printf("page_label", "%s", page_title.c_str()); + disp1->set_component_text_printf("code_format", "%s", code_format.c_str()); + if (code_arm_required) disp1->set_component_text_printf("code_arm_req", "1"); else disp1->set_component_text_printf("code_arm_req", "0"); // Alarm page - Button's icons - id(disp1).set_component_text_printf("bt_home_icon", "\uE689"); //mdi:shield-home - id(disp1).set_component_text_printf("bt_away_icon", "\uE99C"); //mdi:shield-lock - id(disp1).set_component_text_printf("bt_night_icon", "\uF827"); //mdi:shield-moon - id(disp1).set_component_text_printf("bt_vacat_icon", "\uE6BA"); //mdi:shield-airplane - id(disp1).set_component_text_printf("bt_bypass_icon", "\uE77F"); //mdi:shield-half-full - id(disp1).set_component_text_printf("bt_disarm_icon", "\uE99D"); //mdi:shield-off + disp1->set_component_text_printf("bt_home_icon", "\uE689"); //mdi:shield-home + disp1->set_component_text_printf("bt_away_icon", "\uE99C"); //mdi:shield-lock + disp1->set_component_text_printf("bt_night_icon", "\uF827"); //mdi:shield-moon + disp1->set_component_text_printf("bt_vacat_icon", "\uE6BA"); //mdi:shield-airplane + disp1->set_component_text_printf("bt_bypass_icon", "\uE77F"); //mdi:shield-half-full + disp1->set_component_text_printf("bt_disarm_icon", "\uE99D"); //mdi:shield-off // Alarm page - Button's text - id(display_wrapped_text).execute("bt_home_text", mui_alarm[0].c_str(), 10); - id(display_wrapped_text).execute("bt_away_text", mui_alarm[1].c_str(), 10); - id(display_wrapped_text).execute("bt_night_text", mui_alarm[2].c_str(), 10); - id(display_wrapped_text).execute("bt_vacat_text", mui_alarm[3].c_str(), 10); - id(display_wrapped_text).execute("bt_bypass_text", mui_alarm[4].c_str(), 10); - id(display_wrapped_text).execute("bt_disarm_text", mui_alarm[5].c_str(), 10); + display_wrapped_text->execute("bt_home_text", mui_alarm[0].c_str(), 10); + display_wrapped_text->execute("bt_away_text", mui_alarm[1].c_str(), 10); + display_wrapped_text->execute("bt_night_text", mui_alarm[2].c_str(), 10); + display_wrapped_text->execute("bt_vacat_text", mui_alarm[3].c_str(), 10); + display_wrapped_text->execute("bt_bypass_text", mui_alarm[4].c_str(), 10); + display_wrapped_text->execute("bt_disarm_text", mui_alarm[5].c_str(), 10); // Alarm page - Buttons if (supported_features & 1) // Alarm - Button - Home { - id(disp1).send_command_printf("bt_home_pic.pic=%i", (state == "armed_home") ? 43 : 42); - id(disp1).set_component_background_color("bt_home_text", (state == "armed_home") ? 19818 : 52857); - id(disp1).set_component_background_color("bt_home_icon", (state == "armed_home") ? 19818 : 52857); - id(disp1).set_component_font_color("bt_home_text", (state == "armed_home") ? 65535 : 0); - id(disp1).set_component_font_color("bt_home_icon", (state == "armed_home") ? 65535 : 0); - if (state == "armed_home") id(disp1).hide_component("bt_home"); else id(disp1).show_component("bt_home"); + disp1->send_command_printf("bt_home_pic.pic=%i", (state == "armed_home") ? 43 : 42); + disp1->set_component_background_color("bt_home_text", (state == "armed_home") ? 19818 : 52857); + disp1->set_component_background_color("bt_home_icon", (state == "armed_home") ? 19818 : 52857); + disp1->set_component_font_color("bt_home_text", (state == "armed_home") ? 65535 : 0); + disp1->set_component_font_color("bt_home_icon", (state == "armed_home") ? 65535 : 0); + if (state == "armed_home") disp1->hide_component("bt_home"); else disp1->show_component("bt_home"); } if (supported_features & 2) // Alarm - Button - Away { - id(disp1).send_command_printf("bt_away_pic.pic=%i", (state == "armed_away") ? 43 : 42); - id(disp1).set_component_background_color("bt_away_text", (state == "armed_away") ? 19818 : 52857); - id(disp1).set_component_background_color("bt_away_icon", (state == "armed_away") ? 19818 : 52857); - id(disp1).set_component_font_color("bt_away_text", (state == "armed_away") ? 65535 : 0); - id(disp1).set_component_font_color("bt_away_icon", (state == "armed_away") ? 65535 : 0); - if (state == "armed_away") id(disp1).hide_component("bt_away"); else id(disp1).show_component("bt_away"); + disp1->send_command_printf("bt_away_pic.pic=%i", (state == "armed_away") ? 43 : 42); + disp1->set_component_background_color("bt_away_text", (state == "armed_away") ? 19818 : 52857); + disp1->set_component_background_color("bt_away_icon", (state == "armed_away") ? 19818 : 52857); + disp1->set_component_font_color("bt_away_text", (state == "armed_away") ? 65535 : 0); + disp1->set_component_font_color("bt_away_icon", (state == "armed_away") ? 65535 : 0); + if (state == "armed_away") disp1->hide_component("bt_away"); else disp1->show_component("bt_away"); } if (supported_features & 4) // Alarm - Button - Night { - id(disp1).send_command_printf("bt_night_pic.pic=%i", (state == "armed_night") ? 43 : 42); - id(disp1).set_component_background_color("bt_night_text", (state == "armed_night") ? 19818 : 52857); - id(disp1).set_component_background_color("bt_night_icon", (state == "armed_night") ? 19818 : 52857); - id(disp1).set_component_font_color("bt_night_text", (state == "armed_night") ? 65535 : 0); - id(disp1).set_component_font_color("bt_night_icon", (state == "armed_night") ? 65535 : 0); - if (state == "armed_night") id(disp1).hide_component("bt_night"); else id(disp1).show_component("bt_night"); + disp1->send_command_printf("bt_night_pic.pic=%i", (state == "armed_night") ? 43 : 42); + disp1->set_component_background_color("bt_night_text", (state == "armed_night") ? 19818 : 52857); + disp1->set_component_background_color("bt_night_icon", (state == "armed_night") ? 19818 : 52857); + disp1->set_component_font_color("bt_night_text", (state == "armed_night") ? 65535 : 0); + disp1->set_component_font_color("bt_night_icon", (state == "armed_night") ? 65535 : 0); + if (state == "armed_night") disp1->hide_component("bt_night"); else disp1->show_component("bt_night"); } if (supported_features & 32) // Alarm - Button - Vacation { - id(disp1).send_command_printf("bt_vacat_pic.pic=%i", (state == "armed_vacation") ? 43 : 42); - id(disp1).set_component_background_color("bt_vacat_text", (state == "armed_vacation") ? 19818 : 52857); - id(disp1).set_component_background_color("bt_vacat_icon", (state == "armed_vacation") ? 19818 : 52857); - id(disp1).set_component_font_color("bt_vacat_text", (state == "armed_vacation") ? 65535 : 0); - id(disp1).set_component_font_color("bt_vacat_icon", (state == "armed_vacation") ? 65535 : 0); - if (state == "armed_vacation") id(disp1).hide_component("bt_vacat"); else id(disp1).show_component("bt_vacat"); + disp1->send_command_printf("bt_vacat_pic.pic=%i", (state == "armed_vacation") ? 43 : 42); + disp1->set_component_background_color("bt_vacat_text", (state == "armed_vacation") ? 19818 : 52857); + disp1->set_component_background_color("bt_vacat_icon", (state == "armed_vacation") ? 19818 : 52857); + disp1->set_component_font_color("bt_vacat_text", (state == "armed_vacation") ? 65535 : 0); + disp1->set_component_font_color("bt_vacat_icon", (state == "armed_vacation") ? 65535 : 0); + if (state == "armed_vacation") disp1->hide_component("bt_vacat"); else disp1->show_component("bt_vacat"); } if (supported_features & 16) // Alarm - Button - Custom bypass { - id(disp1).send_command_printf("bt_bypass_pic.pic=%i", (state == "armed_bypass") ? 43 : 42); - id(disp1).set_component_background_color("bt_bypass_text", (state == "armed_bypass") ? 19818 : 52857); - id(disp1).set_component_background_color("bt_bypass_icon", (state == "armed_bypass") ? 19818 : 52857); - id(disp1).set_component_font_color("bt_bypass_text", (state == "armed_bypass") ? 65535 : 0); - id(disp1).set_component_font_color("bt_bypass_icon", (state == "armed_bypass") ? 65535 : 0); - if (state == "armed_bypass") id(disp1).hide_component("bt_bypass"); else id(disp1).show_component("bt_bypass"); + disp1->send_command_printf("bt_bypass_pic.pic=%i", (state == "armed_bypass") ? 43 : 42); + disp1->set_component_background_color("bt_bypass_text", (state == "armed_bypass") ? 19818 : 52857); + disp1->set_component_background_color("bt_bypass_icon", (state == "armed_bypass") ? 19818 : 52857); + disp1->set_component_font_color("bt_bypass_text", (state == "armed_bypass") ? 65535 : 0); + disp1->set_component_font_color("bt_bypass_icon", (state == "armed_bypass") ? 65535 : 0); + if (state == "armed_bypass") disp1->hide_component("bt_bypass"); else disp1->show_component("bt_bypass"); } if ( true ) // Alarm - Button - Disarm { - id(disp1).send_command_printf("bt_disarm_pic.pic=%i", (state == "disarmed") ? 43 : 42); - id(disp1).set_component_background_color("bt_disarm_text", (state == "disarmed") ? 19818 : 52857); - id(disp1).set_component_background_color("bt_disarm_icon", (state == "disarmed") ? 19818 : 52857); - id(disp1).set_component_font_color("bt_disarm_text", (state == "disarmed") ? 65535 : 0); - id(disp1).set_component_font_color("bt_disarm_icon", (state == "disarmed") ? 65535 : 0); - if (state == "disarmed") id(disp1).hide_component("bt_disarm"); else id(disp1).show_component("bt_disarm"); + disp1->send_command_printf("bt_disarm_pic.pic=%i", (state == "disarmed") ? 43 : 42); + disp1->set_component_background_color("bt_disarm_text", (state == "disarmed") ? 19818 : 52857); + disp1->set_component_background_color("bt_disarm_icon", (state == "disarmed") ? 19818 : 52857); + disp1->set_component_font_color("bt_disarm_text", (state == "disarmed") ? 65535 : 0); + disp1->set_component_font_color("bt_disarm_icon", (state == "disarmed") ? 65535 : 0); + if (state == "disarmed") disp1->hide_component("bt_disarm"); else disp1->show_component("bt_disarm"); } } @@ -251,12 +251,12 @@ api: // Blueprint version ESP_LOGV("service.global_settings", "Check Blueprint version"); id(version_blueprint) = blueprint_version; - id(check_versions).execute(); + check_versions->execute(); // Relays ESP_LOGV("service.global_settings", "Setup relays"); - id(relay1_local).publish_state(relay1_local_control); - id(relay2_local).publish_state(relay2_local_control); + relay1_local->publish_state(relay1_local_control); + relay2_local->publish_state(relay2_local_control); id(home_relay1_icon) = relay1_icon.c_str(); id(home_relay2_icon) = relay2_icon.c_str(); id(home_relay1_icon_color) = relay1_icon_color; @@ -276,30 +276,30 @@ api: // Embedded thermostat ESP_LOGV("service.global_settings", "Load embedded thermostat"); id(is_embedded_thermostat) = embedded_climate; - id(addon_climate_set_climate_friendly_name).execute(embedded_climate_friendly_name.c_str()); + addon_climate_set_climate_friendly_name->execute(embedded_climate_friendly_name.c_str()); // Indoor temperature ESP_LOGV("service.global_settings", "Set indoor temperature"); id(embedded_indoor_temp) = embedded_indoor_temperature; id(temp_unit_fahrenheit) = temperature_unit_is_fahrenheit; - id(display_embedded_temp).execute(); + display_embedded_temp->execute(); // Confirm page ESP_LOGV("service.global_settings", "Setup confirm page"); - id(display_wrapped_text).execute("confirm.title", mui_please_confirm.c_str(), 15); + display_wrapped_text->execute("confirm.title", mui_please_confirm.c_str(), 15); // Refresh colors of global components ESP_LOGV("service.global_settings", "Refresh color of global components"); - id(disp1).set_component_font_color("home.date", id(home_date_color)); - id(disp1).set_component_font_color("home.time", id(home_time_color)); - id(disp1).set_component_font_color("home.icon_top_01", id(home_relay1_icon_color)); - id(disp1).set_component_font_color("home.icon_top_02", id(home_relay2_icon_color)); + disp1->set_component_font_color("home.date", id(home_date_color)); + disp1->set_component_font_color("home.time", id(home_time_color)); + disp1->set_component_font_color("home.icon_top_01", id(home_relay1_icon_color)); + disp1->set_component_font_color("home.icon_top_02", id(home_relay2_icon_color)); // Update home page ESP_LOGV("service.global_settings", "Update home page"); - id(page_home).execute(false); + page_home->execute(false); - ESP_LOGV("service.global_settings", "Current page: %s", id(current_page).state.c_str()); + ESP_LOGV("service.global_settings", "Current page: %s", current_page->state.c_str()); - if: condition: @@ -309,7 +309,7 @@ api: then: - lambda: |- ESP_LOGV("service.global_settings", "Boot page is visible"); - id(disp1).set_component_text_printf("boot.bluep_version", "%s", blueprint_version.c_str()); + disp1->set_component_text_printf("boot.bluep_version", "%s", blueprint_version.c_str()); - wait_until: condition: - not: @@ -332,16 +332,16 @@ api: - rtttl.play: rtttl: 'two short:d=4,o=5,b=100:16e6,16e6' - lambda: |- - ESP_LOGD("service.global_settings", "Jump to wake-up page: %s", id(wakeup_page_name).state.c_str()); - id(disp1).goto_page(id(wakeup_page_name).state.c_str()); - id(timer_reset_all).execute(id(wakeup_page_name).state.c_str()); + ESP_LOGD("service.global_settings", "Jump to wake-up page: %s", wakeup_page_name->state.c_str()); + disp1->goto_page(wakeup_page_name->state.c_str()); + timer_reset_all->execute(wakeup_page_name->state.c_str()); ##### Service to send a command "printf" directly to the display ##### - service: send_command_printf variables: cmd: string then: - - lambda: 'id(disp1).send_command_printf("%s", cmd.c_str());' + - lambda: 'disp1->send_command_printf("%s", cmd.c_str());' ##### Service to send a command "text_printf" directly to the display ##### - service: send_command_text_printf @@ -349,7 +349,7 @@ api: component: string message: string then: - - lambda: 'id(disp1).set_component_text_printf(component.c_str(), "%s", message.c_str());' + - lambda: 'disp1->set_component_text_printf(component.c_str(), "%s", message.c_str());' ##### Service to send a command "component_value (Dualstate Button)" directly to the display ##### - service: send_command_value @@ -357,26 +357,26 @@ api: component: string message: int then: - - lambda: 'id(disp1).set_component_value(component.c_str(), message);' + - lambda: 'disp1->set_component_value(component.c_str(), message);' ##### Service to send a command "hide componente" directly to the display ##### - service: send_command_hide ### unused ### variables: component: string then: - - lambda: 'id(disp1).hide_component(component.c_str());' + - lambda: 'disp1->hide_component(component.c_str());' ##### Service to send a command "show componente" directly to the display ##### - service: send_command_show ### unused ### variables: component: string then: - - lambda: 'id(disp1).show_component(component.c_str());' + - lambda: 'disp1->show_component(component.c_str());' ##### Service to send a command "show ALL componente" directly to the display ##### - service: send_command_show_all ### unused ### then: - - lambda: id(disp1).show_component("255"); + - lambda: disp1->show_component("255"); ##### Service to send a command "font color" directly to the display ##### - service: set_component_color @@ -385,7 +385,7 @@ api: foreground: int[] background: int[] then: - - lambda: id(set_component_color).execute(component, foreground, background); + - lambda: set_component_color->execute(component, foreground, background); ##### Service to show a notification-message on the screen ##### - service: notification_show @@ -396,29 +396,23 @@ api: - lambda: |- ESP_LOGV("service.notification_show", "Starting"); - id(disp1).send_command_printf("is_notification=1"); - id(disp1).goto_page("notification"); - id(disp1).set_component_text_printf("notification.notifi_label", "%s", label.c_str()); + disp1->send_command_printf("is_notification=1"); + disp1->goto_page("notification"); + disp1->set_component_text_printf("notification.notifi_label", "%s", label.c_str()); - id(display_wrapped_text).execute("notification.notifi_text01", text.c_str(), id(display_mode) == 2 ? 23 : 32); + display_wrapped_text->execute("notification.notifi_text01", text.c_str(), id(display_mode) == 2 ? 23 : 32); - id(notification_label).publish_state(label.c_str()); - id(notification_text).publish_state(text.c_str()); - id(timer_reset_all).execute(id(current_page).state.c_str()); - id(notification_unread).turn_on(); - if (id(notification_sound).state) id(buzzer).play("two short:d=4,o=5,b=100:16e6,16e6"); + notification_label->publish_state(label.c_str()); + notification_text->publish_state(text.c_str()); + timer_reset_all->execute(current_page->state.c_str()); + notification_unread->turn_on(); + if (notification_sound->state) buzzer->play("two short:d=4,o=5,b=100:16e6,16e6"); ##### Service to clear the notification ##### - service: notification_clear then: - logger.log: "Service: notification_clear" - - ¬ification_clear - lambda: |- - id(disp1).send_command_printf("is_notification=0"); - if (id(current_page).state == "home") id(disp1).hide_component("bt_notific"); - id(notification_label).publish_state(""); - id(notification_text).publish_state(""); - id(notification_unread).turn_off(); + - script.execute: notification_clear ##### Service to open information for settings-page(s) - service: open_entity_settings_page @@ -433,19 +427,19 @@ api: - lambda: |- id(entity_id) = entity; std::string cmd_page = std::string("page ") + page.c_str(); - id(disp1).send_command_printf(cmd_page.c_str()); - id(disp1).set_component_text_printf("page_label", "%s", page_label.c_str()); - id(disp1).set_component_text_printf("back_page", "%s", back_page.c_str()); + disp1->send_command_printf(cmd_page.c_str()); + disp1->set_component_text_printf("page_label", "%s", page_label.c_str()); + disp1->set_component_text_printf("back_page", "%s", back_page.c_str()); if (page == "climate") { - if (entity == "embedded_climate") id(addon_climate_set_climate_friendly_name).execute(page_label.c_str()); - id(disp1).set_component_value("embedded", (entity == "embedded_climate") ? 1 : 0); + if (entity == "embedded_climate") addon_climate_set_climate_friendly_name->execute(page_label.c_str()); + disp1->set_component_value("embedded", (entity == "embedded_climate") ? 1 : 0); } else { if ((page_icon != std::string()) and (page_icon != "")) - id(disp1).set_component_text_printf("icon_state", "%s", page_icon.c_str()); - id(set_component_color).execute("icon_state", page_icon_color, {}); + disp1->set_component_text_printf("icon_state", "%s", page_icon.c_str()); + set_component_color->execute("icon_state", page_icon_color, {}); } # Service to show a QR code on the display (ex. for WiFi password) @@ -456,9 +450,9 @@ api: show: bool then: - lambda: |- - id(disp1).set_component_text_printf("qrcode.qrcode_label", "%s", title.c_str()); - id(disp1).set_component_text_printf("qrcode.qrcode_value", "%s", qrcode.c_str()); - if (show) id(disp1).goto_page("qrcode"); + disp1->set_component_text_printf("qrcode.qrcode_label", "%s", title.c_str()); + disp1->set_component_text_printf("qrcode.qrcode_value", "%s", qrcode.c_str()); + if (show) disp1->goto_page("qrcode"); #### Service to set climate state #### - service: set_climate @@ -473,7 +467,7 @@ api: entity: string then: - lambda: |- - if (id(current_page).state == "climate") id(entity_id) = entity; + if (current_page->state == "climate") id(entity_id) = entity; - script.execute: id: set_climate @@ -502,16 +496,16 @@ api: std::string btnicon = btn_id.c_str() + std::string("icon"); std::string btntext = btn_id.c_str() + std::string("text"); std::string btnbri = btn_id.c_str() + std::string("bri"); - id(disp1).send_command_printf("%spic.pic=%i", btn_id.c_str(), btn_pic); - id(set_component_color).execute(btnicon.c_str(), btn_icon_font, btn_bg); - id(set_component_color).execute(btntext.c_str(), btn_txt_font, btn_bg); - id(set_component_color).execute(btnbri.c_str(), btn_bri_font, btn_bg); - id(disp1).set_component_text_printf(btnicon.c_str(), "%s", btn_icon.c_str()); - id(display_wrapped_text).execute(btntext.c_str(), btn_label.c_str(), 10); + disp1->send_command_printf("%spic.pic=%i", btn_id.c_str(), btn_pic); + set_component_color->execute(btnicon.c_str(), btn_icon_font, btn_bg); + set_component_color->execute(btntext.c_str(), btn_txt_font, btn_bg); + set_component_color->execute(btnbri.c_str(), btn_bri_font, btn_bg); + disp1->set_component_text_printf(btnicon.c_str(), "%s", btn_icon.c_str()); + display_wrapped_text->execute(btntext.c_str(), btn_label.c_str(), 10); if (strcmp(btn_bri_txt.c_str(), "0") != 0) - id(disp1).set_component_text_printf(btnbri.c_str(), "%s", btn_bri_txt.c_str()); + disp1->set_component_text_printf(btnbri.c_str(), "%s", btn_bri_txt.c_str()); else - id(disp1).set_component_text_printf(btnbri.c_str(), " "); + disp1->set_component_text_printf(btnbri.c_str(), " "); ##### SERVICE TO WAKE UP THE DISPLAY ##### - service: wake_up @@ -519,12 +513,12 @@ api: reset_timer: bool then: - lambda: |- - if (id(current_page).state == "screensaver") id(disp1).goto_page(id(wakeup_page_name).state.c_str()); + if (current_page->state == "screensaver") disp1->goto_page(wakeup_page_name->state.c_str()); if (reset_timer) - id(timer_reset_all).execute(id(wakeup_page_name).state.c_str()); + timer_reset_all->execute(wakeup_page_name->state.c_str()); else { - id(timer_sleep).execute(id(wakeup_page_name).state.c_str(), int(id(timeout_sleep).state)); - id(timer_dim).execute(id(wakeup_page_name).state.c_str(), int(id(timeout_dim).state)); + timer_sleep->execute(wakeup_page_name->state.c_str(), int(timeout_sleep->state)); + timer_dim->execute(wakeup_page_name->state.c_str(), int(timeout_dim->state)); } #### Service to set the entities #### @@ -540,11 +534,11 @@ api: std::string enticon = ent_id.c_str() + std::string("_pic"); std::string entlabel = ent_id.c_str() + std::string("_label"); std::string entxcen = ent_id.c_str() + std::string(".xcen=") + ent_value_xcen.c_str(); - id(disp1).set_component_text_printf(enticon.c_str(), "%s", ent_icon.c_str()); - if (strcmp(ent_icon.c_str(), "0") != 0) id(disp1).set_component_text_printf(enticon.c_str(), "%s", ent_icon.c_str()); - id(disp1).set_component_text_printf(entlabel.c_str(), "%s", ent_label.c_str()); - id(disp1).set_component_text_printf(ent_id.c_str(), "%s", ent_value.c_str()); - if (strcmp(ent_value_xcen.c_str(), "0") != 0) id(disp1).send_command_printf("%s", entxcen.c_str()); + disp1->set_component_text_printf(enticon.c_str(), "%s", ent_icon.c_str()); + if (strcmp(ent_icon.c_str(), "0") != 0) disp1->set_component_text_printf(enticon.c_str(), "%s", ent_icon.c_str()); + disp1->set_component_text_printf(entlabel.c_str(), "%s", ent_label.c_str()); + disp1->set_component_text_printf(ent_id.c_str(), "%s", ent_value.c_str()); + if (strcmp(ent_value_xcen.c_str(), "0") != 0) disp1->send_command_printf("%s", entxcen.c_str()); #### Service to populate the page Home ##### - service: page_home @@ -562,25 +556,25 @@ api: then: - lambda: |- // Notification button - id(disp1).send_command_printf("is_notification=%i", (id(notification_text).state.empty() and id(notification_label).state.empty()) ? 0 : 1); - id(disp1).set_component_text_printf("home.bt_notific", "%s", notification_icon.c_str()); - id(set_component_color).execute("home.bt_notific", id(notification_unread).state ? notification_icon_color_unread : notification_icon_color_normal, {}); + disp1->send_command_printf("is_notification=%i", (notification_text->state.empty() and notification_label->state.empty()) ? 0 : 1); + disp1->set_component_text_printf("home.bt_notific", "%s", notification_icon.c_str()); + set_component_color->execute("home.bt_notific", notification_unread->state ? notification_icon_color_unread : notification_icon_color_normal, {}); id(home_notify_icon_color_normal) = notification_icon_color_normal; id(home_notify_icon_color_unread) = notification_icon_color_unread; // QRCode button - id(disp1).send_command_printf("is_qrcode=%i", (qrcode) ? 1 : 0); - id(disp1).set_component_text_printf("home.bt_qrcode", "%s", qrcode_icon.c_str()); - id(set_component_color).execute("home.bt_qrcode", qrcode_icon_color, {}); + disp1->send_command_printf("is_qrcode=%i", (qrcode) ? 1 : 0); + disp1->set_component_text_printf("home.bt_qrcode", "%s", qrcode_icon.c_str()); + set_component_color->execute("home.bt_qrcode", qrcode_icon_color, {}); // Entities pages button - id(disp1).send_command_printf("is_entities=%i", (entities_pages) ? 1 : 0); - id(disp1).set_component_text_printf("home.bt_entities", "%s", entities_pages_icon.c_str()); - id(set_component_color).execute("home.bt_entities", entities_pages_icon_color, {}); + disp1->send_command_printf("is_entities=%i", (entities_pages) ? 1 : 0); + disp1->set_component_text_printf("home.bt_entities", "%s", entities_pages_icon.c_str()); + set_component_color->execute("home.bt_entities", entities_pages_icon_color, {}); // Alarm button - id(disp1).send_command_printf("is_alarm=%i", (alarm_state == "" or alarm_state.empty()) ? 0 : 1); - id(update_alarm_icon).execute("home.bt_alarm", alarm_state.c_str()); + disp1->send_command_printf("is_alarm=%i", (alarm_state == "" or alarm_state.empty()) ? 0 : 1); + update_alarm_icon->execute("home.bt_alarm", alarm_state.c_str()); #### Service to populate the page Settings ##### - service: page_settings @@ -592,10 +586,10 @@ api: dim: string then: - lambda: |- - if (not reboot.empty()) id(disp1).set_component_text_printf("settings.lbl_reboot", " %s", reboot.c_str()); - id(disp1).set_component_text_printf("settings.lbl_brightness", " %s", brightness.c_str()); - id(display_wrapped_text).execute("settings.lbl_bright", bright.c_str(), id(display_mode) == 2 ? 25 : 10); - id(display_wrapped_text).execute("settings.lbl_dim", dim.c_str(), id(display_mode) == 2 ? 25 : 10); + if (not reboot.empty()) disp1->set_component_text_printf("settings.lbl_reboot", " %s", reboot.c_str()); + disp1->set_component_text_printf("settings.lbl_brightness", " %s", brightness.c_str()); + display_wrapped_text->execute("settings.lbl_bright", bright.c_str(), id(display_mode) == 2 ? 25 : 10); + display_wrapped_text->execute("settings.lbl_dim", dim.c_str(), id(display_mode) == 2 ? 25 : 10); #### Service to populate the media player page ##### - service: media_player @@ -613,60 +607,60 @@ api: supported_features: int then: - lambda: |- - if (id(current_page).state == "media_player") + if (current_page->state == "media_player") { id(entity_id) = entity; - id(disp1).set_component_text_printf("page_label", "%s", friendly_name.c_str()); - id(display_wrapped_text).execute("track", media_title.c_str(), id(display_mode) == 2 ? 16 : 27); - id(display_wrapped_text).execute("artist", media_artist.c_str(), id(display_mode) == 2 ? 26 : 40); + disp1->set_component_text_printf("page_label", "%s", friendly_name.c_str()); + display_wrapped_text->execute("track", media_title.c_str(), id(display_mode) == 2 ? 16 : 27); + display_wrapped_text->execute("artist", media_artist.c_str(), id(display_mode) == 2 ? 26 : 40); // on/off button if (supported_features & 128 and state == "off") //TURN_ON { - id(set_component_color).execute("bt_on_off", { 65535 }, {} ); - id(disp1).show_component("bt_on_off"); + set_component_color->execute("bt_on_off", { 65535 }, {} ); + disp1->show_component("bt_on_off"); } else if (supported_features & 256 and state != "off") //TURN_OFF { - id(set_component_color).execute("bt_on_off", { 10597 }, {} ); - id(disp1).show_component("bt_on_off"); + set_component_color->execute("bt_on_off", { 10597 }, {} ); + disp1->show_component("bt_on_off"); } - else id(disp1).hide_component("bt_on_off"); + else disp1->hide_component("bt_on_off"); // play/pause button if ((supported_features & 512 or supported_features & 16384) and state != "playing" and state != "off") //PLAY_MEDIA+PLAY { - id(disp1).set_component_text_printf("bt_play_pause", "%s", "\uE409"); // mdi:play - id(disp1).show_component("bt_play_pause"); + disp1->set_component_text_printf("bt_play_pause", "%s", "\uE409"); // mdi:play + disp1->show_component("bt_play_pause"); } else if (supported_features & 1 and state == "playing" ) //PAUSE { - id(disp1).set_component_text_printf("bt_play_pause", "%s", "\uE3E3"); // mdi:pause - id(disp1).show_component("bt_play_pause"); + disp1->set_component_text_printf("bt_play_pause", "%s", "\uE3E3"); // mdi:pause + disp1->show_component("bt_play_pause"); } - else id(disp1).hide_component("bt_play_pause"); + else disp1->hide_component("bt_play_pause"); // bt_prev button - PREVIOUS_TRACK - if (supported_features & 16 and state != "off") id(disp1).show_component("bt_prev"); else id(disp1).hide_component("bt_prev"); + if (supported_features & 16 and state != "off") disp1->show_component("bt_prev"); else disp1->hide_component("bt_prev"); // bt_next button - NEXT_TRACK - if (supported_features & 32 and state != "off") id(disp1).show_component("bt_next"); else id(disp1).hide_component("bt_next"); + if (supported_features & 32 and state != "off") disp1->show_component("bt_next"); else disp1->hide_component("bt_next"); // Stop button - STOP - //if (supported_features & 4096 and (state == "playing" or state == "paused")) id(disp1).show_component("bt_stop"); else id(disp1).hide_component("bt_stop"); + //if (supported_features & 4096 and (state == "playing" or state == "paused")) disp1->show_component("bt_stop"); else disp1->hide_component("bt_stop"); // mute/unmute button - VOLUME_MUTE - id(disp1).set_component_value("is_muted", (is_volume_muted) ? 1 : 0); + disp1->set_component_value("is_muted", (is_volume_muted) ? 1 : 0); if (supported_features & 8 and is_volume_muted) // unmute { - id(disp1).set_component_text_printf("bt_mute", "%s", "\uEE07"); // mdi:volume-variant-off - id(disp1).show_component("bt_mute"); + disp1->set_component_text_printf("bt_mute", "%s", "\uEE07"); // mdi:volume-variant-off + disp1->show_component("bt_mute"); } else if (supported_features & 8) // mute { - id(disp1).set_component_text_printf("bt_mute", "%s", "\uE57E"); // mdi:volume-low - id(disp1).show_component("bt_mute"); + disp1->set_component_text_printf("bt_mute", "%s", "\uE57E"); // mdi:volume-low + disp1->show_component("bt_mute"); } - else id(disp1).hide_component("bt_mute"); + else disp1->hide_component("bt_mute"); // VOLUME_SET if (supported_features & 4) @@ -674,20 +668,20 @@ api: if (volume_level != id(last_volume_level)) { id(last_volume_level) = volume_level; - id(disp1).set_component_text_printf("vol_text", "%i%%", volume_level); - id(disp1).set_component_value("vol_slider", volume_level); + disp1->set_component_text_printf("vol_text", "%i%%", volume_level); + disp1->set_component_value("vol_slider", volume_level); } - id(disp1).show_component("vol_slider"); - id(disp1).show_component("bt_vol_down"); - id(disp1).show_component("bt_vol_up"); - id(disp1).show_component("vol_text"); + disp1->show_component("vol_slider"); + disp1->show_component("bt_vol_down"); + disp1->show_component("bt_vol_up"); + disp1->show_component("vol_text"); } else { - id(disp1).hide_component("vol_slider"); - id(disp1).hide_component("bt_vol_down"); - id(disp1).hide_component("bt_vol_up"); - id(disp1).hide_component("vol_text"); + disp1->hide_component("vol_slider"); + disp1->hide_component("bt_vol_down"); + disp1->hide_component("bt_vol_up"); + disp1->hide_component("vol_text"); } if (media_duration > 0) @@ -696,20 +690,20 @@ api: { id(last_media_duration) = media_duration; id(last_media_position) = media_position; - id(disp1).set_component_value("prg_current", int(round(min(media_position + media_position_delta, media_duration)))); + disp1->set_component_value("prg_current", int(round(min(media_position + media_position_delta, media_duration)))); } - id(disp1).set_component_value("prg_total", int(round(media_duration))); - id(disp1).send_command_printf("prg_timer.en=%i", (state == "playing") ? 1 : 0); - id(disp1).show_component("time_current"); - id(disp1).show_component("time_total"); - id(disp1).show_component("time_progress"); + disp1->set_component_value("prg_total", int(round(media_duration))); + disp1->send_command_printf("prg_timer.en=%i", (state == "playing") ? 1 : 0); + disp1->show_component("time_current"); + disp1->show_component("time_total"); + disp1->show_component("time_progress"); } else { - id(disp1).send_command_printf("prg_timer.en=0"); - id(disp1).hide_component("time_current"); - id(disp1).hide_component("time_total"); - id(disp1).hide_component("time_progress"); + disp1->send_command_printf("prg_timer.en=0"); + disp1->hide_component("time_current"); + disp1->hide_component("time_total"); + disp1->hide_component("time_progress"); } } @@ -718,57 +712,12 @@ display: - id: disp1 platform: nextion uart_id: tf_uart - #tft_url: ${nextion_update_url} # Should come back when esp-idf Nextion is available on_page: # I couldn't make this trigger to work, so used text_sensor nspanelevent and localevent instead lambda: |- ESP_LOGW("display.disp1.on_page", "NEXTION PAGE CHANGED"); ESP_LOGW("display.disp1.on_page", "New page: %i", int(x)); on_setup: - then: - - lambda: |- - ESP_LOGV("display.disp1.on_setup", "Nextion starting"); - if (id(current_page).state != "boot") id(disp1).goto_page("boot"); - id(set_brightness).execute(100); - id(disp1).send_command_printf("bkcmd=3"); - id(disp1).set_component_text_printf("boot.esph_version", "%s", "${version}"); // ### esphome-version ### - id(disp1).show_component("bt_reboot"); - id(timer_reset_all).execute("boot"); - ESP_LOGV("display.disp1.on_setup", "Wait for API"); - - wait_until: - api.connected - - lambda: |- - ESP_LOGV("display.disp1.on_setup", "Publish IP address"); - id(disp1).set_component_text_printf("boot.ip_addr", "%s", network::get_ip_address().str().c_str()); - id(set_brightness).execute(100); - ESP_LOGV("display.disp1.on_setup", "Report to Home Assistant"); - auto ha_event = new esphome::api::CustomAPIDevice(); - ha_event->fire_homeassistant_event("esphome.nspanel_ha_blueprint", - { - {"type", "boot"}, - {"step", "start"} - }); - delay(1000); - // Set dimming values - id(display_brightness).publish_state(id(display_brightness_global)); - id(display_dim_brightness).publish_state(id(display_dim_brightness_global)); - id(disp1).send_command_printf("brightness=%i", id(display_brightness_global)); - id(disp1).send_command_printf("settings.brightslider.val=%i", id(display_brightness_global)); - id(disp1).send_command_printf("brightness_dim=%i", id(display_dim_brightness_global)); - id(disp1).send_command_printf("settings.dimslider.val=%i", id(display_dim_brightness_global)); - id(set_brightness).execute(id(display_brightness_global)); - id(nextion_init).publish_state(true); - ESP_LOGV("display.disp1.on_setup", "Report to Home Assistant"); - //auto ha_event = new esphome::api::CustomAPIDevice(); - ha_event->fire_homeassistant_event("esphome.nspanel_ha_blueprint", - { - {"type", "boot"}, - {"step", "nextion_init"} - }); - id(home_relay1_icon) = "\uE3A5"; - id(home_relay1_icon) = "\uE3A8"; - id(timer_reset_all).execute("boot"); - - *notification_clear - - logger.log: "Nextion start - Done!" + - script.execute: boot_sequence ##### START - GLOBALS CONFIGURATION ##### globals: @@ -920,7 +869,7 @@ binary_sensor: - logger.log: "Left button - Long click" - script.execute: id: ha_button - page: !lambda return id(current_page).state.c_str(); + page: !lambda return current_page->state.c_str(); component: "hw_bt_left" command: "long_click" - timing: &short_click-timing @@ -942,9 +891,19 @@ binary_sensor: - switch.toggle: relay_1 - script.execute: id: ha_button - page: !lambda return id(current_page).state.c_str(); + page: !lambda return current_page->state.c_str(); component: "hw_bt_left" command: "short_click" + - timing: &hold_to_restart-timing + - ON for at least 15.0s + then: + - switch.turn_off: screen_power + - delay: 5s + - switch.turn_on: screen_power + - delay: 2s + - lambda: disp1->soft_reset(); + - delay: 2s + - script.execute: boot_sequence ##### RIGHT BUTTON BELOW DISPLAY TO TOGGLE RELAY ##### - name: ${device_name} Right Button @@ -959,7 +918,7 @@ binary_sensor: - logger.log: "Right button - Long click" - script.execute: id: ha_button - page: !lambda return id(current_page).state.c_str(); + page: !lambda return current_page->state.c_str(); component: "hw_bt_right" command: "long_click" - timing: *short_click-timing @@ -980,9 +939,12 @@ binary_sensor: - switch.toggle: relay_2 - script.execute: id: ha_button - page: !lambda return id(current_page).state.c_str(); + page: !lambda return current_page->state.c_str(); component: "hw_bt_right" command: "short_click" + - timing: *hold_to_restart-timing + then: #Restart the panel + - button.press: restart_nspanel ##### Restart NSPanel Button - Setting Page ##### - name: ${device_name} Restart @@ -1044,14 +1006,14 @@ number: then: - lambda: |- id(display_brightness_global) = int(x); - id(disp1).send_command_printf("brightness=%i", int(x)); - id(disp1).send_command_printf("settings.brightslider.val=%i", int(x)); - if (id(current_page).state != "screensaver") + disp1->send_command_printf("brightness=%i", int(x)); + disp1->send_command_printf("settings.brightslider.val=%i", int(x)); + if (current_page->state != "screensaver") { - id(disp1).set_backlight_brightness(x/100); - id(timer_dim).execute(id(current_page).state.c_str(), int(id(timeout_dim).state)); - id(timer_sleep).execute(id(current_page).state.c_str(), int(id(timeout_sleep).state)); - if (id(current_page).state == "settings") id(disp1).set_component_text_printf("bright_text", "%i%%", int(x)); + disp1->set_backlight_brightness(x/100); + timer_dim->execute(current_page->state.c_str(), int(timeout_dim->state)); + timer_sleep->execute(current_page->state.c_str(), int(timeout_sleep->state)); + if (current_page->state == "settings") disp1->set_component_text_printf("bright_text", "%i%%", int(x)); } ##### SCREEN BRIGHTNESS DIMMED DOWN ##### @@ -1069,13 +1031,13 @@ number: then: - lambda: |- id(display_dim_brightness_global) = int(x); - id(disp1).send_command_printf("brightness_dim=%i", int(x)); - id(disp1).send_command_printf("settings.dimslider.val=%i", int(x)); - if (id(current_page).state != "screensaver" and (id(display_last_brightness) <= id(display_dim_brightness_global))) + disp1->send_command_printf("brightness_dim=%i", int(x)); + disp1->send_command_printf("settings.dimslider.val=%i", int(x)); + if (current_page->state != "screensaver" and (id(display_last_brightness) <= id(display_dim_brightness_global))) { - id(set_brightness).execute(x); - id(timer_sleep).execute(id(current_page).state.c_str(), int(id(timeout_sleep).state)); - if (id(current_page).state == "settings") id(disp1).set_component_text_printf("dim_text", "%i%%", int(x)); + set_brightness->execute(x); + timer_sleep->execute(current_page->state.c_str(), int(timeout_sleep->state)); + if (current_page->state == "settings") disp1->set_component_text_printf("dim_text", "%i%%", int(x)); } ##### Temperature Correction ##### @@ -1094,7 +1056,7 @@ number: set_action: - logger.log: Temperature correction changed. - delay: 1s - - lambda: id(temp_nspanel).publish_state(id(temp_nspanel).raw_state); + - lambda: temp_nspanel->publish_state(temp_nspanel->raw_state); ##### Timers settings ##### - name: ${device_name} Timeout Page @@ -1110,7 +1072,7 @@ number: icon: mdi:timer unit_of_measurement: "s" set_action: - - lambda: id(timer_page).execute(id(current_page).state.c_str(), int(x)); + - lambda: timer_page->execute(current_page->state.c_str(), int(x)); - name: ${device_name} Timeout Dimming platform: template id: timeout_dim @@ -1124,7 +1086,7 @@ number: icon: mdi:timer unit_of_measurement: "s" set_action: - - lambda: id(timer_dim).execute(id(current_page).state.c_str(), int(x)); + - lambda: timer_dim->execute(current_page->state.c_str(), int(x)); - name: ${device_name} Timeout Sleep platform: template id: timeout_sleep @@ -1139,8 +1101,8 @@ number: unit_of_measurement: "s" set_action: - lambda: |- - id(timer_dim).execute(id(current_page).state.c_str(), int(id(timeout_dim).state)); - id(timer_sleep).execute(id(current_page).state.c_str(), int(x)); + timer_dim->execute(current_page->state.c_str(), int(timeout_dim->state)); + timer_sleep->execute(current_page->state.c_str(), int(x)); ##### START - SELECT CONFIGURATION ##### select: @@ -1182,7 +1144,7 @@ sensor: on_value: then: - lambda: |- - id(timer_reset_all).execute(id(current_page).state.c_str()); + timer_reset_all->execute(current_page->state.c_str()); ##### INTERNAL TEMPERATURE SENSOR, ADC VALUE ##### - id: ntc_source @@ -1208,11 +1170,11 @@ sensor: reference_temperature: 25°C reference_resistance: 10kOhm filters: - - lambda: return x + id(temperature_correction).state; + - lambda: return x + temperature_correction->state; on_value: then: # Show panel's temperature if API or Wi-Fi are out - - lambda: id(display_embedded_temp).execute(); + - lambda: display_embedded_temp->execute(); ###### Display Brightness GET VALUE FROM NSPanel SLIDER ##### - name: ${device_name} brightness Slider @@ -1226,7 +1188,7 @@ sensor: id: display_brightness value: !lambda 'return int(x);' - lambda: |- - id(timer_reset_all).execute("settings"); + timer_reset_all->execute("settings"); ###### Display DIM Brightness GET VALUE FROM NSPanel SLIDER ##### - name: ${device_name} dim brightness slider @@ -1240,7 +1202,7 @@ sensor: id: display_dim_brightness value: !lambda 'return int(x);' - lambda: |- - id(timer_reset_all).execute("settings"); + timer_reset_all->execute("settings"); ##### START - SWITCH CONFIGURATION ##### switch: @@ -1253,9 +1215,9 @@ switch: optimistic: true restore_mode: ALWAYS_OFF on_turn_on: - - lambda: id(set_component_color).execute("home.bt_notific", id(home_notify_icon_color_unread), {}); + - lambda: set_component_color->execute("home.bt_notific", id(home_notify_icon_color_unread), {}); on_turn_off: - - lambda: id(set_component_color).execute("home.bt_notific", id(home_notify_icon_color_normal), {}); + - lambda: set_component_color->execute("home.bt_notific", id(home_notify_icon_color_normal), {}); ##### Notification sound ##### - name: ${device_name} Notification sound @@ -1355,7 +1317,7 @@ text_sensor: static const char *const TAG = "text_sensor.current_page"; // Construct new page ESP_LOGV(TAG, "Construct new page"); - id(page_changed).execute(x.c_str()); + page_changed->execute(x.c_str()); - name: ${device_name} Notification Label platform: template @@ -1386,7 +1348,7 @@ text_sensor: deserializeJson(doc, x); std::string page = doc["page"]; std::string component = doc["component"]; - if (not (component == "currentpage" and (page == "screensaver" or page == "home"))) id(timer_reset_all).execute(page.c_str()); + if (not (component == "currentpage" and (page == "screensaver" or page == "home"))) timer_reset_all->execute(page.c_str()); std::string value = doc["value"]; std::string entity = id(entity_id); //doc["entity"]; ESP_LOGE(TAG, "page: %s", page.c_str()); @@ -1432,15 +1394,15 @@ text_sensor: // send event to Home Assistant auto ha_event = new esphome::api::CustomAPIDevice(); - if (event == "short_click" or event == "long_click") id(ha_button).execute(page.c_str(), component.c_str(), event.c_str()); + if (event == "short_click" or event == "long_click") ha_button->execute(page.c_str(), component.c_str(), event.c_str()); else if (event == "click") { if (page == "home" and component == "climate") { id(entity_id) = (id(is_embedded_thermostat)) ? "embedded_climate" : ""; - id(disp1).set_component_value("climate.embedded", (id(is_embedded_thermostat)) ? 1 : 0); + disp1->set_component_value("climate.embedded", (id(is_embedded_thermostat)) ? 1 : 0); } - id(disp1).goto_page("climate"); + disp1->goto_page("climate"); } else if (page == "light" or page == "climate" or page == "notification")// Generic event { @@ -1462,15 +1424,15 @@ text_sensor: std::string title = doc["mui"]; if (code_format == "number" and (key == "disarm" or code_arm_req == "1")) { - id(disp1).goto_page("keyb_num"); - id(disp1).set_component_value("keyb_num.page_id", 23); //Calling from Alarm page - id(disp1).set_component_text_printf("keyb_num.domain", "%s", page.c_str()); - id(disp1).set_component_text_printf("keyb_num.key", "%s", key.c_str()); - id(disp1).set_component_text_printf("keyb_num.value", "%s", value.c_str()); - id(disp1).set_component_text_printf("keyb_num.entity", "%s", entity.c_str()); - id(disp1).set_component_text_printf("keyb_num.title", "%s", title.c_str()); + disp1->goto_page("keyb_num"); + disp1->set_component_value("keyb_num.page_id", 23); //Calling from Alarm page + disp1->set_component_text_printf("keyb_num.domain", "%s", page.c_str()); + disp1->set_component_text_printf("keyb_num.key", "%s", key.c_str()); + disp1->set_component_text_printf("keyb_num.value", "%s", value.c_str()); + disp1->set_component_text_printf("keyb_num.entity", "%s", entity.c_str()); + disp1->set_component_text_printf("keyb_num.title", "%s", title.c_str()); } - else id(service_call_alarm_control_panel).execute(entity.c_str(), key.c_str(), code_format.c_str(), ""); + else service_call_alarm_control_panel->execute(entity.c_str(), key.c_str(), code_format.c_str(), ""); } else if (page == "boot") { @@ -1489,7 +1451,7 @@ text_sensor: std::string version_tmp = doc["version"]; id(version_tft) = version_tmp; } - id(check_versions).execute(); + check_versions->execute(); // Detect timeout if (event == "timeout") @@ -1501,19 +1463,19 @@ text_sensor: {"value", value} }); if (stof(value) >= 5) - id(disp1).goto_page(id(wakeup_page_name).state.c_str()); + disp1->goto_page(wakeup_page_name->state.c_str()); } } - else if (page == "climate") id(service_call_climate).execute(entity.c_str(), key.c_str(), value.c_str(), (embedded==1)); + else if (page == "climate") service_call_climate->execute(entity.c_str(), key.c_str(), value.c_str(), (embedded==1)); else if (page == "cover") { - if (key == "position") id(ha_call_service).execute("cover.set_cover_position", key.c_str(), value.c_str(), entity.c_str()); - else id(ha_call_service).execute((std::string("cover.") + key.c_str()), "", "", entity.c_str()); + if (key == "position") ha_call_service->execute("cover.set_cover_position", key.c_str(), value.c_str(), entity.c_str()); + else ha_call_service->execute((std::string("cover.") + key.c_str()), "", "", entity.c_str()); } else if (page == "fan") { - if (key == "stop" or value == "0") id(ha_call_service).execute("fan.turn_off", "", "", entity.c_str()); - else id(ha_call_service).execute("fan.turn_on", key.c_str(), value.c_str(), entity.c_str()); + if (key == "stop" or value == "0") ha_call_service->execute("fan.turn_off", "", "", entity.c_str()); + else ha_call_service->execute("fan.turn_on", key.c_str(), value.c_str(), entity.c_str()); } else if (page == "keyb_num") { @@ -1522,17 +1484,17 @@ text_sensor: { std::string code_format = doc["code_format"]; std::string pin = doc["pin"]; - id(service_call_alarm_control_panel).execute(entity.c_str(), key.c_str(), code_format.c_str(), pin.c_str()); + service_call_alarm_control_panel->execute(entity.c_str(), key.c_str(), code_format.c_str(), pin.c_str()); } else if (base_domain == "" or base_domain.empty()) base_domain = "home"; - id(disp1).goto_page(base_domain.c_str()); + disp1->goto_page(base_domain.c_str()); } - else if (page == "light") id(ha_call_service).execute("light.turn_on", key.c_str(), value.c_str(), entity.c_str()); + else if (page == "light") ha_call_service->execute("light.turn_on", key.c_str(), value.c_str(), entity.c_str()); else if (page == "media_player") { - if (key == "volume_mute") id(ha_call_service).execute("media_player.volume_mute", "is_volume_muted", value.c_str(), entity.c_str()); - else if (key == "volume_set") id(ha_call_service).execute("media_player.volume_set", "volume_level", to_string(stof(value) / 100), entity.c_str()); - else if (not key.empty()) id(ha_call_service).execute((std::string("media_player.") + key.c_str()), "", "", entity.c_str()); + if (key == "volume_mute") ha_call_service->execute("media_player.volume_mute", "is_volume_muted", value.c_str(), entity.c_str()); + else if (key == "volume_set") ha_call_service->execute("media_player.volume_set", "volume_level", to_string(stof(value) / 100), entity.c_str()); + else if (not key.empty()) ha_call_service->execute((std::string("media_player.") + key.c_str()), "", "", entity.c_str()); } ### Scripts ###### @@ -1546,9 +1508,9 @@ script: then: - lambda: |- ESP_LOGV("script.timer_reset_all", "Reset timers"); - id(timer_page).execute(page.c_str(), int(id(timeout_page).state)); - id(timer_dim).execute(page.c_str(), int(id(timeout_dim).state)); - id(timer_sleep).execute(page.c_str(), int(id(timeout_sleep).state)); + timer_page->execute(page.c_str(), int(timeout_page->state)); + timer_dim->execute(page.c_str(), int(timeout_dim->state)); + timer_sleep->execute(page.c_str(), int(timeout_sleep->state)); - id: timer_page # Handle the fallback to home page after a timeout mode: restart @@ -1565,11 +1527,11 @@ script: then: - delay: !lambda return (timeout *1000); - lambda: |- - ESP_LOGV("script.timer_page", "Timed out on page: %s", id(current_page).state.c_str()); - if (id(current_page).state != "screensaver" and id(current_page).state != "boot" and id(current_page).state != "home" and timeout >= 1) + ESP_LOGV("script.timer_page", "Timed out on page: %s", current_page->state.c_str()); + if (current_page->state != "screensaver" and current_page->state != "boot" and current_page->state != "home" and timeout >= 1) { ESP_LOGD("script.timer_page", "Fallback to page Home"); - id(disp1).goto_page("home"); + disp1->goto_page("home"); } - id: timer_dim # Handle the brightness dimming after a timeout mode: restart @@ -1584,7 +1546,7 @@ script: and page != "boot" and page != "blank-screensaver") { ESP_LOGD("script.timer_dim", "Waking up on page: %s", page.c_str()); - id(set_brightness).execute(id(display_brightness_global)); + set_brightness->execute(id(display_brightness_global)); } - if: condition: @@ -1592,11 +1554,11 @@ script: then: - delay: !lambda return (timeout *1000); - lambda: |- - if (id(current_page).state != "screensaver" and - id(current_page).state != "blank-screensaver" and - id(current_page).state != "boot" and + if (current_page->state != "screensaver" and + current_page->state != "blank-screensaver" and + current_page->state != "boot" and timeout >= 1) { - id(set_brightness).execute(id(display_dim_brightness_global)); + set_brightness->execute(id(display_dim_brightness_global)); } - id: timer_sleep # Handle the sleep (go to screensaver page) after a timeout mode: restart @@ -1609,16 +1571,16 @@ script: - if: condition: - lambda: |- - return (timeout >= 1 and id(current_page).state != "screensaver" and id(current_page).state != "boot"); + return (timeout >= 1 and current_page->state != "screensaver" and current_page->state != "boot"); then: - delay: !lambda return (timeout *1000); - lambda: |- - if (id(current_page).state != "screensaver" and - id(current_page).state != "boot" and + if (current_page->state != "screensaver" and + current_page->state != "boot" and timeout >= 1) { - ESP_LOGD("script.timer_sleep", "Going to sleep from page %s", id(current_page).state.c_str()); - id(disp1).goto_page("screensaver"); - id(set_brightness).execute(0); + ESP_LOGD("script.timer_sleep", "Going to sleep from page %s", current_page->state.c_str()); + disp1->goto_page("screensaver"); + set_brightness->execute(0); } - id: set_brightness @@ -1628,11 +1590,11 @@ script: then: - lambda: |- ESP_LOGD("script.set_brightness", "brightness: %i%%", brightness); - if (id(current_page).state != "screensaver") { + if (current_page->state != "screensaver") { if (brightness == id(display_brightness_global)) { - id(disp1).send_command_printf("wakeup_timer.en=1"); + disp1->send_command_printf("wakeup_timer.en=1"); } else { - id(disp1).set_backlight_brightness(static_cast(brightness) / 100.0f); + disp1->set_backlight_brightness(static_cast(brightness) / 100.0f); } id(display_last_brightness) = brightness; } @@ -1655,34 +1617,34 @@ script: state: 'climate' then: - lambda: |- - id(addon_climate_set_climate).execute(embedded_climate); - id(disp1).send_command_printf("climateslider.maxval=%i", total_steps); - id(disp1).set_component_value("temp_offset", temp_offset); - id(disp1).set_component_value("temp_step", temp_step); - id(disp1).set_component_text_printf("current_temp", "%.1f°", current_temp); - id(disp1).show_component("current_temp"); - id(disp1).show_component("current_icon"); + addon_climate_set_climate->execute(embedded_climate); + disp1->send_command_printf("climateslider.maxval=%i", total_steps); + disp1->set_component_value("temp_offset", temp_offset); + disp1->set_component_value("temp_step", temp_step); + disp1->set_component_text_printf("current_temp", "%.1f°", current_temp); + disp1->show_component("current_temp"); + disp1->show_component("current_icon"); if (target_temp > -999) { float slider_val = round(((10*target_temp) - temp_offset) / temp_step); - id(disp1).set_component_value("climateslider", slider_val); - id(disp1).set_component_text_printf("target_temp", "%.1f°", target_temp); - id(disp1).set_component_text_printf("target_icon", "%s", climate_icon.c_str()); - id(disp1).show_component("target_icon"); - id(disp1).show_component("target_temp"); - id(disp1).show_component("climateslider"); - id(disp1).show_component("decrease_temp"); - id(disp1).show_component("increase_temp"); + disp1->set_component_value("climateslider", slider_val); + disp1->set_component_text_printf("target_temp", "%.1f°", target_temp); + disp1->set_component_text_printf("target_icon", "%s", climate_icon.c_str()); + disp1->show_component("target_icon"); + disp1->show_component("target_temp"); + disp1->show_component("climateslider"); + disp1->show_component("decrease_temp"); + disp1->show_component("increase_temp"); } else { - id(disp1).hide_component("target_icon"); - id(disp1).hide_component("target_temp"); - id(disp1).hide_component("climateslider"); - id(disp1).hide_component("decrease_temp"); - id(disp1).hide_component("increase_temp"); + disp1->hide_component("target_icon"); + disp1->hide_component("target_temp"); + disp1->hide_component("climateslider"); + disp1->hide_component("decrease_temp"); + disp1->hide_component("increase_temp"); } - id(disp1).set_component_value("embedded", (embedded_climate) ? 1 : 0); + disp1->set_component_value("embedded", (embedded_climate) ? 1 : 0); - id: refresh_datetime mode: restart @@ -1692,9 +1654,9 @@ script: if (time_format_str.find("%p") != std::string::npos) { std::string meridiem_text = id(time_provider).now().strftime("%p"); - id(disp1).set_component_text_printf("home.meridiem", "%s", meridiem_text.c_str()); + disp1->set_component_text_printf("home.meridiem", "%s", meridiem_text.c_str()); } - else { id(disp1).set_component_text_printf("home.meridiem", " "); } + else { disp1->set_component_text_printf("home.meridiem", " "); } if (time_format_str.find("%-H") != std::string::npos) { time_format_str = time_format_str.replace(time_format_str.find("%-H"), sizeof("%-H")-1, to_string((int)(id(time_provider).now().hour))); } if (time_format_str.find("%-I") != std::string::npos) { @@ -1712,20 +1674,20 @@ script: } } std::string time_text = id(time_provider).now().strftime(time_format_str); - id(disp1).set_component_text_printf("home.time", "%s", time_text.c_str()); + disp1->set_component_text_printf("home.time", "%s", time_text.c_str()); - id: refresh_relays mode: restart then: - lambda: |- // Chips - Relays - if (id(relay_1).state) id(disp1).set_component_text_printf("home.icon_top_01", "%s", id(home_relay1_icon).c_str()); - else id(disp1).set_component_text_printf("icon_top_01", "\uFFFF"); - if (id(relay_2).state) id(disp1).set_component_text_printf("home.icon_top_02", "%s", id(home_relay2_icon).c_str()); - else id(disp1).set_component_text_printf("home.icon_top_02", "\uFFFF"); + if (relay_1->state) disp1->set_component_text_printf("home.icon_top_01", "%s", id(home_relay1_icon).c_str()); + else disp1->set_component_text_printf("icon_top_01", "\uFFFF"); + if (relay_2->state) disp1->set_component_text_printf("home.icon_top_02", "%s", id(home_relay2_icon).c_str()); + else disp1->set_component_text_printf("home.icon_top_02", "\uFFFF"); // Hardware buttons - Fallback mode - if (id(relay_1).state and id(relay1_local).state) id(disp1).send_command_printf("home.left_bt_pic.val=%i", (id(relay_1).state) ? 1 : 0); - if (id(relay_2).state and id(relay2_local).state) id(disp1).send_command_printf("home.right_bt_pic.val=%i", (id(relay_2).state) ? 1 : 0); + if (relay_1->state and relay1_local->state) disp1->send_command_printf("home.left_bt_pic.val=%i", (relay_1->state) ? 1 : 0); + if (relay_2->state and relay2_local->state) disp1->send_command_printf("home.right_bt_pic.val=%i", (relay_2->state) ? 1 : 0); - id: refresh_wifi_icon mode: restart @@ -1743,17 +1705,17 @@ script: condition: api.connected: then: - - lambda: id(disp1).send_command_printf("api=1"); - - lambda: id(disp1).set_component_text_printf("home.wifi_icon", "%s", "\uE5A8"); - - lambda: id(disp1).set_component_font_color("home.wifi_icon", 33808); + - lambda: disp1->send_command_printf("api=1"); + - lambda: disp1->set_component_text_printf("home.wifi_icon", "%s", "\uE5A8"); + - lambda: disp1->set_component_font_color("home.wifi_icon", 33808); else: - - lambda: id(disp1).send_command_printf("api=0"); - - lambda: id(disp1).set_component_text_printf("home.wifi_icon", "%s", "\uF256"); - - lambda: id(disp1).set_component_font_color("home.wifi_icon", 63488); + - lambda: disp1->send_command_printf("api=0"); + - lambda: disp1->set_component_text_printf("home.wifi_icon", "%s", "\uF256"); + - lambda: disp1->set_component_font_color("home.wifi_icon", 63488); else: - - lambda: id(disp1).send_command_printf("api=0"); - - lambda: id(disp1).set_component_text_printf("home.wifi_icon", "%s", "\uE5A9"); - - lambda: id(disp1).set_component_font_color("home.wifi_icon", 63488); + - lambda: disp1->send_command_printf("api=0"); + - lambda: disp1->set_component_text_printf("home.wifi_icon", "%s", "\uE5A9"); + - lambda: disp1->set_component_font_color("home.wifi_icon", 63488); - id: service_call_alarm_control_panel mode: restart @@ -1785,7 +1747,7 @@ script: resp_kv.value = pin.c_str(); resp.data.push_back(resp_kv); } - id(api_server).send_homeassistant_service_call(resp); + api_server->send_homeassistant_service_call(resp); } - id: service_call_climate @@ -1798,11 +1760,11 @@ script: then: - lambda: |- if (embedded) - id(addon_climate_service_call).execute(key.c_str(), value.c_str()); + addon_climate_service_call->execute(key.c_str(), value.c_str()); else if (key == "set_temperature") - id(ha_call_service).execute("climate.set_temperature", "temperature", to_string(stof(value) / 10), entity.c_str()); + ha_call_service->execute("climate.set_temperature", "temperature", to_string(stof(value) / 10), entity.c_str()); else if (key == "hvac_mode") - id(ha_call_service).execute("climate.set_hvac_mode", key.c_str(), value.c_str(), entity.c_str()); + ha_call_service->execute("climate.set_hvac_mode", key.c_str(), value.c_str(), entity.c_str()); - id: ha_call_service mode: restart @@ -1834,7 +1796,7 @@ script: command: string then: - lambda: |- - id(timer_reset_all).execute(page.c_str()); + timer_reset_all->execute(page.c_str()); auto ha_event = new esphome::api::CustomAPIDevice(); ha_event->fire_homeassistant_event("esphome.nspanel_ha_blueprint", { @@ -1898,8 +1860,8 @@ script: alarm_icon = "\uEECC"; //mdi:shield-alert-outline alarm_color = 63488; } - id(disp1).set_component_text_printf(component.c_str(), alarm_icon.c_str()); - id(disp1).set_component_font_color(component.c_str(), alarm_color); + disp1->set_component_text_printf(component.c_str(), alarm_icon.c_str()); + disp1->set_component_font_color(component.c_str(), alarm_color); - id: update_climate_icon mode: restart @@ -1915,54 +1877,54 @@ script: switch (mode) // CLIMATE_MODE_OFF = 0, CLIMATE_MODE_HEAT_COOL = 1, CLIMATE_MODE_COOL = 2, CLIMATE_MODE_HEAT = 3, CLIMATE_MODE_FAN_ONLY = 4, CLIMATE_MODE_DRY = 5, CLIMATE_MODE_AUTO = 6 { case 0: //CLIMATE_MODE_OFF - id(disp1).set_component_text_printf(component.c_str(), "%s", "\uFFFF"); // (E424) Don't show icon when off - id(disp1).set_component_font_color(component.c_str(), 35921); // grey (off) + disp1->set_component_text_printf(component.c_str(), "%s", "\uFFFF"); // (E424) Don't show icon when off + disp1->set_component_font_color(component.c_str(), 35921); // grey (off) break; case 1: //CLIMATE_MODE_HEAT_COOL - id(disp1).set_component_text_printf(component.c_str(), "%s", "\uE069"); // mdi:autorenew - id(disp1).set_component_font_color(component.c_str(), 35921); // grey (off) + disp1->set_component_text_printf(component.c_str(), "%s", "\uE069"); // mdi:autorenew + disp1->set_component_font_color(component.c_str(), 35921); // grey (off) break; case 2: //CLIMATE_MODE_COOL - id(disp1).set_component_text_printf(component.c_str(), "%s", "\uE716"); // mdi:snowflake - id(disp1).set_component_font_color(component.c_str(), 35921); // grey (off) + disp1->set_component_text_printf(component.c_str(), "%s", "\uE716"); // mdi:snowflake + disp1->set_component_font_color(component.c_str(), 35921); // grey (off) break; case 3: //CLIMATE_MODE_HEAT - id(disp1).set_component_text_printf(component.c_str(), "%s", "\uE237"); // mdi:fire - id(disp1).set_component_font_color(component.c_str(), 35921); // grey (off) + disp1->set_component_text_printf(component.c_str(), "%s", "\uE237"); // mdi:fire + disp1->set_component_font_color(component.c_str(), 35921); // grey (off) break; case 4: //CLIMATE_MODE_FAN_ONLY - id(disp1).set_component_text_printf(component.c_str(), "%s", "\uE20F"); // mdi:fan - id(disp1).set_component_font_color(component.c_str(), 35921); // grey (off) + disp1->set_component_text_printf(component.c_str(), "%s", "\uE20F"); // mdi:fan + disp1->set_component_font_color(component.c_str(), 35921); // grey (off) break; case 5: //CLIMATE_MODE_DRY - id(disp1).set_component_text_printf(component.c_str(), "%s", "\uE58D"); // mdi:water-percent - id(disp1).set_component_font_color(component.c_str(), 35921); // grey (off) + disp1->set_component_text_printf(component.c_str(), "%s", "\uE58D"); // mdi:water-percent + disp1->set_component_font_color(component.c_str(), 35921); // grey (off) break; case 6: //CLIMATE_MODE_AUTO - id(disp1).set_component_text_printf(component.c_str(), "%s", "\uEE8D"); // mdi:calendar-sync - id(disp1).set_component_font_color(component.c_str(), 35921); // grey (off) + disp1->set_component_text_printf(component.c_str(), "%s", "\uEE8D"); // mdi:calendar-sync + disp1->set_component_font_color(component.c_str(), 35921); // grey (off) break; } break; case 2: //CLIMATE_ACTION_COOLING - id(disp1).set_component_text_printf(component.c_str(), "%s", "\uE716"); // mdi:snowflake - id(disp1).set_component_font_color(component.c_str(), 1055); // blue + disp1->set_component_text_printf(component.c_str(), "%s", "\uE716"); // mdi:snowflake + disp1->set_component_font_color(component.c_str(), 1055); // blue break; case 3: //CLIMATE_ACTION_HEATING - id(disp1).set_component_text_printf(component.c_str(), "%s", "\uE237"); // mdi:fire - id(disp1).set_component_font_color(component.c_str(), 64164); // deep-orange + disp1->set_component_text_printf(component.c_str(), "%s", "\uE237"); // mdi:fire + disp1->set_component_font_color(component.c_str(), 64164); // deep-orange break; case 4: //CLIMATE_ACTION_IDLE - id(disp1).set_component_text_printf(component.c_str(), "%s", "\uE50E"); // mdi:thermometer - id(disp1).set_component_font_color(component.c_str(), 35921); // grey (off) + disp1->set_component_text_printf(component.c_str(), "%s", "\uE50E"); // mdi:thermometer + disp1->set_component_font_color(component.c_str(), 35921); // grey (off) break; case 5: //CLIMATE_ACTION_DRYING - id(disp1).set_component_text_printf(component.c_str(), "%s", "\uE58D"); // mdi:water-percent - id(disp1).set_component_font_color(component.c_str(), 64704); // orange + disp1->set_component_text_printf(component.c_str(), "%s", "\uE58D"); // mdi:water-percent + disp1->set_component_font_color(component.c_str(), 64704); // orange break; case 6: //CLIMATE_ACTION_FAN - id(disp1).set_component_text_printf(component.c_str(), "%s", "\uE20F"); // mdi:fan - id(disp1).set_component_font_color(component.c_str(), 1530); // cyan + disp1->set_component_text_printf(component.c_str(), "%s", "\uE20F"); // mdi:fan + disp1->set_component_font_color(component.c_str(), 1530); // cyan break; } @@ -1980,12 +1942,12 @@ script: // Foreground if (foreground.size() == 3) fg565 = ((foreground[0] & 0b11111000) << 8) | ((foreground[1] & 0b11111100) << 3) | (foreground[2] >> 3); else if (foreground.size() == 1) fg565 = foreground[0]; - if (fg565 >= 0) id(disp1).set_component_font_color(component.c_str(), fg565); + if (fg565 >= 0) disp1->set_component_font_color(component.c_str(), fg565); // Background if (background.size() == 3) bg565 = ((background[0] & 0b11111000) << 8) | ((background[1] & 0b11111100) << 3) | (background[2] >> 3); else if (background.size() == 1) bg565 = background[0]; - if (bg565 >= 0) id(disp1).set_component_background_color(component.c_str(), bg565); + if (bg565 >= 0) disp1->set_component_background_color(component.c_str(), bg565); - id: display_wrapped_text mode: queued @@ -2016,7 +1978,7 @@ script: startPos = endPos + 1; // Skip the space while (text[startPos] == ' ' and startPos < text.length()) { startPos++; } } - id(disp1).set_component_text_printf(component.c_str(), "%s", wrappedText.c_str()); + disp1->set_component_text_printf(component.c_str(), "%s", wrappedText.c_str()); - id: display_embedded_temp mode: restart @@ -2031,8 +1993,8 @@ script: - wifi.connected: then: - lambda: |- - if (id(temp_unit_fahrenheit)) id(disp1).set_component_text_printf("home.current_temp", "%.0f°F", ((id(temp_nspanel).state * 9.0 / 5.0) + 32.0)); // °F = (°C × 9/5) + 32 - else id(disp1).set_component_text_printf("home.current_temp", "%.1f°C", id(temp_nspanel).state); + if (id(temp_unit_fahrenheit)) disp1->set_component_text_printf("home.current_temp", "%.0f°F", ((temp_nspanel->state * 9.0 / 5.0) + 32.0)); // °F = (°C × 9/5) + 32 + else disp1->set_component_text_printf("home.current_temp", "%.1f°C", temp_nspanel->state); - id: check_versions mode: restart @@ -2109,7 +2071,7 @@ script: if (!id(entity_id).empty()) ESP_LOGD(TAG, "Entity shown: %s", id(entity_id).c_str()); // Reset timers - id(timer_reset_all).execute(page.c_str()); + timer_reset_all->execute(page.c_str()); // Report new page to Home Assistant ESP_LOGV(TAG, "Trigger HA event"); @@ -2123,35 +2085,35 @@ script: // Report new page to add-ons ESP_LOGV(TAG, "Call add-ons scripts for new page"); - id(addon_climate_set_climate).execute(page == "climate" and id(entity_id) == "embedded_climate"); + addon_climate_set_climate->execute(page == "climate" and id(entity_id) == "embedded_climate"); // Call page constructor - if (page == "boot") id(page_boot).execute(true); - else if (page == "buttonpage01") id(page_buttonpage).execute(true, 1); - else if (page == "buttonpage02") id(page_buttonpage).execute(true, 2); - else if (page == "buttonpage03") id(page_buttonpage).execute(true, 3); - else if (page == "buttonpage04") id(page_buttonpage).execute(true, 4); - else if (page == "climate") id(page_climate).execute(true); - else if (page == "confirm") id(page_confirm).execute(true); - else if (page == "cover") id(page_cover).execute(true); - else if (page == "entitypage01") id(page_entitypage).execute(true, 1); - else if (page == "entitypage02") id(page_entitypage).execute(true, 2); - else if (page == "entitypage03") id(page_entitypage).execute(true, 3); - else if (page == "entitypage04") id(page_entitypage).execute(true, 4); - else if (page == "fan") id(page_fan).execute(true); - else if (page == "home") id(page_home).execute(true); - else if (page == "keyb_num") id(page_keyb_num).execute(true); - else if (page == "light") id(page_light).execute(true); - else if (page == "media_player") id(page_media_player).execute(true); - else if (page == "notification") id(page_notification).execute(true); - else if (page == "qrcode") id(page_qrcode).execute(true); - else if (page == "screensaver") id(page_screensaver).execute(true); - else if (page == "settings") id(page_settings).execute(true); - else if (page == "weather01") id(page_weather).execute(true, 1); - else if (page == "weather02") id(page_weather).execute(true, 2); - else if (page == "weather03") id(page_weather).execute(true, 3); - else if (page == "weather04") id(page_weather).execute(true, 4); - else if (page == "weather05") id(page_weather).execute(true, 5); + if (page == "boot") page_boot->execute(true); + else if (page == "buttonpage01") page_buttonpage->execute(true, 1); + else if (page == "buttonpage02") page_buttonpage->execute(true, 2); + else if (page == "buttonpage03") page_buttonpage->execute(true, 3); + else if (page == "buttonpage04") page_buttonpage->execute(true, 4); + else if (page == "climate") page_climate->execute(true); + else if (page == "confirm") page_confirm->execute(true); + else if (page == "cover") page_cover->execute(true); + else if (page == "entitypage01") page_entitypage->execute(true, 1); + else if (page == "entitypage02") page_entitypage->execute(true, 2); + else if (page == "entitypage03") page_entitypage->execute(true, 3); + else if (page == "entitypage04") page_entitypage->execute(true, 4); + else if (page == "fan") page_fan->execute(true); + else if (page == "home") page_home->execute(true); + else if (page == "keyb_num") page_keyb_num->execute(true); + else if (page == "light") page_light->execute(true); + else if (page == "media_player") page_media_player->execute(true); + else if (page == "notification") page_notification->execute(true); + else if (page == "qrcode") page_qrcode->execute(true); + else if (page == "screensaver") page_screensaver->execute(true); + else if (page == "settings") page_settings->execute(true); + else if (page == "weather01") page_weather->execute(true, 1); + else if (page == "weather02") page_weather->execute(true, 2); + else if (page == "weather03") page_weather->execute(true, 3); + else if (page == "weather04") page_weather->execute(true, 4); + else if (page == "weather05") page_weather->execute(true, 5); - id: page_boot mode: restart @@ -2162,6 +2124,11 @@ script: static const char *const TAG = "script.page_boot"; if (construct_page) { ESP_LOGV(TAG, "Construct boot page"); + disp1->send_command_printf("tm_esphome.en=0"); + disp1->send_command_printf("tm_pageid.en=0"); + set_brightness->execute(100); + disp1->set_component_text_printf("boot.esph_version", "%s", "${version}"); // ### esphome-version ### + disp1->show_component("bt_reboot"); } - id: page_buttonpage @@ -2174,7 +2141,7 @@ script: static const char *const TAG = "script.page_buttonpage"; if (construct_page) { ESP_LOGV(TAG, "Construct button page"); - id(page_index_indicator).execute(page_number, 4); + page_index_indicator->execute(page_number, 4); } - id: page_climate @@ -2186,15 +2153,15 @@ script: static const char *const TAG = "script.page_climate"; if (construct_page) { ESP_LOGV(TAG, "Construct climate page"); - id(disp1).set_component_text_printf("climate.button01_icon", "%s", "\uEE8D"); //mdi:calendar-sync - id(disp1).set_component_text_printf("climate.button02_icon", "%s", "\uE069"); //mdi:autorenew - id(disp1).set_component_text_printf("climate.button03_icon", "%s", "\uE237"); //mdi:fire - id(disp1).set_component_text_printf("climate.button04_icon", "%s", "\uE716"); //mdi:snowflake - id(disp1).set_component_text_printf("climate.button05_icon", "%s", "\uE58D"); //mdi:water-percent - id(disp1).set_component_text_printf("climate.button06_icon", "%s", "\uE20F"); //mdi:fan - id(disp1).set_component_text_printf("climate.button07_icon", "%s", "\uE424"); //mdi:power + disp1->set_component_text_printf("climate.button01_icon", "%s", "\uEE8D"); //mdi:calendar-sync + disp1->set_component_text_printf("climate.button02_icon", "%s", "\uE069"); //mdi:autorenew + disp1->set_component_text_printf("climate.button03_icon", "%s", "\uE237"); //mdi:fire + disp1->set_component_text_printf("climate.button04_icon", "%s", "\uE716"); //mdi:snowflake + disp1->set_component_text_printf("climate.button05_icon", "%s", "\uE58D"); //mdi:water-percent + disp1->set_component_text_printf("climate.button06_icon", "%s", "\uE20F"); //mdi:fan + disp1->set_component_text_printf("climate.button07_icon", "%s", "\uE424"); //mdi:power } - id(addon_climate_update_page_climate).execute(); + addon_climate_update_page_climate->execute(); - id: page_confirm mode: restart @@ -2216,10 +2183,10 @@ script: static const char *const TAG = "script.page_cover"; if (construct_page) { // To do: Should be moved to Blueprint ESP_LOGV(TAG, "Construct cover page"); - id(disp1).set_component_text_printf("cover.cover_stop", "%s", "\uE666"); //mdi:stop-circle-outline + disp1->set_component_text_printf("cover.cover_stop", "%s", "\uE666"); //mdi:stop-circle-outline // In the future this will be dynamically contructed based on the device_class - id(disp1).set_component_text_printf("cover.cover_open", "%s", "\uF11D"); //mdi:window-shutter-open - id(disp1).set_component_text_printf("cover.cover_close", "%s", "\uF11B"); //mdi:window-shutter + disp1->set_component_text_printf("cover.cover_open", "%s", "\uF11D"); //mdi:window-shutter-open + disp1->set_component_text_printf("cover.cover_close", "%s", "\uF11B"); //mdi:window-shutter } - id: page_entitypage @@ -2232,7 +2199,7 @@ script: static const char *const TAG = "script.page_entitypage"; if (construct_page) { ESP_LOGV(TAG, "Construct entity page"); - id(page_index_indicator).execute(page_number, 4); + page_index_indicator->execute(page_number, 4); } - id: page_fan @@ -2244,10 +2211,10 @@ script: static const char *const TAG = "script.page_fan"; if (construct_page) { // To do: Should be moved to Blueprint ESP_LOGV(TAG, "Construct fan page"); - id(disp1).set_component_text_printf("fan.button_on", "%s", "\uE20F"); //mdi:fan - id(disp1).set_component_text_printf("fan.button_off", "%s", "\uE81C"); //mdi:fan-off - id(disp1).set_component_text_printf("fan.button_up", "%s", "\uF46D"); //mdi:fan-chevron-up - id(disp1).set_component_text_printf("fan.button_down", "%s", "\uF46C"); //mdi:fan-chevron-down + disp1->set_component_text_printf("fan.button_on", "%s", "\uE20F"); //mdi:fan + disp1->set_component_text_printf("fan.button_off", "%s", "\uE81C"); //mdi:fan-off + disp1->set_component_text_printf("fan.button_up", "%s", "\uF46D"); //mdi:fan-chevron-up + disp1->set_component_text_printf("fan.button_down", "%s", "\uF46C"); //mdi:fan-chevron-down } - id: page_home @@ -2260,14 +2227,14 @@ script: if (construct_page) { ESP_LOGV(TAG, "Construct home page"); } - if (id(current_page).state == "home") { // Is home page visible? + if (current_page->state == "home") { // Is home page visible? ESP_LOGV(TAG, "Update home page"); - id(refresh_relays).execute(); - id(refresh_wifi_icon).execute(); - id(disp1).send_command_printf("is_notification=%i", (id(notification_text).state.empty() and id(notification_label).state.empty()) ? 0 : 1); - id(set_component_color).execute("home.bt_notific", id(notification_unread).state ? id(home_notify_icon_color_unread) : id(home_notify_icon_color_normal), {}); - id(refresh_datetime).execute(); - id(addon_climate_update_page_home).execute(); + refresh_relays->execute(); + refresh_wifi_icon->execute(); + disp1->send_command_printf("is_notification=%i", (notification_text->state.empty() and notification_label->state.empty()) ? 0 : 1); + set_component_color->execute("home.bt_notific", notification_unread->state ? id(home_notify_icon_color_unread) : id(home_notify_icon_color_normal), {}); + refresh_datetime->execute(); + addon_climate_update_page_home->execute(); } - id: page_keyb_num @@ -2279,10 +2246,10 @@ script: static const char *const TAG = "script.page_keyb_num"; if (construct_page) { ESP_LOGV(TAG, "Construct keyb_num page"); - id(disp1).set_component_text_printf("keyb_num.bview", "%s", "\uE207"); //mdi:eye - id(disp1).set_component_text_printf("keyb_num.bclose", "%s", "\uE158"); //mdi:close-circle - id(disp1).set_component_text_printf("keyb_num.bclear", "%s", "\uE641"); //mdi:eraser-variant - id(disp1).set_component_text_printf("keyb_num.benter", "%s", "\uE12B"); //mdi:check + disp1->set_component_text_printf("keyb_num.bview", "%s", "\uE207"); //mdi:eye + disp1->set_component_text_printf("keyb_num.bclose", "%s", "\uE158"); //mdi:close-circle + disp1->set_component_text_printf("keyb_num.bclear", "%s", "\uE641"); //mdi:eraser-variant + disp1->set_component_text_printf("keyb_num.benter", "%s", "\uE12B"); //mdi:check } - id: page_light @@ -2306,14 +2273,14 @@ script: static const char *const TAG = "script.page_media_player"; if (construct_page) { // To do: Should be moved to Blueprint ESP_LOGV(TAG, "Construct media_player page"); - id(disp1).set_component_text_printf("bt_on_off", "%s", "\uE424"); //mdi:power - id(disp1).set_component_text_printf("bt_prev", "%s", "\uE4AD"); //mdi:skip-previous - id(disp1).set_component_text_printf("bt_next", "%s", "\uE4AC"); //mdi:skip-next - id(disp1).set_component_text_printf("bt_play_pause", "%s", "\uE40D"); //mdi:play-pause - //id(disp1).set_component_text_printf("bt_stop", "%s", "\uE4DA"); //mdi:stop - id(disp1).set_component_text_printf("bt_mute", "%s", "\uE75E"); //mdi:volume-mute - id(disp1).set_component_text_printf("bt_vol_down", "%s", "\uE75D"); //mdi:volume-minus - id(disp1).set_component_text_printf("bt_vol_up", "%s", "\uE75C"); //mdi:volume-plus + disp1->set_component_text_printf("bt_on_off", "%s", "\uE424"); //mdi:power + disp1->set_component_text_printf("bt_prev", "%s", "\uE4AD"); //mdi:skip-previous + disp1->set_component_text_printf("bt_next", "%s", "\uE4AC"); //mdi:skip-next + disp1->set_component_text_printf("bt_play_pause", "%s", "\uE40D"); //mdi:play-pause + //disp1->set_component_text_printf("bt_stop", "%s", "\uE4DA"); //mdi:stop + disp1->set_component_text_printf("bt_mute", "%s", "\uE75E"); //mdi:volume-mute + disp1->set_component_text_printf("bt_vol_down", "%s", "\uE75D"); //mdi:volume-minus + disp1->set_component_text_printf("bt_vol_up", "%s", "\uE75C"); //mdi:volume-plus } - id: page_notification @@ -2325,8 +2292,8 @@ script: static const char *const TAG = "script.page_notification"; if (construct_page) { ESP_LOGV(TAG, "Construct notification page"); - id(disp1).set_component_text_printf("notification.notifi_label", "%s", id(notification_label).state.c_str()); - id(display_wrapped_text).execute("notification.notifi_text01", id(notification_text).state.c_str(), id(display_mode) == 2 ? 23 : 32); + disp1->set_component_text_printf("notification.notifi_label", "%s", notification_label->state.c_str()); + display_wrapped_text->execute("notification.notifi_text01", notification_text->state.c_str(), id(display_mode) == 2 ? 23 : 32); } - id: page_qrcode @@ -2350,20 +2317,20 @@ script: if (construct_page) { ESP_LOGV(TAG, "Construct screensaver page"); } - if (id(current_page).state == "screensaver") { // Is screensaver page visible? + if (current_page->state == "screensaver") { // Is screensaver page visible? ESP_LOGV(TAG, "Update screensaver page"); int wakeup_page_id = 0; - if (id(wakeup_page_name).state == "buttonpage01") wakeup_page_id = 12; - else if (id(wakeup_page_name).state == "buttonpage02") wakeup_page_id = 13; - else if (id(wakeup_page_name).state == "buttonpage03") wakeup_page_id = 14; - else if (id(wakeup_page_name).state == "buttonpage04") wakeup_page_id = 15; - else if (id(wakeup_page_name).state == "entitypage01") wakeup_page_id = 18; - else if (id(wakeup_page_name).state == "entitypage02") wakeup_page_id = 19; - else if (id(wakeup_page_name).state == "entitypage03") wakeup_page_id = 20; - else if (id(wakeup_page_name).state == "entitypage04") wakeup_page_id = 21; - else if (id(wakeup_page_name).state == "qrcode") wakeup_page_id = 17; - else if (id(wakeup_page_name).state == "alarm") wakeup_page_id = 23; - id(disp1).set_component_value("orign", wakeup_page_id); + if (wakeup_page_name->state == "buttonpage01") wakeup_page_id = 12; + else if (wakeup_page_name->state == "buttonpage02") wakeup_page_id = 13; + else if (wakeup_page_name->state == "buttonpage03") wakeup_page_id = 14; + else if (wakeup_page_name->state == "buttonpage04") wakeup_page_id = 15; + else if (wakeup_page_name->state == "entitypage01") wakeup_page_id = 18; + else if (wakeup_page_name->state == "entitypage02") wakeup_page_id = 19; + else if (wakeup_page_name->state == "entitypage03") wakeup_page_id = 20; + else if (wakeup_page_name->state == "entitypage04") wakeup_page_id = 21; + else if (wakeup_page_name->state == "qrcode") wakeup_page_id = 17; + else if (wakeup_page_name->state == "alarm") wakeup_page_id = 23; + disp1->set_component_value("orign", wakeup_page_id); } - id: page_settings @@ -2375,9 +2342,9 @@ script: static const char *const TAG = "script.page_settings"; if (construct_page) { // To do: Add timers on TFT? ESP_LOGV(TAG, "Construct settings page"); - //id(disp1).set_component_text_printf("bt_sleep", "%s", (id(sleep_mode).state) ? "\uEA19" : "\uEA18"); //mdi:toggle-switch-outline or mdi:toggle-switch-off-outline - id(disp1).hide_component("lbl_sleep"); - id(disp1).hide_component("bt_sleep"); + //disp1->set_component_text_printf("bt_sleep", "%s", (id(sleep_mode).state) ? "\uEA19" : "\uEA18"); //mdi:toggle-switch-outline or mdi:toggle-switch-off-outline + disp1->hide_component("lbl_sleep"); + disp1->hide_component("bt_sleep"); } - id: page_weather @@ -2390,7 +2357,7 @@ script: static const char *const TAG = "script.page_weather"; if (construct_page) { ESP_LOGV(TAG, "Construct weather page"); - id(page_index_indicator).execute(page_number, 5); + page_index_indicator->execute(page_number, 5); } - id: page_index_indicator @@ -2410,7 +2377,7 @@ script: indicator += "○"; } } - id(disp1).set_component_text_printf("page_index", "%s", indicator.c_str()); + disp1->set_component_text_printf("page_index", "%s", indicator.c_str()); - id: exit_reparse mode: restart @@ -2423,6 +2390,64 @@ script: id: tf_uart data: [0xFF, 0xFF, 0xFF] + - id: boot_sequence + mode: restart + then: + - lambda: |- + static const char *const TAG = "script.boot_sequence"; + ESP_LOGD(TAG, "Starting boot sequence"); + if (current_page->state == "boot") page_boot->execute(true); + timer_reset_all->execute("boot"); + ESP_LOGD(TAG, "Wait for API"); + - wait_until: + api.connected + - lambda: |- + static const char *const TAG = "script.boot_sequence"; + if (current_page->state == "boot") { + ESP_LOGD(TAG, "Publish IP address"); + disp1->set_component_text_printf("boot.ip_addr", "%s", network::get_ip_address().str().c_str()); + set_brightness->execute(100); + } + ESP_LOGD(TAG, "Report to Home Assistant"); + auto ha_event = new esphome::api::CustomAPIDevice(); + ha_event->fire_homeassistant_event("esphome.nspanel_ha_blueprint", + { + {"type", "boot"}, + {"step", "start"} + }); + delay(1000); + // Set dimming values + display_brightness->publish_state(id(display_brightness_global)); + display_dim_brightness->publish_state(id(display_dim_brightness_global)); + disp1->send_command_printf("brightness=%i", id(display_brightness_global)); + disp1->send_command_printf("settings.brightslider.val=%i", id(display_brightness_global)); + disp1->send_command_printf("brightness_dim=%i", id(display_dim_brightness_global)); + disp1->send_command_printf("settings.dimslider.val=%i", id(display_dim_brightness_global)); + set_brightness->execute(id(display_brightness_global)); + ESP_LOGD(TAG, "Report to Home Assistant"); + nextion_init->publish_state(true); + //auto ha_event = new esphome::api::CustomAPIDevice(); + ha_event->fire_homeassistant_event("esphome.nspanel_ha_blueprint", + { + {"type", "boot"}, + {"step", "nextion_init"} + }); + id(home_relay1_icon) = "\uE3A5"; + id(home_relay1_icon) = "\uE3A8"; + timer_reset_all->execute("boot"); + notification_clear->execute(); + ESP_LOGD(TAG, "Boot sequence finished!"); + + - id: notification_clear + mode: restart + then: + - lambda: |- + disp1->send_command_printf("is_notification=0"); + if (current_page->state == "home") disp1->hide_component("bt_notific"); + notification_label->publish_state(""); + notification_text->publish_state(""); + notification_unread->turn_off(); + ##### ADD-ONS ############################################################ ##### Add-on - Climate ##### - id: addon_climate_service_call diff --git a/nspanel_eu.HMI b/nspanel_eu.HMI index 371efe04c5828994b1ecd423668584b132dc9a31..1eb5d5b1aa31622ebb8167799ec9f13d6980cbc5 100644 GIT binary patch delta 2681 zcmeIydr(wW90%}o_W`1yILo3%YrCmZ7QYy84i)5OXBrLEfD6n#u6$O&VPuD_I zLOV!hqGnb;Rza_tiQ zXTRsR?_KBL4#L3-VT`~k;`#|f#hf4G6LNDF=9;o1Mb_1h=q#*3g}SwqF;hl%47p28-@-OdfY}rdy*c zL!BJBS&<$pGPTZq&&s>1*ay1L`Rn|yu|n-Q^>n4t5NR=amxK4(1vbV@ z&QPKDSkIOos;GU{)nzprdyPf_1t>uUYVeb4H2%6f|8MC(yroHZ${ZTI1AFeko;$GT z4(z!Dd+xxVJ2d_Y|B5fvIy7-96hpD}B#oi56h}|d)AS6DqwzF>o~7q#B2A*nG=-+p zG@4E`D4u3g0zFT&=mnZhbLd5yOY`U@dYR@^BE3QjD2bBEL@AU?X=J8!T1bm1gEDC` zEuk#Rrkpy<5uLPCV@Xu;;nT$4yl;PtmM8YNOptI=wyOF0WUe6(k)|d>ov~> ztHNrrUkMe#3VG6%P+RMypxr5xv*i;LgZyiF=flnsE89`V%10F~+>f!7?! zrydf-828jigBfe^)P*686?y7k`Y~4OsSCmwTjiQrH9gDU{34M8mbW*F%N-~QUzG3!>aQ;lXI7gw+<4ZF{?V>>UJ=4shH6zQM zJ2D2_#WK=|$v2OSGZ;oi>Gi|q6&Ccy%Ru+cVq9#LVYFT^{|iOtC8GH+*Sp5a-9_@# zIv026`%jg|@I6Dzv}*Ud`N>1YoEO_qhjPoKEB*MP@`AC#IbIVcY6YD%PGwaI+|pR1 z<;@R?^LX<0ygFWa!)D^e&7~tG7nN>N@cYr$KznhOO)9QhR@V`9q3mj#{IHb664DhG z7fP+X0yH(2>kUhJ4_{b%VF$cn+1AGwmNbnoEZ0MQp-6qu7nY82Uw`HxUs!HF;vT!$ zJ#p$VUszfrd|~+s!SRNr1Htiz<>!&U{(A_KH!N!r9B){f5S-4kYybMT)o$uXskjO`Yq0e=&tNNc`Tr`PGZ=|KG*96<56u>W$LHZ>PU@jek{T7PR+ zlEt*p%uNPcBHs{X4N*7)+=nB$`{9tzgor}~-fR|ClIlj@Ock$>cdp;Kt%EO{TNKZ; z{R#u@Eywd=Ijn#JD1;(-6;?tqlt3wz0l_L*4R%-qufgk34r^f@yaDTB16079Pzf7h z6TAf+s$erz!`tuQogh~%Pe delta 1829 zcmd_pZBSHI7zglkclUzJpl&T_W{A=RF%rWv7MNn9U=R`%nP`b1_Tn3D?cNPt5QIk- zEd$!>P?~{8<@?rBN1}*u!6hq6tR$$|l*Unq_D?vNMtXzA_WdtVwp) zNb9xJO{REr(O3cZ9)pFom=L;hoH6oTX_K=^MqBr0d8sx}-79-z1~eOP_dnn+u(8w` zct>{~W9lloQ(vz+oa(P#Ewi!XA*h|mK`kaIIkZ4KxYl1g?65Jf0X5HL$^H9;PRXg8 zWC)$Jt(4`aV6`iUxvz!{P0*>=4&+t)j1Hes0u5+E2QmZ+pD{Rc)TtWN|JMVkR*eo7 z6H+lD6%$f1Ar%u+F(K6$Y#9A7Y;dc_--;=j=F+`1kLFVfEui~oA*IqHT1;t_PD|*1 z%AibofU;;QWz&O{L%H-2JxqD@2rZ*WX*uQ73R+2z(c`p=3TQPIQW348Vp>a2(3A8O zJx%LqJ#CZG|wI_-x_AQQzS=tT#~Sx%==`=sa zD=sHJH+W7Sajnd5;a6sOk}7V!espmCihGULpEv3ms|@7PP{w#5SL1i?3gq-K#>xY^ zYbs+^ft)s-vF(A}i(@mko)yJdSz!I-9pld~U}>?8ZPEB&+%cQ65XqmtaX2M`+?GF_sD&M{6JCH9VHdmvbx;ot@G>~z6?he10}hSwI=lh9VGq0sd*Ll;f@atU z`{8Y9fp_3tcn=Q1K{y15;RqasW8i}K;RA3(D|`qafq>)C1|LH^d;*_B2Yd#d@HuqB z3GhHS^uS5*LN9y)r{GKY3ciNZ&*<-Y6Pm83Z+|8wr=_kW)I+=KRSRqx*Gt<`()+O=0z zclzk#uLK-l|4P7uX0GFpFKj-$#nr3*I(*XeuFJ=IBxb(6xJ$qT&(%IMH(}yaiS6eb zFZXz<&Tn-)HhQ_q#i!<{mLKxz(K&6_bX_+6oy9FTzx8nUXCL3)?(qQgp};%i_pDuL z-MMf~kN^Jv-xm093;eeQ{@VioZGr!`z<*od|Mx9W#b^3lz5rjKFUVKISJD^kE9EQg zE8{EcE9VRGmG@Qfh59P`D)}n=s`#qYWQmUYWc!^;l2o8ZC|7>$`|d6@x}V$ ze06;BzPi48z677!=ke9|CHj(l$-Wd{s;_~sp)bvs?rY?0>}%p{>buR?%$MP7?rY)8 z^tJT0^0oH0@wN4}^WE-i@9W^}=dW$F`*M8UeBFILd_8@4_T@C6Ahx+-mx_Tc9b$y$y z%6h$#uFv}Cqtb(+=6sbu7ETY0(oUJ<#Hp#e^L`Yj%+!Ua@ApniF`rW-wtMTDyVMig zAvj;{5Hm3U$ae2%m0ic))scL)*IS~D`lF9sdB(nHY8h4Kofv_Efgy(B2{7I?4Nr?{ z-{6g?Q%AgCs>qVwz^F-ZTE41$lk!Hu+Pc|+#)$KW`i2^DOMV#~VldY>3ZCA?ZHCfNK|-c(8>k9mymPTH+=WWZZ~HLA$lO=;pWEAxFj zH9kJf4pQrmcsrHX{b5Qopn;Or!j)F-pk!$jWmfRkC>tz0D-&pTLXp~?<&99D&%MEB zCzbZO_hZ+P+G=cucZYi83vU(A1EOKhA!m~hk`D<}Jmx&H*oViQTU#A$X~mhf)q5wr zwL~TH4R4$}dZ#y79q4G6^=zi&R&ooujeJ1}sU2b|^2eB-?*pzxU*^PP96 zd0r(Q_trA+Q-i+O9hEZDuB4_M$1$-&tv~J!H;1UVk9(WDUV-{K)EuIszV~LBhv|T4 zQ}E1nQNJkC3nyBY)Q{hL-L8-*_3UwPSlJs{_h75GRCHjF2iC*mQ@W_IG?}F(qt)2c-pcWn(9H6x%vY?M5gpC#lG6Up zcBN?b{Aq8v>~`O2Z-RvV+i7o3^}_!9Q|XXG>ER;H{tH(t&v@P8;^vO_L`J(!*^9F& z)!oqpRP!TN180^9TRhqdjJ`!!3=tEo_j_+mb4dQ=v))Q(;ULdnea>r|{^PKTTJVmy ziu&hy?@!gfM+_M$h|F-|F>#E{@#gnYYGE=ayzH;6<7(GMZ&!C?1m!WCl1<3l$Yw%} z|4gwQ{~2oRb#I*6Tn+qLAE;JU97!vF_J+7Ey4*?H9ro zhI&h?=9j!>-E-;p2>CEMkDM=r(qm$&^r%)^pq{+st?5iDVRAAKR0oDyfhsH53U(cg zR-u#Z$mqQk*-ySten=h=LiSMfqGMKq>!aw!jlEG$?GIRE-(S`?KT^AY(JisCvA0sh zLDbAhkwY8vOoLQ+KtX}QMFbW%<~CLSS8pavwl)i4T-%~mi%s4f^Pr0R&AZ7wng8)` z-d6*fO3%qWZ6246Was4E;!^Pm{-gxepn=CcAsdA?4*o7nv4s4KSG;pfmn){|3|vw* zzU~e2M8%-88AC>sSmmH3PKe#r6U(-(6QifP_!zb1x;I+17Dn2!ddBQXr_N+2vJ2T& z2$^nTDU+pT%xu-XK#u(wIW5GfF<)Zd9Z#Q$UE7ht zxqPHI*tI4`ZJTFTUX*EtL_JA?mE=?8Dsr_DlIs>7wcM_!V^q|9yGl|MtPUGB^rT~6 zO!Ju9cLnP&|0`efX;s#=;@BMMadVBj-L$sC{BBycUGM8qRDBm>d7B#Vk?)Xu$$dh^ z@*!jSK*yq16uZ33YJ2|5#r#11;qnXNebq3)+Gf75P6SwuC9u#4Z+Jp-^~MG}LYfToSe)8W(kknjK&QLOiR3-xBq3y` zilxkCEo0uRN(5VlL;I%b=hav}{k%k#e~>%Km&sRz(A^o!cllbZTD91U*6onb8ryGK zdvs%@X?O=R|Cq0;yi!(}>&aME;a6`9u{n;t{=9z9$>vqHvb43yJec35jJ4iX;~+z5 z=rIq-M&VS_sjR7zyxw{$J;WOCIvp!h$vf3b#{J1DrDPmWDfuhQTj{1NJWe%_M-*_` zHrDFqZUz^R*__NETacMTyz@3<*`h6#RS5&TRh(M2#;VDEj)TBmtUi<+LJlK`3n4I4 zECohrf!sLdeOe2ojJLYD9*$Ep$6Mhd*s`_N-TfThpC>nxo5;;V2)-bef?KrU);RU( zTC0`_SQ8-dF{^(<9wHBup9&%Hg;)w4(E^{vsho9MVAMK9^hcc9ouDJaTD7OAdL1~J zHOU%eEiz09!AP+b46maHZ$uq6wTf0;^^DcS(~|XDldZ@$WLqH=I*6r0JFQ^eu9{c1 z!pzg^n*^(tnzr6*=o*Tb=2_u^r!f%JHlI~fon3D=@yw>ugXA3YA#$z|+VjOy`(a1> z5jD1&GX&aOl@_jSl>!`8MX~p@^K_NUIHO$&%1Q|(2384@tmI~4F z>cZ=GoEfhYYia?cj}lfB8xc5RDSU%zQZ z=zcWkST)pFo2=VB2dMH9d64{=JS2qf5wX<$#EI;1yxQG`gJfnn-r66meucbDUL~&y zAz;=m6u9mP6vV6KE&8ps%twR0(G?9=yRKTb#fp%_>5VOTzs<$X%p_ZoEy-3w$hH&9 zxLVg`iLSczmDlBs1Sgd}G)WdLl3EBONXq7VxCVyW$J4$g~WvJZXiq zkK`ccqCt2X7>G?i?Z#JI!k146@@axw&8lxjy7na~bD&k()zYmNF2Xtz?s zAqkhzvJ-K&Wd3-oyx$NzkZT94%z9SE8^ce%A^bZ3R`_n^oom&0;@|qe6MspyKf$V? zM|PtdLvHZ@D&*0x6@?suQ_cTElb2NI`&$)csNgV)QwLuE*S2nWL*W1BQ1PI@ou+=| ze<$v05;6|le`)5lzlyfujRPBZ0rb@;8Q2#Rttcnj%YS>c85j;p$yVbVheP@ear%wm zTg2&BZ|p8=)?qjw{=LJ&qgFj;g-Wwx9*R}9QvY?*Xmmr&ek0))F{>G=MQwZde<9>e zTXe{UGhf(^&D{8gko}rD?Z)9CnQIUpGS9hH*SCveZiDmS-`mV_Dlg5d=J`GWQ?7ZE zJVE|Io)Ti3KO>gY{ErFxy!lgtS~ygnDD-u2xiV4Nt#iL}ZjlQm%aaw!N>ASYzv0V1G&KJgFYDgxJFTFRG$hbT^4}c*DlH6fW@;)+o`WxJDOwAq}a0Xa5@C zG;wmst{+-0)a>TgDA#zmP9*1}-c8pg=i}s)Y-g*ZtE@8lNtqUIXRLMWY!ZHwO?v(* z`sUl@TjU<{9UQ*aI1V>TdD$%bT_5Q0s_QZQZ3YJ&u~kw>SK&|^B;m(}}| z{m232Kp_Ndu@o4j1-u@ePC|g`of@`(lI*-mK zAt2eL`(0MwOTI_$Bi|Q7;DA^Pe4qvPdsK_6Sn)yNXae#^rjutqI-MMk7A;OE-R0`T z*(^_nkQK;KA;hbQrFccPx&zv)Qhjycb}UNAD|3KVS+YrYIz1YbjmRcsQz0~(i>1bG zTBBKgCX-qtOpU5;H8lGxvjg(B@hY-|b%%Qj1*VZx$?4<_Atdh?OUap9a#nqvP2xRE zHtAl=>d%nt$o1s2LI^xBmI52Jz;pF=HVJ{^Y;tdXW|PvAuh&Far>OB0`6GFnJR^ka z1+i2;t5wg{XEuqqb+9LLqvg+AZ9EkdQOT@KRwApARfQ0#DV8GD67^A2JyE&Ckoi$1 zOhryZ-qtu#rT>ttLmAoejhoD zyr1+5A@HDB3OwLMH#7E1yZ!X(bAoR=!P`-rCpLvD-njImG0rJo=c7(^T?4x z2#gg=fl*pubdt_0+22K3rTZ~@JwZNBE+Q8Tp|eaZb(GdwlEkFanH*x7Rk~lL&+FuC z={clTF z$4cVE4aq93jvi-BD+jTA*q>*W@4}a_>a22G3bRVH z+v0&%74uz{)8A?$cfJN9v+R~4cNlI9EFM)wi6p9Q>tj_i|DzbqzC|%M!fEO6h!Ju3 zvzj^MHT}kBbaF)&Bs<`fNiqUCDH&aA?P&B?VQYSh5&myf~zbL7#gfq+E z(V9-A9yMr}RbCoZGQ%4~buz=7`n@Q5(PJ~DI1~6rWeqAy1ZMq>ksh32dsIX+t`zXp z7pE#Lv?|>gt&<<#)UdaRHpM?ZJoop8i#40%hG^KL-0;SDo!sz0i+5&f(P1?JXSly> zAfS2OiisiOEu6c;Zj9GS3~!3JC@<8bp}gN{Nb%1L_x+9WVycQQU3hfy9u@cR3s=`n!$+MV# zOGrg7C6@`Y#}#6EhIleXpCOj31w(O-9j(lSwD40A;c_%CY-EM0GQ+S0zF|%d)9K;s zDUu#Ws@I2Ev&=*JErv^uDEXS?i1Wl2W`HwV6=#5)2_;8-jiJaTOnl;S@bKaqhvWsx z5kK~?kukzQN8D4zmJh^qb6rl+d195+KgkoTr26HF^TtS?=uTyxXkJ!Z$KnoMN4Oyw zB|DK_$gV=PS2wY2uPhaMHXiA=2A6dJX#;`f_EJMLFZSc3CSuiHrvZG-x@0_Ak4z9kGf^xx z-3@e3;Ax<95S2iMs^oMp_f=H^l%h3NfM}1iX=84kkxM8SoJHAezUF1&k4RW^-DsPLW%9~on{HMAw z32QSglI8lYfxhdA=e+CaY6u52kPIM$$Pz*bmKICFk`2}F94z)4>NF7oyy@s>_4=fT zOeB+p5NIHl0?7^4tZo$GO-Be6r-?ZYb()AmNfSL|s45*D4P3MPDD9#V- zr|J9` zCK*PC3n36CmI4uK+ic9ZwbON0i1&fHz{v_*(WedBnrut96GEke}B6pH+kh_I&e_Jfw-_$|;GhHWy2tpD<_X$@2fjmi`B7YP@;H+2* z{Go3fxLhM6GpzV7qwd{k-ej!Oxbe-|U>jvUXjQAz1}{O^KO2;y8?wP6ja6pv zqU0bOXPm!Y6K27guj+KLabtax@v}y}$!KON^D(Q53&nDe(S>5k2=z$92O{fX!F@xp z&Mie9Y}~&UtQs`8X#KkL?~T>$hm)xuwdps;>Ewq0S)=;ph8~=Z{@zB_>7hhhbO-Uq zkewv)KMUC}NnG}~hwS8u`gm+~W3*15cvG}RnU@~5et9BBZT6s|kr0e?&EMF-MY*Ch zaB?!T+8c(glPCUX(fZv+y!&sD)=3o+ZE>o2L#_@9OBmnt6rUkF*U#o~!A?8Y{B za>bhhF3J`4i15o5F(Ul#A$G%g?Qa|rk}j62h}=g$@%@KNS&UD^UTlQP)%=ybME*wp zF2rPhwGnUsU2eqNf4cTBtnu@$YU|s7=t`!Gf2bD9N_73vNQDly5z-bgx(GLV&yVs>}F#C-jRuEnu+7^CHSb|jdQn?Iksu6Gsjv> zty!*qIA096=BqJH@P(^~_F5J5J1(;t2KJYXPBO{LVhc0Luf`SUiJadhlWff(olNr0 zrNuS+$qSN6_VusvVkz(izP?o% z-$7}j6G=o+oJd}UI1)*S9$b%~dgP9ULLlt8wj zPdlpHK4Z5-UvDFbxbpi=dCXf%&{b6!0`3N~r2*HJ7DLCH| zd{m8jj*XwQ5oyOGJMG}b9j&IG7wGm9`69WU+#!U}D`F{>@4UZ%H02FPG!T?>Tt}Mf z91@W+hy0E1e~`bEm&q$a2o{K?;8jQPT2uYWRVYXj>5jY&HOy!-ii{y+g;1y~mI`sI zZbvh@n&~@=TBV0O zPAZu3WF4|DSx<;C>Wig7f);Q$(@7%)ijqcmSNdd=S!52`O$e1c#8Ra@Rm>jh(HHd0 z#v6+Fu=Zqf5_vBmLmIgi+tEj-%gyR&cB4Aa*?$!kw25akiQDy ze_1U3f7AZIH)GzYkEJkmU^_lwT`L2X%y2S{j38?ZArd2&B9R%+jFX{1p^ARtCsf<8 zemk-)c{|x&2!+mKsnEeu=$OIO5piJ5_VSEm_0i-gatt|E2!V-WDKO3v7@xt^QBDqp z*W;agi6}uoJNFWIHNQD~+^0g{M)tT5FG1Tsdz7LZvd1&c{jt+Qb!v1Z?&%)^;%Jy^WxteD4N%~&&Z>t4nK){W5iA#`Jc6|Umh8SbIae^ zwg_1#l7$Co=A%~FjUhY9TFWaJaPO?>WvXQ$>e|5z<$YOE>4Pn=a?wI_vkm*{mYEsL{=J@-YGohT- zoC&3_J(V@?y;W_UP@-x0c~a~wQ{nTZvQx<@*V6SFaviyzd{&5^J};IhmJQAIx$Qa3 z)AE^EDBhS-s(J5PrCgY{nNGg+F4D;x=W-{V+}B*ElSAG^I{7W)8E*B?Z@JfcFtER5 zbdp3qDYh_)tow9vipV)rlE}S`%Sj^3?JchHt-K&f8RM*NDdfY7GewLHV z$fw8^LhN}>3yzyrEjVs;?I&4d>8)xjeg_rN@j}E(HRzC4-(0EY9m2BtUA5_u6%)0a z{%@22B=?Z-2+?5pmdPQ@6RoSg#h2dvvuX^`d{2$|#EO;n;7EP9g{nEvj;i@CJTj6? zBg@CP?;Gha-}k~ZbA~$li8b3bqXoa(tgiL7gUyR-;bAK_`X}z?9C?O3PhJqBNq*6L z{8_m^wc?!GXIbO)t!hvB)T&b$A9l6%Q!BdWMK~0N*I0*lM^ShURP7_U?X6>sRef4` zE2#BHFz$mh^AkR^`nwuSXM6B1-SJ`zhy0R5roqci_?th$nRo$z(5Ix>!V2-9tDRq1 z%Uv;<`hI$Iym-@)X`aa;laC=2VS0LrzuAZEP4*@G3DG8l#BzZ4&*V7A=Q($MZAF^+ zmi|vxxVrYWRjI}dy37>vuON8L=`5M0>V1P-nod=Ifq#9b9-gaMVJ*3aTt_}5#D1U4 zSAAo_PNpp6k^^M=?CttNf$Z^Z20I;A7VPO{7s|HpviM*m5s@ zQ{1$#%M0oFY=eIV`&$#2LGTUf4&UMn^hcZq{uxznYT%#Q!2R;y`p&9jddjqfnpuu4 zONNl;g*X~2X^X82E%iha+EN|6Zbg|$Dy4-Z3osoupidgvkW42V3E_L2w%BUys5EJ* zGHci|ekx^D(g~}Krym^$kp0Pl5df*qbnHrYA+yMAAq0A8i>(|-s#_}+5m*>ie0o{~Pb&Tr5YCPh=y*3dk-UeT zB!s|JZLu|3OX1HQ)c&b(B&K+lv-S$|DRL#bN(isD+G1<96Uv%aDyp_EZH=)Lugadr z_}{n&O4!kbDitE_GM>})IZK`)&ynYa@V%rhwk|mD z<)SKoh7HV63Q9nva%)sJtCCg7YGidGT*I`*R*lxW$7{A${Yw^xQdbR%vP*lK(Wg0? zLAD?>h45{oEw)-}6%3yNXA46~^$ce1A>>`;P;!_MUU}MLYq%4|h}P=4;NmE<&sn8C zkI-j6IgfmlTp)z+6WU^Hp`-FxYn4-qDl*S3-ij}ME-i(l`z8AAAh(nG8bNpi04cCeNBEvenTD=!vDCo*gEF4%(v?5c`Ft@9d*HK=m~6t zdS(eSh%8A43*l8(TWpnTqx+|H8`ZfCKC?}Mdg{qC=w%Om63O~x5}7Q7Z$oXdmEx$R zwozN-id72YpwfdrcaS~FUSw|}eEVyQtv*`C?5nO{#2Mg-I{33yPj&qnV}B}Lrjygi z8RSeMTz%SNYnBtreQi{BIfeq2hMu*o{tUT}Tu(kLgxmAlVrzpV@LU^pwMd|z>J)Dk_UwFJ)|wR4mv6y;Y;{+83xZuJe6N*!&7YJPUf;Oxafc0PdZVYL^Ksm z`SX%ZDDI>gKmIO@u7T>+Ds~z9+FO{~>h)H0^=zxxU}I4CrX|9dwz3B6r)H+uA?m4X z)fviWmNskb|$=YJ8zN3=ZPA?H0m7{m!FOAKt zWta2h(6Kw&jqE}86k@>i5z7H{ha=UioqFSIq&3B@<17>=({T!UFFBQ*CPXZ=w8hqR zErq0HpR2Ha{MQMq>Gw3bhFnXo6T*Lkw%B^c32J>iy-x5CitB{;=(vyEOTJHjAcVj{ zZLziA3F<=?9#|X{TPh*~Ep>r@Ka&^9OXM#?`2V3TwtjVj`mLRc{0U1c|3)tz1gRRg z!^Nyc)+EEoa3KVuw8d7$?Rpf{zFn^vC{{A5kRLGn}<^$q{58IZ_C(vD#v5loQ41+f{`#g-2K2#U*i;Ur3k7$;Zei$VEc9 zF4Y!Wi=7~p>Q}NbhCT?p6R+G1;`6UnaI)xfibk;JPm!B9Cy zpYOZerLinE27F#ErP)@21!Ns9uowLfgOSMO3vkY09EK8OX!ZlP|Y=x+UIHkJE zx7W)B-N{AE1$PSF8jz`ELo!VW_a@q6D_sjUYOhxdenPTZaQC5GKe8{`pBx~ByQM9* z22#izq*j;q8^C>WsQ*~nuHc?UxBJQaNFVut5bh6Yi>=vOXpZVs#;#K|d_|~h9E3K| zZ6o;{`8>Hv2={H;Vr#R0Yg^jug@b-;>Zm9^b_CgH>-x9>M>id;#q5@L^Q#q!LsT8F=;gI-EF;d3cbKGdFN=I1XAwI2^?BIkTrNsQ)c zvZTRpM;t0BUP_*b|upt z)DdcCNwNePOqLR2C*`!oR%sPl3q4t;qrSrMk;)0T<5fa|Rn}dfE=gn}nM|e#;hLr` zwoHa2=p6w)$$3ejRyjfg0f|`=Ga^Twridqt^^_ zIysY^C4~0_+G6WI>X`Sd1vQb%II&DSiCEUrV?Fr{`7F6X2+vL0V(U2_%f^m+>EHxY zv~+Oqr{4kcL-HW`kq`squviX|kG0aFj(X)lrMhag%P!;ol`g-Nzmb2CmxT!8y0+N5 zqD8KD)E5^Vkpp3v`6D`^vKdL%CZot`AzbTdi>;VW`g|JONv{{E(!kS>)!UP|lO4#8 zLb!F+7F(SEz%ake~7l&x>E;b4pvq)))4+mvXJo1rr(3)9P%M@t`Pq7wZ+!M&f9yWvtCJ1 zDpqC3*yTN&>9dvGLT)2p5W;tdw%B^Hv;ITxTVrtUFO~>YtIi{u!}K~reoB5uelCRf z*VKcfr$%mQwk+;$1!UqV}K1>nzqVO9<7qOU#p zD{&c7hkkX*c(NXuAcTLSw%BrOB~KTk%g zg6EYD>}+HLu57?APq3eNHSDTzJ)*j*+18HE_qpxf0Zn8LAnS?K{;P#YYPgF2W=})e zovbGs$VTB!joUp%>xnXIdXnA1mDQDtimD?}?WRS=i2Mb~_Gr_6A7l5C_mdBhvxV5l zTy3#6M;%PXz<;o-UQT4G)lCYoMLb8B=gE!aCUUb7t}kedtu0z)YgfITC>C+9MSMiR zL*&QgC*)xv{6E(gTc2vBBVDSTcr;BkKs^nxHMV;)id1%;;*9lMa7$*yFU5aX)5SPs%`M=B>v zuPBOJ$GH|Uo{kgA3FO`6Jwn7XMO$o5a-=3_>2-y_6mMEQNyn$i<>U%-r4Ry7Ym2Q_ zj@0Tby}0m~;>C!6((!HbEpiX}jt~O-w8hrDj?{ZudY$3lR$OQNM8`AaY4R+2P6&aY zwZ+zXN9sbBUT64Aah*{q8!l!QvNBnftR{p&Ep4$?JzJSBT<*-)7bB?TT#UGlE*WGq zvN_p82-nuyVk0<%u3 z9KDL5Nb&6px0`PDNe`JwCJEu*KwE4jYoU}JeLccYh}R>!)2%1jgS><6C4_rFZL!sx zLS`Qo+8k>Vt)r8Ft|X?=Z5lb1oKDUV!u@`2u{BdiG%H81B>a`Ql6aba>&Ug_Gvs<9 z{5NWgt!K5;h8(?;@K@qWVjulJAm1nVlOGD<|FO2%I-r#f=IE7#zY;dRyTN<;ba&YLDm++KSo<@MXC!eF$AKz>6L`P5?2zf z>DQKQL$)Jt7s9`jw%BT~l{$3OS0o%It^&q&)2o17x{fACl4HoRLd@0^yKxmTz8hBo zy7nm6$otFM^5-I2A8ed13^&42;O)q1d zH^6HWGuq&q#I}61tz46kQ@*SrhVz`~TybdApm+_jO(bOvv6b3RjRM>@k!up}4t8_b z``u*upnv7b{gYHP&yc6dv*bA;Li|}QLp-lTywFXxD8R2vKm{L=a()-0a(7XwN>(AO zk=2Dz2@^||8r}7DTC=DRd&u|5y+X+ES7uM!?RvkvnzhQVoYVln9+#eu zzwX6P32J9~TloI=UpgcI*ph9>$hhNW#eM3BY&&d*9zKQrjeJA*tQ5Q5Rq&J}F$2F< zm%yR+H;>W^{~N;;qxIY!cJ=!E@Fp^nWuW6@cPYvGgKf^hE$s2aj<}>+ceA6T&#?V2 zkmtyYf!TRc5c5zo_foiW@%l5^5Ix6i-Tuj!Fgv z+c$%=KvJp{=%zPYt6|;k`s}Iy8(s3RJ%VUu9#NHh*rET!`NQcL^O9PK*`)FS*%gnw z!d{5zA-|YYDMbc&YFcXH2(N~USn-lI$S^Woh{GeQhfZyK$gk&A{&R1c>abS6rT5C7 zc5LAR;zBH+_q1y{M@ZoWd&3b@zyANnkB|s7NAVHj{4CU893i)>hP^OVWwHg^kgdqJ zWIG{_kdEq}UbZ`0SCi8XK1uXv)!1cN(VXj5d~D3P9W{%OjRyMI;F(G$qzs1&6o{N8p|*T(MpSBDPsab-s^Xrz?-57cGo``1j`=`g5?he z!SV-#rm8Lj>`mrl`Bw(m@3{KOncRb4%o-@R@XFGJ?BaE!G?pg?pH=QJ8-+FI^((IN z7;E4YwF~`g{4r2gmI>;1%O306)I+Z<$Jlmd&-+r%+)sW$en=h=qBRbQ<;vh-54|S* zsE7LSOZ;NqCUwEKlRdw%`fuc~`C4s#D4mU<$ikgWT40trw*q7(!q8+ z+<-hf*p7f&!C3oBk*JZ;WGopcgnB)(RIj6s4YT7S;!z;~s^Ed3 z@vEh&xc|~PmA_hwh8b$Ncin!6IyZssG;EmN)jfoY!^olJaB_qY`xqsb`^e=!%sf?c zI75sZZnrldQKN?2wb2~&heK>5T{n@>lbgvcLWsR6mSS7A*fv#v1jRayusgdCvGQT^ z6Y^8?h!E~yilzH!bPxX=1@f;l9`b(EJ&n>l4fsDox;DzLsUmXi6wfuv6p+_R17B~z z?R_DHgTzwU)k_}(0ln1fT)UPWO8CP8HPw+^90_&kRF{k=>yZgU$RvuTjN6g%^iqBE z>{Zz4(15kHkovM2&mN z$>bDrst~F(#Zq;eRyC)q4@a`?Lnh)nbLmkCZ8cqXA`M z7ST-n18YM^;J4}UJHchtnNfCm-3Rs48{jC&XxNbFNjb9di`3Vhb-Wzz`UG!EkNdrH zSb0a=m0cBjE}me=sV7Ig+f>(lw&D{t|12o^l5CsB?qu@=kx%P)oB=PG z>`}&!-zzepGLof(U3g3!vkEkw_q}SIUElonmiwPDp8Llr2v;3ec+06RGHJzTI!PGM)H| z%N*nERtBiwD>7>Rce}c1w{dFoL_5)ycdLE7)zsm3XweYdcDG%r^CNy?$VB9~Gnt*7 zFl31Py&~iOPr^_Y?yJ1Xk_-Z)syIphQ6gXBX(98B}n z?n%g*AMP#75U2KR*6`h`w*Iam4mf7Xb5+D-EJMP2>SYKlmm#oRhQM+eGFRo?i)F~F z{DOP!lL6IN$qpLe`qfI=C|qS+o5D3je%%@NbkqF>gZPU4lKh(dMu_mg6U({as5&?k zm-mmU-)7q1CYI=fax<7LNtPl@3*i?cmVRZhrE=!j(XO(6l>0vWBUht7>R^^#DJi94 zil<46WLFKbPDrMILo$_2Bh!UYY^r8HgobR~M=m~8N&FMv2CScQOW&{Wx8INeR{79( zjZn4d8)wd%wyccGvUmYM+>Ad+@-PO4#ds^LP7m1SqWe;QAlaWBM0$k?b8sIffi}ae ztU5kmhd4e1Sg+qLeJ-rREO^^&`(D#hJ7(k4IhOitwq2{@1N~&^6%W37x(QW{Id(|Y zY)Z~0A0!_p9}yy?1-j+tJ0bb`Jj8l){?Z4Zm_9zo-i<;0%!5d}=AmLyd!^~L$iKbj z>-Kut>EF~w$$tI&0{60me2L5_{~<(_ujwdX(NQM-ne%o!y!e;S<|`^}F2a3TeLWX# z_p&k{wyOs_o%srbGrw0`@ng8^^22udsIRH?EqRpujyx_zNIx(n^Ms1Tui^T;9AmX_ zZsl^vBlervS&exJ;zZE zzH(V1#;IS9b;{hj{$um)-7eYBr&d%{DC!nWu)`T_CAIM}yL`0GeGDN7lS9d2LPVSAL_31fR`z$gixuzuYbSGrD)~4X z6FV&bPj5JbG>5A*kJ~j0$JYoQ(jtabU7dcyE*(9eijR>C$j8Yiga~Pg6VhUaRKwqC zAuB%m*G}eQ)q0V=yTl??$-p0ieal-(g)g?tM6;kMRd=rJ`SyT~_$2>C51o6XQusSQ zRS`R{ewFE?cCWT8SCyA;x_L8N{j}Onb+4fQDsm;cnp`79WY37@TIp%E?OCj`)++3E zp1QKee#1PK|Ju`bmw@W0q*5w=&;AG2mYw6z$G@^xMXk3Z%gXvdih4u_bXR7E*R8(V z>kU>j*V|29f&Kli6UFq0j2TD9l6A;m0dWf8IL`48$uc^EF(3I=aZN zsJ_~O?>@HJU?+JxQ=lu^h0G$eg^=tamXbMI((I;oZNRV8Be0_z>;l)E{=A|WHIr^W z@;>qba<&jcbJfC)SOGrRpG#?7`+nA#b*tL?ik|FjqisjbLDh_u(r7EpHO|3PTb|)I z*wFrZeGMz?YjdbN_B<{_;whKcbJWC5x;?jTvIoa+<4%7VsNWs$jUEwkQ;Ou?C)P2@JrQ(9XfbQNgt}o`S?Kct8{#w ze2v^m?h-=apW0&U4M%FX`YazGNP= zwxjhSkh9Z{RM{`vUwO(%vzq0|vSbKZUI_0>+G4B1Ks}g32dWvb=(mRnqn65i*{+~I zd<9w!=$S?~B-6=8LMYs(Ew&mvT1^J3>#yoo-@n^#r$)SHkJH`vgQp*T2ax^Af#e_| zH15kGhH7IR2TZ#Va-4OX{VkbzJg0e z^1pqw;YLZ(xQ>1cSNnfZE#9)zop~Zw?fS&7KH~z!<-{vfb?HF}&8#BCL5@$$6BY(_0_9p@T zKazKhn=9r)zIA8yvgEDe8(uPCJgGR#f9YSN(c8r}3RnX-&93{`Xs{6%-+F8T#^%M+^@1N?t~U^Wr#_{jps$x~vqK703`W zl&mO3=vBSE09VD$IvAtMCc%+*Z4sdi0$PGG@@D)vN73|yiJHeT8L$@H1q0HONLh!?Ia&NX>Xb%^7|aNzcQ}dRl+bD7=}@Rhx`l1EMS_3A>}e56ql=m zA6O9;rCk1@3jYO%N_p4%QZA3{a7e`~&@oeSb3)4Y;89%PaN)10e`YmM4>cQFp;mCk z0`Bi!)RAr~+F!*2wJ;H<%=lG9Dh8mIes+GHZO@Rp!yq`Onqe&Xp`buC%3xnoE=yz8xNBmSj4#3|ng{el^Iai*>x?38;9Bjm;x)V8Kp4TZouR+0eZ zAL{a7QP`^a(26r8%oNBmlM!?Hw&@8)bs1BqCWhyaw)?sxjYdEGur97 zgfAg_!=S6A2c48-vsk#29&}PJ|BBub%e&T>a(NUDx=MP`N!izU6xS~tbaS@tybF&Z zcnrm37#_p%7?HniXYSS7Gb+?IjMu+#8PDTnors&K!8q-o85>}%g;;Amf2kAB4LIKOc$bWk(xETFXGzzYov_!3Y=ek{&OR1#exjTZk1zHDx$(ixu~|?MZZ5R4Rk>5SgG=vVK|#Uwa%##cypb2wic=7IOg;sp z`u+%!$JFc}QF0sRx#v`?pHOm}8ub%OPNJlnN;r+MPnK7`PUr3@@gUZOKUYwd&LF@C zRr52bRS$Fe6YBCA_|;Q&&Z1;5O48N0XW_RuRFyvmzfqWoKd-3vorB*f_3Js*s))mK zx_aR}{3@!i&!c1qN}|=W3n8qlDh1;2`D(hE-^f;#af@-SF zZ@CGjxLxpQz)F>QUtTTM=eOJ^f*MsfjJ4|GZxCsuB7TR+*C^?%KL0(}U0OB^3XTSx z4^W{GXiz#GD#9qH3sr{((0+N1goxE{Qb_<4N`0Wr!rI!VVOL%}zKnX^ zm6u;?1xj+G3}dO<8GzCi>O?@^JFd%7YD-{VgzHR{`Y(Pp?>Q6ewD+~zpL2&;n~;xS&?CE>JL%`Sv_N-ggDxDYYn(0=L9?jiZ zA{!^&yF98)1j^cY^npA>oh_4B8`mX5%I4(<$*;Y?srHu5bGx3euL^4C?I?K_MI#ao z^?rj<;p(%1!@^+M1mx!}WlG@lXFG9T>l2_JTr}l*8<(KT5WEl8yZ1vj5 zBg56wbiB}2Z7vV>-|)hnYD9%RcWK!yDEI)Awc3`RS6$^-$Xi@uSu$4GDXL#Ax@no3 z9txLsDTc9KHLZw%+Tj<8oKf+;#F2Tvt+5R;9chLF=(ps;Wv?Mz!^+szp4i z$?rMh*AcJ8L#(@sr~|(6nqL#T+ffp$I@Zc_T*146|_;ct3YgHTf?Z)PJK}YwKl4ddZ;CT*y^8ZZ#~rN*-o9SidqFI z8hN|gSPi=@Xs7#V!|mwF_PUQY+|E8K(Y-yovb~y8gZtdGYpV)=&0Zyi;?L>!LW)bvCg)6tz&i!d~Dl}>6<7^)uWs{817*mhaEkB)TJ zN7u7iXwxixbS=-)o%Ct8?xelhx|8G!fi-j3Nv=SA5ls#-`AXiKIsU!WBZs{dbPcZz zSI;$+SaZ~eQF!O8x?$Syt{#rYJ6ff7rsd_A=+NCT@==6da&_pgR>nx5pv>yQBgu8K zyY8nIJ+S2IsrzX~4}C1jN5bChsgI@ZJ#|MFpls9~>?l_OKExsilYF|cW-lI0u8nu- zu96SSz1@pluy_j*H#;6Vq16DR$F(M zaVMJRPXF%0oW}WZ174{zm!=1XnIuFK~YB2lD)p@W!tbRe+op+TXC1}u#Q7;iWs6htm6>fVFf4~HB@(4!4TbH8;7EEhUpI5I8=97uVILMnC`G% z!*quQ3^$Ci!*z!R4A&jD31ziL=nmU7Tz6Qn5$Mh!nXCJ2 zBZ_L|>HgZ7tNW{G9x~ND_Lr+?o<6)vjWmp3@rWE{7+Irqhm{(sJM7+3y2D0}(jAsO zPIp)~?22)^!;;784l~B1dB^JxyM*iLScbZiCg=`}o}fFd{{+JrH$it;{|UOoo<~{D ziT)k-`~=-$Jtty%n5a9f=S1CMzoTr(-MYhmpU4giT75V2VKuiu-u&vjb$@ld2Yqvo z?yrvb=>GZ@Wp_=|{q^fTy1zC~!p*d=9fpskaz5OSvNbc1HQ;e&hVHQK({+c{nW;Oh#!Plt%`flQ z9d;GAqfc)yhpir@lEU+3j-wyK?%_e$y4@#-l&jy@_YvGutYQV_6!KE%eh?Vt2Siq^hBjv>TpgK1)Z%5hsbFp&6<4ru& z!e}f$-W!EAN_};BRNkxQsy}QPZSi;I<5OF2ZAlnmz`rz999? zn7sV5=TS0XzF|Cshq68$Sv_Q`VH*+nZ>cfEI6qH4IyP@dsW0$q`$sWpsjlPl;$2_N zSNDuV@g5X4SYQ}~RQh;G?ok8BV@KOiQhOm1S`{$?rQ1}y3E0s}l$3kSFmA&`Ss&$9 zFZYbG1b>|}!uZM9Zmd*^6X7}!FJ8f;o;o`buJcsYyWu+JakLa3)t-Q>`NhcUKIbt)G-v$Lyu{Pr_NW?P9}t zLCu|vwM<*JV=_v9LCKwJ+`TwPep#$m-isB|vq}~LeW#$(vugGfEJ*q-F^uOZ zSQ$R#L#y{wqo%?;WT|0HRSDBjHALMp4OMreBx#wU%D#iDeP*NTZqOk;%aoq8pF6pwVDmDvv^ui z;0ctSy*@i{aOte44P!PQhn`mMIaqmgQeEfZ%{;wU>e+!qP%~AHeK7A4{HWLU2QeJi ztB8kCA%C4zm>f6_6{1z#wcLga#~^K=n|Gi2syaItjk*gpJnFfJ(WtxB;fE2+_-72` zSv;z!Wse}j(Q4--sCRt5Bq;aJL)RT&uh!4QTV3+(|I^l)z}1+3ar}9on{I_lC@O6z z#b9h9gluEq#xe{;61w-=*N}Z1JLA}w(I7=cWlP8&LI|OdEE(CCG2{M!?|ZHp{xf{e z=bra>&hy-NInVdqyF#3Y)u$l~k+_@|E<}mgZpUK4qN)8Nl!z^jS!8%9-)^VAiw*g9 ze;{Huw<^*Wr%yiA&d#XKQ0x-JH2G;eRa=S_8LOuBEfT7wG+AaigewT2mKl;=?GSkf z^Nz#w5&FUOW1K^K0(Y1?#5#vxnkdpE+_W{fr+r=7QbT!A&v zg(eeLRSQ~AhU8K{$=qR6d@i>5v}vcY6g4bou#rB=Dx(rgD~b}Re(MvYgzOU{57vv? zuQGVb{A3!s%5b3g`Te+_bwG#=SP0cwjnJ9>)O|Ioedj@(xslTvtnHoDXbnnu*&$px zOR?;D%C1ETFC*WzDBKYVgj9Aht|dEt*Y#S;zbGTq3oeM z>(R`RD#VRcTC)Mo40Lh>wut)?9HAe@)f<|%5nIHac5Z|^56bvs04|v}L7hh{HsRFr z1C;zUAsmkj5llb)ipu_gN4|c==I#ecUGisz%E6mkuwd3? zy%k5<*G^N$RvfmSIZcII4M}BNrgOV+d?s3a{W&4tQ`K??7ahWsyV;mn#2MOjS{j3% zoat~3`aT53pC)XFa)`EU$4VP=UWn`GDKr)-*>RZTmpoWK<>AG*5-WXi5LUL$&`e#;-O`LZ`M3kN@&y1k&i0|$p#bc-)bmjx8IU=oU>%yRq7CJ zXs%NPHm5u7i8iz^Itr(^PSdfE`e}Qbni%v)NiYOSO>7qE#t( zSIt+aKmRKu-K4wpke-N_2`DCuOGjBk+DivyTK%2v15b^y+eY^#!>nW#^{Z&+8AB~69Crn_&F0!tdzhR}Zu@X8 zq-{0@?=u{h+p@{L&)_T9W~+xL33Ow>p_V+BO%4YPNe;tqal@7P%)ce*X$_ON4k9_$ zG$raA+!i7R7c;c0B&$y0DoKOelyeY8^Z=1gcWBKaLx2uG<<>Ioc2;ykL(S|v-02y7 z?#ZD=DHsLQ?@)XS8otWGm8@KfIE-_oS2;w7p)JV8t~ggc?DVitS03ZacqNgeI4TQr zDJm7mM3wJyf4%Nf$Pt5&-cOr;M#KB`FS}$Ielhb1_Be;~IO%B~RX&Qv-^!+Ei$(9@4Ut(5615)RWNeKx^|z z9bWe)lo30IU84+x8iCIfLc7`)N->#*b->V5^<9%vqK zspM5?d)`p+Rdn9rt+wd8Zrbruzias3E^o;p%aG*S9ie9LaO?zI^ZuX3oub!v$Flod zdY6Usuaoa7^*WYv|9i^0Zb))`{E2gI%|djC(eL|le68+fbqHzH*6)DsDioS=)8H?6 zn6*)&?}~d&Mz*8!xe?r9y0jrFhNsp84~T+;|A*@iTfxpla4}e zW8<$^DEu}G<7c32qLm`H!+IB?%6Aa^Sw|i2pr9rdQM3)X7oRh&$t4F%Fun){<{0v2 zf;D;OqJ5IJBBttbQwY|_hVJL0eUdfl?_y;}+9)F5hSKh0Wk%Xip{lvtDq^lJ#omMF zZcADB&{vu*rQXMiK82Xs9H;EkAbmH_Fws68(mp#y+=G=aMiCFteY!0zdSEzd*BJMr z)cUg0Ys9vyiD|l&WB|^5>0mxC@|JMqjC%N-?MOinary&|8t*ft6nhNulO;hr)zaNY zsJe&Ygq5=sdeY9dY@HNxEM`cw4uRCui3%PAPw-cGL5qjxR+2KGU|Hgw$ovG$H?*W8 zvP;sz0%$`^(!&B=xvEx55iLq7^t6(CY1qbCOjavJ8BdYD4iUT36zgsbkn2iO^6$|4 zmR7{M(lqiJdgxo4Havso?W~Bp&eW?Anzu8}E<~?OpnY;ysMs+>Is510C(#*@Yog2+ zOPp!wb2RGef?9E*$}iBUs|$610nMe1BC3{ASHB0v*kMjw%24o21ZE@fx(t1MiR9U3 z$nO=tp-ow={IUui+Kq3BR01)AJVcz*RkSHf4zJP3!Br8yu9W^7jT~I*ovKAad+JJ+ z4;ek|UBx|Zt|IVCb(AaRyg@v~O%c1?Xw6%+32~!SZw*N{dUr*5!nCnUZ)ZfAUe7F>>^K0qttp@?!G6!ZtQA|4d}2eh%!9(Yjs zkI=??P=}Au8hR=s){~0<39X?g1^x+5=Y{R)MXyv%=S7}>K^qP2z87Wx1#Pq!=|4dW z@>WEQH>G`o7UWHZs;2lT!stV>WYL3my8XEClW#0T@63i3`VA0^mRBgQk*S=$ z3(n2U<9|KTQ*7}0CDoW@-KV@F(#un%VhpfVeY5$a4!>4D6L*@sf`XAZj6l8LEBOhe{R~BYFa_tQjz*vK^x+$i0i%-R14Y=Uuszd zT6I4~toI|GHMHt}RLvUNTWA9+QGu$x^&=O(@qpctN{Z0?E26qTW$TST@=zr*tNPRc zMVx`X44^a{qmRub_-1o$oKtk9hPK85b|F<1u>h7-g<@^dFt`e3*rK7nsvjZC>oxwMjMKv;Zi)ra0jNZL7~Oaa3OrNd6U-g zb}=;USyK_e!7kLKHpS8K`^P1D5|$9rANDCfUyqRK)nYxVsHISCl)atfwQz zhmMvu&bRN~Se4A?8Th>1n1Kb2fmN%CBEEyE2@I@CO)S6~)$}v4!kb!vwFy#kQwA1% z4OqoPuuLHgtl}XItn<+7HDh3%4`E;}Xr_qhW?uqpK{E!{M??lSXJFx{Su|j!G*?7G z3kFt7a|Tva3q`DG!N7`Y!N4kn*1P3@0IRSC11q5=FwlyDmC%xbHM$kbAGa(12G;0S z46FwTbpDQk^`I34E9N^zIJf=}V8wjLz%sU0#EjMqEMsd1)@^95+x#0?w_7u?HnmZN zeOm_BrZx<$u(pbr1p5M5VQm>$S&*BzV_;>qWnisq2L`lfV6AJ%zzS`Tq0pXz722MG zbro7j2L{&F_6)2w9TZ{Pk%6_Q0|TpHM{LKA3@i*g4Op4bnsj1dWp-p>t?GnP)0u&_ zsuKgNZ)fnPGXqQY{{^hSAP(;GAHe#nvj(g~T@>Npm4T)D{|~H5T@~@9D+6m1epFlq zR^#tM?C%*^jlXALS#?vy@NNt&t8NUe)6nX4XJDP~#=u(GT@inFXJ9St&cN#0LlMV% zFtEDzU|@OlR74mIuZn8Ga_z~$%K1SNe!UdYu@?g?8`EC_Yg2DU6u?UT$iQ0Hn}HS9 z2YV{mjXn&le(=8nR=`h+7!6zh6RoKaJox^^z-on2H4T-=DPboUsfp zmb47UT8~Dgo&C4V;Ehx$1u9uja9^fvHyXtcDR3`9&0&{0}#eBx*W$bx-y|X8TSRc zGRHBxLdK)8#xuG?#xuI~6BIFO!hfJkk2@ObaaB4J?oD8HrB7gV1w|@iTjamd6%@(n zG9zx7$mlXhGP=?x;s6!)1-jBEGP-I{QpDy-jIP>~7+oKs4W7*C`Z$Tvb#yWY#bid; z(aDUino)|_6vgPO8O7-O04;n9qw7Nyqbqd^w&N5=SLzf-*SAv@v0*Bs>)WY}u6NMF zrZKwSO=WbYOapnQGrCm&U+C&JT@k0I{|CByP1n%nIs@kcGZOYIoMD7fFk==wOH(UrCk z`>aKZ2wcSIO2zb7=$f-w5t*<*7xS^!jKz$u_DdD98kV+{(bXFMSLiCeToL_X^OiHZ zN-Sq|-TFlll~yRC(+Wn{bxePSu8pLj%Qc!5v1Fwp5@C5T6$$FUKP{)s(ZukQtFU`m z#qg4=7+zbT{U5xNS24V{uVQ#btyWXMg4g2J46o^{8D2hX)ReE_Rb~^lRYdSshF7Jn46l{Y zifsE2c&*&Z@anZq5vR8?yn1b8czMJqqIS#|@bZXZcr8TWV+_M zb>7bKa*kERH?a&a=U9frqYswCWSBssB*t?VA)nX^Zt601uD#SCqip4X$CPRA~&+wWY&+uxtOA!gX7+%eG zF}&<{V>|9}PoWwU6O-YCl+W0IWH{@Jidy@S1Z_5f@<} z4l=xE!2b$fty4fuSV{`Rt3?XK%RUvCT42*s8D4hqzk*lh5k+_$RYc39eB70BgyFU7 z7|!=$_Gt{SU*LZQub+-9A`W)-IK!*=afX-QNkxo=tv$)`Di8lFcom#tcom*f#I4f` z?#?Qr8jR8P54;LbF}&I#cIXVltKAuf*9$HGt0OOYmf`j048!Z}S+&cr;FW!r;dS9G z!^@birhEmj&`Ufc)A4!f5*^%(L($Mnl(QL!fPR;8`g@tyL>mKi@bUL_aos8dVo)ZJ zyb^fJ46mh%21<32ahc+OGah!DoQX<;eO|f>e6z!91T>1@WyJk1dor2~+KtO^4&$8-|Aa={hqyA|iRQ?5|dR%5>Hfh%ek^Ta~SWp!8Dw9Pot{xIa&tJnxI-8HHlgV{ZN zg*wFGq}%Hn9v6qXX5p#uEGoGjF|TVBxE(R8>xy^>^Syz6-VOSw#;mTBXRPt0o%>Cm z+v}E_HxAl#N$uuMn>gbL`?I$>;R!zL-l6n3qmK?6EzXTdu~~gb5%DnfDy)}o;T?v% zjLD%5JB=Q?wK)p?bT1;&`dW@6n&whuJdPl*<}Q_8JJ0E z+DuxXfp{m6itdG&l4qI43i;fFOFmV*gt_UIuZY9>RB#D%(h!d06`^z%Lx3w*kG#h9osg!toQh2~#HX5k~+ zupgN#A1lJ@3H3UFO!&0%8Zv{P;PTiLg?eWpGw2BoJ&4Rah@A`6S_{y@r(xHTxu5|1 zkOGCO+(71n0t!w+W}T;s`1L7$OhG1mYJ3x!HzBt8U7mN4 zqFyT0;2ttdyrd2%k$C{3|0^nb3YqY!<9%cfe1+L>p^i3OLuM|-_Eyv@3z_g~*g<5@wUXkUm82?% zkU1Bl@;WkW6p>;h?tt7tCVXm~g3N4)Ev+T}nS#vhA{2ZRnNikK6j;;8o5+Muj;Y8j zua{!6UedW#WR};H!!2Z9>#xpK_02F^A*bt~(GvV6zUlp`6=DEMqIhOj}xW z2Z``$*D-XN3bBfvBtsgyOtq!>9Apl(lOod&@0}nMK214}%;I<*EwZRo9~knN#fwtZ zU1TOftWb=C?jaLCbv%j8zIZ|HLNTd6FXS)#7NZXLky#XPr%fnMMe~pepS(^ZGZ~_< zy`)>Gk(peaJRhL^Lh-)ZWr)YmU_fDlo}a-IIXFl$*@3d93HJdUs4yRW9)uR)NU;ym zCww}Rj$#UTl%i`1B*S);pf!)c@Nh>;eS`+-(CRx;thXsZ2cH(7H=eMX;Uu{rAI<9u{jfr<#eOqsE^L+ zcjCvC++4XPb(p}rIEmI>U8OkY$~6gJtI5BhsZSiJH3^?~*))q}c4mH3^?f@>1lLx76g=@?4W16(nBN;F^TbHF*MJ&5D+qJW+vb(o|83Tlgz+ zYE8oDnso7%VwSI^CS82FCet9+@Z*|<&ow#J4@1Y#Qj`YEq8$r$U`6$=WkOiiH6bYlS?|0Lrp5CE2G#+gBO6uo6{h zO%W6BItEZ`5z|Sl26*92L!_)$g)7qgTdv3^_+0d@r6M76MZSP)UBgn551?ulS+Az0 zBCEjBDsmuxnj;evDkXK8&?>T6EeyPRu74p$_6uE-q_%LZC1az`Dm$c}+h91i4)gwGZE0b+PvOGSPNYt`v^-xFX?m zMYgFYMRGk$MYgHO6PtMDX{pF%^|>PJ2T8Fth$|94SL9uY?Hh1K z-VNf4oYO#xHx0NV;d4b+YbeFqhL(z~){ram8pM!BT#@j(A}2Khw;Ne1a#AC%NZ(*7 zmIrf1!sm+2fY_+9r6MzexgsMQOYx*JS0sF{NWUf+I87`S>DPoSG81Ccrk0At1XpBK zQz@P`<%*1I$`x5TM2giROiB1m$t;M+n;{uit~paOD}*T-)Le?~xB;V55Y3VI;2TNG|@Sd>M$BKk#WA z)Jg3yUp)EyT*AAuDNY9Cb&tvzuptQ7=qyDa*n%#!tO^EfNGD3Jf>=@)DW-PC{syM+ zMv>njmW1~|zCo;dHz~ZkOVI%~xd(+-MXY)^nq3vKtvxV$dP=b#*0vY5sfO6r9yGL? z>7?DXUc7wo@jTTAql;dfjOJ&>s+&gGkMAwTz#nly088sbZr`Hqc)WD+E!sZo!)+b; zu?3sE+Vl;rF&<1CVeb{n39azCB9sbhps`mdIn=~DdJ3(_07|ck?FC=kUe@ylU|0-L zDd9o3{-$Db-T-xTs$oQd z=zJ+6<}m6~7aL$HUaqJMt?fW5Lh*7%J!owQQg}UR3DCU4seFBC33$1pJ~UG}4q(Em zXb?2Kco7%`?JBg8LFyp%u>VdOr9BF;T3I8mhLdLl#Fq?`V%s3fZh$sR29drY=I%YT zu)%=NBs_BvB;IO`=8JO5`$1HQ1nWJ6LAt>d+X#*J45q9`(AbGJ|2sc3neKRaQZvAnQ6JTzX_YmM7ri^g@ocj-xViT+Y_Icdw(o%*twz3r)z-0ckBvinr37KK$=bQ)gno<@5*VO18LMme3J1y7eE zV>+$r3@vy%o$8FCJbVTaFjI=sv!tjyi+=8cc^y83;=3Rg18wDO9B9u02IkPnu876V zBI=6RIB0X`O5r|Fir{(F>wCn;&7r985!(gr$j>;OoiD}M`4rL(v0d{hyc=SVpnY6` zqk)A|BrK%L-4S~P%^SAU^GHCAFJ z&H`3p{|w7sMSFT7R$?V(^+K%OYAJqNBgHG2%UW8~8?kn)DYZ9ZGuL9htV5Bk$9h>$ z(|<&4=33hNBVtFPUD<%6gN-=u+ei_85Iee_7WF}F#wIC7{)%Is%{cPiOkMgSHe(Zw z?F$}7ZKl3IVH-_H?8Rns>xXSLeKUR$0$OmAT|F)29cG#@dR$_YA=ww$sRP zfE2z4(z03GvEPoBVn0kD_fK(Fp-+`eE;4Joiq#AB{a{lW*&$A4Ym#dh#W5t z@-rYdZ#T|WVKoy_!wFQN#^&uN2P0yBd!+aUmI?FTOPNNKkDaQS%@ved3N_gXHkCD* zmfN4%i=s=EqCad`A{{iLlQVlM$AnHcBuVin%s&~0oJ^aCBDNukP7OsY6j*yX^s z?4zHDA(om<@xu^%2CesgfERXsKaCuY*t2~^!x8g3fc-G+FIby{)N2G{UI!>@1Y*k$ zVmE(CiixnZhbUwuV#^NVS0xa0N|9m;tjJ+0x*Vp;qY!gSp$?-EtDGvuDwxL+DGW!b zeyr&8c(#NI#)J&Hj9t8wO|z3F+gpd!7pJZ@a zGOQBCPB#6ZPdP6|(F>9eZ8mz#9p@Q${VrgrUZ8>~44ZxzRNN&v^~VK<+8G$)7qOLK zkryd@3YM^T2AQYez$qG<**p$!4e_(hc65KMdI8sq+DtQbw%>-Z^Cc--!&Y9R*lB3G z?ILANGv(XlLc`;jf;JsiAJ}!L%?U>BvH9BxMpsISFx7JEZ!H4zkd}2Bvzv+IrA&&P zfiChc(S{jV_bspBoc^j5CfL=h6gm^JmRD%@OvFAxGhV}f4_0`M+RQ@i(^VQe3u`7Y zOa1EFNu1VZmMp?7wMZWg2$ktQqBiD2HczYghIx5?|PItFAs7xvZs+7q6r+h(!jT!&YyH+Qv5 ze!cz=Pb`irKJ?3zkF@CEvUdb@Gjn!Z}T z+CG=h?W^Of>#OIB@x}V$eDS^nU!pI`m+VXN)%T_P8u%Le(tM44jeSjgO?}OL&3!F= zEq$$gt$l5LZGG*0?R_159etgAoqg%P3||*tS6??@cV7=*PhT%zZ(ko@Utd38f8PM# zz*jx>3aHeFJ>g~291cgJ;=z$q`$dj6hYjf$nHt_NQjOWZ389hFL*rp2(8MNL8~FJ{sIU&qu0RIV(Qv zY$wn463z-4>gYgEctDB%c`9V}_lWP?YUUXD?ir;&%7W~GlExV2o{go$XXbU-G21gO z);Oi&cX(Vds?zpFtvu2n&Qr1&h z4H#_|QHzgzip!D>OU+O<`5CLM3ajD?N{b9Mo}}8|2(3~akr)zInjwo^k zC|zm|Q-5CbR8cigcxpNKMkvp-o8V7gjm@PzPm~OAk4F}t6X}GydI{mp7d1C*We`+u%fu+6j>iTlbumMtM4h# zqyW2Sd3EKiXP@!1+I-Ga$!MXzIS*4)ojK=e9Oem^@N+gGJ_Q>PALCBs|ESdTyr+@z zpqhE!QyK4`IPXa_R%Z*`mUpl6Gg(tcS+lhIdBrkLz1lBLDtoT$>j?jS=;Ri=Mc+Dl+gm z)CAyPR+(rX+^OC2k z4zIMDyvI{a#a#B(N{C0G_2P=6GLEd+Gt!J$EGZ`M1A#OnA-94oK!rH9=(4A#^Q|zI zb=lKbZ0Pqm{=z1I?}-xI&$hE{yV15E*!ITvo=wiHVQS44&kC{iuEGztn{B7q_DR?o zGA3QFQdoDP$iN^sY;MD5FOA{SL(=GI?(C%rTzb@AD#tnYNLpkh%ThhNER|436^9eA z38O>6pcFtgx#kIy;96h9F&G;+?wThfRgNNgSM{F+Fam12pWBode;3YvkuF2Ru!~0{ z)PU=r6#IBnx%z(=vikPCr=n3a>(+HoX(M~r$f|PFV;EQ(_JgO0;oKCVHXJug8=JD4 z{ODw#VgM5vgX4%&ESFRTlkibz_A}yREnV z<|#Dday9BU4p8INg4>=ZFdu4D><-^`y5s4BDjV*2wiwT6b^gV(JD|ZPX;vJjjg3;s zp1-{LL+%Xcd0BgWyxVwA3fVQf-?rx&qyF$bVmRNzyy=L!Q*H5k%DB!j-gD$x@;rG# zh*fh%vc3=^X<{joYKt^b9>WY56`snU4EF>ZgViR(jEd|} zSCbq_TI3)h#D+yFV+MA_AyKOHDyxjD<1|BTCl4zQ_<}vkB1G*opY`Vcy^op@m?yx+YFnVW-B_%wATz~ouJWAX)WsAhi!$#E(Yl<^l){@d zLl(&tryVxJ$f$-z>SmxBsR|V^D>~ng(sP=OYPoZo`2V968zfJgT#8cLds(Gp>SOkS zvv(3sGKp^EG$T4so+U4k7loLiT!~Wa!!UOXD~J}+mCv!lnZK^gp1vHVrWUlvEqcv~ zRli!$d`aw(V6&FH7&g#t6emN-5@bmsdZUb34!=^>^cXI!P6V4_c6&yp#?_B?CndS# z6Xky+iOwlxGFhKY6+*6&Sjsi1rbdXL~(mV=RVS~X?<>db> zK_RqeR?~xddNm%7?D|t!XVTx-H>RuYg-x7su_wzoo~AAqHY+>(S5pgbdm4-V$hIMO z^!v_tJQ=7~si?WdSe|vLsJY2memR3ka2t)w1yvxKY~dWOP)GL(Qs? z8xU%Cb9?DLiX2JaPmUHsZoF8^jj`p%Mymr8%t{alF9U&e+bf2i*C#mff=pI(rtgJ3qFcS==!YZ=48dZeiPWrz_W|6OxyM$2OCzgu4sp#BO zU0vO*Tgz;3c6Xg%^;6_Y@-%ry2!RV?DR5Q`oU5+3zo-R}Syoa_I+%&hpc*QCi&<6L zu*nwmVznCZGOCl&WDT;W5UOsmRIOD*A9rf2la(6PZqC2;tvd zEd9G^e`nVkYU@_ri?gPi>CSOA)b>GURo#IHYnT<(woYaP_oI|qK`tj(lB;Sl!>t8XNqB{z}J2_f*JSPDFE3%pQM z&GKa*Qo6c7V)akRkIBR25g`PQilxA(w!mjK)uJ7GKx6;!=Kh)W?~u32U&vpDQ20|U z6@If7ey^$0cQOR*rq$JgXfwtYRtvR^2r`_EB%_2-sUemsIFHo82#HojtLqUGn}r>_ z4Qsa}+mh|c4np{+i=}@@?cYfqsjkN<#(yRC@f&6#b@&l8&NYU9jvA zX(E-JlWM7Tujx>Z3^J>!V>O_%mOhV@kC9K1PYR*(lvt{))A6iV{cGxYn!W>(^)+!u z#Capij9j(LEM4|WZAmJv3FF7#KPo0RvY<@I?$lNX;?1(rckmfBF{z9<91i;#&zo+qCp zUm!ONark~oEDzr=*47h@Eh;@(&rou%LpZ;vt#h|e==&LYg#4U5DumkCwRP_HWo@0i z>H43t&f&Y)Z*<$k>4YS2vc6|h%sOH}OEFW7MXG3hGb8Vz8e3Rdjb3X86_DduT8s*p z9QvF3<}9OlR{vD%g}qwCo!5lXGhn#~DN} z#2X<}$gVLcMbg0$%GtymWhAOGP0aV4=`NiJ!b&2jemiTXX02~(7B`HcYFjg$5EET$ zOewRA`(cqX9wFzDbIEx^wBaJL?2-8{oeeHLm&onp%R(sZ6ibCy zY=u`{Ob12bW@)pd^K+MK5~^bw7>e1~kMzGq{zU#v-WEdfH?dT_V=MmRVn!&65oMrI z8P}lQMpd#38AgT+p-@dM6(Zbvt0LVxB}`OJS|LSkrk1qAu!A0MVsv+#^d3Z7ZxNC0QXBN>=FF zOpPt%i{w`FB_UK_5lhu=T6KFJb*eIEq7d*`hQQ~n{snoI{F3}i2!U_KQs8SXaIB8b z3L(I(@K=N>St0u|H!G}A7k)-1vLacTtRjSNgjniUt*b|ESY36ZDl(@;6`qd#i&jpa*fozp|;Wj$GOl~J%Azu|j<~6aD*`Z~OovXU&!32?R?yp(<8}byq_^P>2^xg&12QwjR?$QP{BCj8OZ12&5aGdXU}8o@6f}WcrDvOmADJPdz4w zJQj3!Ph;&FM$9Jqg{wf?ZR{;bCY5#4)u5VlG3LwAJKGNQ;xvKkpJgi0;3jHr5y?&BIUYCugL zQBH?! z?cDI6g&OY43H6tI9jbq!S&kz(nrR_6>a;y{&?+d@Snvi$)Mf7+wXO}p0~{M`rwk1KTeU#Bn-VEgNRKoQbjeApl)HhE?j`wK@|w3^LwzOHloXn{|x@wQ#su z&)tiTeaPNqU$UPN>-31_xuJioJ~s@&Aval1L708w&S9`hA7NH-hQ_L5^>HuckrB8T zlJ|&QMW=zfS#=s%|2}h;a}`blsb-6vndakxebaGhm0Ym1*z7zmplNQV$Ah8dg3}q3 zTzkaBloyBP)>tJUNG`ZCZ;gY)buQ=`ZH{v8iOq9s@XJ`85yIwVgbEp95w#^4&t`Qx zhjYnsdE0ud`Hu5yEN>Z7LbAl7aafxXLKY*7lO=>`x=^ufx{`5hI-`_2JPtDj#K0sm zk=2vQBr=7pFN8pvSPG=t0u9vC@mhd6V&6EOBSMfl;sbPlkeo_RBc}@?_>fo%&aee% zs{Ipio`(Qa#HU&PS@IcjBe_Wkfz4tm@SH91yqYyp3p8zoto2ZwTG|SO1A@#EFVg)o zd5QdVIEJcQrWrPr@AeI7UjQ@#61`od6L8))apg{Bzu#6gis$Kmg;?N^?vb85)od+93&T2E11pPGw3sm zoJl@J&K5%D5wTS9*(wjmGf~tk`sShY*?65NB5uhO-EUFj9rA7RUGhC4R6i6;)kC)G z`|jklRX(;=K1tAtB2_A@<6*exdOd;JA|k#q6Squ565(W&Ad8bF$x=dy zmK96U(usPLLlbqfh(^mz7L(~zpG+ZB$p%8mG!{#lhKZ`_7gjV*)N&6|b_HgO9#*$V zlN>}27D8aSSPBfW;~1K#Zz4j0HxcKt{sMA7xsY5Wgu*hhR9LJPj3w&8Y<JB?jUyxA+Sp<1+r{`*VIg(-iF*{@f-SlM}A8lCr=2Waz-pwPTCuCDpB7_#D?%r zVqg+#7zM~6vLG2OghElVR4A0ByQFZEzLUs3zlXaHtJfpzk}+hg5CVx}DG+B1#3$)Q z5g{;9?7{lI$ev_xvX2l71H@9HudUE8iHV}#5h~~2M|97i<1BI}`4Bl<2&qTJQp#sb zJ)ETTM2^~??&nzj1@d`vGx?$r0^7t=V2drVHA$z4*qYoF5pU4TOcBfen*8r6Vu2Li zMXX)`PpCpRZ;mL7^5uv%Qr^EI)357CY}`af!7 zwQf<)eWPplJmdx#s5nbjR~`1_hG)KD?Y!|HHgKN%i2ZQxy658o_Yn~?&V4EQqqVcf ze~&gNZPcSTPuhslD`}%W9Nxco(PB{FSZ=y`8!^v;pmP3*?Y!~d2g6+=RyQ8ax!IM1 z)7(93UL9~6V#QfDT0Qv|?$_rV3wGxC4_jAKN4s@5-s@o9`aYsQv?b?{)=nP(J=&b? zQICZ@*(1h6p8JTQI5*v+rgh>-#`}oZ-!+4syOZ@Dz*lkL#g$`nC;2+LONe9nzGQs| za8I(n1E}j~vCfXW*JmP$X5k$`tZ%?@+yR7LgpAUCg1)E7ljLdgj1cR+AeQHlv&s6D zdJe~FNhP6}FO@8z_N_4s$<{HSJhuk7QSuzTb8jr_rq&syT8oUb3QiixC|6~g?bMZ2 zv#9EqX_m@*=P@%Ou%0QdB~ImQ@%ivlY+Kdom-=dd>{#C<-9e* z*60Lt-+CmN%~SFum;+LDf(gq66VIO3Q?<__qhyvj>?!l6b9{E zt4Jk8Gd?Dk&A2*6H{+TVee)3t%q#b>{yuUqxt}~Bgu+{5sc_I%cq2vMe1rlM%hM@3 zvBY~OmPUPe7y+b{3?zeuP%I>tiUsQHm}JXO?)+%<_J^k0D2sW65zs2u>19!SS}>1oh`8Ey$aXt66<5xrTg< zd|U{D^5mzjOMEG7PF`8bqeezcaeL@y+TMH6idl{dOP>0>U0v@#QTn?S^X?|hCD}} z7ee5&SPERw0vA*DeMboJzGH9$oldd`bJNKh4d7?gB5RVhNtY11^~6%w-9QidIt`dk z%81Q<95tOzUC0cwE7?s5nO6j|PRTuFaLt|C{HYlKjI zLM#>6+KP`gU^0m&H(o|Ix{uWlko(Dlt)c8B7i$hmb>sP`OVmRfcI5 zW4KzlBj-TS&Aout7m*9e#pDtp1eS}Xz*4Nf3MN6FcjErEy{FFHiAzYY(qSjLgUljd z6GCE-SW3KZZ^^EP%qF1{lZ8(Gj@3_)$H|lADIo;TiKW14Ti{GXeb*63 zUwy~1hb%}IA`1(l6(W{eMbg+YMp56NvD!K1zc+49hNg#Zo}3axH&0HPffL(38xFZorsg>uRL(zu z?VR!-Mx5u#)cyB3;)eDCCpmwdc0TzJGJoiH za{2F}=OmYUP~=H2F(~pRmyg}c&~sDEW{q@e*+34kMq@IKY(h2_;+WpDkxng}H`1x4 zuHT4t8s5FWq?Tx+o9~&SPOOfZB`h<`p>!Qi4kJg9_X)AuQDS*2$!w%fEyFzr9H}L- zloOKt(T(hTlqHI6c;O{Se|gpf$7?2+G4JDMW$rONC%41{tq0#XpK?BfSae1inzi=> zb8cYY0g^r;kL=Gh%DxTx;)dKTk;fg$BNs9*yT-Eja%(&zA4negblw{G9g;lq6X*Ml zB!&FYeNjF%E|ZtY@5w7dIN#6~rK^qf1nF8Mwd7NL=M)MN0amq?WOuSVJ|@PUfN)DT z7PZo3DKeBSBSa%s5X(j^+gP8~%c+FV@MR2$u@Ni$h;LISHP#s|EHc_()r!x}IH%cI z505?+96Jv?;%{;bpY?)7hO#vh77B)o-fs&9^(bqrG#`U086 zd{yfUGb&;>1s)+ECg+m#glMBhYUCHDJ5pDh!;gG_RZYieEKujaFstRPa=r@x(u}M) zA09d1xlY#Kx$Y^$sj2Gsr8&phw6Xqn^0xU_u=CZ%D&uo2G&Ug-Up9_&$D$+TPg-o@ zTDOxgkuQ_42+>Meb_6@r^smh5NL_s!t8Be%^&4NA)w2VZl^D7dyymszQ5D2^Dn=mrdSpoVD?o+0U7hBrCvoYZJw0--NIHnW4W_9u;i7FCWx* z8;9~%*!-0Y+}diuAGlSw`a83caZZgsVrD7%0xtdn!}{acsU1!9h}m|+Om$ai0vV$c zS&^(vRuQ5NBE)hqR&An(c32bj=Oujm`5d-OcIhc6&C(T`(y5t{Uw?NSO}M1FdiEr8 z;_SNoqW%bV^Q0LOX|cjkaxgiJ94^F~y-oBOy|0NLqZU6MLJlJTwm!!w*2ytCLIs`1 z7#*SFPn$2|d9IVE&Dr%GB7l9-pSSf=j^{S-45^TWM;ydvxBvN*h8pvSrDw zwn^>o4HsG_ayo#C?l?x5=N$JLE4y`2V3TO267lzco<V9 zS{sxrHKTx4ST(s~7Ir7mF@;Pf>yxQM2sF|br3TIT_XzOyf~EzmoF;-&sCxiiJmf&q zBrPFahiZ$`ARQ0>Hb&#Ccs!INInF(YwdazLkn_m-LU=9K7NrID_AG3s<`=Z=VN+AZ zT*IbprO!6Q;9QjlgRR2uFX;0X`6c-^c}xi3`Z2mU4-!Lp)E>Xbs*iEtB(q22ZDo4 z7f(TT|4p;FYa;z7lat6Pxxq*C2 z2=|TJqV%*5>6zxLYEcf}4L_MR)qO>+qON!7@*epvd5C;p2-lCbMd<@A@?mo|vpSx& zSgR=Vadn7XqstBQI(d`)K?v8MwMFSiE%H-y^~sO;rm-zjdd zAzZ6!i&CW)dS|TMLWPH9hmzoK#Oh7R#$;2nnGkNRv_+}8EzqKc`Y=bJma0@7$AqEu z8BPu(N09dk;X6uOlrmfB$#)ACQ!6`)T53iuh%BbdQgR8ojC@oG*Hzl0v|NXRzg;x_ zXR~^CC(9Y!xwnO$X6~fxF7h>UH@QcMgYSVB`V_veg+7Jr`meK2*4^vNDIDv(aSC5P z-m6aB#)Fc3RmdGYD0zyGXUNm!S@N6^E4?I^NBr}4V_s;XmfT^V@~nC_!V{{_-@$C_ z_ZBLov{gQ9)-UD*0rhvtITUk(S9vbAlZ98#<|Yfji!%P&obel1Vb>USJ7>-{)+ncr z{DE({#kJIvbJ*fBPN0qHCI zVYkI93@h*4U@YCnljFz<P+EpWs}~KcnvN&V{RV5lMZQVCO}-<9*ZbO{^sXJndo9(ri#SE(MxiGL?#pz%LVizP zC9eq~@PoD}UALufpmk+tU`ugkP`VXr8)e8)vMgCnh;dR$EXPTC6%lAfJ1ex}#5P-m zQ-cO{Nh2GQjmXAA1khYtl$vOfrmZ+Numj1R8VsV_5OOd%lpH36d#1K14W|(1t2Y9( zTepg$kjxBR3+T3pTu3e^mk8m$Tw9cuYN2InO;D~-&b+|&3f*>)uaY~-EFs)?Ym3rr zTIhAvqyXlo_NK|S!1WD1z9YXSkCP{a@I0d}N+)&moNA?-T*dT@BGpt(q!p;@7PJbx z0$Rhv2qFW?0%SoU{EKLdQn1<{jDuPsHLqZHkJ~~rM{v35R)=(xb;)`{xW{XYQj8Xg zRWZT&ghE_h>Cv6+M)n|k3gOvTTawp6;{X!aZRPmH1a`mIyplK*V)>l zG*bsMOHD778_4u1Xgp1iXUS*CjpQaFJU45L(sMeH=Ub~;H!#_@0~uKuA|KG@Bl1J? zWAYOrTtCwmrNdg}NNYVouzNapg772#ZjnEcKa;nG@c&I)lX zr8e*|s*sh*s$`fD{!!YZ6s|TDMR!N2Dn)Zg@xY>1IahOfv?N=Qt;p6wc(&ITr8d-X zwr!&)2zE3ODXKoHj(sYVej`aQIf}er2>)@~qBL47jcKE23AWPxH4x5nx~wEukgG@~ zgzID4qO@9X(i#;OVpY#>o8rY0&HW*WW;fmTl6%N~gXWz90CWECrI zEf1(4Cubl`6=HcND(K)BAbS0oJ5`t>k}_48Ol`YH>5^($j5UIPE84lDZSLg*=Syw% zgaKA23|X1wtzL%fU2!%Jk?)c3lOG5n{)x6IeW(Nfs4XuatWX)zRyFnKc}(iB)8i(2 zgZzQ~Q3%i5+M@K6*0|MHPY!I64u)0SU9O!3Qh_W_RwOG4;TonbN|oE`8E}<$`pUry zWmH2ba^=9?m_AL(CS)_Rxe&gswMD6gtJmy3!!{{@D98TUxW(whZzqTlO zZIzMj^z4AK=<5dVrSy4}Tt+S@R|qjCR*U7BSlLcBjl_6vr)LLtC`$uz=K3C)zxy@% z?IK?%cawXBh~j{@DDBnp82gmJ3XWyDO2yqL>2jJpMV=wg3gLQDTa?b(8+E>&zI2eQ z5~z6TAhzvbj4;N7uBxJPW(e*W`o)p4WIUN5gnx>* zC?#qoXHt88>A-GjUOMPSpFU)7vM=@pC>nyFACwhOCqXR8Uf7mL2 zw$~RBY?b#5;aWzx)G{K;2r`PSCWLQIZBdHupm)sb9rO%=Dsk>Mtlo}nOSUIF2;r8l zElM42fleLt?0^HWraD{=O){E3W63e(IC8uYzLT{@X@adXv4fr&P$k~In$_2mYskmQ z$AxfPuPsVX*aA;>(3cFj9oVTcBXA#}&l}`H@=fwBA$;G{7Nxgsm3KPmDM7A^o)Wk( z((y8RiTs|tB80#VZBe>vOI_=r=LEJC=L97>qP9_rEJ>CoLxu1yuPsVt)b<)Ud6w;{ zFC5q+xs!qv`lXWf$p&OYA^e+Yi&C0aYSd9*LC94q=kn0SB297-IamnS;o71!gd+HJ zEcI$(iju2Qlvfd4bLlppoJTGo7YgCNR9lo5>1Y;r)RO{RDXcaoOxx-53i&emD!D_5 zL-6Zjc?jOAMY1~T)3PnXnZ?PD`clN#bp4L}hCEK55JK!sM|~;cR7ZU&Lf8M6b&lP= zKIaxVTk~04tnZS`s^f$$@3vla{@hVbZ)K(KtYh^GsQ;3jOEE3j%5$oH(l1fone$h4 zewH=KwBVK$vTrMVP+O)2k2_0t$}=NychWNg*qloUS;OP3(uTW5Cpa6e$d+VlvW*bp z9kfNMZ703cx9h}tK}pp#G2f*FFa1W5Bgy;8(L(r-*A}HQw$j*6dUlX2Ro13lb#slhGAbjI7`R# z&Jc~J;~E83!T$(Fj@NzV>!DPB7$))}>p;$#R}f-EV-XeuL?L$j1xmW=(jbZ0#~ zutj+7AdxP~WD=P|))yjxG;L8z)glc#^V&hKhJ9P1KivkB14s{P3gJFPTa+v6OlUYLKfG>N-l7FUc>+ugI^3aQ#kOl#XeUZ#wIl0Y&m&KKO%ve)3P!kq!;R5W+u5 zTa=tCq9HmgAYI>H$g9Nb2hsGaK~^VglC^~JucIwW_*;mgLm@^reMAJ`(ig77w7-X-55-y;tR;rfxbD7~*mK1kPd1d8On#c-8= z*U4+-4f3WC{9JVVbHaz*S*2t(*Mj2uc1Cr1e3KT=zi?$b({ z8G5>4D{;E8h%QUW#pF_QnGmikwMFSsEwVgAPZw;F-08v&`el(j$=Ar&h4A02ElRtz z((VjBUC31`=lYH=C&=UEN%E8suIIEx>9iI(lc6snG*}*h)OrCv?#l5$e!2maIp{k?}$toblHgTHqo=Vi$c8L06AqmAZGW z&J#UO!aUJqZM=v8%ZmuT=-P+uP4*@G39(j>Se_F4>rEKYMbB33P2fd@-&*1#!nmwy zt>hwtTTVroEx33}vS$nL#pccy#)+iN7RFNBt}(lXzKHO0J1gF~xQm`L$PX>Kwn#PO zC2}jdjodCoh&#kG#Fur5uXI_7hp$B>=f@aaU(n?%@=Nk-@|X}J$Hh|Q8!hrJy2Zfr zAW-4+AQw7V5%!z%Gs@u7NDy9*G(2=u+X(E6AB!=9z*1NyKgS}UVeh~a5iO2)#w%Du z8W+iL5R{dQjzGHNuBudwcL&tM(jrnhs2eH=RK8%p{T83=x6)eORIy%Gk@~vM5ctqV z*O9mRwIwX{M?l4F?RhGrmsO#}JZegP(KNzTNGEH^p#K*(WmPY${Qod`W1ec-*{bS{ z=&EOvuzXrafVeC z^ZX7OR%GNH3d|?xk_*U%LP##fJ!tv$jm2Hn&AC>nI-FsJ*iO>S_=5D`JK<+6TwRdS zFIKbqTcI-+p=MgF^eBFHBQ{1q0`}KEipjR_JLxo+>z)kCI{#=?-h-}eojVS(Irgs% zaYV8u_#07qT0)Oi**jvTI`=p1MmxL8?{1W>6Pt)%+|a+8^%9%>6>>ZID!D_5qtEMI z?H}FfhQ893UuK1Ee_dHR*vL{3bj#_hxSgn(+gGu=uZkfo?$&8MBGikM1^QrN1gW## ztU5F9VSoLj?y?Ues$egxZ)GoVMW>XWK?}_KtKCRdYKh?yq*F?89!p9jQ*8|8MR{ zt^T%0*b+HAlHC%2vm+H!+j^mooajBAmdHS|AQ>#g&Qr9T-g!#&#?GTF%jpPD1^snp z?mUH6X78Mx$6E+BbNeS=_YcoxvU{ZQocKTQ2|Uu^FuJRgeQ~uuzK>Pb7^x!qSxHzl ztB)03Q&#n#oPO`YfiCfH`-d%&(?51g*!`m#ZS_>{xuxeW`z$Su7V|%E7F>6?o25y< z7OAr8E3>GxQ8#_{DVd$wfUHk8B-4c0Q=4|vr@hAA^wlR_Kb3V-?p|LerS_g0)(BN| zM?#_=31Ns(CP-#i{p&rj{PiAK{(28Af4!%XIyAuAVsy)zG|+n2**8Ku6hBuKE;jp0 z)SXVbvrjoLxnuDNa#bm0*C^R1w?;SCz(cZK^VXQwU*@N^)ti`=<_=H8o7(yEriN`u~gY( ztL#s%}DIqjBilye$w&pXc;c%;psBFK0Uu7LN+=>f- z3$^55IlS;Ip!oVjZ2crY6)#W5WBmt)BmOf~K1ZG<&yyE~Sl9Prxvq=dmAMP|=)0?d zBdkjBHzru6)#4FWqO(vBl{t}Za(0B($z8Jte2m&;Ez(80h0u%^F( ztX>KJMBek6Z1|Fs5%{r8%#BykWi_eDHRM_$M4l8&k;i(dn-6%RD`SED3&l$sHOZaK z-vg7M1iN3&^jhuR`>Ak{JV3rdzA1#}yJD&NmJZDMb`Mo$q}~DW_5X@$%G3DSP0uhq zN7kgf8LTFaw2HYeQsXjtiTs|tB82JeW#3N=aQtZ}4RSz8<5|a$k&x#T86Igd(v(iT zCX8MuN}qO94^F_Zx|JJaxt$fet5cIP{=-*I!4uVP6*0w1aiRu)J>|ZkR*As-v0}C1 zQLDWA1;0hBgGrS&+QG=7BhM=3cwz@5LnzNDGOqqMm^EV&%)q}3W}MYPju7bgN@~qG zt5k;>c><8*OrF)q!N(3jMq8dwWC-RBV13@!s5~AwO`iF?0OYr1Zj84|=wnB{4swLb zZU8y<pe>!*l-JO^IX4U+@<>ZN0Nvt||v~8SdmF`eTw#V)T zIauXcl^ntBAY?@6`9y|!-XJ#Q1`(}lPqOM7b=AqqI9UDbh+rW8Nel#sp?V!UGHwfcpVt*$uC{pFhRO}m4 z#IDx4m!8pd?4@Tkx_%qhX?6Gd{M$7cZv1vm2etMAtFrTWH$8cQ<>UpHlNVS{UU1KO zDkd*h*3<{B3jugI22sT0+Lp#We%woKnr(gR{H2$g>a!vue_;Ke z$)CvE_l`Hfy zeDLGS&>T3&>Vn@6oh27o-kAgG%Du5(Bb=;CMv#$0#8bUDJJZ0=w>^S9QdbXSl`40w zzU&cey)&w}+Wd)pw{xx)R3{4cbH0~n{}!qoVC4tmTlYl)|FXwgX9+PfvJF?!fow;1 zBs&QaU6Dwx zwg8==eI~KqguD8zUSJ)>>iR6igC|qfw1rmrU^|otbts$E&4uWv^;CI=e2RRQ+$cm8 zFW6B$r_4oGHM{!Ltg_**)jwTiz2V%{TSa_nMnr5v)tnx+ziFAbd7jfTeI_yC&)qDs zibsA(^~2=H28`^(+@+B}Mu^!HXpmt#+bt+zaPPj&R+o?67!hbzM$%NV1otgtFXRFefp zO|m*!i>xg~RCRS!ZdGc9Rn4wlgEgY>R(tjeG?uH6`sxi&74EE2vSxiA$#dZ_ZZIP zr7&+uz3h-?tBR`;(t{M9Nlqtckq-$G(i|O8 zomyj6$UeyW?5=xBuZ3NAWG%YxIqJPgzCdmvw+a!?%Q~EG>YcS{AzgbjYdn9q+R2Y0 zl9$vkk0FwmRF%iA3I*kefFGP!<{T^C`Ar|S7 z|8X>)uKp#f9KCDx(N9o!VhAOC*t+y)R zm((|}x7-D$!p{|{Vs=`g71y!cFVY>}FLLyVQT-xQQHXTmfUk;dK+gS0U;Xz|2VLwUGXi!{kWXcITc34q)M_F*_PCdAA>Z^nn4-7p-}OS3#}6t<$EdMC>Yad&5| zJ;@$qFS54~G56ONr9O7_eO2^pd7`J@wb!h&?rC(KK~5)UlCy*mcvxGM96GlpB1I}bYSSvMpF}AJB zi~0clo4X~wTa&HGHe_2NR61&lQaf9(z3O)`zh0Q^+nd$$H>{@ak@UWw97T>M#|WV^ zL0go@+Ir(u^qYD_NPJmK-?Sb!oGS+K7E+_nzTc-$oa^A17V{tPe7KKd5B0V(%016| z672(pTZO%2Ri5!7qxw>aeH;(ElsozJ1VW& z*Y3}f@V0NDOQm`NB|;nyF2w0K2#5bK2dMq;SorRty7G=yJ7l))C;2dzb$rjN=9Xoy zw8)r9dlf-)NX4*)9vU;I1go-+@q&8dJ?yr#)xr0yvZ>iMcqq^+^vV+ytx5&mob&e7gKhPtSj$XM+5q;kS&VCs94TTv*#?8-^{(g zB?G`6hco+=d28&>Q{y0O;2zn5yfw1kl6lVnHT5Iw4|l17(tM$0X|fDiRtW8iVmS#Z zH&9=ODz6TGY>mes3TpHTru3<--H2>RHYS@0;g7G@e}bponhlicW|_M6lR4Yutp`K< zrm=p5zxBnljfX!)db??!RYCbb#TCe=YQSM!duXa=9mf5fp6ZFiR)l*r1;&zN$Z_O& zAp)5!mK!o*pgs&t6y2(-&JkF zUAQ{+8LrMR7$_(A$`!L`tnyoU@{jui?z0}{mPAE-%=Ldt9wt8{KNlkMuXM+JF;LC; z$}FS4{2bRCw9gUN`{ZwZj4!0&s;iggS;1=fJDy?%c}T#DCmgkgIAOm%YE?wP+&*em zb^k)0-^gFd-^o9Oh{Nz?_sgGlzxZ?H3#oTsvHB>U$JQ$oS2y0mC62~lS}P5A*3mDm z?~L+pagT+Li#qmh^373RYJKFVuPwX=W&QN^;QHqu`Qz;&cn!sC7+%Bi8iCh+S%18p z`Fq%m)-@fDrpKI)7jcNHi7Nv0SEq!N*TxZ?H!JJJM{Zrc(1V6Z}?Te zABp$P?{_#}Zyd<_58?gwnGVMhpMI|#369DyIUJV`1v=g;{uZy#QU`+ zosL>v3h{kYyzk<2I!^7??>%^5xTVvvrdDBoKEqkk5jeo<$XHp}5eomM&Im{FRHtLa z8-*Qb@qT-AXL-llPdgp2M-_3*#DYW4N{$)tIvvZ#7I9p}`?JoX4(kgiTBL}h7XqB( za3t@6_2ZueTpM-Nsr@5E)khaHi{e)Vj$O#yAG8olUsO+C%#121qJDohl`#!>zph@) zd>mhyoPQ}ZtY8{C#P6>wAJkelx~#f>DRXSlBrH6qhF;Ee1)!)Ze>?J(f=04jnq8+l zeV^%a#uipnzt7wmbOnq0sH7{Xh@!gk-N;vhjpU8UZ_5-_VOKM28yi)-tC?9rUYvOz zQU$JMx(u(1yM`qnVo9pHCQCk46|ZOR4w`~z%yy__*E4GbPe9S{uVO4S(^c;qnS+a7 z<8*gU13QN)N?`jM()Uwkf%Pt!o zsBYcNToE)DDc32r_y??btlIShLaB-q=R7s>$4pm<6#f2Zj8_f6|24>#Rd4^8xuU>+ zEUsNr4g3jPv|r8t2~HlIJ3mmZZedMQ^!tA{3OH8|99dDVyoI$GI3$f!b$>=<;TO&N z{+zk9z_VCXva~99JF|9SDf|6xoV}c?o)bPpZo{W-X=#8zZzHm{s`eeM3|Auz@8lSXOPyPnCuhsj%!EG8YRa{nce#eq&>gC_Dq#CXbEK{TYz$R2H zrylzQoA5psC6!k_|IDl%B4xjSNx(Y%QMsoBB%o*iL_nj;I~?DrMtKE$ zF?(foudA?>{Qi>xHv&}uh2DxQCwNyB*oS4VimJHbt&K0=rW)R?pdl3 zihh4gV3R-@>dga};U}mnEb*37J)Pc%id9E?vjQ*q>_c_l>5Xz$ucV3ucy|{21&fDO z)*r1?9|w4&LS&KOKPzwYcXiRORk2s&^(jkwn1R}D??++?arhwmHp@4|o z3c}|Eb>xHGnc|nER$c4ZdXrTuj#E?agW1voOe`pY%r!fWVzoz&9Mmd`_-v; zy=B!${YM3>w6flX1?9Juf2`+F&mA0DMO`iHEowZhel3gPUN^?!SgUrH^SX*j(eM8V zr$oR1lv;Mbr<^M0l6|&3#?BFZ*d$hMa$!$7qTVkL*J-g1#}zfF0s@{Et9H8)TwELi zj#HEBAmF$-^;kvk&Y)Hy#mj^w$?cqAhQrxUzB#!DScz#;vk2sFxEbu0qG zT*1=5YE`7y6(U8yf1C3Fj(l(N$al4kH&|Vb^geEEQS+m`VZrO`OO>zjVIy@t3Zr;X znk?}9XTu&*qpIP^Fer_qqdIt{_1Lj(%z~CyEm3k@{f-K zOR(_S#;RN>nq!G-SHqiC-~<+RY@)}nX8tkq3-<54VY(Oq}r(QbN2o!=d6?XGv!`Q3Ft zCiOt4^8q$d~m#3Z#Rd(yeMr`}gndN~{$dvRZNru5Q% zc^b>od*|)T)4lZ0y0AAozPH|47xvbjnbZe8--n&)OzI!*qWx9*&rY>;7CkT=!?{2#4dj5xPH9N9g`Mi)CHz)BSmN zgznG9_o3hK%iEue@6-L6l8N5W)cu)~sr&OZmZf`jf1b|N{khQVaQxxX>_3qhZ zB(AoPayWY8HD?rePiK>nx<|K<(mnbNKFimm!^Y|!eFXOCSly$;#_AqT9*5>0r+d_e za{eA2I$rl^@9}@pqsy`I`SH3(myc(U2A#n&d_mO2PIhLz?$Cu3aNL=oJ9Oa$-J$g+ zIvh_-)E!!HqVCYIu&mW2-JxGi)Ezo&5;|{^?$BA2bcfcNj48up-Jx|R>kd7QWf@a+ zhn}9SJ9P0Bblw!*p^K;J4o!UkAwQryH1z@9q35xz+f?15=O54=x^$|;@#j?Cp-ZRg z4o!U!9sgk74o!Vfcj#Gs(q)?N(6bNf4qZGA-9Jrt=;CR*LsOc zeLVwt>r96uZl>LIIB; z`N!)?)oh%%hBM$1l{wD4tME@)6h0Rb%v1Ho<7|Bc@BMz$&Q)uw=f`^o7j?};iiB79 z`B=rNT9`)EncyuNSObfcfBVR!WuvRAWfQ!fLW5D^FkZi?Unh8L6qdIL*s;l>zT1Ng z?A<*hkyT9e&MDS;fy412Uhm`elDa(68-_oVTzC?u(hV1(r|~+f-k;>HQC!~o{pTFF zK)?Tv%-71OGLyY4iq=?+#00Mcc&UzWk1Ve~nv9uJjm7Gl$=;oXN-aTy;4u?WBCKXD9u=xaK8Q)y7wUlrq4X9$iCgY)cvR{% zZ;cRn>-Qfu&QVDn+>80^!_%-iFQZQQ3Y`4$Qdi%@=A=!B%FC+Vbf~Py(vX!7M?+P3 z2I7&oet)zx5z{rlKLvBLP}O~gcSYgFsPj8swO6ShXLzgQixU-R;uQMeDqI>;U(7_d zCq=)1g7aaz&ZTSgEboefZY5J>hq_Y$lg{sEp());eLo8m%oF&equTfoyrt;(zwJCq z@2}{6>mhhQx*9`wjYIYN9^PAKBl1VpuGv_1%QX(iD{7(-lT0c4{bd58khJTe2)ct0hN=M%V={L~&3_m(;LU51?>y#EC9aLEQaKaZSd=5mvB-!tiRr1ca?d_8i%sp zv#5pd`_J4#!@+iaeuL7A=O#Ls;PVw`Q%Ii@i$=AA3d? zSb;;aC{FEN;$4V8yWMUnrt-)6$tWyuq+VL;eX8)aXQk?tz-d?%sirOS?!n(5NPQID z_cJ~jq<(%BeJ@2^j0jxE>jY1sYN%?t9Etf08y$`lcy-u>p?hQnn)v^z>rCKs%HBAB z?s@BNUlncw!U#9pq*tWxV-4#3iSa0B912g3|C{_)z5N} z?wY?6E8mPdtU@m=2%b9I82cI$O^&NEY!O8DSF3r-R;us|E~%5Zi&i!5fQ=1cLy1njNTub#zk_}D3cLwcPi~e4(B*FgOWfev7 z7xVDk$Jj(j#r=#erj_f|O5A-PrL0qv>sTZ+HUwf!K?p>ITN|)M2DwP{*mI__T5PUT zQDMonVLdKEauC*N8(8XXjUI}exH${(yLtI2-D3JJTW ztzcUi1&venu|CrtlQsRaL7it@a}d>di0W=c7j_Nx-iXR+eF%fD(F z!kC%PZw9h^(BGSZ$Rn`q{0-+xO5Os{ib+kIr>sWyT7`Bs0c7WR zl&D!ZzSX0iBFbibx{OMsZ?*{*=#wr$W>@-S8(L|bA^q_gvX#Eu(Mn6*=&MH^*^Yyz z*>Q0WtG)vVjZihM6YrzLx1SE*u{+d_+~EXOjK>8YJ0Swbz!6AM@oI$Y_nC4QYw-P` zNDn-PbzbCScIDq^Qsy0$LT6Z#PZgCy;ZBr7XR_UeUHBZ1{*=B8!-_)1yjdSc4k}_4Ma%?27JZFdBJQoY`0I!4B$9zwJS5Jd3fB^!;9R zF?kln?ZuVPR+wDQ(Xa&7+g9kB_6R>ap(B5(Z1eR@51*rz60x4XbtB7}}yQQgW; zW`DANtPDOMGU3s*pHR4NFGf_P)F$TAG;F`RSkdV3{Ww~m>Hb9Q*+A--tj1V3x+D^g zV9@)$iYHj$Xhg$OaCkSR`zbgHwb1=nlxy(Rr;$y~l^2b&rL9ddJlyS|8jgFG$p=A? zo_ZM0GRBhW(N6b2(dV0YNHv$9fPwd{Kg7J{AODjo{f0rgtUu`OQFS-XzlZVq&;OJG z_$QMlSEqkSR9Uxv=r7Kp>uIW=Oe@1)!RYn=%27l`20hX=JZ|+WNklz6JosX#9^IHbu(30>UUDLwTjb? zkN)lO<|n{&wYAxq@=vNwZCl)t3q9(N$nmmhifMYh(5&})w`QvSotxgpMFga1pJ?Qp zDLTlfu!K$TQot!J;c~cl+@;s2Fwn95E>$@V+Y8w2awz*WY%lJT-5J=r=Aa*xLm6ja z>zYH)VRPOJ+hNGR%`1bj0ZyMq^ILQ1>RF^&=7MOsL|I6)%%!v}*apIOHkYE#!8S0L z;?ChT;g~0z3Bk9|J*gl5#LlqIqb27t`yq&%4A~1wd4P5Ab_}#MUBK*z+@nbs)MVq} zN9g%IqJWEPb?g4nHO*hg*Zzy@U}NNCtomcJ`(1UT=9g4ki_tJpc4xT(*Iz=&yeEvM zJrN<*t>-}3G?SkHHb;lM?-P&US*x^rg8-MtWQvO7z;HmC9%*9}6 zeY$=Xu9wd!`WiOv8@Pr%r{L?Vx1-QC?J~~;k_!;(Ld&k>h6_DMFXjc+y@9Py&nfH% z()?dw==KGb%SM{eHLaGRF?zAh&^vUYA=&7xTzEmXZ(_MF>+Ww1^mG=MtMe^&vg1{l zj=u!OA(dX!V-7Z{Yx>QK&o*^jc_&<%7pp&z6znI zX{xL3&7zA=Q=vR9_`b*0B4|A4u3F203H>lPUV*iZRtx|z(CQpD!755)tU!|ha1axk zHjd50C*GwdM%l}^1Xq)C)#*-N*fpOi3JZcfQxsYltCpp{d8jEbMkDetn(4$9^j;KJ z2XfOub?;$yojCQlrzSfp777~0We>h>EU99?>cI;Q6p)YI*3eS;$}8fwW_{{=A6u>o zOqNE4`9f|RDepd-YGO%t1=uGVY~NZ@MgjJT&^4`#@(s==1CfqfR}Zi&*I6md!J5jw zQ$6VP11#b?E4umsvkJBr@#~b0`m72cqCz_20qjRu`VhF9+9+%&9u`Tq_*sQESsVxUl==j>Tb4P>^*V@eJ11)XRP{2zM(>WQyL7bMn}GA_ z5V7`h7+`=t^#SXvEmk_CU40l}KD6S)0OIzGF$2cy&h+@X>TQ5dooc8F#s>J`SZhns zrGBiS6(l_I{-)^(9LBc_}J*iOsjCw8Bo7rp>Ql+f$k@yh3Nf z^D~A0^qE4(o2j@Ee2op}`5C3WM)Vzcx|X5Hzp$}|j=QGp9X^@9v5)o5?6Zr9`iMnSJ6ms=d-IpCS+4GF@%Q8)g#^?$P+fadKD<*Fq zU4ix}uoc3F-bs9a*a|DqDh^v3`t!bS6lySe+Y24H)%jk`hK~G+)!Jk*Ej9k=hKDl1 zUJIoC=td(fkoFd~;qFw!(&X(Zbo9;n8>AKLOE=aMX-C`@R@Z}^j7U4;P60-w&GtZ< zc+hKMo9#hWtW1f{Z(ti%Ni-q<$afFU4~14(mp2|{XN|N}xP2;9hBf9UbWNLTSP1Y5 zAmJdhF)g*4Ss4$8R92|nVeG)uHb|aXnXcL(xr(R47I+fbB3bCTXf)hLa;~17V~a(- z4ReSWMcHAoZhKOk9nv;p#*!R4XvWE3soq@0ck_4 z&?E<>c~`}LuS))oNE12;W-$wCbM>^Dj!1h1bDwHd$q8wXs!~TMr0uPyFt6%l<%~3; zqev{SAnlr-*3;Rv)Olich24YvyPeiM;WX}03adJ?I#n!XO15oXLt)X7y)`Jil*!Aw z1$0fTfQv*tpi$a1*v7J!!a767(T!53a&*14$=+JQG{&{`prFr8gKaas6;=vA*=kao z;y*(xX_(fuu6jVNG6;yqyOn>3XrGJOxX|`8Scci3Q^go8L)SVATLn2-DHxE{MABtFT)271q5zg_JXS8UMgEs?v9@ z>al2)ADt+Nn2ik-_5@PiPqx(A70a=%0fo7ma&5!E5DCvLU!hG5=>c@ z`|7v7Yq*YA!(z zTQQLDgXc6vG%rEEO`j?b^1oXA1M&iB{{eZmAcX}4NsvRAAYTMyVUPs5&`Sb&x0VV! z*iwSLTT2P@QmqtLvy}vSsa6u?QLsH|RUG6|xH&379@JW4J6cPS3%vx88`>zW0{+X6 z0J))!1o>##Znlvi7kUXGZ`c;xYg-)T4ckhPzk$a&Sc3dbTM6>v!Kh@2z7;=!d^m2U z3XuD>Q`kz#e?cxhC4l@X%+~EC$e*^8ARo|PVQ1P)kPH12Ag|UzVT(Hy19`O$I>_^3 z$H=x0^85}G>31<1oXN|1YY0_HkNkPE#8kmm_=CkgVrP7>t3Ix8%rvjn-& zO8|MLE()99MS{Fi7YXtl*b2Kykmq!fAP)^u*fEIMnBuP($U{RU$lbf*xbG@KF7y&W zeh20dT#0`G`JJv3|r+va-o+1@)q3{wjD3N6d-TWU4mTcp)hj~338#A0P>?S z`{H-<0^~<~NRZF@Qek+zjSh05mjLokJuw#6Q-ZuxPYLqUUny+rR}$nxF9GCNU~U^K zT=I`Tfc(l=667&(=R-<=EkV9U5B~si+d;h)76-vEcy$EpB<}~qM94TEko^8KTPOJ_ z7(OC-z(9q~hU^?DN$wB*|4GgVE36A7a7UiRh|KEJpVk6Lq==Pr^0PBuV$+Ns{jSVXHA& z(tZCVN%yG9VBcg(ccGU+_cl{-98ZySZ!<;GJqfmI-%Gj+y#%^X`CefK-%Gkr`Cih! zRTRo3O47Yml%#tCY*nU;Cgfi+x+g?Qx=(^Tf2yRr&`Y3u&@=#gT5-AuO_OxbhNt6n zNq3=_K=(D%aalV<(tXWzN%wv;6n1Kcq`S~dpu5)(I5Ykr>F)J|qnut4*qM^VMRkWmg6!eei9y}ji3P{R)*^Ey2R`Vs@ z?H4F46f$*z?5A5p|A_AA7b?tS5tek3%+~3C2F8!*{_|pm2*PkWbSFe?cNAX>HouoT##ppg}ox*;Eh~<)W z57(!P(|!H=f9Spx+JESN2FAO%11tt%pi8cWsq)U%6G%-8L3|l2}Q1p?`wzXW$BmD@OM-u{zxs$6;J2PSSmGoTR(OHiboO zlXSP(Ch2|>wnp0}-GyEP-4||G*p}^*?hCg|y7L`i$PP(&p_f4S<1jajmvleAL(=`H zc$7)Jr29|tlJ0CLPM;95F~wgoy0e{ZS8EODsQ-5Q3E=zb;zr=J5D;XWYgeiG9k(S7kjjKe~Vhh#H4-G4eL z=^mP@uoy^Ys_eV>fc_EP-H%`Z53=}(%+~2%9)^$Te)l(p)k{-YuQW;bo0$H8y2l+= z*lS4TW3nZk?wgNFx{pj32_MmYG)(<76!rsTPllxX=yXZN%PnZ}N5!y1XT>Y5nC$`K5T%Y9l|7 zvOiCeJ563zuk@I);_hNK+CNtHTQtf@+D_9zi&7UrH`6uM&B8)xb%W%cfQ(%jND90_ zBX(mTsUdL&Kpg*Gc@&t%lDHnJj)tSkeus%DVrNW`O-jK!UcE_g51Bly&LBe5win&v#SeWCm?9jf+?LDy3%(0(Q}aKt z!m#NpZ0vjoqnvlh=@52d5cH2$mv6Z%+g){6cs{I_c+S#z3C5N=bU78Pb?Giuyk<(Y znv{dCb&f(;u9<4_NjX$-80%U!7sqcdZ9Zc1Hb56Y>`SmZ4P%o$g|^&4Gmcf-R@EJQADP~=#x*u#}Emf=G{VMcs_>7^1=1n zhz!rCuyjP0x{vekeJYoMNa)n(4kD9btX_aK;ax-~->2Hg5&2C4Zt@gR-f=`ir_XZ` z$sb^B;(=<9VV~TGr`Iz@JYiVN zfC*~)2=U9G;b!4;h5mw-FMmdM7tnIc=cusflyLzqLnr$uh3+ONfL{*PfaZoZ7y`(enz?ka@2ZTKCN4$=kl9xZjZx3uF1$H0&}mpwqVJ zrel22YYMw!@-Te$8U|-`f@8aPvRK3Mo%l``D{Qh@T??_(3uUp|L;tu~JHMC3+Twi) z#X1qjy!WzLC%%`(T3N#lJgul$D{FeOTAhH=pKX-7!QC<`jJkkq!pV zCK)LBHX@-@pL9ef!dTUUlWPVd6Acu02a)|OILox4a(594ojyN~NP{J3BP}`IJB~<$ zCDqPBsCkuai+NErgVdKDeR;x zCU^c824{1k)5Ee@U;H_^a2Dpmsl^{APXmm4wOSp7^*pT3hfJPUyD;%lxf(28v3m}g z+^zm9CtM%H)v7-Jm*84NTuDV4VnY0EI>C4a*0$y8@-?g-bb4?Y%Q~$*XOGLvisjSF zQ^9p?2k#1;Q3YAB&}G49!5CPvs9>`y$by|vk+U4Ui%JwMbXl-&Zk)|^D=JtwH(9X9 zU~J$n3l_R8ShG84*W8N=77tkJ1zXO8vl$+;V4=%`O@XmSrJ{mO@sI`EuM%gcD#?O{ zE(_LJnX}QAiwf3QSr+Ve7%OdLl`;rp|CMHLLAtl+WrPzA8+6+9dhA6M`}-=YfMiGOAFp9;PYV`%-N z3dV%2;Dz;Zbk~;^3|&@m;|82|WR`8G}074U4!O&#|+Xrwq zA)u&&?E_>5?}4#$Q(3{#Wd-+c%2`I!q6+TaR93Lk3}=C6vVx(@3XX-*HL$3HW1Gne z?h(k@Z!rGbK`_7~D_Dce++0?$7APw?t~n037P5k&%L)!{!C88Xq6!XeAuHGr#92g; ztYGM}g5zQIXjxRj@j()~VJ$gp*9y^)^{pgwVUx&Bg|SZSBIKsFlE@togI=&BTFZj% z+g=vz6ntm4=d^RJ>S=&czpycScHr!%4m7Ne*_(TIptsG;iB`v9^XsVBp*xxCn(Ym+ z(5ZBFf5VX-Wn;hM`(7uhH!AjMUGZl&N9eI1p4psM&%Dn1MrY2RLul6#9EQz&&GuI3 zF{x>*(bD}+$R2IgFw6y5zNyHS*BOU?Yu+jwdS75KrOrn{f9SO2;l8k#3NWx$-+m9yKB zQr$V#+hZzA+Z&?Yj1Wp`2!J%{&Y5KooD?C^Us9Am0Mev8ZSXfII`93GvrRoYy8z*# zSn+O$u~<_YA${+c6x|5vwPAh*@%oyxtX>q-80ob`X>?o>i`nu+Jh z0%>g%bA)4IZ_e(Aq3_a%v*5l|DF8`@y{T0Ik|O$&T~j0t=_``{(39|_afIW>0do7C z!gqy%^th?n%K)1g!A!6kH4x{eft)H2K!5mQGc4e!fqFq09S7lv8$?NgC=$m(6dhqc zLqEsjA#a~}JRB7}h%%d-bFFtEO4Fv}q4@_R{ODl|^JL?0n2rykkwHk@J&0BXnG=mJ zgK?%COrb5!-VQ?7v{;sm&qMM$Zc|J1QezhEd4s8WE97MjrV*`>*Ki1D8;4Mh)@E-< zp=;V>{BS|j4EobnV_Tb-T0Mi=W+?llx77)r0(AX(^|=BKpA zqgvv}UM|$8E#_Hv7-ydkqwKbrXW3z77mT#Yu;mYwnJ0v;C38N)ZXlED|D=|az>%-DQX4EX^;8$ z9nRU<;S|*Y^Y1&H;yNHH9X7vjX;?=j2_0+8KjYLd6HnQ{xq#PjWOOu7H_rGL-I;GG zq!Th{d`pu$A+yN{oFGP!e`hSY&@p1nhu|@;;re4-Gdp93&tdMbQl&0Pdp?3Xc0t;9 z6@_6Us}Q6KUDG!6B&4P2X+1-b7H;C~cN0BE2oE<=#jZ%JX69^(nJ#xln$R`v4Y$FQ zSPuG=Sk=0jSJ>vlTx}%KJCdTlG`muEH?ytvZ9UctQC%shyLqtfuu)iS$kS02-`(tG zJqWsd47MxP>Vbg#?>O_0;A~6;g?xo(;(MT(92jx8R&S=%mxwZr<}4oaX0(`@m-TSy znl@Swcq0N{j^V7)Sk9)874vbWsGex%DU5j5Uyr)g6H$}Lah3|Pi4-&QvK|jz)3)jX zC%!T-*__P{NwR@SJ z!to}SPdt=6T=yICgjgVj_BKznDv08&@l-CxF+BOzD07oq>Mg0p@rC}{|M%a+sCA@H4p z?e5QPZVHv-5-R+Kq@y1C)XXDWj&q2x7!vh@OO3ah~oB9=o`Q#yAlzw-`GNt-(m40 zw&-UL=di8l{y>_=;>-x4TQ9JpQzEdUVOzzCB$r=^6{iopm&AhkUq;B$ID~HlD7GV9 z?~zJZIw}>G7ft@ypL~n90cWjIJ1|tu;E=o z%pUyLG$)(^%FvIA_|bB3qs(LCKbB8jt`5XXI-^?}HrP0XK!MkA7F)g&~! z5$00+IhzJKyPx_^Mx(-pUs)?J^+x~F8-1LLMw2F^(Q?V?bwOAP4qXT-m9V6Jr=Zbt z$uwdL8eI;v#Q_|*kjn?C?)PX^*l<&Xx52qZyoXC{%(35N&EpSp=6;B?7|0U{t@lEE zK2c~d{vZWJp}h&IIL0CBVQkUEq(z}UVZ)EG`7*t|6?%JZrlP%8N3fY74SvH~L1@=> zv{yJ4?X@~WcGGa2ur!f-iHnz?)F+?m=6SqS8l_A}2g*Wsi9;}uD$OuYuenn<;5|5> zIB+)T{s(%3)eq(vPDd&32Xu~B9ThV%80cJyF(f+fhkMHzlnX>VL)mjdqy4AJ5RD_S=2)i198iu_<3e8 z2Vui&eAp6vlI)?qoM%4D2WL^reB^{@VIb!mmI?Ce97X+vcEhu1!%v`G=6MVWUEu5) zq}N5Pq~~3n5vDA_Vr8DE=mkih4)aq;wM!VkxI`ff&0e}q)9e*D6kKJLn+p|=SMgx* zLY#0@E>YMb?6XwFYg!O~vag?T7h|7gT_U?B*k@_FOZ+4>kVY;se`oO|xK+~s0HW5O A00000 diff --git a/nspanel_eu_code/Program.s.txt b/nspanel_eu_code/Program.s.txt index 9cb5ec8..8df190e 100644 --- a/nspanel_eu_code/Program.s.txt +++ b/nspanel_eu_code/Program.s.txt @@ -18,9 +18,9 @@ Program.s lcd_dev fffb 0002 0000 0020// Fix touch offset for EU Version } printh 92 - prints "nspanelevent",0 + prints "currentpage",0 printh 00 - prints "{\"page\": \"\", \"component\": \"\", \"value\": \"\"}",0 + prints "",0 printh 00 printh FF FF FF page 8//Power on start page boot diff --git a/nspanel_eu_code/boot.txt b/nspanel_eu_code/boot.txt index 7f58781..ee3f1ab 100644 --- a/nspanel_eu_code/boot.txt +++ b/nspanel_eu_code/boot.txt @@ -20,14 +20,7 @@ Page boot printh FF FF FF dim=0 vis bt_reboot,0 - covx display_mode,aux2.txt,0,0 - nspanelevent.txt="{\"page\": \"boot\", \"event\": \"pagechanged\", \"version\": \""+tft_version.txt+"\", \"display_mode\": \""+aux2.txt+"\"}" - printh 92 - prints "localevent",0 - printh 00 - prints nspanelevent.txt,0 - printh 00 - printh FF FF FF + covx baud,baud_rate.txt,0,0 Touch Press Event printh 91 @@ -140,7 +133,7 @@ Text tft_version Dragging : 0 Send Component ID : disabled Associated Keyboard: none - Text : 4.1dev3 + Text : 4.1dev4 Max. Text Size : 9 Text esph_version @@ -163,6 +156,16 @@ Text bluep_version Text : Max. Text Size : 9 +Text baud_rate + Attributes + ID : 18 + Scope : local + Dragging : 0 + Send Component ID : disabled + Associated Keyboard: none + Text : + Max. Text Size : 10 + Dual-state Button bt_reboot Attributes ID : 4 @@ -217,3 +220,39 @@ Timer wakeup_timer wakeup_timer.en=0 } +Timer tm_esphome + Attributes + ID : 17 + Scope : local + Period (ms): 30000 + Enabled : yes + + Events + Timer Event + if(baud==115200) + { + bauds=921600 + }else + { + bauds=115200 + } + rest + +Timer tm_pageid + Attributes + ID : 19 + Scope : local + Period (ms): 2500 + Enabled : yes + + Events + Timer Event + covx display_mode,aux2.txt,0,0 + nspanelevent.txt="{\"page\": \"boot\", \"event\": \"pagechanged\", \"version\": \""+tft_version.txt+"\", \"display_mode\": \""+aux2.txt+"\"}" + printh 92 + prints "localevent",0 + printh 00 + prints nspanelevent.txt,0 + printh 00 + printh FF FF FF + diff --git a/nspanel_us.HMI b/nspanel_us.HMI index 1f8e1ad034881bce6e6d7308d210f467f08b2b5e..4dd6d3ceb8059ffe85abe2cb7c4c6ea034c88c1e 100644 GIT binary patch delta 2969 zcmeIzdr(wW90%}ocUce-5SEAJprGaxXqOpzsE}cWnlF6OL&OzUM1{SuyXdm4ypC>$ z#Tv#bEyK5&8o0tuEd&%5MT9b=(9&|uiWxU&a)z0VzIRz>N1Xm|syp-9{oQl+oO}14 z@1E^0FLmn%u67%j97J+88M&&g2rcP5X8ZA^$Au7XTh5O`M3tExF>~%LM<01^B2TJh z=(J{WW!#bl1IG4t@uUf3NvAhQY~ij|W0p(p=V)rY#gjI?bLdk>M)0csIq_b8nFxsonyh-#``1smy!FLhoGG*A&2c^YwbFrKQ2}r>OWZ)_k%iY4d|6kC5 z)q)mwms;dz3s&5M6}Mo;Em(02R@{OWx5(Z2f5Zo@7P(19V`wa$LZ{McG>*p8XX$kM z98I7z==1ai`XWuFGwCcko4!Qn(7ALTolh6gB)X6;qKoMgx|Ala+G*G>WY#p^_hOnqOm3`o zg|36$@>xH`?3<$#d~@{KS3HMJ4~!R66@y==oE087Oe(yCGFIHJa0Fx5*eva<_qr2O zb7F|25$(O+i2 zah7zWfHB+J0#|mutHFm=M;FN0(u}5QZ2tND02VUHypvU*(XU~O%qoA@P^%AMwpK#| zt4=qZU>#j~BZbre;|^DIyD<;e!v-)wJ{X}uXg8X&=Xoala5_xdIs^0*!qgw2dk9m1fPM>iwm(3y`UA8TVd@W18^UC8q&0CeAwwjOhiR0=+XEL* z(_q2ZX;kUqvG!<<_?u`&=r-uW6k+W49X^z`*XFefJN-S%%*a~mLTTl)b*amMy1#E|Rpb{9o3-7@W*a`2$2e1o1geuq#dtfi@ zgZ*#-4#FY$2oA%?a0HIRG57?kp$3kF6;41c)PVq>!bvyN|tnK^Fg6EWB1RV=DMDGI0FsP2u*Mn&OtMrhYN5KTHq2~hE})&ZEzLZ ip##2vFX0+|1=rzg=!9?JTj+uta1*{0>UzG9YWoXdAGS#V delta 2098 zcmeIzYfzL`7zglk_67>&!UD#SX@fS(P0$ogC9#_j7>E}%D>pT@1eV+4?t*OYBb!kH zksOu4MYGH_(KSw)vIb~jfncN=sW8pt7n*rLF+(;(e}rmqhR^k(GxMAGIp;aId7pRY z?JIM5^#MOs!B+>T(Cr7Rj=>+bR1q6&_Q89gKCl!YCR!B%dg zk4H6+-E(-{r6LwHYxLnm{h^liM-iLhefMzgPQSlPJ%`O1z4^%%jZAwOGg{}fdv3-W z1{zs@6}E8~`KNJB;NY26j$VVa*T6vqYS4fdbh6jrHMy@+F&O`^K#BU_tAIl>I2Dvg zL5UQUNI{7dlt@8|6oZ$(@4qm?tr+|^(ma|^kI@2JNQ)?r9;d|=PfO?tdXk=^r|B75 zN(q!m&r%X4(=vLFQYe*{QyQ(Hm9&ahQ#!4owe&o#qZjB!dWqJPkzS?^w2?N^E3}!m z&{letUZZW4L79|w+BDd$NxD+7OT^qZJ;2jM{Pye+e6Z7HU6{$PmZ6hO_1sz3Yl3XZ zk!8KPzpvBW=`6h=H)P~i2MGN*XSmS!=j(*4*Q^(dow*UBXV5xP9JyxwRjf~J-Xz-` zxwF(m6XPY)v&V@jQ=U$&HJ8*1`?R_Uao(I8A!im@Lbyn2KNc=K`U_`pQFgF7NS-dX z_^a-YR%y(ug?+$!MbuC71j?BXi(VtK=Q=JgZ#S26;aOM|*bwG2a?#^g;Oq3y&XfMx z`I&7Rd$@myJbuf1aq>Txt(sC7EIP6*_lX|8HAv#Zq1rLCCao=P>}<4;ZR(g=f$SZ5 z*3Y)c$Jt>sLji0D3s}Jhg|fp|l(|eZ-<_H+v({MLenWQ&l+{_55-!hev$U%I9*7-3 z9NxBAJbq$FO}?(7BR`W%EU4geioGxu@5{>^F3MY7{Z2)-1B$^8uftAo0KqOO0Vlix zyWveJg}2~scn8X$94g>lsD$@m4^)AGy|54VLp8h)HBbu&zy)=15Dviya2P&>kKhP= z3`gM;I0nbzQ#b+ja1u^|8&1P#&;SxXhcDm^d2+}Zq)Sl;Oh z7Qxe7d}V;6S+7cHSKs|Bu%r7KvyQ}5YZ>$6!{gxx7`r(VkE>(MesQxcLxc zREf5|o(Pc>+42Z~R6IP%6C_VWwnVE%q{ibd zf4lCwQ|-iW1w3#bzJexbh8DO07vXF823p|~d<)+}8??h^=zvbR0^dUy`~X+s8vF>? T;V0;ZpWz1Flnn#7=C=O{)DRRF diff --git a/nspanel_us.tft b/nspanel_us.tft index 2e3a9a05212e2bb2c07e34ca1eda7d789b15e13d..6359724be10db70ce37e15167375d07a92e0b963 100644 GIT binary patch delta 63091 zcmeFacYIXE_y2$ICO|^(1OlXy0ND*`v;YAD(tGc)_ac3%(viLbN)rV~Q4ml;1Vw#| zc`FuB1nD4lKtRQYQmrWL_jO)#lWb7=`2K$R{PBDI-g#u7XLfeZnR936&Yg2-%a2E2 z4f*xUS3~Y^JXCgT-3++B~DsXtMxMDgYz#W z94|bu-YXeb)+|daG4!J|3-8#_arLZUe{S;J!NuL4esEW#2SdzzLpxMiF=2%@c*VHx z|NZ}O3;eeQ{@VioZGr!`z<*odzb)|p`xYqYH~lVuh(FX{z+cc`$RFkp_ZRjT@fY|WU^hV#W?I1M#?CyAUI#`V|b-Ci*guWF5lkv~Rf z!}9P_<_qf8d3e5Pwl36szW3==(^TKTnKRF3_uKA$u9EA} zA?<6Oqu#59Rh@8e+1Up+MjGYiK#kDQP^mq{c*`_Ash*HZ$Ss0LXjoyx$P6(`7B}S3 zyGMtVxak!rgdi(CDik!DNwRWST55`i|0$ky9NE)oP>=ZxxtZJ|EN5;NfdbEKiPW=E z>V+y!hOoirS z>q=ylFhZWJ(K*x@dFlPWrHuH8f4Z}{(P+VgBTB2x6JB?L9xv2+wTv2uq#3G?wX-AD zb0@sV&Dv_-N$-!9QYM)&69_~brX+Izc89Bpr@S@H2({*vH>Ty7PxJcoemR!ZdLDB* z56T%a;V1G+yv-6B9`mi>5)miaKkB`74V@c(Kshbv^Yl zylZnH!0Oo&-pZ=u=iW%EqDv>MjGFbiH>$yX(XeA~j@8y=keM0C%4C*1Ha?bF-{bYX zESyA!*-d@&y*EK!{~V{|=2&(AyLKH{w>Xux9%G}^4sWTX|H!g>=?iakn=N$aS#m4+ z9Jx)1gZ>wvy+m#oq5*igWkb#9nfn6yqN?(xZp(&WdNbO*&&&_W56F+mkA*OMlFv?& zp9zD^e!|>O$rI{z$LxtOy_wREXw-=8v~%7`Avw>~u5Y|=m}}LXZ@rObihAxl-Qcf$ z>&=X6A7k*Z9EcuDtDWwtm+GmLBLAlJ%4^;-s^U&>q*TdBaq(v)+wwQI2z$w5{$C^ual+iXXv=&IfVbz(!!a2ad4 zBTgne^DK<(;l-!r;&Pt0msdH`n*HSl3*P<^ zUtjRXLX5wRKCN=mTgpk7-W`s^uj2`kBb7NSr_8XtGHOX)y7V`giEk?Z_C@d0<|oQ` z$-4@IHI%!I8k}^4p!A^JbTzjOWw*OD>I{z!E#QI7>xP`%6y|PMJ1=|7CG5gcN}tQD z#}3Pkjb(Z}UdT!BQompJRz=;Fu3##EUbVd9?OGvcKKU!N#dFM#5VP#uD(WJXspXFK zM8~>KsliF^QmI$H8P42NIpNmMXvZ*JZ~M+$3Flc_-)zi({ zX5MP*(yut5N?;6o%u-}YvNTyn2rCst(n{GleLj_oQ=NZv%#`p}tCxcLJH3wloAs&M zfXpBpl8uBg)>I^oWolz)V|C#-Hh`Y@*RIBSUh5j>li6`{J@Ko19M0Bxea> za$cO8yVINKniHpvePYEpNI%s0NdQTq%Zp|?~=YsTuD#&m@6fb zvxuv9L)K@B*)2?Kq3L=)PG6q=Ay#?MVfucQJVG8L-xFdQ{!mM#jyp~HzB(Ub#bacb z3boQbzp(UgLT4Txk{{Nd;&phCMS|p$f-iqf45Wrbg93Z zQ+yJO+;z+1UBiN^o~D+DSudc@CgD~C-4+#jU8#lZ$_ComE=1FD*>WA7k!ebntYq5C zeA6f%S?X*-D^`6IZdGz^ucntSjpFl`F6sZHDOlnk=QktNe7~AX?QNGyM!=GuR?kzn zj{KX4=+QCq2>Bj)T!<0&kvd!0a>wdoNBPp>zbfXm-3O{q5i2gYAKq6F6hS|{ubLON z5!o;o;V8M$O3wC_vkIB6{qbs@ z$EqCq2yCcQ)vXFDWs23n{VlyePku*!PyQgpkzW?cw!EO*@?yMtZHg5sHGVS1>gp+- zfC6S&vJ6>{EH8wCN+M~XLV}(yA`;ZhsTkd`@W@oFgR6dmvT9jXv}YZcV+PpS+RE_s zqM1HqZ?Z4hPYA<FAN`;W_9z-VflIFTyj3?7sA3Kk+g7+V_`vp z8aG`Z+|ucAZDWEuIX%aXR9kN1bVF75BVDTYJep$~N$dL^>jx6l zsS+KTz3S{G?m)sQx(l2KhfI#V|tR`O+3(t0~gm8@bl z^z^6ZKym;%i1Z3!>rRohWjVI&>dKm>ZCS5k$-R1(RogWWF0Qnyh>I6zSv@@KY2*oV z1NkKRln`b&i=^3&+N`-r9jnUYE|qANReNTm@%B^YAbEg1L>?Bx$a^AbI=oQv}+Wv*4iU7`jon5D>)WNEUD5H(Z~$r{S4 z^|6?0%GFRS=IVprHrMLuuFv8P$PBU}*+>WjO-0f`CJjV2Muzg?AByi3qvi~MNEgEbz?(1Y-_A6}iOi66-C$qVE~ zA&g!XNu!takzYne(2=KRq~IP~Jx~2K-fDY9SswKJzwfb{d&<^?s#%^aM^+#sgfLxM zBu!VWsmFJvnySMBjviR4tRC)e#j7)=yy5Cnyj8@LN$n^D6lYxr2O72rD~9(#q?Ol{adt zlzVfgr+BsV6<9e-oiE7G$uG%sLRk4$B&~d(m;ts-Bl$M)hqYqoT9xv=`3D{tWDM>>j`0?p-392?-9;j`N0C)XW;dd=?@)UyZlFP2~zDz6DN)xlad-+2;<)T!mY-~dCMn$f!AORH(b+A zCk&UY%oN7>a)xA@5+Ns~s+hV~WbLY!GsVcgGRnEMiRwP>)Sn-W(VAV(F+4?v;n%2Wzo}&Y;l9**Ms_Nu-IW3>dHUF{8 zD!Q&!+3|P)E^W8ju&}wez(1O&&*=;;^GOP)2%Z3eXf(wXLnv3*UmqXv8$kO zUgZqry1^rP(`|J;MSVJlKIcpZmGk>tH=oZzf!<95%g{{7M5Y+#>2Cb8S5J(VQ z01wV)YV>L=#%WMl2i(pEJ>0;m;CaA}N!46QK1i-29};5bUM-R{w{q*b|6#Z4vqoRZ zxIH1aHC($eN6Q_mSE>94`5O5qxl;&pyWKiqe9Nr^MqU1Omf3OZ^1MTZ{^$LSUFzOO zRxNXv`gbGD&{NfwMpl=66Ll4J=~-_9^9!{u)7s#==2l^kTX$qHYHU3g+V3Ta-O{i# z!5B`iG1#S?UBS%V$K(lGyS~T#TwKZtEQdGFD{)O;kR5>Ef=gsIkh z=;>6&mJoT6p$noS|;L%7S@ZTg|&`_$2~d!eUrs^kvqw^$hUW0F6iRUq~ zSow!0!;D#wEI<|_!-S}&s7O{5o~*}x;ba|_!h(dQo+Oq}CTo!?WU3Gr>WHL;G{-`E zvW`n(AulfNmdv;mc@md;CeX%2@-A``Iavs+(?!zilw@_bl{Y>L89|4CQ(OwOXRE>N zqcpOHe2iR6J}!jWCq&ZhI>*`d$&5**!C(Pf-V3ZO&u%L1A>SeQlJ5#(=AcNL+2@$q zpR7Ysn8^!8f1uJu@&b8@yex#7pG4Bk701lgWF3maOkOBj9$Ri6GlHx@RwOG4VWz4` znu$!&eONh#p{N|xoLY!z8H+ZdQWn{iY(_R0!b~fXG;@bzrbP;4Q89x#rjm+YVHMU9 z>2PX}Bu9{=NS_e4#)+h@(b|?dMy=?h$0Z}u6)gTB`2e|+TqT5oM?})VLyj{lg%PPZ zlXISitNZ&}4Lq+>^EGk@`8xTA5VqbDNn39^wsxj4I2BtsYa)Z9(=Vubj{K7Riu_s# zTjxd6);G?9eXGv&!>uNm!eH;|DVmA`W^u9@S%NGngn_amX`oc9?ySLisq5UZep>avA6HJ~mH#=TexQN>-1wwv5_VpQ#J z&427JLsZAxFK@56$qY}~xXz%ioWF&gAXU4Z@XuUkjOzH?71zVt(z>odsOQ8*V_n6w2$%s$VYYAwxS&ucit`+^#Euj&gGqz>pEhdczLB&Du25=fvNV{ zo#%6I03}(ODaA1`osdM2TpgD>p35TO_BQUvb9Ce8%mg=$1}8NA(`dMr*NjXZhabCL z4(p~)R>dF2Eeo`FZfKgnmFwxqPx~7*KitaS+%VPgxiBtFx3`f?WaviDo8g*nM`TiX z_05CC30(iw+_`b99wa4#2MOa=$MvbV({;R6t(r<1g^)7}lc0p05g4MlwM|wctB_TN znBHU4bjTTWJ|J@5cReb z$;(RXG<{iVlcpnQSUf9l?BjmxYn{C%3tMZp8UtkZ52)^=5y|SQTqc_phpiab$TYP+ z6K@%e8)MCN%}tY7c3F1qu~yg6ehnqgO7oZv7;ibT?Aca%kt$DWiDgI7AE(6rF?l8C z$_o<9&IvB@#8`=CKXPqK(_!peX*!IB%n4(Qs#9U!VroElyOK)z4r7O*ZR%tMv>&JG zfOZp11_iXgNDbz1NHEFh9?_J?jW^SatG1-FSesgI{%=Q287^kc~wGLEb! zgnkW?)Q?ZsZJvENIQh4hLJ!)=jlEtBa=EtG` zMgzZ-*T_G}>q3|`>*koe;T(DZuLK?XO_3}Pm62?$=$X~XI5M705W;SvNV;0RuI`f> zb#)}GEjW>EJ1TV`+mjv1PC}UJCX!}4YcpmSRdONjD@hmR?x{|s&SY{DIfa}mgq6ER z(#kZ)%5?P{tjM{%6nmlEQC&lo$H}$iI&!@bMxGK$BOB_f%jdoEYRn=%lJjENJ=A!Y z+)M5w_X}a;ut?fC;5c$nCEuGfHAMzRuotO!nY=_^A+HKy=@*f-^rO?hKh;$!HE9a- zNl$k~Jrpo2krl~Eva%2cqD9g`6?JwA-jqRBTQ*Bkv$v2w|#? zNSbO%Q<&LiE=DjdeUvYJb&sT;j~qpgCdUY2X@W>v!Ub2H8dr~dtLP{U@Lui*S$Y+@ zl6;6%Lg+s#lKKy8PaaW)mTFJ(R(2A*>YlGt?p*yphpv}ZmlX(IFXJWH3=Ul-D_`hZ zCL=d=b@nB$uc^#tF$V^*nF-#VXSt&=0A2lc&Bv~u7Ceao;y3PymE4oSI*z?PDHD{ zPxxov2k*Lma{FEPj*yiCc3&}4a6Tn)^EJQM&gScX=5^5CYb#tF|JNE^_F#jrvf(N( z>diNDoTyhHg*&h9bK@~R=!2qOJ?Qi8#>!&hHXjN*Kz3z=r;(e+jT8I+sRwT5d+@Go z94>XY+3lQ@wSu0q;<-7Sf800`u=YA=nz@zNxe>54&8)cno}+9h6p0x;m!!oiF{GJKz_m)J8hcTAtPt_g0ENVh^`gh7Nw);GV_P0l6f3DF`8M6yNZXXtgJKSS@@qB`!{ zZesb(k2pBrgeJ_(zd6 zeAzL4B}4Dp!Z3Gj%QZj=vjSP3j36rtVWEmhTBy`OA6#Suy=w~#+_i1kK=0bpwVUGH zzO>b!>_-kD2MS@`7D?-av~|;~E^Wb*6vnx0JD$8tzR1GU0c}7+qJFGQ199zlW!TW+YoAIeX<^zK{gP=Y-5o$+prHJ=0L{+oB%XxAh!i`6J|E@+f&s2n!#Gq=omih3MnR zk-zeI$Y(n9zn2(x8R}kbs6$;mXQ*4c5$u>{$ueX)vb+%WR1(R0Dm2nVKcbP|xP=97 z+%{zSOtKN#m~0}1h2|n@p{ZjbtC8Ngg@wG0TdNT_Zjr~0+c~r`kDN=+C;dWLT_loL z@6lGH7a&Leoa4VK-i2MpyPIic3;7JWm3&qRyDx~O-RB%{w>8r7uD0OByYEryeeyW@ z0r{a2W%Gs7RVRq)i>p)SI?2byL)PnTl7*E98&lPePdb zO(aeIOjG7BYQ<~%sJLfasWDzRE0d9A6|$-j`mrLZAJtf&YtfDMo-KUITh4LM7CC%x zv9HOW1K+7l^m~h^;x*U}j(jC6U*x+Q8TsE^?8oKu@0WG+QJ$~r$k(Sz9YEw;tO+Au zbH19p&&qK5-~a+&$-X?;a_endcr5X5`FtKb@vh@>&4281aKL-zb~{{4@7zig=j`0( z_u7eb9j_Dqnb*OAt``@@+t~H@9bZs*N_xdCnd18@S`Keu^q zM61V2P(-`BNpM6fONiU&eBQ2Z66Qk*W)oyWHWSGjq?_~zaREqaqJ!C5O>{7;%hzO? z>bEY>U>1$UU0u}2U0q1o)pd8FZa1SG={zCL2^hiCyLOLE{ttGL?pvDI6peuV7`WV1oO z|Jhs071LA)(2#lG+_2S3bxoV9E?vD*Ire2X zGfLxu?`1M4HPxeMj3}8C$Z_OdNxNrsC6MSf=69aN+bH%mRhQS>Wz?yYR*BfRXnha4o7_vjD};{+wU4g-O_jC5 zE~`48%2j%Y1>gRAC3C-e<`lkD!D+mG>f9+Sw$eT*-brv;UceV?nV$uh=zm5|fnadwuTA9eZZEHm}i<@w2cRLYxuv(%xl@TM13+Z5ltprXd08xp=o zH>^}oe{IdrC?~csS(O!;(+j_zGxg}lcfzfd7wTdoIJm&ZZ%no8l((i@`i<4pwJl3` zz<#F#AkhK+vctZ!5=_tMqG*0eenFlizY?N%zta+_ud^5mnBS<`=P~lPDf4H1ROq?- zb_q}6W@4l$S%fS`78gRbw3bMfXr|+dlFd|!3_C8z%GmF%5}q{b)F#u(I%HiTbQ@@i zR6WN^{buUu_c$lDFAp_y7EvAjLf5opPWzL zLoN_P^*$|;TBwbfi&V@7eAUA?HU6qq?V&Kcm}d($o+Y=E&ym}N7()LN$x;2h*OEg4Kg5v zYDn`OR}kD^#yMd&SAj;kO`--}!e`Rsq>vd;RwEP0>OvTCYl&11ZKP&%weu1?2W?VC zHLYfsakryN2eLick?bUdYBw#B!nd-BCtaGWj*acAx?vO4mdjQV_gz$(L{20plT(CH zouMUC_)w`BnburgYK#jDdnZA4x&kAQQe_SK7`c{wTnN=Cv_xthjhO4zmMi%1Ds5C( zC!5%X-EULl9db9hhukZK<^e5{dRN=nr#fBDv61RN&%!^D-;)=}i$W+})e@;o`Zz8( zS0|h19Y@0-aU5mtKw+~SS(YqMRuDopQcI*Fl=Ukbqv9QEPF9|g(_*9{RWiv&WMi_4 z5US0!L<(0X7%{U{!=G{vBtea8W*2b}rp6HRPI4$YObE?US|T-E+ZdrvYa1A->F&iW zyp&u*E+dx(KF#K)VLP7(d&2vBSqDlEzq=X>LrmLvKE;vgnqh~NTp~?sV!9H zmU)&2wM5%=qe>65JK2-$C4_1}Es^R?BW53U`nSBcfsLXn`5M}02GwSgcayWo*+Qt# z*Al5Y+R$9J_*$N!BiGP2Pf+72@=0aCu12@H@A(QkM4Q^P|Lo)WuwH8$XO3W1#;J1O;k^po$m6q)R+8LE%llUQZD&Q)w7GM z$6Me7v`6F(rLIu>E%zWXWm=?{w8_CjR5eUXr0!HJ3fb|lAuZLM^Jo`Tg70>V;|jpN zkUIC0i^%)P#X{&V*Al5E+RD@kMbF(3whI$u49!vbzv2 z^wtuo9*&uwt<;!{_+qS_K9XgCXDXGZlheo<{6$*orFwnkj)1b1Bm<>Uoz+`^kOe0rH>_%15X2jRa4W6_ z#0*+Eo{Is`B`RGZFOyfvAB9l<{Ro*ahsC^`$(1so-@?>oIFc@L4GNO?l)Q@b`V3``;q;HFyPe^sR53ufnqAb zu~J>_EQR4ehdT4fx#WD(FNE$QEs?rMTX8LD!{tG)nKxR%%+pkQhTKeUA-4*l{JfS( zJ?ofxt_{})V&-ybw9HYKe~&yy9w*-yLhoZOk@~uW9m}-2b$N#JsFceC)W_uk zq%03ScTsl|Igy-9P7$Ks86r9NPjwDsT3cBkQglgF*E7)T~ zGFr){39E#byp9#ZJrI1qLU=(}?)NJ!6U(wnSjsA#65AuxE>p< z9npT*wYx1B3FhwX8B~oYGs?^tUuC?WY0QSySwbR|9 z?L@yIS%54=h6$lnR7<47)rx2=CR2pJvCgq*mqS!JLLMfMlE;Mb;R7v^dQTfU-i|8)xC0~U?w?rt7xHKFSMoO@w61H3 z)HSXDdpmtAz-f}Ua_O$p9)-;)vML!(#t5MruO(8k?e!TN*IwTXpcQ>Dz|(>{t;m*S zYqE_Hx*fDcs;y(CU3+~qz_Bu?s2#2s0i&rnmK;NlBgYG2V3L+dO>j)z)n4Bc2sXuq zz$z*#@*(nJ@)02ntkDvw)sCr0+jAk1)8X){tmk#=yh*-6?j&~!q5F=ONWIlwUA~BO zs6CefK}HIzIZd&mI7hv&$*;(7$Zv(v|3OQnzH|IJ-(KG(2tG8f35s=qidljzPL?D~ z31Og|mPnQEpu4S12Ys&~*c8_Vb*Na6tV`A>GlVdZsU=bk98(QDs7AP==Nw?k5@@9X z)EPt$B)z01gzgY6k+K~tgFA3tpsiF>#hPPTdk=LMk_*U1n zn^l$@C)TS7`#sN6XB+t(`8@f85W3s7MCwJy%D+0OlwZ(uj+I%zSVcV_Q0F7^L-J$t z6Crd@X^GUQj+GM~)X7{cwLRBaJV4$cjgC+?O(E0@Xo-}oqwb@Sj{2?v-KfbM2A+88 zR3{V28e~l&bd$71D$%jx?x^n=I0rKl(Y~hxbvlt9$Po@yE%vfMYBqI|__$``;!BNsLIk3sevl1KCa4xI_Y}_s3h-R z!CdOhC+CrV@*W{{@6{41d|m}s%!R6WhFwiOr4imL*i4lzwBNU(gb%=d>%^ zI_X;ljuqZ2I7XG@FdX?CVW z>V|eC&`IAYfFn6K3f!?$$gD=jk?~}L5CbGpBnL=!H8&FtTcfkSPmt3la-YE6mOAap zc4P;#qYw^s)e@;r+Dhln`Zht1748;Hpw2|{E^-n%SqREs=U$yRxpczDFRgdGZJHf)J`#v_$HnHgZW_Y>bmR#|XCzN_RnFvn*MLEJv0XLbZ~X zNL5g!nxcauy6D>j+KRqC;BG*jMr1=WlWZ)6ZZj>B!lu7iY1&2K9ne-%+%}8fNe(85 zkVAz~8>uBy!)O5a+D|kMIu>pj+((rqq}9wGp`=;NH*D2gw8E zA@Z;gTJLFz)De9sN4xT(FJ9!{3UFVc&X43(@+b0VA#|^4iPSIJ%CB8{(a${=-U_JH z4W-S>WF%RItSW?Vtd>Ycbd9c6O)+z4ot-LjqCGbAHRt}s{vH071XSpxLS$Xfy|63em#SjZ}z z5`_?PaMyNk`u`#a;zf)%-* zsnenOQtI>6`GNeNyg*(Q!pc>Vv~tNg=*!*sa~@)bJvX@vZl>!e5wqo^6b0}wGE-Ah z63vR;@nb}0C9pK|7u+8#Cw=T6}zIsbWcc4_ z5j{{ir1IC!(~EdrKb1!7u9o()i)83BL!d(yT}Gbfw=Hg=TXKK5&RnC8^|C9LT0@&s zUTm6aJ=D6ccC`J!e=KS?s{eoV9tW|kn{B)5cGs&!NURc_-v}~$*cqNqa@b}UvNPG0 z>?TBy_Y%n-@7`UXt3A4_H;dwoeXk?6sfjVaLU+rh&EOW8~xHIw6Mj zlPadC?TOXJq_Ieb}OqH(08_QBt^qZspx+@Wg=}wc* za=UNKX!QIi!|`@>VavP$h{G{lcuX3{p~#jO{c=?u>u*;q`{#bC+(Uj1seBTD z3Q3<3<^N)Kkp8g^qWi}VRZYEiDK%%H zUEVdXyZ$|?k=^Buv6a=uMc%OL;>16=4&RQ6FY<3sBlOC;L3Ttz_E(BZ4fjSAdA8T9 zxfkfOgX}UH;^}|5*uXs*w2Dgd+D&gd`e?Y8L z*7w%u?%oMu{YWZ#yYI#AdnExVQBwr%83sK7}B3aAJx)ucZi+pT}r+juR z*GE0o>}hnm*l4?>=VvPaO8!FrMqU%b+zpX5_q${654CkP-Pu3dZWUd*7mpz4=Sk() zfpK;__j@e-K6#w{ zfc#Jh^-o1o{UfSZ{TLbY=Zw45`uIliTxaGfYcjrWaP4?I)%`o|Tqpk^Z;$~YEQj>Y zv5a4Wz6%R$ym2sQf_~Pdy9i;fhe(?1N^@1aAtUH;@e|PLb<%U%ex5@2 zS5e_(QOCL^Ryf)s=+()zJe8b6P9vuaQP(VytZN4Ain<#a@|QaV@|l~bFa)~leygND z!*FO9hQXg%yEd=NGHYap7&n|qL#C2UuE|Xq6+y4aP{~Y@dh`3!6NnYbz1u8;l_sB>!96x*XZPqs_K8T5BjyADBq$jlN{ zn@l&3A2PgxUXd~PcYXvW=lL<=R(>>+sgIojJb9m=1bH270hB zZv^?$csky6;dIU)xAG;q_)T*hMrm?8nF(_Si_CFBwaUcj_#-Dp&?|DL1pD(^kUwW< z*r|>`m=6!h82QVwqMN40ST+sDaFvH<+NIlBLGH)|8C0pvnvOei-UPiOC(~cM(<{f5 z1-J4<`DWQAU869P$;x{`pKu{(L4Re?AkEYo$@@jX78=&CT}Bwflrd%#{k{XL#pG zB4;Tyavm2t*@YI^vrPAEbm9&2b@EMerw|9QTO?u z-;w8q(7Py-df#ikA5{3g_HkE4U-j9&c1&!kzIfd%N0uSWlNE%}kL;^r?z0nJ75l0V z_t~*d`LZli`qt%Nzt7$&^~_#u$HYXSZ0^U;oDig_jKCk@AbugdqH4O*?q)VqG56!+ zZmXBrC1M-Wd=oO0Y)WPc;aZEn`esgZwc>ueT(C}KmTUC)IQXzh)X@HL3x7GcImU=f<&5H5|^t!0iCm&yn0jAXgt zx769Y%zg_$7I5EkI5S2)yWEZlb6RJtZk^TQN?h!Nw4%sWSe-X?dE zyUBNiaBrV8r1o-1Rrs^&TP(iw?^UtK*YH7mm$^q>e-Lf8M@6s9YpcDwt*+>9tF#K; zcAlm#l0T4_$jd@_^pn$IS9P}q>0DsB?{BFyX_ft!>q=jB>Vy>&a|K0no2~wzo9(Lh zuBy7U-Y%D%QQH&La25K&9W#=wNLD7R2;pXoI{T#UHlvhxgI)eFbt|!a#NX<=qWY;9 zl)cMUwV(Rxlob^^=LC!k;x;vh*E)t7*1V-#%jR#9IoVS&a|(v{i>!+ZDr|69QJnF9fS-#|U-s zQQYJjOH+4|Z{(tiF28j*FX&g8G^!cZ;3- zkim^M#c^&!UMJ@@+oP=JadHj0j$AKmFWVtstG z`4e`zIA-SF;B{`$1v~$Q)8mJo9#79ZvG=md1LQvPAbCg#*N^EQKjQTGpEUQg^t*qn ziEYHy>(JweRloJ<@xyBNdb?sF>G90iSY@5@w&pDpydM#r9v5?!hJGP`B7Y@+6T+SA zx+Q;?maOKK{+T6yyjAIA8_?C))Pql;tFNJ8URT%t^XdG%(^?7r<-^@&Q*c5D9d;Bh zCHS3iGKQ>1#tY$L&Hno0TD`w~%DdcOYR6I|`qtXTpTeaUJ{*0@j*Uz}**vG6dp!5y zie|p3ifyz#>8nw|9os+FgS&H+E#D;PMqRAid?Vn>{GCS1dG@%Ajz_LjvDZ?YdpC1akp zE0_CTuWIn^LFI8g+?V*ik1F+nx2#JfzBv#j_dSh|3CyO=x#S#j9ywnKcNU7|y2#&O z-zB<7p{Av3*5}>|>e6O=v$;Qe^)q&xkcj&0Fu5;*5=XOZ&0(Jx662vXg8UxMW&FcLex}8Bx_33HN~bQNB$!4kdMu$ zp(cG3f=N`QcDlV!s^`~wL-mh93?HBu+7>MjAqSH~$zej&HEMufXpb167uve~oh)PD zy1d+|tQvHP+|7`~y>sl8G3@K%>e!1|jkg}){CfQW=hy28IKN&$Am`WXLte7+RmVJt z{_4ycZM zg|P62mPnn^eQKUncfO3b<^&yefzG(8%OikkPe>CqC67|Fl9HVLa$SJUAY5akb!W@EI@{m1<67}xL8C>q{5W73-^b@@w*$@`p_}X`u8d; z<1oirxub_o^L*~Q-T%+-M!sT~b-U?T66qmpk;y{%m#!sJDcaN2fokq6c67dGtpHCy zz(|1tW}-;=&I{;175S=Nsk{uR%-Erp@2(-Sh;a>blVqsC9=oQR_$p@6eS`EYy2)wB z3$NNm%x>!1tGMR%R8@B%xa*4s$>bz*3OQ8>m+#gR zscCfHoUR^z4I8LAXEQr&`0MDf$EdfKTthxit`kE4NiC6DuPtp*@4k+H3$hfZ9(}_u z?%qwkJ>)y&Uh-Wb^bcx@)IM!#zqve;_ZCmxR#&QA?yQYfD#D z;!Zt=x^%M2sKGn!0ZLp%gCkVa`Jv5v{q_~)C#Ttfaw~OvnN8Yxh)USK&%LV_1 zl9_r-tJ(4MZ|FIIGhNC*KB@2qntTI!!n?RHyH72D*RJc*g$)=RfaaY@%?hJ@h&~|qG zrBHH6$&$qlgSlaNDHFTfJNDa2<_5KMpPg8IgQHd$uOTnyfL+ZadG5^Elvt;R0&>~G zkcBz4bxKJVWf>gw_ycxa=RavkRe2hm5Of(@3G$JL6LOP_=e3K|wTn4NMi-}R7bWk1 za#5FYT=e`&<1bvy(a7F;!2TelzYG;m8phO%JaXw1EOowlH*eEU#tjxF_>^aGiG};} zN}OQ{Z2X-LE-`<9HkM2MOi!v;+9{n(BWsg&gs__-l8cqPUiHF4oZ$7mYV9%mE|=G< zzd%X7hnquvs5F4=M-C(h31MciSFb}Xul@q1Af^5+*!R{-xI0u%g&)Uw@uFa6s&oaG zT{?=Y!n~YsqH=;LY2EN5*hN)$9k*jV%V~cFc|Z98`JfOEDv>zU__w5a?{mx;x{s4#lHf`)B-yz>6_X%P3kaO4voWl-M+QWjoZ>>ZJ z-ueI&;(m4R1A8b$`w#61*E3%IGZN{R{uzlTmcE7|UpDgNat|Kn<&WnP&i)_0^b42C z32NO(cBR-KB*VN+UL>!OSA{r$U-SW(KdDt8+3`;CODuBX?~A*Ba@y|0V|GbZ=VQCH z>qoD;@t_@J{-{QMj6Jf+YT?IrRZoN^)mI`bl96O(A*zoS$zG{q>0YU7>0W{5QrYpJ z*iB5cUG|Vq?Neq%J1Rk|Ew!ApW$+2!*Inp8Y2z_C+kf)Tdw))Rt)O9~8-@|UL;k`r zBbcUPNIsH5`6}zMUA462%O8sHFRYa0ccdM8?FI~`;T701)3Ey^d2iqmRDRHVqw1-I zmxh*z3@aUAWjj$odM4M2(gAgO1HO@`T$f=bLr_Yd&A7ubq~LofIIejK}K~OM!DR1-pP6Xrt^I4k&%4;qVs&4 z^LkYF(DFI8%}_hf*liQvM-BOUs*LU_$wxA;@yf8L)H^+gmUM;jNk=M6!QAdCqq|4) zKExxpd&;QOLkHJgSnT)^Jci;i43FV>jKE`LcCq85c2}ESsD@$eJMA)_#O19PwrNji z7)I9Q5aTgeYL4fl+8M^ZJM{D3c>W94i^mWl%Il-?eEt{&lP&f0d3au8j$v4f^>by^ zHikWC7@LoV8n1;L#sOThyB{`;6@3dB52L=bM%mfMuO|(o%~J)8k74j9Bg80j)-d{f zTEMszY8by7vBs7ghB4xF0pou3dnL1kky6?;!t0_ip4T*M8wZ=1#@WFIjoz3a2H<(E zai(!EUX^|o`EWd6*4|}QY*U!! z7rIIrZHBmvV=ompibDTkSFCY)p38XUY+<7{9DFs)6=6hebs079C}K=Rf%jaIM!Q2U z!+fxaaR$$Sa1}MaJK-{7P8Tsc!@+5WQEw(>0Do&B&lgn7e;XAWf;?69htY3@LT9v^ zd~H-*p)4c=fokgVSbPJ^%zD1ZLW`ge)DNMfD;K(fx&wh)@><4Xkea+~$l$UjD97r25POC?+%xXfH>R{&czx8o0?*@w zt)hzGfade6!3}8k!Y=bW>SyE>lVl+9qVX2EM{2B~S_DR|EKmsxm{j#y07{is74~Hp zoP>-oi>})1ODrtOK;Rdnkg1Xu`zon&rtjeb@p#{5KlP&Ns~#4EWFQb_uCO|*RG070 z!VfYd5I9v#J?`?whAzi*mArp+-4)}is)`{#Z^7}!4dZliH9N$YXpUFUg!r-xR6-kWX`=yRV@USFx9pYD%p&ja;jjM&s|)Sfk3P)%@qjLb*-?45q26?Fk6a6`LNICL%}XMp-J96FK=1SY!t&{;&C_`=XxB{PP4qcC(X)ecf^gb#jB zDFr`|;MK&)7=1l&HgH z;AgD5R>qfI>?`DSNAxVNEm3cj^~DvJtU#b|=t$^}p>Bb4zLmvZL8w@( z`HI?K4mQRi_cP~}@@iRm*pRG1U~A}Wu(6XiJ}B>7S-g1_!*~G?sqNb;YDxuPEWX=r zbp_v!@G?~mqca{u)W8T|Tv!Pt1A!Y*?W{hD!04QajI&i$lZt4piE3m;-`9mBqoho; z0xb)yu+r4hO1>qgM^%dSMTJH2m5#`7tY%00CWN;|M!9HA-0E7SuR8WIVk`Ty!&f24 zj*%w$yfSiEslru!duv=q4x0nhn_`b^VO$Sec8p!Rx^xwcs!5CC)L#BQNCE_1p=oFTr3a>T!oSH>Rc3>_o;YX*%II( z9wXI)Xc&1)Jrj+?tXp0DNiA5Xpd99*7#wCR)i)N0*?_NPBEPYEGuAhu_!PHxT|u66 zt0r;2Sl1M{8dcZ#M!{Ad!|3l($@P4(h2(cs^UZv&$w?}*zOQPb5lQk&-n=)vzHdUo zCy@DSlKQ1S+WrYuDFFlZXJidlA0}Y@{hXwVG{E?i9~v&4toAnWRaK{|`-+;6sqdXG}SPkOI5wTKz%dasIRHI&yD)NMSd^U(gQt71_G_jUZ%Rf1T)Yo zk8fqs2hz}=SX_t;>iSo{2-P78+7GC{NziVHS2nBiwV*9Y6frlM>d-Q152*!5&mps$ zx`EeS=hBrs83(?+wqabat-emioG0l(;A`_2Q?0olI(1TfE5kDC7{(?%)VJ@9uB?7Y zL2Vi8S_*3W0=Zq(%c-bMl7T=yS1Xqq{QxwdEi<~d%1HBh3oWf{7{ApuR78(4Rn+Tg z&|a$cr{Tm)sfVjdeZy#l$7HoE9b+a%y_gQWE0GhT#?;1%zEZ8O?c3|>kfBDk_EimQ zisefnZ~_x$V|Ao8#*F-wgfvAQoNIU+wWY6bkL#1Rx+4$brFXUzYM}6`S>SP!bJL#V6hIIaue_3aJ^3U!3=dLWc1DWr2=E?8cfr9AE z0>!%+#tijUdmKvfF8b`3kDf+%m9sz5^->phW`SN^WsUQ4M-=PTRrjUQ%`nDvV_%wv z+TRK7vKd(w)Pl|^wYi(xl8M%nk1Fl#u7)*6>vdJDyP(wX$Qq$~c15Y*yQ>*ZP)go% zT)L;K*A%6mR3p2gl)Q6phf3&JN23Q#bDi=OYSs`Yj^51bIG0h%&arSFrFB~Gt*UP zi0;qNkk@`F`_uK=5Pfbg9ExyeD9=sT!lAlHQ-&GF+F|TbSIRJbc7B4qR>OIAx;`1E z`*hxL!?-kD_vyUh`t)>6$ZA zcWdG(#2=&Bt**pT`V4&^dCh&n{rdhW-LG?e2qZ>hQpaP@Xx*=Ke7avRkJkPAC0@(d zubal}e%%XMZi4RDP2+XHPMKgBOD5=k9ffrMb9Ccfx?dl;>o5BCI5NMxOZV$>6qJ5V zn24q1MBT3m6Lr5HL|*+#x?c}Y)crbk66VNBx?jgm()}7S8I$B>-LDaob-(UHUh)*( zue&DeejPal)8rK0uOp}Eel0WAFy>Cx{aR+K?$_6lmpD!L>uXbWzYdvZ7{{mSejPGR z_iOR#hH>|F-LJ)`>wf(=@)Bm~e*O1!-LLix+~$}O+^_Zw-LFOOHjL?a>wYbIx9-=M zkymY|?$?*^*8S?8X&6Ul2KTFXrta6Gvv9S=BMvLSuCsN&7M-R0b>?i{ujBAqaKDyM zpRfD18{~Q?eRaMXJI`0il|Enh@7I3A_`|O{&Bp@l1k(BY_vd?5Lq8T^-`FEC{O5~& z*@b&8F^sqI_+g29;$B|@K7GIcUSu~}Y8YGa_+Y78e4j6&q&yD-&83!mBUCssWFkYQkcy+N-P8i?Nn3y&U!8u|@S=;;UX#o(2K~%+WM4jwU`? zhUh7K2~1qat0V6>jE7XSrM~K}>&w-srT?d{>i~=5>Y{Jn0t-mBAQn)-28cD5h`lRz zqoP=1i-p<6*hR5-MMc4D#NGpzpn?jbV(-|ochQL0JL>%B%_9;1;C|m_@19%c&Fr1? z%FHZkg3S{^ogz@a@Gis~|O5fHd3S;}*$S0EEJBAkH9A`7dT{6D?kZ4$6Nq zWu>S)Yzwj)89)Px(e6MDO_oQZi5ZJ2HWHn8G+~XLev5*CG|{O;>h^rYU097aOR#{s zgwc>71eg}1F>NSxG4d;aU~j29VNNPkO{-&Qt2uO)q(&Nd!r-|STT>8RX9>t4<)kmbrs#_U&#)syinkmUkC;;hnVpPyj2t*{z1Q^=0hGE3M> zWbpxjWdPml-b!Sdvxc#Q5GQK03Rz}A#q2}3pID_X;CI&IrYiMlxtD8&LDP!cd_P-+ z_RkFSfo>Ob@47T&jk<=vSx3HW)pXkr>qOvGi@-2V*2}z_(VCPHwQk-Fur$^!gDuUvrNd zL36U*3h%d@#THgsuG78!wqaUqNr~GqE&ixmHUqCqCH_(;m%F@0Hgoq6j`wlhzDo}< z#$ishEgq030pyq6j5+R+ZVx%WJOla!yecqfSv8RIRa9`?c6FKkBm^CY3`%6ogSzcdODJI!x&xDrxk(sJB~gu?s*j`4HEjr+ zh`*XPMb4C`?NlS3`s_vD2NAeb9S$G#7>jK>LEGg&NjStY2x_CnRP6f8(< z+GV-4*eLkJ5IjK2Ac{v;rV*v4t`^dzRjfxQ6?& zm_hq?V_w;ip6&)!eFgID0PbRHk%eEf~12fF%i?6+dxho z!ge5~XnYc;HMbAa+9Wm6w&`KHOLGoW+hiQ8u)V6CMMHqJ?V_qLQr_E(Q_TH{bel+R zl2MsO^^aflWzG}HI8h57mG*8&Wt!Iekj5DxmB^AkTiiaRd7ACkirn|3>q{37y%w4E z?fkJ{{nhgNF|n5OZ9fjs^<#p46YQrP$1)E@9Fm6g`~Vt1`a430-v2ch;aO)K9KZuz?$y0)qcN73)4?2w+hX`|-GsvKv z6sP4Oe6fS*hx*Sz~4A5zAiYeaG;ewdo)jfu<*?|ThLrv`j;z4DOV-ZKF zSa4-i^|s8Ar8(lb8fnw*B4hI}F_ujEPvA@MMzu~L)af!~Vf6k4)@p@{bys#p4<+YW z_@bMf#0tqS7)o71>j!zL#p&xw?DHi&4YV# zw`|0KY*k#V7WnVZ+22GRv{p>Tam7h&zXCk#T2$dx_5CE=STB@JhF{5?ua18+{ck9Dp4H0ml&Am~)Pp*h}I{sE?v z53pqSN%iLCAJCj@YGTE+0L1}we#lrBMCkQ%l+*}zhIL{Y>;&7ToJ6o)V{@Esbqw+S zA2GJ-5mmf_wH5zI6m$cdy#cI#Iu*XD`q&9w(~hvq_$y8-SL%OLU1B>SU2bD*I=#4s zGtKQ5<^*GP@VVGUT-b7@Nw>h7j!&g$ou|Un(;^=}(}eYs4+q^wk8hKK^=*h~vv|>~ zTY}zh<3QMCP}Xg>2I22W&X7InOBMKCt1>DEdCIbHE-y6YIM^{M<8|@&K4`CS!kO3N~=39uKi`-%JXA zs3ump27_o~h2gmkuCUtzICOB1o0gi`Egv@w@J&u@-eez33+R87;KV40< zs`L)yzIT+Bu9mSb4_z$KiUI1F$7(;TM(?r1?}f1_eSM5-s|P^SI_Ms~pTHyV14ddO z=+qO0{{mgpOuDhf-|9f?;UBTK10m%xHhbo8Bp8T~@+wv-vV5v8D>vnn05t7pj$IL_ z{6CdEQnxQe(z;~Kz)110PZXPhk>XC>u!(Pm2^S5Xshj!kPc$|YroFo906(momOqE- zz$XfLfx~+krplkm_!5_pgsy36{4q}047lQ2+)J#w_xp_Hz|ZsoF1+7oD)tItR#{j& z&Z4we2ot)dc^iJl6rm0V*e+E1wR)JZ$)b$c*!TwB+|$qprYdCr7Gt~^K=cKZTgdaT zL~qe8#$-{_Ta1*8e3SbxE-mNP-OH`F=+K{}AwH z8-*Ec6&7zxFFs>OA6ip^EH%;L3NZ0SJLXf^-F$Q-OLgZLY$+=X$IRYN*j$z3dS~JG z701jO&`pT7y~6g`)5fnzO+P(Q$=p_ z6)7cNki%|(XB%D%=0_+g>1{i*S#b|Hxu@yQl@+l1z(mH@oI@y~djS0mS=H;eP zUMzglGg?dneZ9kIa- zH_C8CRGhoQN|d0DP9`5ap=;W4z+lLurMcbjCVGrYnM1 zm!d3J1otnku&~m!s|ecJzcf84VoGpI1Jpe4@fB>arbws0WfhhR`8SIgXHj@@Wa(R$qKhMoQchu}a@55QS%j`> z7Yz52C0)<5-VI;O0lplJ5Y{--4Qm)TVc<=scZ>^2_0vS#ZS26UK2BQ7aCCl zVU2whw%vyuOCqeX5BZlwn60nEa8>vNFbAP)+DMD(2%D{kHSs{$S-`c+(;W|lo%N-B zo(PL9k6y=*j(H+X=%^lxs|dTPhZXWdSfHQ6j{4CyFN6j9(G4$CqOE5Ig$;r%tUxPE znLMrCp=(-EOt#xmk_jUn;?B2F$l7XDuN+$83tiKu z>-qPTL-f1qV9go|8(c$1*YQRxUIEm!)wYZhXctTz8n| z1Bc1A6m}N!p_WWz?~63!0iY|@y?*yKEwF7`TL7;u-vg>bb;_H@S+xYTr#9^`k3-k8 zHf59t3}7rhro8TxukUHlF}=;P}p*a z2okRxlwKLvO$DXDg4w#Ir1V!UB&GLisjxFGb5eS*mXgxF0u;6&KvKHU^Pu!cfWHJt zN`Dj}DZNuGh2dWa=#(z>|4_PXYlTf~os-gCTT4p60n3}#lG26#UrKM?Mqx>9B&D}* zBPqQ=Til!1R#Ljq^Pu!=fM2$ilzy$Pr1Tc;6qe9VQo7Ldpmh88IAhx9q;&iClG4w^ z@^^bl>F3)^N^jIbVR0RDQhK8flG1HDf^9lVN*8(_l%5JWy<<*FPwglvz1}Yh+x&~9 zbfM=#>4r`U8`3E!r5id)NcS=9fMN)cSm{S8Kr3*a|O84xlu=!mjrF(Xjl>Pu%yKa)wg`Nkc zZ|J75f4 zo|4iNdq_&3+EZbtAa8pLlJm5l2t6mI+cf!AVd0Pjn%Buxn38`12{ypzT#Rn)qpZ`EA{V?S0Cp=szyfYa67_L1FMvv$Z9)MW>M!mYA5#i8tF?yE) zpnJ&a0W!KrAX?E8KrTjiAB64+vTzVp?20r+q32@shl4@)!5B;h%QSx7kmfGHT#UX+ z6~I4?-Xq8~&S5j4KTHZshCDOT;~=p2W|i`F7hSMfVPnj6th?xfp=(+>tD07tRvUEd zLYaOhYjW#h+RL|^CCl&EeSXaH+jV;mmY)$KS$;`~NUmu=V);3`JqOGC43R8fa-NY{L{I>CutRsSz!T_CCgWxELna%umYHA==VG61NZflCCdj-0Rc^sEHCstSibU9g*Bg= zljSQ>vwYc^lI4%UTzQscd76Hw?)X`f<)_Y) zEZ<}{M&+|5%L_dZmbadxu#s~l%UjQpEPoc5|6IxPLeGQc7tU31kwLQj!nu;=1H%<| zBwVt*(DPvV;`0y6?H_XBJ`Q>=nr|A7J^+#wEz{@&_l5v+(Y)<)0py~2 z2S8bn5-SweW`(4AhvkyyRbV$(NSYV=k7(X$rKEX}mBQ!8G+$7+=b-t&S4x`yoE`Wh zn$OhjIcR?FDoOK`H^?o<;QiwUN%O#R(0sRz3Jbw4u=@H;8+^z;n4hsJo906|3Df`4 z{7!%;bwe(i2P|p6ywLwc^CtjS-et!1WU)&0pLjX+AO$D<(;j=7pXI&38!xHz!G&?~){G-fb_)c(0^+q31#K_W-v| zmNb8FucY~n$(R@HlQb{%JZL_6AA0G1lIDZ=Nt&;=Ut!}Q>-P)d^R%uEJr~WtKL7?! zL5ZbEX4Gl^HNadnzxyCAG#)~g9g;M^6Q6U_{J6skI}UkuSmx1be)M5U^9_%J2p|bZ zCC%4`o{Q$Kk7I=h5_Vih>ojixAQ#Q2o={lPlL~8eQque>e9lGlQK#@Q9K`mtOrz6$ z1b|#L-}Q_Da?yMbKrPSWssUvASxNIf&PbY10_Kw{X32 zZh!^KuoO(TqSEwhBUbfc-g1?i9mMKX{j1`t$o7JkhVR#IU&C&^hHv~;MJ%PaK4h{p zrt29;h)X1;Y1$#vG7IH89QV%)mAQrC zFl59n+J6kT8aL^|F)ZoUzKuc69fbu!#zQEgn^@94j;+o_5Xa}GnqK(S?=bG`&Nxn0C^_5=Sg_{L&O}d-IcwTx%8Q0+%_8M38Uem@K@Ptm!KETuc4Y>J@LYqFq)BO!4-Gt{s zfEC`-s9W%aPJ2I@;;nvriy6yX>UA66&~I;P&TTl_zQdsY9W}cHN9Z&+3n{k(EczZ7 zx^M}MMI zkKowsGuZeu%}9qMbUMx9`37L0EQMwo;Q8h=ML&k;$}CLZzEGDZ@PtmwEZ`aNMPZ3w zFgCJ;XTTQ<{u>qg0pP>0@cyQ-I^U?`QxqC7QmqgX1n}fHg~}Nb5%i7xGfYPf1vPv{ z)@C0wy zMQiwG$>~|D$<6r6QkcGfXJ^rZo>;0c|^U52L@9;%P9=2Y_vJiV-G>}z+mdqp8^uk7vOAF0otXQeGJg)^dmUl0@$h`rMz78@CiJt6{2Vhc-{lp&V{;I!V@~Ff1BbR!(BKF zEevnS#loB_JvDjoa2E=;Lc}Y8zq(RcBO;(v?F`cq9^*>Itj+G$%Uwl*XDO&}G>w zWjQmI%`RKq{jZnpdVtR5vdb19WZAYT$5}j3y=+^QlVzI;u&cK$Tj;WEBfRl#cxRVw zgtsi)YPdIKwT~=Y=(23D0c_@*UAEVJWZ6#ki{AJm?*XC?)ZCSR^W!WABShY@e*&eGc%XV-bRA?Ppw$NqS z7O0B~t(#r81?tMO-3!nM&#wx$g)Ymse?895)ypp1{`F+pTGi)lXnk3>&}G@i0CZ`P zUA8gxW!biAz{M|INVdfXS+=i%_H3A4wyzt=vR&MeGu}v+Ep%D7wHo2uXp~*HwHnE? zy$!HsV_CM)W!X+{%-PGv*=0Mqu`FBPCY&v8lA~+^$g)j?rD@abvQ2BEm+h3MoV{); z%NDvU+ltM=;?1(lwqi3`wl@H_Y%a?dx-8on%{hDDJiBaXG?!&twFPHuTFA16F3a`~ zz|$?^4JjRvUAA{x$g*t|z}fZyS+>w++2S&+&bBXL%vrV$_u9#_RoZjbwmnsBVD>Zs z6Z4(~D_{jWpg~75-|%Z_w&UyDlYc`ndfN`1C3T<=4Z-NpY3?<3kHdR_V!TnYBWHfU zP(~xOJAd7Q@-;T^vl`F|Cs-#+ZEW^520_=fW%|5FS)~uOsY?@cA3m}(B{ebQ5qtcD z9!=Zu?-0C1Q!^g12k6j+sHxeOx~%m=he@!R8joSpXyy7ZzKZJ$bt>)VHNM!D($*&dlBLeM8;`aYoJ; zF;lA(fZbl(l>!0~?$#Y=BE+=^D6S_twnDgDcdFV7wjn(^^Y4X`7Nk&b`XFpWdQ!30 z=A-2TdW$A$+RGnInCj~GHMkk7E;Vao9_rAr5BiF}pkW9e8$H$r$r|>dj5bKNtDj6} z{ewIHVsv|&o~&>?B>Q`y3~(OAS+7ClINj``-=J%NK`dj&TgAiTF_=cRH~aATLHbv0 z>^PXSeS>v^!3|3ta1=TYra2vOfM39Z6&DsN5Ac?bIKXcPQ_wFcj1REc2UFor$n;?_ zHR@zeFa`y4c03qoR$<&V?$#NZf`ZAnGrS9_oRwGUac6iJQmH@}U}J&(tx{?iU}IIv z5?BorXKhThD-c)>6Fmq7wgOl_vp9*}DY+|>t}xN5t}q0eIU8c88QtI+AfTaMd z7$VMNAD&{S=pbO@LpX~Hp)TEljSrzI-GMy<)?ojCUh2nF{5wrU7xyN6KOp1@WO zp^iPVOE$lAHtKgy-u zm&52rAB1fg&RNkBM12t^bo`hMzl*Skdf21B2pc$pvnwNLLO+BJ96_=D%!#(%BQb`B zY#&J>{mq`%rJ>_jWpFQ5JNmo7xu5NkQMl=IG#FvDaBv~hZ)Q8|6oB%U)poRpaJSjt zznNRv_8EhgLo&xuy#dJ86S}4a>bdp|KrUr0XN@8A#>!lE1|rwjP~kO9_gXy=UhBtk z_83w*j2s6c&1&eHHcxk$H3$w($8$Cda&f#&V?P*a8UoO?KXtF)2b&kzKAa$c!-nI4 zaNkfcO7qDC$_O^6+dk7xHw|}nlfB72&fz7XTNCk9Ns~DHX)=)sr`gL1lw`tb)@!oJ zq-l+RaQ9CK-JV~cZap@eLyb*mauzw0Q++ShgIAwPb3*V1Jq0*!7Bw4!qyKa!#jY@K zFNp7{hWl*JwnD@f#ETRQ6PAU3Mrl8*iSIxnwc`mpJQaGGS3`OJG&7np^%?XY( z!#Nu>52xCE&MM94)Gk>qL~g?nJu{qqhatKvEO?*}KVXFsP6WLehUl*Islag9B7tpO z2)bH?idsZz!(oezpe$ia1$HNrvtd!3Esmo7BVbEiL=Q&5W?YPFBQzXxo@nDp*o=$m z)JWJGF5#@xA2@X(c1vmgDA*bcr3+ELY~pO$=l$k*XNnZ zFpb0InJK8naNUHb-F`s%6Lot71lFaEQ_Vx2EdG+ERSNGzA=LY*=*y;=?F=yKi<%C{ zf&Uc8S%1imIMFS5^5cK$VWXCXHswAzUBw4Z_9&WfXAGtdi^+95XaZ!b`1 zrg@xGIbel$qHlzZiAPvmIc)aUOoWx&K^Zg6i9as|d<;@30X;256#uU|?%fYyBa|3C z6aAKjD~sWW-$-J~>^M6pI-3IYYLprqOO636ZWe?Xjfqm$c> z|K?)$bP|}RePMR`b4-rt5ew3hIp#g)=KHFC+ejqiV8PJIt|{7y@9wU<9I=+eR=F~>v`DW!Fwra9`bDkTx=hX z2_$MCm6(rw0@Ji8Wxbwnlb$bCG2xf1=9?!w-GXPpejGu_F$kT1f@f1oEHK;hTl>g& z0g^f%;4BRCC*;EcQPZAI0@Jid$~!%&c#5f@c%~`Rsa^_aTOh`RI7K0JuMrxV8G%OD zOQEa??Ae#=+{)NaVFkHakP0*icT65HOL9$$gqgU-P7$5Qu(&z|nT!f=n z?J%8MghZ#0U=s&Cbw`W#)ZG`wN@}UEnnFfXRb@J+D)}QyjoX7e$PG$%_Qb zS72}AE(qpNaF_=3$V;5XK+asEkd-)c(=O7YmF9H*{t}H{1)tBb4ZO_RGRV`*RByG} z(_Ub>K*|>3FNqVOFil&HA#ar{6tD&{)vsV}APsGT984p}wa8oj3RPVT2BWK3i@1id z9ONE^;%N*+*cqxpA>P5CXa{0|hPsqFv& delta 58747 zcmeFa2Y3}#*Zw_ol28H(HKC^w0_2=P8l*rV^xiuJI5TuOR0UL&qQ^on0vlACirDBS zQl#i(#l~Yn>7rr*1v`SkcdvU-nuXWr|MLH?>$|=uaDHpfoW1V7X74>Sd(E73`SU#i zKfSjnU{Pb&?N2Xm@<7v#iz+Yr!Z++nQkQz!yO(zg*!g_q$8+K*ud3H}fnhe?5f|CL zXWH(JA66|$E;Ib-nFm`w-uaQ~mw#!x>8-gvo__dHvxfuB*@5?#-rsw%HDvLGp8x&- z-xm093;eeQ{@VioZGr!`z<*od|Mx8r<~RK=e}F&GALK9QFYYhlFX<2Vm-3hPhxkMN zW&CCR<^1LS75o+bVg7J`C4Xgq6@OKKHGg$~4S$3`(jVoI_Q&{Z`eXgI{Bi!;{yP4; z{&>IJ@9`)2>-p>Z6a7j4WPgf3)!)G1(4Xc{_hWe>;DBe+Pd@eZ=3e-D38e=mP;e;|#+4GI2E}`$%-Oj!;=S*eGha|W8hfJy7G@ag;CicW?%KxQCgseQ>U1Zp zt=2)WRao0NcVuU;tDO0s8Z#I#ZOAG7(ocisr5yF^1iX|ouJB7UC(27-sr&B5O9y5+ z)x3AF_wyt(UG3cAt?NpDQk~g>nA#|FCqk^WDK~bfcT-hY;5%w&yf;4g`n%pAgTsa! zhVj_iG8tuzfG6v84K!-4_<3lks&dlnR_#xE<6U2wD!Q(>s#R(#At~!hGCdjQGJ#v ztK2cQVz_D(o)oO=Dy70y=byYa)P&E`O=DtI;^W>1Sa;-eZ*szaq^T0W@J6*8%P_{1 zzb`q`~}^$Z7z5ln>I@nkxW#VrrKeu>>N8(y?4P|#+;rn zdi{d8g=bYXw$ofgt|r%#>x775y;u&X$D{SQd?K3TQZ{Pqx8A0uWdj2B2BfG?&)Jb2 zO38;QlQ)z~p@8`WR_SrWr$_ULQAc^TUltN`~aEPEJhp$iu|eSQou*8+?jl^^;4ZkaUXS&N5G9O^7^~jm$F778H;b zC~ziPox13)ZBA0fE_richFtQ-z&vot8w>NCHt%Wkvo=+~=W9*B_dabts=oT(y9{Rf z4_NuAdP1AmwfPoihKxS9yFBVE850=ff%R~gl%C03o5;0OoqacNZ7SE^=d6{379F!< zVz?~D^OmI$mQloT;W2qaC>WFus6{_|gAm#BAH8mD(MvyiyJzP0Y+gnGr20|N(*4}F zl0Kq%qGH^p1mVW135)lsjX!xa^r54Mn%T+a11G@B*!Co)|&1N-~dCiK7$rLBE3E7xzN@fco+OnpKK5oUE z%~ka8-WaEN7K=2xY4JtB>*LMD_GsZ|>d^1r>L$kj@7`>f$ZIrSZPs1$c6TA5M)%ro z6?NS^%j}c;_;v5zfJVJ!(~=QJPgzJTjt%G-6;S@NVN}3k$(kk1J`zMqipT6N3wb4; z{@s}t9CBF?nyyJT^G>qi?nR7x3Avbjm|QBv{=Gt5EG<*bf~;ERay0@*G^9r}k}^C= z$%&ry6dVpb=5G4#CHIi~$QOl(`;b_6?S8FxK$R<|)h0H?_{b?{m3E({%je{0Q zAw<3rOOY=r;`*wl+EdJml$a)l+p%W3<;AU<(ZR7OW`>fb$ueYFA!I75q>`4~EUzXM zw_=^rAuLhqW~DzZjz*ZIlFC{Y&2p-G32Te1T&$Y8(+)40H<%is{>q+|VQkjx-6g$SjI4yCb#QsvK%X)N5}W{&TaEQqR+Dj95TH5;kD!B(a;%8?r08t#}t zb0`(23ekL=k{m!=W|^`|W-0A4ip=Y=s%a^!scUL1rz0*rpOs`qsY~B^%O(Gh5>Vh@ zURx|zRZCkjF$-Ds!{lOeDY;CDfwMAJUFv67S9g`RLZfxzB`mP$uL|qtQtHFfR?WP= zSgt}ttSuOx2STiP&mOw%BlnUolKX{d@t4GM3>}EoN2-G=GgOZujO&_edZ<;#^BH}< zAU`M1kzWd-a$YP|zS1hLuVdBeP%Bni{ZGf3_*(iHQ?nMl%-UovvJP2S2-SpI`WWL@ zYs;YNbn!SAiM?s@GG(o3r#T|yQ8Ft@<_j`GN^u9=xM3KWaTq0WvVl2B zrmf}J?4foy%$V*hXKggIb8DBkHn=KhGq6;T*;E$t4k`&{)q(X^yeb=J-R2rlOAaZo zxu(?O8AI%%%ieG`Z-Z4o_vvt}xM|K)TPj&Kq-0WCtB2<~ZpudTd2$oES%_BHE|zV( zr51ZAVk_3jUl<;kiKM1^k`hxq>B*i{44?sOQDvxpK#h;c56PqC$3m!{5KGlhv}%oG zSR;R&2ZscvCwegRX^`kip=j4CR%h3hT58=Q9eQ+otEan497N1&WL2^{Swo0QqQ$b3 z2xV5o;Vm*w)tzQlmu+t|&FbN9&f+b}7Gx{3wGaaB#Zmw%n+UXxQx~RL)kL7=-Bu^p z$T(%%R*k>`2wqL>Z&g+ARsnfg>*=jLOrk2Ck3dRF~;i1iN~&T}^eJVR=+`Z!1vk znQoPG|4hkW$zRCJKHl@sHiUOwMwWuovm7G<_;^kcyfb=INjG)-!9WV zKW3)Y%QJ+M!^olJaB_qYm5dR~N=7=BjH<1yt-6JgI95<+x?0UW^XRmIoKG$!7YQM= zR4io{YZ-HiDi^H>5LCLF+tkcxD-w~fjmD-Qq4WFXzsV2C4~3BXL@eb#a-up~TZP=G z_1yPay**c0{&(^!d5yd-go3M1p27`B!KkAq_RtF7-)D7kMb%M@cj%U~{8le_Q}HmH zk=bN(vV{`3t5!rStdPHgy*o8At)P#+u~u*QNJ@+*N0DPlpAe!G#8PxD zMP1|SsJHI7s-dCaUr}A0k1o!xg(142j>>*i577Y+KzSo|Hj|skE#y`qly{1y@;0r! zy^dPfTW^2#gAn+L#XlyGlAn;rgb+9-mIBAMz==BQjR&0u+;3G=Yx`gazCjZW3HA0vm_*f~Up!ftbdw$-loG{K zDM2gMtE=3zt*ZKvVm)J5R$F#k>F#dy>OpoVdy>6`(CH_ZI=!_{pStS&Y(3x)F0!Ik z-8oj0`!4$2O->{4A*TzWa<5pb%+M+`>#FDHXcZh+V%4{z@&tX>lTVUQksE|ic}^@< zp4KYQ)KwGa7TLp_yWgVAJLKEsyX1R9h7xFUs zn-Bum#8Tjj7PwkhU74qQdg2IdOXK-gk|!b_rOYTYl8h!}giwhSOO=}O&fzLv9hhHa zEVuBqp-(%qE!m#zAcRU6u~g}(RdBWPK!V;)zu#~5FWTG1RpdgeLfA^TGasSh_J0!d#5eO}mUH_pX<0c4OgyZ2G#tNT z)xpd^#+qI@R(HYP)}ZJpknA@oZxrCLkd&+@4$VI>Y`;|j>jOhA)xNP+$)M z>_zq=`wDTi&JoL_bw4+c`BD9`M*f_OuSrRXp45hk$a`c4EJ+W}`n6p5xpiWBH`Qj6 z)5%%ny+Y_efFmd_Ub*~kwXTd69iz+7V3~VvUVicKxNs)pSuS7Qr-GVT^0Z*`60&Iv+&x(3$|vYJ}6%ze2Bnp&R*4w!<|f(KWZCyUL?CnBf)e}W1te-K_x6VponUyv@ zZ)K`_CA_6`L)%yZrmKQSZLNeeG|DqKO~#dCT(u!n$OdFXAsRAMEITUA!;Xqf#~S%7 zn7tOtO(DCuven%)fFc9Q9C8pjSP0o6Vkzs@vJn>6$lqTjr%>%y#p-0vQf7P1Wbssz zQ_osTK2EM9pCF$UqLQb@vXb?>64z56ot;8KvQy6+EPt4MlYEPOTL^_CVyW9V0dV0~L)6=u)nS%7x6Pf@=vn*MLEJv0XLO5J3g)1cJIZwp|ou5Kj@>5S5%V&`3 zWG2~22!*C%snFO_$V$)&DijJ5)PV^)LB-0XKPRZ3yQw*yyoa1Y&J>~+zgX5XOV<*0 zFV@K4UuUSO26vu%d)8BB1NjvBH2I7Wx*Nq(_gN?U=MtErO6SVGtG~=q4=3mx6=j&C zenZU*v`R8Qxw zP-N~pi{k@VG*S|7eKOGwQRmaD-mlTepFvubzP{KA0RtdPz$N zfnj1PU~2)_kor1*MF=<(>-^R80G%EpA0%g!bA*stAeJ(79hrIcnZR;{%N+noUOk)X zw3XaKZX>q~A(JbXGCLfZo%MD0$|FvG_UieVZpX+^$m8S*A%xC|rO-)7=u~~3zGAZq z(pM8V={#lt=^_KkAR%N*ilt03H8BTg1seT7Ov`WjCk59uZo$a+GkB#Wg=eXWw1 z$n>@F-rwBagFd~;o@8&bj}R&Y#8RcNR_T|h^H;>e{Pk`YpHALG&LC$BA>bEFfmvGM z-b9_hLLfhXb+4z-2J$KLY4RB%R5psG%ClPKxkRR~g$HvB_dE1?k9?OrLjGF_m5;EHj5Q6ud{t+xQR>i8Ty#IACXBSgTxrQF`X!{QQOWB2r@d)d9p%MjRgb0A zuqdfFFR@P6^Hd#W-G3A%+;#fuMEcY%i_~=}NpA8ql2Dnz775i!V0EbR|2R~gz&f#3 z#98Oow5r5eBy=Z-)uG4zv(S~~uuj-=V!w4^qlxS3ELQJ~P8M4v zVke9JQ^fgMtRB6g7@6S)}hUWNX9$O?%Cy)Kl;*>nriE|K6cel7@ zC6g_Dd~s6QB4InJ?0*)vq_R%fa;m>|VKbM-SSZM4iv;WBvN~9I!RXD;W%XDnQ+O;C zVq^)jq!9Inh~>E>Se3iesuf)dE9CEQ zl4;a4OWx-f8R@MUY^{3U7>Kesguge=>XvszcaD?Qb!O{H)|u^^@yKjjCE=k$;fO+CF{)A zpR6-m*dm#2soe2Xtw7WDNV3jsQC>1z_ij-%_mX?aedLQmG}nesAje8TB^o96rHsMQ~FN#;CA4C zIvgYqkcY^ZgphbuEG1snk-7er!mJjdL8Y3$>-u?$PHLsA|01akz&qMJW)K-j79)!b zQAsJWtfWLLn=h&)*2v#qC$*@CNv($}^~eOWKA9+lZmL-7CTU$WS)G`H)I$sWbxzwo zl{qc8Z}d!LCljf78##%*ot!L09e0Xl9aEe-rmAwY*vj4J;l3Ylx;{de$H+&?Rpe?R zL>?DQku_Q*VlCFl-(M!QqZFj8tI&IKH}PPqPHM49OlnV4_*3!>d6xW4h^oF6%c?%t zRk^-MWm1a`j=#_9<1Wzv1u@neVpZbw-gf`&qSomMM5BG=bsb+pF z0?)jD+_CCJ-!5clvMbq52(?~fsn(rpkv*`Y(1sVyXR(oz&$_2j;|_8vc_(?75USI~ zQgs?t&AZj%`!RLb{)MyI#~Lu3MY#PRz{c;T%!}kcazA-M2;rB-Quv_W_(KhNFBbmm z7NEB$#91xepVQ?W`33nU`IQhN7sOKJYc29k1Lm_@q&jcMdO{kakXeQdCCifKgb)c6 zOOf&o^&zK%n)eXy70TGo&t@CaC!I_qGssLKRGNsTN+U<5v5Lnn)Ic6-3X<8u^s-1V zX_G^Q&>10?Izt_uVd|UN+zSpYvSN5A*7Fcu=8&_=x#T<{L>7sq$b3g+fqHIE-T|u? zZ^U}G(q%ijjod-*6hdUTSc>d&L~_;mxkdN+=AL8pIYAyLPm-sEP&q4>DyOxI>r6wY zvgjl1dwo0sX((U@k%43}vbYcerNmO8M4IlNlIpj4P8j)jVmKTPMXSZ5+Ar}Dp_2=0e7U)7222DN2{742%9t|pGe zJ016{Ba3mZe?z)XY}=~nN9Bz&EAcUnO^d9u*a!@<21NsQGF&I%y8kTTKcu(`IQ8A~ zn1j{kB;51j$uq5J%ucH7#2o*RV=j{GK6;CT)^}?QpD=Z*TQqbh)%_30N1OHm=Z`u}(+DUi+9Cd!at4DRAd>5m-P`*3$7Dt`9JPlc-9KdnwwrH$Q%KIP2 zS}5oJ;ugosJ+M;YGpbH`%?;`ZZsNNB!$=FIxiSN|m17}GALj7Z4cxFT+Nw^H>%{6V z*yZxGTs;B`Ww{^XSe19j);YKxy2Sz4(n;>fbe-f{a$+*uu|Y9Y0S>ABjf@0mx>1>}5kA-PD1N|%b|Ib|`9%lPbD z^b)L*ze;$>J0<^czZlizr?{oe*iAac#W9{YaJ#IrQi~qpYZT)h-0kYj8tZY_n>d>^ zwOZ!BzSepyaDZQOI^?fzx6s za6${5%+R-MA;8xnp4a5Onti+3I(@oqotTxlZ+u_$y!3l)D_EM;~KHE zB5Pxf{5g9-(c86JyQ`~BBc0jeIWybg6dg&9AV-m-g{WqnSXMKpk!n^4A4+MY@76+q zcWW22_+oMqxrBUJ2mvLQ0!tey6K`=<(ek!pxXZm-bEjIg19y+{l(%X>pzlZIhvZT6 zV48nnGJ$G_@63No}uDnW3k zQf4`_ELoncAcRUKu~ey;r4LtOS^6$5Wb*IQdeZ5XNoJ6Z$i_m*WQ(OtmLt<7OW&rI zwsGF1(cELvX$WbPL&;%6$cz$8ncB6Ee1*(;VZFE}#0@fIq)(U?1#^R|N)o)dIBMV=&2lV^mG z`CKezK6PZyX6akCh=#Xni*&k^;MQyU=L9#isZMY+@fws1C%CezNP?TwwD5b4<(&Ta zlh#&n=Bqlvt=E+AHFmw*L}$3IRMbm&vvEB&@eSO;#ah1E7{SY%jl+us>Lj*KpmqOQ zpm~X{^ES>Mw=`DXyG5*W@3v^HPD1O%8vl=DE%NT;7@Ui4UBedKyp@6K>@iM8Tcn+x zjP^eq5QW}>Ea&-K7k9zkTg09J9^|6U?WD7R4mm%a)nm9&I*Tz}=uODiZ)wQ9eJiaj zxonZPb#mGNFwjEpL-ygkc#GSX_iqtx-kY6tGFvom=l-n|cddf)e3J%N6W+9N&@nurXROE7U1-ViPnN`|i z>5-=TrsB1un1(_FU!hW6Wq)jidG^!eAbEg1M7|_M^S&yU&HJ)$Ue~{xstq6GqAz6F zj=sy@5Z7l-^&Mtd++n_=N*u#`r+a;D^;Ju=y;btc2A4;-$VZFQvN@=t6SHLtQpsep z0ohQ9+A~$uam(#W&*qqNil?wh(oKt(Eo((dtumxS(@-=kDcC^W0fA}i$XI-MC{0D3 zz-J>Zm3;yiV)|2T5Sc>`CcQ$$F_dxO8(=n{uxdJ`2eQO~o0X0{Y1Pb&0#)@rX~k5v z;EOA*Kw!y@ZeRZxym|?c;~_)Ki&)-Z*Lyk%A2GkA}~y4+)DtTC?4&t&M}^WbMWgq-od=;MO%zD{Dn#V2#EEaY7s zI&;cgUc(-!PJCuHaqY|2?_fBZt;ZKE$Jb9^Sec$n;%5Fpeoy{L{vLVofc(|@k1s=hvlmO$n5O%bl_X8I7A!56d0Mr0GR zsSx$GXr>Q=&6?>$pf2B-WioGGp5s;Olk0ogs@+$33k#~<7mQC!ZyIWsRgZs#mhG)# zzqannI4awPL(NCrKBr;t{@gUUd*S;%dP`;aU~(_9dF>kirKx7cd+Vx_-&onMiOqDw z&TFO{7FOOGl8X;Lj4?e=GTNue_2dTfX(2l7d2O-uOf$Bu`K-En!HO{_D)UGAglUqu zxQfrT%Xr?R-#g^njw8hdR&3RJ5x75rG{==44Z33ki>34wK zPaY%>3E}^Wwpe<}3F_tMYFd*&NFDzkjr0W_za-C*Uy)x6A@HrXSo+41I^SG1#+Ufy zZQngVSQXqMEl}DlLxz%N$#O#YhG~nX^2+=PSCuNLPk+GP&hAfgH(=p3vLTsHW(eVw zr7e~+>F#ROLiw`oDD7Wcz4fCN>>fy$!Q>#)OIkv>4$~G(wiX%ELX~ZnClaT||Ag;0 zxSuW$k`Is%k+X$xov$sH=I9NXs}BE!HxP3};?&hph5EfYw*&sQRn9MHjB9kcL0%_~ zmT)&sAzXvB#ga=c{za~UwNz_c6g0+-U(gt}=u(@EBkPcLg>X&K7EAFIG4W}JU-KHH zhDt1Fhr2t`qYK%Y>`HbM!n2pQSn94ddMNX9-ac4EdGEmo;yYZn%D5-fZ7Mm1yo0<` z2={xm#nN3`XqtNNvK5y%Oeu7_m0iZYif(Jj)#O@ooe=KpwZ+oox@n$hsj^$!wTdXs zZ4ISY==U1=D)~D3h7kU5Ym22fwbJ31>cStDx?I7=eM`TKN zTdFNrupc?cPj1~+Q3`7X53>>(PF5zX2;pBtTP#&opI(JRH8tSsADU@lTWnkw-I|h3 z$ZWEi5bmwC#Zq$$xmvVRm)icJnHsf&(lGjsAcvD9$x%Z1kJT1SqqWkQR_d{K1xkr& z_(E%S2~sD|M~C zo#2A?bg=8WU!dzAayPk`+$Th>2gULn@S@&;{jJp2{@(oF!FME9RMl=EJ9)oV?&=%X zl7P&4az?~NVJ^>%&P3tYZwh8$?~A5Qe102W2mhb7qeqTdg6ChoJz>F zOMBYUrvurZ>_~PJ!nd2YSn8}*TwPjowvaFL-M9E;&_p`jMouDcCnpQxe5bZpn&JdA zRef3Bn&-kQ?`N1(Qv8Dp379HP(5_zrSAxs%)_gxel%v6QO?UTDLq zfFls6=K{y*bAmiho+M8R;d@qFES=UWXWDQs;HcE%WWeKUi_&Hw89)Y+#f0z;))q^} z+v+{1gt9{I=zJBK4tV0}<00K-0$EQ8-(+pER9~yO65FZ?KO;*%1OYb_t zyw_GWbKBel4^^;htIn5kJo$l6KaoF@Ka;-*;e16~EdA=pTyCqLzl;eF8kaJQ%46rL z+789d>SQ&t1{ooQbBwlFic}NJVGoQ_&C1&qmRGPVI6`&Q!q%AkHK$ukvIW_SY%PR) zdu_4QhC;5k?KmZHR8ridS=>jCA;*&Agm9arEtbY>feGz66Ug75>sPQFFQLy;@?mlr zxm*a}N3_L~(%Z8_eP7Xz%NNNGL!<1W%RX{1`69Vr2-lai#nJ&Sa!^Dns4Zdntx{Vx zX$PgV^!uFrjQoN;Cxrhu+G6QTy-{Da;|xIJVV+;Ez0UK4+rz;OB}$5*>{@FkGqX-+HqFgP`=2~(MxsH5X2=S-1 z#nKb)bwd4Qd-eMTOykEWv!-46iovUNe4Tuae1m*b2!VIB#nNF%>aF(ria}v1UNQKN zj+e-b)jQ}b z28E?~#h?itv&p7pGqSl50hQi~4wQX|apI&fB?n<~jOf~7~1BgxU^7$Jtqc(EKN zJ|~p19rVS5!lCeD!9qGNCKr)Q$cKdpKxvDmr5*S_3xvXp1%;J(u^^XzyU7>GJ>*^? z{10f0rF}Xm^F?(e7GJ|!Sc%sPPSfvG@(g*F{7eY{FSW(e=g#JR(LrA;aHQl~fv0#! zlr~F}CCFg1ln}mUw8c{Cj{2+`qN3t(L4_i*DkK}1W$M!supoI z=%_ClI4Xlfpwfpv{m8y#e{z5jzJs;JQjViCu%o_a;HZrK$qMnzpwBFFCV4M;pAfze zYKtYmqjG;o_0~_g)a|Hrt%F!L(B~QQY4Ta}IU#&EYm24l9hHq8IZen@S=AgW@6zW8 z`5yUi@_iwEk7|ph4;+;bJL;8Z{6=0TuaH-T@V%iemVS3su65Lx4;+J;`T~Nd4Sm{?ZOQgz2O)gBXp5ze zS_NN`mhI;7E$6Z8sxFr?XBkhIiR1)w5_y{tu2Z$e((O(tlRI&mfX0PNszGZGZfmr~(qoRmDuf}qJ_YKi1+9@U9H7r3@*w#V`LYncuW5^=e>p0zbkbK09F@#A zQ2CNRUz1;v-;n2p@V%%lmM%Cd-*(bh3&yBJ_0S|YuAoWEbVg~j99fnuPgW4Zx01G4 zs@PfgPFQD^BUcQllIlrg@eDGZ%p@BL;nq}JEH!onvO4Q41kT3D)W9>CJ{IXEZE}bZ zz9Y27(ojcbSZ958fI|&~1Xl-K3p(q&Ru9s5E;*Z=N6r`G0K8buO0?asg`M^F0bP6! zi#&AG;+!4eY|GgJYUAtxma~IxblpL2CwG#&gs63oSRVFsoo#rbv%Wy!Yy&S4^iQ^D zx!&%aKTn8NXKq-H)eBYZ_}m#O_9a)w19DQtjNyKs9G&?uFMSkgz1BgYHjdz-dcn&1R8 zu?r^(j!d%WVU}M;E+vGLAFkK9il5W@FmZLxIF ziQ`ZgeZ>HqQ*g!Lb2^n4G}zGmRQoi0db>4k29c))q^5YLUCtnil!(T1)Xh!eewkZXl-eNtO2t<#(GcsI@iq(Snp z7`XpMpI6CO$k)i%h46h#TP(eyRo?8TFBm{2|AK-00)4(Cza=k{mxS>BNn0#^uT_5N zrmq*|sqlJ1#qKC=hLd4rC9<**zSXtGQWZ6^4Q2sVRnykUueFGCt)MYonvhv!Q!-l! z*OuC13D>1Xq`5j@Ad=!9%F@HhVdMyMq!3;{ZLu_p{;tv8^`(NmP2r`2dGuL8&LpcHN%UBj<{1onV~S%NG^mL!9PILe0h(3c5H z_t2LKbot^e6Lji70`Js5WfyS}GBJ(I{pGMP*fqSiFAJhrFy(C5tt zJ@i!q=;10sq6+AUDM0%koC4(HQo&sT83A%az&YQ=6N7U`Kb=-^&TlWOa?Wo@d8fqO z_HxdD%r&fsobL7SaXsG+w~qZ%%6x#lpL~#fNQfZkiDi(pb&$BxS-Lw8Qc%kOi4V_4 z`fMgQkz2^ELa6K%OO*ktYa#M` zKQM^3WlybD2G7hncsYx!gT=X!wAtd1`~zrJi<`a)a~BOH-Ra^;Fe++EM=>iQXKnf_vGv z>v9i0`-8>o?~1yox1HfGCk<^@Aj^{#$uJ>0wTf7FYPkBeH-bPip;%S`2lY1)O<`v%88HBRq4N=|t z+SO<1e$VSEq&@m8t!1^_EuV|w5X!>Wt;TbV+~VO?1_9sd@r54xbbwtMTR5|yU8TZL zQbiKBMDG+B>+{s}{p^_N``K8t$p^_fx1(zg?w@G-MWc$@fils51ar0jdn)dg_}9=sd~DHUG9ImJ3Gyt zFi%7i<$%E7qtkDub9V4Q_P|aRmxB?$iOso<+(K?AcL>n~FUSawR!ws3QZc%$9BObO z=da2--LOl2mQ!e$?^F>3^M`rf;jPFpPe}Ox_AuY6It{X`RQ&TWKh;y+HOP*RKFZcQ zPJTk3AWsU>%Ad+Ok5VTFp_O%6Ilg<$kN>KyZe`c$o~prM+~9Uby9;%V8*EqZu7|s{ z^Z&k4@rDfpUt#!+Wyh-D2ixJUmOb^aLwZ!SZP%z@^kkFQxBpj9UCvmS&8=?Pm0dV> z9o*=x-e+Tt#lgg5zWI3|D5a*ikUV4UB zv6r5q>GEY*CgkSjIYY}kkX2BFhuGC!={@xiCc*LtlVIfslkfwpO^4du@ouywL+y=b z-Q4V9_G_*Im*v!tpZ)q(Y~GtRgL)Orxul^yNq7V8j~s>0oa@-&f)aJP9eAT>9a+fJ zXpQq$S36$K8);8;wd}>InRWnN|8C-5N_Hqaws{R93e!rj1kLI@JO|IG*W_5 zs_JOFnrQKd_4<#--L`pjSwPMw7m|yF5LqggB8w?fV+mHsUj;nmVlc!#9sUwlBPbQJcLe$Yv zEbB<=&6##&D%QwfI3BWz=|yWgru~1h!=MIJ>jw1xoHAcawX`eL_@nP%JBX zQCEU*a;Y<(LAD+bxl_H>Lj82(c*J~-&Ns;Gq=9#^<3fWFazSD#=jx-c3k9eS6YS~; zXXFICtyxoToq#(nE!B|;2(CGOTaqovR%B}-)Y^-sS{p|VZ(Nwj;1*1@J9@^j^jOkI zjw8nl;eVT0`cH8DCo1rwDS5G$=?ho099fnuPgW2@x{_E*;|CFMw`)a&VMU=WPc5R>QYB8dJG;{pZluOGms;O^i$>b z+4!!7>G8Gl)c(qS$P`mO^#P@y3ZpMr)y0WC$0IW`Ch* z_Dr)=@}k-Q_t7}L^w@Yd5r$h0b?k1m&Z$E2$g!zVt#ZI};*lX<=oK0Fh2z;*D4v1$ z*hx-2W`JrZgXJ#?nU7MW4I?+Wu_- zwbXmB+kvWMAG@?Gp`V`q#P!4eWyX_rNH^&bV*g9*r>8&l`swM9E?<{rYTvv(KeC6t zL-M%D1eDGH70Hz3qQ4@!y_cR8!E#ar%U_X%<*!I4sLXpYD{7JZ)xCDVz{)M8UioR- z=CY7CrTK0qr!=|uJ!nri-P0M{OmYS}i@aBe?Rr2gk1O}7!E-Qw@vH8$?X&J@Sn4_Q zS@L;uqY!>u#nNw+_S>xPpJTu8I@V7$JAtp^96Q$zjd`CgN68P#kI7Gj5IKp)Uunm? zj`verPT*5pCkvcDV!;n??vydlJ}5O_oreqDuo3g^N+mbL2fu|4&2qi$_DVh$W(KOo z^X-~3*C=Q9NA2bfF1xrKAVfUH`|E2PLCRcU$2!Fg7PvRXFma(Bln@Bt{11es>dr2K9j0WdK(kH`7VyVwYq*S%C^1%4GoQfFJipK`69TSs?g84x<&_R|) zV5ZZON&O48WDcWDOv*_0B&DTz@Y6Y|n3VQnUH!;DWPfsi5TW7{iiA2)hx*|sQmgM#@{H~e$d0}Dm%dZ@o1l@}hiL!)Q0iu=j?$Op&=g$Q;o zgLTdBuLot$(tIC3%ia68KIUwdyVO2pKBVqkX2-xhw#=@aHz1)`Fd%mn>g<)v(b*d* zx|Q5aZX>q~5mc^jLHtOlboR34=xpt>g~c}A%;o##_DilE{Z+q{R&>k`l+158=QEXs zdwXZ$Fwf{P2d_YNpRkIP-*)?d;fvm|Q2a`5AM2K)l=x~QI+_3sMDkK+dt9JI%VbI??o5R$JHP~r} zs?}@lnl*=_U_r3X39@josH-5@MNaQ`SchO|vyS=XTyg=qP>5h3*1;}zdcTm*JeHgD zw?4Sj7XG+>&|IXBK90}qEmBt>x2qJF<6~A#jGCC`ZOikFYaiRL5`J(z|IoOTqPxjl zau2yzh@cMWpk8DP%5R+i!Se-{-u1VhcyC~*C((TSRGIZ?zI`ZI(0tA*r*QM3qJrl8 z%IWJD*Q5D9WgTCTpONRtFNKKoypHs1-Pfw#Q~5rhv)tL6`pkI>dk^aCxB=JsU?*(A zHTB!o>+Cge`b~4 zTqQ2E6I6{Cy&=mN+d=sF8(e+l2s<#!FDK@CiTkV6Mi!A;Mu}tjE%gg0SM4q?`-YC0&CZ1#^=|je)@4V$||3f$R#x6V3GnsWvC8v;g zkar4k#qS<%v2+*OqdxNUj9k1s2(5~{x;61D-zk`|HEiH%fH~VLdafZ?lWWO!LMW`) z7E6y0)K{jSP-k*6(bj#$tq$sdi7U4N(w+c(d4V3}vMM3LxofNouoTM6@(m%vds|y9y{Q9r9UiF0?$+Cl(UhYu?zT&` zXPEq*$3Fz>cK@#eReS7;o^Kh^Me;lH68XIlk^QVKmVR(z{BfYVw#SYt(wZ&Mno18K zd`VX|v?h<-GJvvTZl5%H7{?HfCgt#w-2P*uX2lG*e76mYK}u}k^7ElL>{RvZUffQY zJD7*d{3ac}&n{(#sVVz#3ahLh*@tYek~+B0jt$&^9a62ssZDiy*&ecdgO#nK4tq;v zq~Ua)B$Ir(6y9(Uw#7^*)5r`mQ;64_Xp5yrgYCG|CWP-P zZLxG*tGG@KQh_fcaoC{xy^2G8{S9_W>5%K5>vS|^XqY#+Y;xJ92a8!uTSx_<&v8UX z#{1a6(7#lQQ=?w-hNxA=yuHQPaGBMkhRIWWV{ec^|Zy3+tKu>lvhPF z7tuwTp3W@ZmFz-xBfAUX)>~UF^>74wsyAPwz@^vh$);=aVBYR(^8We#`mn)+W8y#F z8*wwp8Sw37tS3J1ZQzXcSbc?O%$s)9jExNH1tH!%g7^L9XWU%J16L;2^6)H$^$m10 z4DGDns30rrn^HP2G_Bd#=|I^V_4^uFsD41%P{ZI#O$A=De z+=3j4?+{SO)9|q)1mJO00 z+P$4y=FCNWuNB;+1dN=(M>s6^gzlbdeUyrLIL)*z$E zXd(1!dG+k0rk7tO^q1Zd^r-&#-niFeeQ1ZP`#-Sb%^0=i13RWh42tKc!cH=jcL6C~ zUHrg~_H?6S53)Pilk6o#Z2iP?TYG!;v7wLDbJ8`Bn_3~MK?V-*4Y9eH8sICp?x*)` z@#T|zzhp&h2b7<-(`T9q#hSoeAgEU25&e zxSqG!i!Cs>lUvChBY`5MrTx%)!iCxPnzKun;+_ZS!mXxiSZs1S$-J#>Bj^hz! zmsj1j%#I$h3kvz0lveaoU|ziVS`edT^%4z{N2H~Bl5qM>O2!@QV{pZLoyp_mN%E8s zai0~-9zN~#@EJC4E*iJ1X@=x}dfYx~Rt~YGILeong}lqfUw*>N#SfgaA2>B+*Quei ze|fOqv0-=&$72K@Bk>r8$LQRC$Hx3Cc1DvrhSBMi%Xkupyn48^8jgeKE4K$2j}95|WAS{?IKx=gGLYr(#q-uP4daX1`nfVvjn$hlcYHU{ z*jLgp4&(Ol+;?#QwqKC30`+}rl$&AHIc^wlKM`c?Lxn#W0mj19sPO$D;}Y8aXCua_ zf6Xvzd>mvfLi<-T%NRS#n#POuP#DkS%v7Um6Vq6hQ_Sd#9jQN_ZyRSCS-@%&&Vmoad3Nj`6l=cAHbM%YLC`7k^$-@#?P-7J`|`(5RXw}-fl z`!@y~rQyHK6=O`Eo3e3tT&+V!k ztkwjg(3e=%Q}qu*p)b_~K`68Ux$p0)c`>Y6pvD!$nr=8-ja2c)v8J2qUEG&j?0KxI z7NRPY@Wq?Yt0pCUdxLT?!Cj)Rm+;jt(HDz1ZbX`k@p*-NO8SNdzsVJdH&mT3iLH56 zg$6_AX`FY%%c#S_PlA?kZv4Q+e)#jQ>C!x8rF2Iu%rxa%hgXuqs^zmq($uRKxNpG@+tloKQc=nh7eR0@hRvGmM$)SOvIM z3{%A``gRq20jpxe)yowT(hKUliYS$X3kz?mXT#u^qdp45nqrl3dr~b4hhMQu>OeUB zwqaFNWi_o5{I;p5Dv4iZ@v|$_Z$V}8t0I2wtB79}HMNTPVO3;Rl~R>{gQ}ubzp94u znyOk2e*IMIYQEf%8r2MAE*>&cURJ@?eKlP*s;T#@dNMUYWi|ZzJ)a_qh%}W#bWJSs&_1AB6VU^WG!EWt6Gd|S__-D zC&n=9)HICVc+60)IK;C@#l>L*I>Z{rZalukqiij8J`NkuL50@FR-dS4813UwAs*}0 zziY$kg!-j6A|9(w)$zSna(ZnY@mlqc>8n&?BA;dzlZZ>j`zD2Ma_iUMfvxUQbK`w6 zu1)S`H+=hxP4^ha!ybH92v$w<=sk6#8szasnrqc`54!GHf?<5GG853j#}d@|Y;*Iy@>#3&AeY=X^T^|RN`iAmd z9a|$L%(!aYfrIrtql|gCibzBywGt7AI+o~j2g~A(8}AyY4Yhc&ud1q>TAto=egn+#7`ls&t?sjP?L`CGDYX>s|*&IQSaI#GFS z4fRZa#Dt&!J&=OE=?%P+rtV6Gr!3yMG2WbkIlwY_zL5&gNhyYLCdE*9SBK}FIjC}y zTF?MhR!=pIIjVg_ILhLU8wbpHO=T)Lu59RATI^M`)eL71Ij?63$j^HNPk(+REnAg?nCK%8eP1Rrz z2DGQCn&Cls!_VescT+t&24~|WoGqgx9yjrtG)KF* zni<9fb)`85m#dko-y4e0VO14;7N$3M%+Qu7)w8)_yrkZ2iBdhAs~de#>Kay!X`v2J zN2zP-R4df`6lOdXTdGG}`{G?swNUT&LoxYgvKL#bx&2YBi`vu%VwbUMxEkFSVwYR0 zH3Lv;T`R*V(^?J4L8*0WdOMVouR_|bGTWn6ht_KRK$Q9!tA?~u?m;N^v+CRdRjz4+ z*+N@Ysw1jg(?&HNjAHHD;>6lkT^)>K?Nmf3h{;!%*y>m(i2c}Bm9cOjSkulh=CwDB zU3h$<-t3HCTcf_~j2152L2Yh~77pluZz1yS3VpS+?w@n8saw2ZD?w}XC>JIv$E6zvV*g>uzy6XM6RX4-f){Q+BYT*|wUN>qRb@09Gt-7(J zg3jahKB{Uj#CyIQci>|338LTSBV^dB1*%?eY?XZAWxe{QH%g`TP-R+T+s|NC=bq|t zOO!gJuJ=I`$$Qv;#VT}^Yc}4e*$Tyydl|;sUb?4}d$Fg2j$<7@A=)2m$9t*GZBWeL z8*{SWYD`{9-uCE_Py$QEJyd%!W`XK-MzZ6Ccz%`>b~mkWnaZ$o}6as zz6!T=Uv;x}U$wM#Uro0$N3+>i0a#X1n zk9D3Ax})|F*Spk+5r*;M2<}p@5hHX@l^u!W&q(%^tL#Xi)|0>HexSPWM-}ak{@wP1OB$9k$~n-Cw6BvcEP> zGK`le>Hd0rlJ2jQx9R?R?>60E!M7Vm^zC}z3cg+MTLZD~&D#t0*TCC#e+5i7jPa9o ze+5j|{q+>qRh**x>#51Qzq(ApA!~~6uP#$`e_h79;Zt>gU7n)*Yu!{FwC>RTwQj2J zul9Es#tV1o{%U`R?yn!Q&bm|g*N=DT{(9_A!w9}h_t#^0>i%kVmtkzbOZQi+yL5kD z#JYjgbbnpEOZV5xX-IzV*8R0|n(nU_cN@mmyLErHxLfzvw^%pe9^GHx-mUvf-D4QV zrtAJv_vrp=F&!tk8OWaSm_0-HSBvSozjn;f{k35R`>X2c`*eTJf&JK7j`w526r|Q< z`NCbJ?~}eO9dW;5q~IZ^HMP~{tL`d)KYK7R;Q`DcW<~p|2Shz!s56(x?kw3Kt6sz7 z2Q_>iCT{)Jf_a!UwtdhrCgCw!b)WC68PM`UL)GgvuG-=WndBT7yEKcPnmBRXYnY#0O6LqF}89@hG82K_}AN*VN6liQK;k~ zym%OoU)BC4sBDlrw*+h3EyPI$kF)Bjhq1Pudgo!ROH^j3P#$b<%V&3xuN#e#Kf!a6P$R3K8oXdj53Uc>di-Sz>ZO> z{+lQsW~BWaYqM7v>cRyS|LsW>|F=5z7>eJ&!Z3bRkE}w{ald+Xl`pq=`buonN+^Ga zqHjEfqUmbWY7{+>7y7BuYf$vOTD}HT>(y%dTHlw!k3S;AXl1~vfW;PmK6ssPX7ICE zbsCR^N0s|=%+jAyogc@DF&{IGhIsf@`6qleOI&+Y91p^+tD64=M$EufNI~&9qpsj} zq(Ko+!fVHB!#IyehC2HsytZKR#*JU-HE=z=Le?5aOFWjSH`gOYD!Eo&T<_aca@acL zGkAQXwmk(m3yU{ycmk!egbi?e>2bsO4UabJkqxM9zuLb68x#Jd6te?|qac19{b}Dk zSM4X&_-8QNsQRQ@_>AvdaQu2Ha%bQ@C=#RAJ?q=&s<&PZeh%~HWW2OSRec_VdeAwm_r5!IYk^){k0`)t5P9QDmcG-e+az6o0y`ZUhbc#KoWHeoA*pH??E z`E~`*dIo1(JgPja4s6EgpQX-iM$?Z`?`%P|J_8HlE$Vko={9x+vdC1 zyiKj%h7wa*VsOw9me{)8x6hoW#_jOsR-J)Ye9sxiay&vdijMwUR8pO`eBn5^_ulFI z(&gT$n(p$w8r;|^vI7?r!c*llm9&=)W#IKE3uUWIL! ztIr$9cj4HxEzC5{G^y)}T=Wheb6+rw)@uK5Ot{ymQ@ee8|DU$b1g@s_`~S~=ng>UQ zOr;b_<(A=^=WCX$NVr@wkLMio7&2Vb4av03f7W`Qz0cljzxT7JQ?bKG&=|HUL5Lo-Edh~3l#+n*Og@T3^)W#mrx+_1 zdyNZJjYT!wEU;CQY41_QS04jF5<0Fr&mjSvQ#~L3=(~m=O zPQ=li8YW_6IVaMPM2u|`AyrSJ%1Id8BvPj&WKB-O2`AZ~K)cCQ_k;?H6GBuzDMS#x zJ)wf)1i7CC5w<{Dc1nnobpIsw-z{W)3MZz{$#|^!GgqVuP)X`PcP{}d`?8YFc! zoT3BC;OFGif|?gIw2U5Al72dk0u4RG@pxKu8kN(T5>KN}I;OB1O|#CRtlMdmWu;oy zpU)9@7afvmN-kzR_hNsl@Rq3pjJD_4JK2=vzSc+ z^*M{>wm%QP!PEsjN1o@@k~~kv*Xj?J0Diis32_>xMoV8Hhx6FSyOaNUG~9Fn<#drl zz3J6?G~9H7GS}%3(77~yY2^dmPs8TSqc3Ut`0_U|bLLxowz|UpN_-a3h9>&576`9c zVu-c=8 zyrw>vu}Pw7?q%e)y&=RQ`sE7p+LG}KlowEXk?&O~FR0s9V0Xn$Y_<$4bqzCIK~1kA zsd0u7JL%&!BsHe0*P&!V=}Zr=L&+lD4JeCl2~kAnZ$Mc@Z*Sm4vK1xX#MiAy_itiv zoc6E!6;CQ>aB0nxUS?o#oJo6c>9cL;XpvhAJ*Z$P7d^_AuH4q|#`BHS|Hb8&HCoVQ zI&97R-Xd+f0G%|YU3c`xijy&LcFyG0r*4zB-}wJ&t5P~=Qqlu#gkeo_<~%x+QZw~c z<)BQ;&(uG$i`4S{MJ&)GjreIDt{%HQ&+ zdp^!=Vi2ytgj{Rkh{@e zExPhnzgsqbPZ94BYOaM&$kSSA^LvC^y{DiLSVQd)ihWNGAF+noy{CE~p*@Ax?E@96 z+SB*sUIgvW54i2{f$kLHYLDuhOg{LL2%0&{hznt#^rvOjkCgvOJx+gAgMBReYvYm< zU-VOT{*YXXglGmE^NH4e!PoQuNJ(FCfLs5GzurO{Z6~u_f@w2I-OguzpukSn4LI1RT@#4Ef=rWkxJ;M3)c`dAx(OGT{1113`+>MQCdV$Fw$ z(&C(m6#kYJCei8^5?Wc2i-o~g-m;{&7KS)oxRoOG){0mI3$!5zOUxwPiUKSV8)~D7 z-)t2z57xkr3f0(98!BsMNYM4P<7Hch&w=)oX=QMe-R#I@Wq4vAZLh}4DX!QVYLSPH zVXAHgq`nS{SO{z4NV{y%)e3t`x4~ldbX3F{M~bw?V)b;Scw1;i(1sPGJLL>+x*KA# zsEq&b#6D5vNE_`ii@%Ghv)HI?)n;+h-mqKlEJh<83~}Z6AhbrOh|{ol#d#^!wfL0o z_XFY)rh-%Y{bX0nP+EFAk$W*Ly0a5CD`tqRP*{o^xRl2HVQNG5pZRRY0&zO=0IgN5 zIi?}wKXaCLQe%-+TA@u%^=B;KJ1ge1np|gvW>nY5T6>kjpC&Cs2c59d;M1t)5ThY} zDMLq_LxfMk{t!dTDk7;Y%`S;G5>l38N@9(aDyInFax|h8v{L1WN*Us8WbNJ%0Qb4 z?NJ4CC<|?31*%sToi}t*#C8{j*0n+BL1HU*XE!lJoDdCN$h{mIeMW+_tGbPRPDRS70IdjGNjF;N z08i;TP%Bp7t31-aHpt>XjF&%>231nTwMq(A@1w1#S_-eI-;_a>D9jy={5%xgDj=6iXyoTXZ7ZSCOK7&9 zSi24MIOqA<;3!{uP=E)r@yA`nB~QxrKsJu6Wj&GYRap^BD&_p|$c>#C~sTSq)k%ZyH$* znpHJLjHyO`KG3YHQFk9`XQ9>gp;Erk&Q_ylzR(u?D5A)Rid1c}4|)4R>*A}36TXz? z2d#@Q6|WAhoS!1*_>o@%v~qs*PSx&0>rkBz{sir=A7%bzNU-0AKg;_ZR^}(#>TmG0 z-2&fas({gaFjWjN474BOuZS4fEq{s(02~JRQ%nFF`qWUwSlGH6G`0pBdcilDg0+Uv zYoOutnt)R+Mf9&ly=tOiPECraiG~MjW5sm^jfTzZDIyYfs2-L284Vl5H<^xU4Hx~4hSm)f(FGQc>-b2JvH`i*0h7)* zR1;rWy+vv*YEjoP)%p^oCXFb$E>^{*hLm3yh#AvJ5n+uLF&lOOrtT{0ztXnad5|2_ zh%)LKp2*9MDXG38#r}agr@k!@#;$AAy|r6OxeW|kTt{{zTnwPVO_ zZ?6da47CQi?d=(I!#XHpMhAx6unr8l+tAtsGURS|V92ctRD@l}A3$zhAVV&!qar4D zWXOeeWXN5C*6dgF8u=f{UFpb>BV<^0V#v|247uK&6fv$7L#}rxhTKJH4ROang&cm2 zQiEJ{5Q;bG2at;nV#tLCE5Z=WkP8iF$fZK7)A^I@W2f%SkXzK5As5m` z5yQKD3%QUk47p@PYJ@Q4lDjbE=7lKYb;u7OH!p-C7uZ!11G+Ng0=qKgjzjYcWyl@x z%8;8K3SNaW8Im zuJ>Tb4e7y<^ZiW`tA1n1`Qm1S3b_Jkc#TYhT)}S)xkEh_;n|BJhgYgJ$W7^`i0obr zxhcIEa!r3%#O~i2a!r3{$l3N*L=bFJZ-$&D{O=%lu8$&0gkf`s(XKuq$C*A1xyZhX zxB>gpmzISAIrHFu2f3jBidYLf-JinyqG2HJPNddeMy^co|m_+YH!#n3)OTY=(UtfzN_0k&EO23t#m+Lg)l6>N32 z>2JX1U}Uhl8aeSR*ote@-+*nek-_%YI8MBP&kEz&SLXn*Wgf;^&bV*6HWdlc<|O9Y zsPSg59h>l#YcUhdT+4xEn!sFx&s+a?UR^mWpQy|9lT{gdohW* zmNALB)_Src4o?07*IG|zuGvjd#Dpo#HM=RywKQlCr!d#jrZCqUg)3r5ICHI0ICJd_ zv=LK(z_l;o%(atK6>)nibM53*=34D(ir5TOSK0p#-fB-{u6;npkm<~|57U@yNz)Z^ zb2@V^X*zQ)AOc722b1i;`BGP9t*Wza|*L-HGTjK{@^O?z9 z%SS@*SszkH&SI{4&Bj1&HgnBuHghcpTDL!bz_py&%(Xp#V6gB9 zb8XKb%r*Bpcy4SCbIpAYbL}y-kh#pY$8(r#yXGpQ?7SavZP#4pTKjnb-#q48`+3YY z+xdzZKcBf~JD<6B4qDv>%(Zj#nQIFdDB|M+=Gwvq%(X6m;`HH9=319OnQLVt74b(T zbFEAybL}p)_6wP7cO#i=n-(fUw}`p6X(4lM_#zA>VgD{-t__C&9oPJ#Fi3-~i{inX zcNBB&`4UCci^e98=D}MIroZFb{-wYJtm-lzyzN=aT${KYI~FW=IS<~(!vBtIO;!SW zumdZ3@YY}@bIo!U5Dc5NiU)53{&!qEzZ%e6gX8xa9=xTjX09z>t0sQOwWW|E*5OPA zc6A+dZRuL(S^>1M^~|+`bzQkRuUEVJ|6E(8O@G5R!v^Ns^bMT&m20E5>2J8^ zw2`@H{WmB2<8!LnSLg6`z=rrY1Gf9fC^Tm=*sdb3os~Ll{|dG*+st6A52@331{-_^ z+g}h%>|n6LXRr<4f%UM1!8UjYgRSaL3~+Zc*sAViuq}rs|M>yfmhWV+_4o%n(?1Nh z9{(`dD(q53&0P$(3cDC=e?oh=i^2BiE(Y7LyA_eJ`v+kAbvJ{}X^$eR?P0Jv?P0LZ zf>r=i*V+GqZPp$JTf4oAh}+9xYqyudri)R8R}6zq7sFti4lOr^!8SdH!S>5OoWAV) z0oZ=o$6&MGkF)Om3^wci47N$op6vet*e2~~ur)n^LB;_FThjv!Hp_#Ga5?xb*enk+ z*v299;2?u-+(8Cg{X=+E_0SK%R{s!#?GqA8$1>PH9b&KWw8Amr-&_a z47Q)+7;GP*4UYc-*gnQF*jB|W!tyYKZB;yjt@~jNV-7Rex*uk+l{u!&?vbcBsh zX0Uxa#b8T0jUDR@Mu2A+Y^N~&9oQD8;2apHq%zp%r!d$;&MIO9EcGmdEeQU1U@L!K z5rbfh&okJZ&okKWrKySEf$agLOBZkj5$17`!S*1H!Pe}eBKAU42W-tQGT5>%GT2@t zrtU&t2W;8e^fzETc8S4u@e(I~1=|U2`Wvu?rE6ew3cbOJ4qnE zp|{oagCgGCz>PXz#&GvH$Zh_`P#3o0U%GP{^ZM;JnJ(js=}~C^+`(7~_TdgCUqS5X zzm$Ciu@iT36uqa2Oqje+yRIU3;x46M#i{#^`@9}*@eLQtvzVq9c*r1nlrI%sGmOzK zeaIOH@F}t={JO!@0@_MNf84r%7S2(#aDBJ}^}eIGlUYoAIrrLtOEbPdWDiJ_B+dL^10ZvauxM{s*fz6OELGbj7boG%A*nYQ3UYuo7#q0o1uAF z&v|&nvk3QohUQU3CN7kfc#dQCbA`HoGWb|vf@XX|Y68@1FF@zdNKJT7K@ZUBfEO5Q zz95H(=oCH$e?g{oKGsG)s=wI$0LS_uaiUo8h3z_g&RKlI79tDa>DNt72#bWj- zp!`Rex$+X%(qAfcx1!O<0uxlAAae^;-77_Xj?_nPc}Yo6&}Exf7`wcp@N9GmpH5gH z^BKf$g}8ukiOgrODC#LP7Z+lHS4e?5$b?TztdLpjHEQp*LLIG8s*d9Tnh2PC?`r}TUzra^4@fg%f#2%j!HB6H#g%>08w z3yUFh;s@IJ5}B1hV*LG)dc8s>eA=W#W;(>CMaXQ6%=C{mvJmAIUZjYjpO6hZ`3c|F z$>?DLkw!V8NhZ`zpKtNd>nJ73FwT`+F>K4E{oxs}-fyG-C53xbGec zCDclaWGhMf`zVx9D~kDu%r6l2)-<9BUkyIZ$i%(m?bdi3#D+pXVF%l8O%b1v7;Ga& zq760rj70bp`~Y2kfH=rjlH)^k`N4*Qz94g*trYflJ4s@rY(N~f^k!sl9? z<0ZvQFLN!<@#0$asVc>as$7fkxfU-%Y~XFK#fw$B7Ds#I-6?ObMfhBc&egEStC?%j zxf<8v5r|$sT#N9z7JK_hk>+Er#oj(#i`KqUjQ8bQgs;`&0cak6=2|@9%eC0Y4{v(; zaV^5nE;7_*{$l3&`TiPv%<0kC14!sPmU%8t#gywFsYU zF#+QC0A#~N4X(umf38Kh8d5B(!LCx#q0IVwU}CuYf-5$g|R-@B7CmJ?GT+Cm}_x+eXhme1}M7*T#N9z7C%57 z(vWNMLj$hGEe)k`YQ(h&pKCF&kreTb%(WQUh->i$#NQipEyCwoq{gVbCgxhC##${l zZz9FsCR#1Rv*0m|uVonpT#Xp-$@fMG_s9c24wdmhWiZ#v5wdmiBYw;??rg)h` z({f05$SFI{I8PhSJ)ZfCa+ZLs>q-Qcy6J>WHJ6 zPcSv>2<~2k)~vHygLrJm!r*8DftFJk09eZ`LQb{1)j&^Pl`olN(*>V%#k+hf+ic;C~(A&E2F(hkfZzExY3AaXplV zbVba&hZL`1ZolF9)|31~5%b1d5}}A~?uosumlW$@_&J_Z-4NT{lj?Ot?Dg+bB=yF) z2DUnkiqsf>amT&8F~vSTjK5!j`5CTL+VmFf8Lq${#xc5-zMy$Oz!K&(fYN%PaY|px z?}5gR25@6rem2F{Uz^U*8oTr~jwx;!!U-$znKeYxx(9j>3yA7vs95U;L#6n8D24aJ zYHBc4+fp_e(0&=FfuSOPP|a4Tk97D8Uy(7CqJGEv8#_$xa)Oxh|JL9B-dKMVhf!D` ztom?-qj57L%;;;Y`X%)wFZ8D*D9FE<^!%$II6EDW9H~D9YO(Js` z1@uK1tA|UmZ#d=lMHi}XGF=noQIoqc^fUIgHbFIvplkiG;HKeZ>W5ZGM@VsX1Rd=U z?dS-~?hnmVFGZAI-Cf-4rj@zhiL0L1Si{#s9w1JUNLp5g}@<7`?Ru)Ymg zRqJsN|G2r4PN}A}HqgdFXe5nNls8hZ!Du9nG;c7pVbE?GspSx8!;Ca?2(&6ArD!~o z{DwlSGLpIvMdyp472zGU>OT1H$Hf9|iFC?7Wzk4#HVlnAjFKX56cr6aqYk6UdpI;@ zG)ikUWeta>jHcovpd~=_9z$s(pe2l^cd9mS4A?e?4(g$e8$+3TXf?-5v0*H&H9)I5 zmQoGS@}Tt`N3)I4^2Sn((U?$X&o~SsVRgrI!Kl024jT#xGnTR337uMOH@ZfTs!z{H z8VB09pCH8o*tH4NYZU6S^#qC-ge8Qy|0gHuk7g{GH2cr`&OW zd&3UTptTdx(>UB8nTUNXYX&byEA#F8o7!|qJmlS!awi$5*qom$MY(xkwXfboCd{R% z$ymq6c|g~E3Y>y#2gn&@fjAqNQy&?$YB~{jtePZ8e;dL6)cwGk0=Z>qNq@f-CIOurz2Kw zi4=a(zz*zTG~JnwSh*!+Qez=Yr5LbGig&OI%PBbmv5=*d9f4Tna@5NTEaOTkLRZqR z8HhzLr}PlQpMzL7w2xabfZB?~##VBfi&*w%YBm?K%73Ab|CZt$?D^khF%PlIf06e* z#GY)!EBV`{7`g-Jg*zx$jXl{$#pk0i9zZjh?#Tyu2+@-~78n=WJcbmq6Z@3()5EPPI)53umpElt|Rs`<)aMiO?r4^`=K!5&TPS}CZw|mJi%IIkUO+CKqI>w+#VL7mR`>50se1(oN z8ohN9`=odVE4g2azWb?2jYaGu_h^872ej|O-C`+fe>ddS2XN4WeLhHOOVMQae#&2J zOwhRIzl0Yn9C8GNQk{iz%m@g zffe@bC^cGz*oy=TTZLGyV^VB{rNPP{r^>4lt96Xpu12iiaU8^9pJ9QCSt6BPi&!$WnkS@)gxx+tch(}7oJ1xy=5bPr#jyLZ>Zd4q zozc@y)l8;3vNiqZq{k1yuQx8&9XSOKCZlR$smZi!J^DCuiqhAkkKof7WW$`!NYUpE zE!%)t@M((QfLJ!P&=e_V!>*)I_(sIC&(Ow=D5v05bv`%bZS4`+lbehSWxrGk+Kf%o zHI+tgHl|pLvjFv#@kUqMLM=HDsZDYJ#<)dhiJ zEBMM+X!Z`2MV%`u_~LYSSFy9g{I5yT`5KMgiLYgMm1rl1WmB$E#6QTHj#wV7(sdl{ zu2aih$eDhPhU`L4+;s}tjhqC;cHO|NVQp?wsXfR^xK8!<`;7}N??R>M UNTaJvzfDQ|jj@&~cZTl#KQ>`VrvLx| diff --git a/nspanel_us_code/Program.s.txt b/nspanel_us_code/Program.s.txt index 52a40de..6612dfe 100644 --- a/nspanel_us_code/Program.s.txt +++ b/nspanel_us_code/Program.s.txt @@ -18,9 +18,9 @@ Program.s lcd_dev fffb 0002 0000 0020// Fix touch offset for EU Version } printh 92 - prints "nspanelevent",0 + prints "currentpage",0 printh 00 - prints "{\"page\": \"\", \"component\": \"\", \"value\": \"\"}",0 + prints "",0 printh 00 printh FF FF FF page 8//Power on start page boot diff --git a/nspanel_us_code/boot.txt b/nspanel_us_code/boot.txt index 7f58781..ee3f1ab 100644 --- a/nspanel_us_code/boot.txt +++ b/nspanel_us_code/boot.txt @@ -20,14 +20,7 @@ Page boot printh FF FF FF dim=0 vis bt_reboot,0 - covx display_mode,aux2.txt,0,0 - nspanelevent.txt="{\"page\": \"boot\", \"event\": \"pagechanged\", \"version\": \""+tft_version.txt+"\", \"display_mode\": \""+aux2.txt+"\"}" - printh 92 - prints "localevent",0 - printh 00 - prints nspanelevent.txt,0 - printh 00 - printh FF FF FF + covx baud,baud_rate.txt,0,0 Touch Press Event printh 91 @@ -140,7 +133,7 @@ Text tft_version Dragging : 0 Send Component ID : disabled Associated Keyboard: none - Text : 4.1dev3 + Text : 4.1dev4 Max. Text Size : 9 Text esph_version @@ -163,6 +156,16 @@ Text bluep_version Text : Max. Text Size : 9 +Text baud_rate + Attributes + ID : 18 + Scope : local + Dragging : 0 + Send Component ID : disabled + Associated Keyboard: none + Text : + Max. Text Size : 10 + Dual-state Button bt_reboot Attributes ID : 4 @@ -217,3 +220,39 @@ Timer wakeup_timer wakeup_timer.en=0 } +Timer tm_esphome + Attributes + ID : 17 + Scope : local + Period (ms): 30000 + Enabled : yes + + Events + Timer Event + if(baud==115200) + { + bauds=921600 + }else + { + bauds=115200 + } + rest + +Timer tm_pageid + Attributes + ID : 19 + Scope : local + Period (ms): 2500 + Enabled : yes + + Events + Timer Event + covx display_mode,aux2.txt,0,0 + nspanelevent.txt="{\"page\": \"boot\", \"event\": \"pagechanged\", \"version\": \""+tft_version.txt+"\", \"display_mode\": \""+aux2.txt+"\"}" + printh 92 + prints "localevent",0 + printh 00 + prints nspanelevent.txt,0 + printh 00 + printh FF FF FF + diff --git a/nspanel_us_land.HMI b/nspanel_us_land.HMI index 7daf9d84d85de99d782d50dca213e7d3cd3c52fb..723eae58c668a507835d1526884299089a98ee8e 100644 GIT binary patch delta 2651 zcmeIzYj6`)7zW^zG$|&Out*!Or3eZI+M0BL60};&tq9m6DkxwLO@LC`gl^K7UZk`i zv}8WXQb*V@&|o4*-pkX<1c?Wjyv=0etS0O zoSn1#ZqC;H9)1=yt9+W1y1FYSA+^OQvU)vZ8pyS0=Ov^~8qd_NR0v*UxW-PU2OMd& z>w6F6+TLc7IR_~H>VDMqNy^A~&B?dtCWva+m{gH9>2Pum-CA?>mkevQfpaun9xJj7 zIBJ^H>jvthd$4xXHcVG9gQ?9pdLG-w0oXqtGppKWrW^TDZgIf6|WyXfM! zN}o{W6EvWOFwlV>!X=;3q3@0V7xEuj$n+bPvQQ;srDd$NjFpzL(lSIOgbjqN~^f*nS zC+JCfil)*udYYc0=`@38(zBFF&yk&GQ5HGKNwaAV&82LbM>#Z~aw(5of+rzquM`&n|3s&a(P!-)QS#XGcR8w_L8WZxO%Wu*(}e{@s*oJ6YtX9 z9mQvKcaM?~zIa=w?X%MIl+=vCi{F)BH;O|RT|sG6f{raZoUx^0!Fq#%v2wNU--$7< z)_VoSNUcjF87oukTiqC|Q0tOjj4e@X787c(=*L*8+J5`KK;O*3Y$byjE7k@l{&fgr zMoqB(BM!k-YnH&6L9Gq##(NWsq{4B_{0p24)tMZHd<57K`#I%AE5>=N;FB{gmc1~n3Mw4HTYvGGHAlI|;5SPPsta@)o>C=7@sx^U zv+@%C#(g&LVV-%>8&OptiQoY*6hI*q!9pm85-5c-cper(IV^?>s04x~uoSAG8eV`G zVHqrkm*8c11!|xcUWGb%4PJ*8z~K#839Dc=ya{i?8dwYUunyM42G|IjU^8rit?)Ly z1KVIb?0|RSJ!k+Qybn8J7wm>TAi)RlA?$^Hupb)X0DL4BNb-dKosL(YxupE1D9MTp zCaV=?l=7so>G4?GlC|uvP_jDWO=(Nk`p%(bIl6|Db=e$BP*%@SvaUsk+UMO9O4ikT z1ATJ>6KBPSl68J?C|TblWo^m2hLp7>>!u=q_z3Oystu^-;<<#BHDB%yw|! z1y7##kRk955!!!4r1K`RzlPV873%ny>m@yT%IN)(+}*=(lx}VHFCSbbB>SNW4#FWg x3`gK&_yj(M&)_J04qw1AI1VS^OZW;-!YTL~PQw}a2F}7cXoeO^NIpOQ=${fuMQ#89 delta 1703 zcmeIy`%_e97zglY;T#;u^mURf6KQn14M=X|Fc8ufAQy?iQd2I;Y9S_>08qEe=qApR2zI!$qP zF{f}U-_2<}pVRpscJRG?A7^kTXYm5g<{ZxDJYLB8d_NcP16;^Oyoev}*v%ImVJnw!5UgJnWFcYZr$ zM88KF@Fcjw1727M^{^f`Km%-qr(hE_LKAETA24izX7IyS*alC-Gq4?Yz)si&EwCH* zKmeYF=U^{L*ay$UemDRJ;Sjt4t3k9ED?W9J-W8h4N?1g#OT6`P=QTJqmyJQcc$D;mLB!4X&M9 z{K~-!^@k_CYlal*;S6;m5bkpL5uqD;;8XYvPQXbx1-4(O4zssNOX#2=T}MC^1Qiw_(gYEa zrb3Pt@hBD)K@qWoB8bw(M$30U_u5H@gYrM;dwu`c^ z%+W_*3OK&;rGQ1vUB@3?++t44%nIcn_@vjJmyh*K%zSZa*MR$J1jI_ z?D;~S-|BX1^kS2XPb^F=KlIb1bK9=#wqnK?D_U)R^T8fZKf0&=qXFgvf&ZBE@Y9Q} zI~I@a`QQKl+XDY>f&aF^e_PzF1$J zuZ}O?SJzk1m*8{zJihwAL|>9G*_Yx=^)>J{^riXIeT{sLeNB8#ea(E$eHp$MzLvgB zUn^g0UmIUrUprrW-)+7QzK*_5zRtcbzOKG*zARt1FUQy2*TdJ-*UNXiueYy{udlD4 zufK1AZ=i3GZ}1D=q!KFOTdQ_(Ny9Kol@E?qt;Tz6j&2OIJjSe-_)!=S$sGmQ(oA-fG*SFcK ztk)aq`fNZxD$NTu7pnYmaJqlAcFG(tPEFMv_n|OlmM%PfpLcqS`HUL5(_7EntsdJ6 z!G&s^k<2j^wNNyd}!0Kl<90XYPBdmQhvSi4hnW7-ATn0OJkQ@T7PG zYNE6Z9)ZE74I?AKs1RbvTkaVdQ2t+DfkOa_O4SYojn=Xm7Th2`*^`pyNl8xjG)VTC zmm{EUUL~)P*MwEf>tayBRht%D1re%MMQ?13ffD%_jz_7|fj0{3XDa!iH&U%>;;kI` z4c>@4b;SFniY)03jG7Fmm21j3DQ^Ua`>7rAjLLu-9z{s!)$zON}_}{n%`%az6D|SG_* z=T*{iZ!Pm)HTZkoQ7NPBN^0tH922Y5#^c^_bEtajxVMGtC8(c6&7msldvAt$m=1V0 z70+B3^@}3Cc#>5~{rJ7t?FxxfPapS&l^u#^l*yq~KwuMf@VGZdWp=lM)zRzTa-RCq z-)0h-NG6jhLcI4hu^dpTQJffD4Wc+W{Z&)c;%_iatDN+fM?i5Wy{W1FsZuzaWF|8k zph%A;j{qz@+ohO*rSdO`cXemaBP-iC;sT&=yFG@@SnVoiGBVj)Pp_Z*lUiB zKJAV1$Z&JJD`MZJq633GupSS>H@}Zki<2?oWq)NISGzBIySW=9D395cY(h38n+q}i zGsSZJXQ*-4y>Vs>HRxx3pjuUNB(3_{8{)R;atCRXL&!UY5E&tsB15&vFm>%`zlp*d z>Mf~ST=JH6&!^u*s;pou*mW>k zg-*63qu-;*e)4_tL-K$SvWKFV9J3N!A4M;1?2U42f5001{<60Dk=pZ%Zi&T>y_F&k zqGm>l9NL&?8l<`d3JMG^BCxnIcc}8edNX0NwOI_~+7Yc=r2UXl}-Yw?I{EvV0 zz8uh0dQRqP^SEpzJ16Ismx@pDCncx`4Ls%v*(j`W@ON2?CFEbc;+<={Trovw;F7BG zb#I6#Dh8F!7&4l~DhDNTLhP=dShj7Q7(La+$Eao3z0snzIMR;QGiE0`bs;;GUCC}j z$aEJ=nJg`1W~&wja_q;*X(2|9{Sx!;1o})OCz5xOcMG91RV-B|JHbqeQHh=H+Kvp) z<)gg8u5~eL#{#?Zl1wWk>TwFJCZ8bJkZXmI+_2=R<#s(8qoNktRg#)ub=at(Cmr)* zn#a_>t5|>KU-_C(sbnrjThw@$e4Bia+$TgV zA2OB?bS!FBvCBKGw)d}G%n#HbF24}oR}BNK9p?M$M1a*;0t=1sh9^V^n!ivXI99hJ zmoC{T$}pu!Rx_PsK6qFS3$!v_!LfSj@^Ea?(xt)wQ2_q@$GH(hJU&*n4YH!5BW0gv zEE!G4k#&SP^(4fq$-V6`)jP-vaVp2KLe!sD=7Cu^Ruu$UdLW|ZUD#LS64o}cr%G7$ zJe}#mtt+Jkpbh?Y2MBYtK7D8s4 zSjtS%GUh$1M6gvjv~QYzUXIn%&kI!f2f2%Uk$g!A-PdCIE?~(~D4a?HP(Ap}N= zrNBrnkQ=AGPildb307CvgK=us1S?zwTeY!zxSyf>v*c!S3%OMY!RN$MaGMs~9;Y5& zZ`Be3Ya#?bX7x|VL*!xdQy~Pt5KDn0THv!dm9s$$jNX8V{)kh15_CjZtM>9#uLB3O zCRu~5MTQ9>7%7&5;dS)jji{rhRndxTp0av+TCsi`vNhS3Y$t?5N3m3BuNBPOREw%s zn0Z=#lVH_S(>GcTUBmFw0xLZ5GzNm&;j?P0vm31@o;g&SN6sZ5AmytVvXSZ&& zsE%l~OZ5Mh{Du6D{9Opet7576hogA8jvDujR$TZD6vE?C!>mn4kdb7R5DIZ(sSq8n zF1%{Tnei&IrWQczSWAuCY^Ax{#H$L)Rs>q|m6}#>k4=doyX&e& z&*}Nfy4ULN`IhyMli!iwlP82w_)#nsPC5!d)K%HfTeWnDx0-ENSF@t6#-1|uP|++$ zmL)^T@61>Tk&Vd4LZ~zsOO+;$O4EAk zgBaZ|7hb?|HjwoPlY>YvX$hflr&uc3TEV>il$>+%Dg;2;BONAGlICiR9b@V{P@V(u0gw;PM zKO?^&zZ62?s8|YojnithJ!#^^ zF{6`HqDx{`Wv08;1&>uVE*-By8y7?ymPNeuMD$~Iu>t5re%2LNo$;a zBnL5<493&IKy319cfQ&RzI-}}PZQi~c6}?-wJ$-LgRIJ~R&KR;3D%J)&lzMjGWV$q zNw|cTortR?3ny6R{f5|qTsv50*0UvwdN5kRGJm@P^_wz`md8lqZ?xO8wt0FSYTLvA3n6dW zrb8~A`ND2&=EgUK?AOd`Hx38MT!ZkCdCsl6y;T%*Tbu{~-e!(dd1+QP&-V$Ka?O+E z3GxT>ln~SW8L^z^e@xKl&7Ts~;$iwkp|5+(m5Iu3o%@w@i(DvKo~%e#5<;$;o4H>V zH!nTu+7(zM!8e7K#2S`%qN%fc|#1`g%Q5DUiyGfkG8#czJaEYg|Mu{fHHM+_RX-Mt6_}BQR ziIYQi`_O8s=CrUzyC%4GBDoOtZn`$P5GS8xJ6j!HW0lEI%CvAhW4&8vlkk&l((_Nz zH{T-PB=?eU3(=PQ#IkGNaqF&m*R9h@*)!5f&uP{_OP(Rmk>`a_xFnVe7aWC)I6X-| z2?gep6+O%+%?T>Ajn&hgf@{zovjLe(HYC%85Nslrg6V2@TO_!RJUX3(9@EKwtUiG3 zPYxsp2_ayMrNCe<;PvQq5&}#oXL)owiRY3|x>wVEExCqVM?NWp;6||&T(1Q;cyu-i z0m&xa@38uN~(2+uc(sFrA!6&LC$BA$gxzO3u=fv+L_@67N~E zN%wkIe~R2dZX}-;Lf~1k6xgH%o~f_1NeC2Ylke4MHYqLnYE6W7iW)zWKa!`(GeW3d z5KGmwTJ>CgW|MeZ2YVqmTKTNi)>APNmCVXyC9(=xRS1!qVkuHBQ6Dwc6O}s*nIBcc zROEEzZH*IkTFL$_PAhv;sxR4x>__$&LVU1TiVx7@=0Np&S4@_8i?hSAs-DH__mZ>8 z`$(S<0`tUD;C?5%If**0ghFvz`Bb7#D^bX_@-2$IP3|S%A>S23_5-n$eb15Im#D1T z$QPhcoL8Qu(|Ph7d4aqrgv_sEDf6=VW|to}_+?)DuooUg^%HPiwLj*@kQ@gh~goRB5MG+9&C>5@ASM=^nxAx#UPPj~pe0 zz&NoK7_9}yB-<~In4nZP$HYj9B_F#B(e^x#C>qau=VrGTft zI8|Y>Rq4iPo&4~ohP_3!DgNoy?v-YGx1*Dcy(;3m1vGv6^2vD?D6RV{DNuF3G)h|z6Fjn$JcPjHl^Rn7L4tMA}!41hM z*_rH0b`zq#x{GCdWvS4+u;j{4WtIs4vE$)Cfwd=*6Un>CyM^$dDwh6}wf~e<=7{i5 zo?vw|m#di*(E4~6yyN%}I=@7|NWM(IB81%QVk!5kmU}IgDI(;&6OoS{W9{$AZ^`52 z_d@ue5=;LR+W%xKGer1D-G?M#)&{GYt7HRai6~n%39Ifp4d7$eCF99@WP%WyiDIeg zZlH4lPXnDL;$88cV;1Y@klAE+vWE}~y~R?Yr=!rTfld>lP@E=C!i#d(@iK-*ahm9P zj9N>{C8Q#k38B7HEY+7g>MI&BPn1^24MTm~@m2clCSN08C-(@U@|IYtyrEUhf2s?U zu{P5pS+4II=(~=1&byAThHx+g$pA8lEFpwoX|WV6*--7t!D6qWP7@)(n~rW)uTOf& zL^4STfd*nJklaws?oI*Tbc8^0nwZm2r->+(G|@Ab8so`v8Jwe>1 zBBx;q2?5@8T+Zr`lPk!Tv;LS(vF zirnLfOig2UNReKiRjj>+TurVe*9qbOlvw&d>G-ct)5#&;Mp1I;d7Dn}lJAi3k^6*@ z`A{rn-gjg^NMm*=Gt9kK56^j4zervne-{F=t>P){*E+%?is!K_8r zB*VyXAq1ktQXoR@n1dO&cDl|A@jfsYI9Xw9`m`n6knPC!La1~SOO@NSN{4iPs}U-4 ztI?gy>Z8a!ax^(c2!RP=DKJ(Gj7!%UAq0vtLic0zSxPP;6}e0Zm6c+tvYaaB3KcrX z3P)Qc&9QpBUuEUpHyNumZhUh#*j8EdtZH@I;w9+%XM<97LpC_HvC8aI zlpJK^jPuuP!YnxRRhH60BKMI`eE*?Rmg3W}7aL)6HGd^9k-w3@ z3o)5rZN%GummBf+pRWB2Yy5nx+WPh%x{~SQAF8FY5?y~ZQlZ1FL{GR(=w@v)f{Y}i zgxF`CSe`(l8|zQDHP$yUp?5>RShUBuuA;9~Mms$NP zd4;@2UKc{Z)ud3MKnu8xCi;FO6nMWevWfouDxOO=>1in*W-Bt2Y)!TiLh&}S45@7s z9a1~Ba6J~(5Re;=p5d%Mk{m(il6gW1j1^0PQI5c9mAwJWi`i<_2CJKEVH1775qkXi z>K1x$Be#;<$sI!I?G#JB=d_;d`6f&yA-MV}d_e3ls~;ghB|jrS7ee4`u@v|MU*D>X z@1Qi%i6kN@P9(2F9El`E4{k(CRI4eR%y2S{j38?ZAsQo=qLEE?+7Q)LCy-DrN+8?P zr#;z@yp8N2gi05&ROzTy%ucHLCf(Tl*y_lpI)Q{J6UYbX{vbJ@e282igy3Sa6kO;C zKCH$*!^Y3qjI`sS*X-b>ovfyw=jiqV`8>Ik+$Dt2OJXUM@4UZ%H02FPG!T?>Tt}Mf z91@W+hy0E1e~`bEm&q$a2o{K?;8jQPT2uYWRVYXj>5goM8fG*ZMaGb^LMYS~ONBVq zYCDpEI?eQL#@Q-siNw)fbTulZ(kmgb-LNmI9Abzt(U33-S- zOnxea;um76ctnTvSu=f05g`@bQgmOX&vo(|SwI@iwMw8^s+elrPBfFNxxS;QReHMP zq=Few)*e1J zFN>xBZ`%L&=FA)Qu@t5b?8FDGYh|F48BT_g5oB#4L}J8JBr?O9aWeELRM9W|glb#X zZ%?)(ZzDShq0mJv6*@W!oidm@A`Xn%-kwpcK874kjwQzlAuvfS1;#r96Ec`O%E_Vd zdc1Ql5hdtn=U(FO7B^>)`&8&#$R79MC20F+k5Y6)_IRd+fA;t(M!;XMx(>scuMYA; z#oXOOXOG?%`Xj1`Tj-CdqMYd?%6UVvcvuzPP^@x8)J_`tpGEEW!PIs*3;mr@Gm%6i zV-%;~7^#y;>PX}Mt@c%;Unxp+p8uNzMe{oM8F{qS;U`gVjM&K||FgFB%Oj(3ZuvXg z79s0IvhV=SeAo)RF=Qv1yeZ_OWKs`ezhn}F*e{uU_-_umIGdE&K(fgjMz51i-ZUm| z5w6<3r|2H(wZA`FolWYQCyt*tZ3&W%AftsAxl14bo+5u3w`@>ip;m>baE;=gPbYE9DiR6CX};V zFrn17r?JL8x2mlZN;C~WPl}yoDtw+)b}AX=db&PEZXh?3PYbcrXT|cwvZ;kWw>^V- zT0RpC#T!#fwcs7Alnc`~)5#a!K{|QkT<)Zk`&#I9a_GBAC%;8JBdk98t=_Zd1rCsm zPLjyS#TF)!b)PIw5jkf{68RqEa+1h$?-kehR$h=K@|b^(6Ymu#ksDmWE%i63Hy^O7 zdg`=8RM+a3dfY7IepZqz z$S25ELhN~6OOBg0EjeyvvuX^`d{>S9#EO;n;7EO^rK-8Wj;i?%JTj6? zBg@CP?;Gha-}lBdbEZ1_i8aSHvn9XUtgiL5gUyR-@nI`A`X}z?9C?O3PhJqBNq*6L z{8_m^wc?!GXIbO)t!hvF)T&b$A9l6sRef7} zE2xb}Fz$mh^AkR^2DlnaXM6B1-3ej~hy1cbroqci_?th$nRo$z(5Ix>!V2-9tJl7; zR=Q#`_5Jh~c=4to(;|~YCLcp4!u0eOf3q*yhwMl87otrDi{$_vkjZh5&vWkn+KM#s zE&ZRYaCPl#t5S`bbeSdOUqSGgGgvZP)%ymwG@Yva0{_NLJv`U2!g_KYxq*C2i2Xj3 z$>I5QCWoi4{UmFwy;W^JJn{ZHJU6Nbj$(LjRQX4(XYoO^A;+xynn7#62iBcw%BUys5EJ% zGHci|ekx^D(g~}Kr#~GBk^{&=V0cF}t}P}8pJ*-W1;q@YS$h@v1i6}ABZSv_ZLzi131wYt6;<1ow#L|rS7lFQ z{Jlw^z2sZu+vGb!_`a_#w%&DA-fOKwO4!kbDitE_GM>})IZK`)&ynYa@V%rhwk|mD z<)SKoh7HV63Q9nvavM}OtCCg7YGidGT*I`*R*g2g$7{Ax14t)JE-yDI9TH>521Ji04cCeNBEvenTD=!vDCo*gEF4%(v?5c`Ft@9d*HK=m~6# zdS(eSh%8A43*l8(TWpnTtNW*PTh*luKC?}Mdg}2q=w%Om63O~x5}7Q7Z$oXdmEx$R zwpH8Xid72Ypwg2*x0Aid-eeykdKuai z@;-g`lOK>Dk_UwFJ)|wR4mv6y;Y;{+83xZuJe6N*%TsyOCHnqO{!0EqUKU~ozOEMk zfgKmIO@u0iVMDs~z9+FO{~?)6r4^=hZrU}I7DrX|AIcCrTRuV$s#A?k^1 z)L%50DR%4+*i$McQI(0pAb)*yhpeRy5LuloGaHB)GTJ<2iB%`8@f85T5_g z7F#=Yo9t?**9gTTdX3;dLch<+&&V&xFNN?wsx7v@($RdqB-xJD!RRG|(O%wr@Ka&^9OXM#?`2V3TwtjVj`mMc+{0U1c|3)tz1gRRg z!Nsga)+EEoa3KVuw8d7$ZF&^czD=(fC{^+ zO}P>{A5kRLGlI2q$&q9pIZ6nxaoS>Qv=hac+f;=!g-2K2r6qBeUrd)r$w$b?$R$F! zF4q=YOPwH;>R+-jh(ba|P4iF}28RS4HT+G6W9Cz9Q_sX=E8BZ*gCgQ0Sa zKHrhwlE=yKh44M4Ew)ZLp`28kf{R1RI%kz}m+FAZW*M?HS(Yp(glnj_*a}exaY}WS z@1U0px|55R3+@!UH6T;ThGd!$?oG7CR=O5y)IqNn{Dfq+;O1F(7F%<)&|KBIj9sT__=-@sI0$W` z+h+0^@>z0=5bis)#nx8+*0y!f3kUty)KO7-;-Xc-eUN@1lOK_X$WMgu|4dtK9o9;p zc2ETuk$d?ooh^%){-EC#@-lgqye5Rd*^w4o*Y%q#P+8^v<;|@q2cambXvUDyWGopc zgnK=0u~kRS4#5D3@2FQ2{vlnDhf+uSbtXHJUC6FN_~&Sgt!`Q=tD{~`I7(biOzx;J z42+}eBys|I7kRf3^Yqk?yf84OBQFf-+7nr0{9o2Kr>KMF?I<}X^SZ!f6^u26IaxKT zU?;g((r*>{1i6}ABg7upi{+VNtqy-(N4=DA!sk+=e5gI!%+FsOYCjs#M9%rLk{H9& zWJ!bHjyP0MypqTlNm)tkqPA1xVSEL8pUss-3)e>-_4?rqYTUGbIMb2qhx~@s>`JCP zs1wx8l4J=om@Fm4PRePEt zY^7?E2A%Zc!4XM30g+yG=}q2F_96QU;W|)TZ1vM3{X6m60yV-__Caq+xxnC_POq8d z400AZTL|y_wZ+!G)G_ZBOwOJVX+(_A8VyUo%G6qN_Ev3mtDsFD_wpkeWiyhjO-7N?Lb%q^7F#i$_4zcmvtBPyrGckCt9Kx8BRi6v zgmCMoEw(y$RtKkGz1&$}Oz>|Mt`bJmZ!9^697m29!v8L9u{FU7WnyQ&O7NHBDq$%d zmywEGPOcC_V3oGmdR$AHD^+A|TupM6vd`f2TwE!9d{OM(!Y=6T)|ww%B^Ui~d9J+hcIYYtAE@!}K~reoB5uelCRf z*VKcg%B%mQwk+;$1!UqV}K1>nzqVO9<7s;@ox zD{&c7hkkX*c(NXuAcTLSw%BrOB~MqqjPO_DGNK#(vdJtmhwLtd|LxjhtA|$V*;Owi z{FS(jxQl+1$-BuZQKysvFlLwYzaGqHEV=jq10mt*>n0 z1kWoQ*x9HAT-ktKnP5NbYS>NTdPH?qvz;BC?{nLI0-DGgK-Lqd{Z|VQ)o>O4&7Ov` zJ6TUOkd4Bd8n=0h))Qsaj3m2(E2|q96;(%~+D(g!k@<^~?J=hNUdHYt?<4Og=LoTn z`PyP@t~!{Cfj_UCUQT4GwM`1IMLa{7XUWav7ILc)uFq+Ut!-LldpEtDC>C+9MSMiR zL*&QgC*)xv{6E(gTc2vBBi*>Bpb#%cxG&S;DtU#xMqU@f(UnDutpY7!Wa(=WPB6R{ z5iOO>STcr;BkKs^nxHMV;)id1%;v zuPBOJ$GH|UfsT{NiR4}6-9p4NRa2-y_6mMEQPRA$6mEC!6((x_wO>!^!wh#jQw8hptj?}wZdY$3lR$OQNM8`AaY4R+2P6&aY zwZ+zXN9sbBUT64Aah*{q8!l!QvNBnftR{p&Ep4$?JzJSBT<*-)7bB?TT#RT&mkhEw z*@A2-glijZv6Y#vhe4}sy~dzQs^<P;g+i{wuUU2QQ`H7fE?5|gUCR#1X)rD-!j@_D_FH^iCL#q zj$TDjr1Kx#Oo0~=+=wuN#0KO7Q(&1w%F=J zA+xUvZGkn3*3rp7R}xd{Hl3VC&LC$B;eMaC*qWsynw_Ip68=hDNjyov4dis3H5UB{54$g$)&A!h4I-MI>w(4DIQ zU3)ZZ+ z8{jpGnQd`RVn@E&POeGFDPPtQBY4hpt~j)9P`rlNA(FC&*iLPyMgeY{$TbOfN4tgV z{qC}S(7*EJ{zS?)3bO9{M*N zZs>XW@t1P4BX%=-Z=X7lWk*N7NwIgxz2v*(dqT+XS7tBU?Rvk5n!U!ZoYVln9+#eu zzwX6P32J9~TloI=UpgcI*p_X_$hhNW#eM3BY&&eG9zKQrjeJA*tQ5Q5Rq&J}F$2F< zm%yR+H;>W^{~N;;qxIbFcJ=!E@Fp^nWuW6@cPYvGgKf^hE$s2aj<}@Sbho3U&#?V2 zkmtyYf!TRc5c5zo_foiyJ=m5^5Ix6i-Tuj!Fgv z+c$%=KvJp{=%zQ@sNp^A`s}Iy8(s3RJ%VUu9#NHh+M)l$`NQcL^O9PO*`)G7*%gnw z!d{5zDZiLgDMbc&YFcXH2(N~USn-lI$S^Woh{GeQr%r8q%CF~C{&R1c>abS6rT6My zc5LAR;zBH+_p)m_M@ZoWd&3b@zyANnkB|s7NAVHj{4CU893i)Psab-u4%ryGx=ap`p{elnG)>hUV28O@_s~BW1j`=`g5?he z!SV-#rm3z2?Jedb`Bw(oZ@c=-ncRb4%o-%N@XFG}?BaE!G?pg?pH&_p8-+C%^e?XQ z2y5UIwTu00{4q#YmI>-M%O2<2(o?T2$J%yf&-+r%+)sW$en=h=qBRbQ<;vh-PrWAm zsHghyOZ;Nq7Ine4lRdw%`fuc~_y%##D4mT<$ikiVxY(rrwyV1@*#G6 z+<-hf#EyVk!4SKvN6~jVxr|&vJ}!jXYOz#X>8L%Sp12cBsV(Z|JMH$7ui|z2R}ByR z1Z0C$#w3oBk*JZ;WGopcgnB)(RIj6s4Y%VW;!z;~s^Ed3 z@vEh&xc|~PmA_hwh8bpeaNTyhIyaH+G<>+-%{`Qg!^vUf2y&zl`xq^j`^e=!%sf?c z1VfA)VRtYeQlm%Mwb2|4M?h>dUAK_Wl3U4bLWn&tmSWqr*bY^HB*i+9w7a+uvGQT^ z6Y^8?h!E~yilzH!bPxX=1@f;l9`b(EJ&n>l4fsDox;EObsUmXi6wfuv6p+_R17B~z z?R_DHgTzwU)mt9}0ln4QT)UPWO8CP8HPw+^90_&kRF{k=>yZgU$RvuTjN6g%^j7`y z>{Zz4(15kHSctOpSZU zDdbdgnh>h9#8P#-RyAj+4@a@>Lnh%mbLr6tZ7p4%B-fGa$qhn?Y!XY6ryP-u>Y>p{ z7ST-n18c)Z;g;$s(lxS={t|12UUCNXsB=T?@=kx%P|L^K zmC`5s?N{aiKXsWHoc+px@O!1;hW&<*!+xK*#eVVa&T)1H-NA`nWY#Err!pV->B=PG z>`}&!-zzepGLof(U3g3yy9P9!_q}GkUElonmiwPLf&0fO2v;3fdCRG76YQWaE_qi@ zo6Fqcw?COsoJeH+`Mn~8(m#?Xiz4aeioacbI3DxH&8?3w2R26oU>GHJxy^64GM)H| z%N*nERtBiwD>7>Rce}P|w{dFgBsWCsm!{c5#r6s|I^P30OQzwS(XhUxx-L3~AiNq$X!BSiS$iRD~yR2`g! z%lpUFZ?o)g6HD|(xfx8BBukN{h42dzOTRMMQaN+&Xjj?3%6+f>k*iT(bui1Wl$6pi z#nU83va5zzCnVFqA(=|1k?BGxHdV78Ktnd}D;FQCB>stS1J+NurSI4G*{@3gYkcUt zMyOi!jWcIWTUJJ8S-gNBZpI%Zc@TrbV!V}A=lkt)(fueth#Wu;CcQ$0IixR>K$~G! zR-Nv*LmZ!htk?gRJ{Q(t7Hl@hzQ?rGt~vO0j-@`EW7n#9e}5Tz#e;8wZbDUKt{oCJ zhm!NjdE|rSLqdeKNVnWVCnP_g2Uu_JU;5w^)5qu9doYNfnunxo0V)=?SDH?X{M&1x zZm$=e{!ML^?AO1~aWA{b7s!0_A3{X=ijMLn9c9v=Iq#&y^MC1VzNEtDBit9&*YnYK zFDmmvyLzzGnJ+Oo^Lw=&KZdI=KWLYa`kG4Ll1It!$m2qU^aDdOPpC-z8m_;~F;@HL zRxYYu$?{|cA%dvfPtAV7PH4esTp;bvnf6FoL9MIak2|XJ9wKsk(`~5}s8?xiId%R(4@G?6nDg*V4 zf^Bm1NNb^k9l>BLsm+hr<)dxxV<hxoF>F9-2e1u#?K1x0&L`ch=kd`u}8vag; zS@Ge&b~2Z$HcRY1C6=H{2L2H2o8C$)e5qX~ngvCvx^rdEzo(b#NcR-=bfDj1`V#l} z8u<#jn|xh}kl%Dde#5WNizjjI{VF|P{%ddZ4K-8YK;5HSEyIxBgPQteEmugL>p%Vx zzo8>O<8=4gW$5k`l>d?Zf&7U)EkvN_oj}hz-931Dk<%$wJo(p7=2`Xfa>RE=O<#e} zZ=F$VSJ*X5%0!Y8jh{<@%+7Yz=r4zFHTC%8X!44fo^eNptV~uTs|yiJSbu#C*X%FH zaCLvDDy&%P)=rlm$5{(|+_lnz_n7KiMdIp*VhhTnBh zT8*{$i)z4XyGG5gP|qDbAlie=U}Hy&*4M+L-8dhshgaj5sNd?ZlYxW%{l2L_Muo1y zJUX1wud z6|wW`SDC(Q&sw{3Re9;An>S zs4MI2*UeM;uRLjY4XA!fDy8E0?0;Zw**X4v{7dUq)J8k9tgH{DsAptA4`pU}-Ri6N zyuoVLM!TsiaDd-+qL=}YG2_TsvJM$9L@aKxjHT`Xog>#9z?BVY3Unj8l38T75RyH`QZh$Nn%&jzP57011a@?jUErEKfLHXQX3@<@ z-b>z3&JjXrzFNE)E5LaJxRlnl?_-VGx2mnL=*iAD+jhiURLw{!jkdyE;~YG-*RZm_HixNW&*Cy9o^p9TS54ZY+jGYjdr15a?(~O2`rYx~=n)Y&rAY3La)5lL zns2oS{o9rIY_%gjA5r-b`7!wkd02?cQlD#!txug6J)%;#*>!Xuy}lpW`Th@WO!M3A zDxS-9y-HpouaVb;Z^>p2lT&b;CEb&jCjXn!5|9~7#*lGj9U%fv z&=y&hFY`D@#X=4@o`$JZ?B3U<@Uz8phrwJ&rK9)IuZk`sx+CzS{Hxj-ek0=^4>!(6W_KAyDqyXW*AHl6KRo(!ojfuFR+)(?)2?KAUS{>L=F~0 z;|^`HgetwnLcXp z>-Ha>&GgwqK1*&Tw+Z3ovsA0v>$Bq|g}sWq27BP$f%&aH2eObQ5<8yhSQ#!DG+Re5`{ zcG;uGzGWwb>~Z|$)Pk~ud+k_{l({palcSwo1O?(n3|Xf=E3hi-;0;H;ZO7!?rllnNWPzde~GcQ6XS9nW8r&ajLUV5Qucp}QP*)|^xWj}CovX!(RK4ff{amRNr?F0Cp4BoMy_^H2_ouv8J9qLC8;?8kCm$Kow(y7ygR+XI2CCK=WZ0Y6Vv; z;Qro09qFc`{Z%YbixY9mj9)XfVgPFCXPKicd#2PK4#Bb23}ev`1qGr}2K$n7Svvcd zmvzdAp!@(@BKdb+znoJZ@h{~ePWe9Q7tF+qvvmDnr`%&0AveCDb~LqWCb`J-@yx>cc-Pmom(fD-&@rZ~xtX zCgDqn-Z1DY=|Lyu*en*Vqz9dp%fF&`#PV+SrCc6GgRYVubW-*;9>w(w2i@Equic5q zP&|g=F&vK(c#O>7@mlWH+A}NEHH=rka2e0yWSxkcr@=VwpBWcmtcO?|Jb$4x&g1#| zc^^FY;(Ql=RX-nv=ViwjMp~;t*1s3e|1rxjy3WzhmC?}neyd^Jxi8Rovy@@%!+0P5 zE?(~yWOTv)zA`G$G@kzyJ6sfG9K{YV7y-uKFAU?_TS3O}IN4t^qK!U(7)H5$LB=u+ z<*H_Rb z2hYc0oG*zB=JQ|7nWc@bpPNR;8^LVW0<)xX>RZ!z>&sxHG9oPDs%?z>!!%w!6Kp&t zJH+#F0Og`JDDH<9nQur2f6GP-E6$m+{2P(ne)Gf7BIa z_@=pxo$r=5j^p_Ytz6ZORvTPKkh_dA3kC1HY8hAFaT#AtDP#PA=O*X_$8+7T%cWG(@!VZOJ8^Wxs2@=j zfK7EEf7J8AW}`7UbiOX5KK?#80T*?ye-FVltf@Mymrmrm%`|o51WJ~mBtWe@iIOF1 z|H<5!gIeRx-wd_zhurw!7T7E(2sam7*{a;B+##iRv7n&fdO0=q6yC^lYSk%-JR+Zh zQT={|$Rldbk0@z|dF~n2`X`h$Q=@-E$w`!SR|%&P_Q~?9_vzeSCFWsG_;UqS=?ns# zr&^prt$LW#A5)jlz^|UFa~37dlr80g{t!B;5Ql*@#huQzH{&!t$sa+S`~3v z&QQ;thhIhY^?8)+LP@k*aRDW})ZPmy>4(o$>{a((L`grj^&(2HqhzES`7^YyS61q0 zH08P~m_SwcOQ^I?&A5b0?Xe7hUN!v%CGFMFUr=%eCH++NuW&n4Rb~B(kRHWUUr*tSWu(thOu5<{0$3H(T-v7?#!l6=VxHU89=|^v zhrM4x(a2Qgu7kZ_Nl{squ=kBv7*$oJE2G-RRMj#b)#TS3@mq*j;vv>UMO49iDL~Pv zhU%wg@GNMc%Gb-=RdQ29e5@=Dr_f*X!qusId1cK_>TFf)xks8|>`~8DgJh31^-TgK zuc0V6T|MrG|Ftx=yE@7?rsJbPjnsoJQMNH%ZS&+k7iw2D8s#)Hj24YC-{GOu$eQT3 z9JR0}gm828CfPcrtW<$=}Fdk)iv`lfnK9x{9(; zRXQRs#&te}-Q~g`={;8lgDj$@Dqj{&(Wj*h^^a;pzK^8vW6l zUF2%tTFneawTmdT+Nfp~(F7M;vy*~0wvl}%)R7Kp!#*m}qb)k5ttwNQ9nvBm`z%1w zXmvRrwF=s*+EpO7xt(FuXwN<}H>;3(dHE&f?^yk_yJbvq>`X}Nb+@WS9;z*9}tXhVlk*jo8gTqkuNH^U_zr(iA(tUKKn?9zV&O+N} z>0@eTmhPlavvnuEm(5NpAzuTmnWK-YKz#j7jw<;g-WxgksOp)ckE&}Z8=;Z$wbVh`Od>qp$9&&3*Lo)T=K#wy!>(di7;r1r?xdl$zfX zq6K~BaN1R3Q$NF~-k*JigL73Tj*)@=F(D2xjEQ(WIe=Z|8rWaWOw8Ns+K>AH(pP&1 z=)UrKbziNAz3A0_<@4&k>S>{UE!|fgEZtZ4*}AXpvUOi=w{h~dbzg0_bzd2Gpo#9# zeT6AaX224gP*!CKk15xtJ9KAt8G_T&5O$WU%Mg83{erSP?&MMB`eg{aD`?f7=o&S$ z6W;ZzJ9Te$8j91wP~BUdhU(rbK-uVFy0;33>fYKs3_UYk_txfNy0>}{N65o{KcbA!q&dt@`W#;NbYctAf zHd0lqVBI=lQ1hx(*4zIlJ2kHQ8x50-Cw^?(*3peF66#<>;77Mmp;5Y-HpzHW2_Ei54>pN9DcZ9!SB>AJ(VOw%3KdpbIH zy6&*v)Aa#n&Ol~ALr;eIBq}GvohVy36Nv&IS7z!S+c`t`Se;qA$7;-CkJbG0KHXzi zVLSQs_Db05K`JRcud3_I``CMB7u|0d8}N`tnriiJZkWq=Kl?Cn^&FffL(ROffJf#S zD*523on_xgQPa7GF$@oN;Z$Drko88qG2LinM4AJQ_vfhEd3i6Deig5t!sFOH^<7?G zbij*q4YmK3yjqLLHdO;hNAZ}fR*k{Qxw3j~3>JDp3(!$`tWq<^VxbqLo*J8% zU-mpo1}-#=2k=nVr=zNeOfzgF0{<;HW*X-gsE5bp?JD&JUhVKOCN0%%d|tfki-qd$ z@hIMlq6Ui$W3Wn}0Li^-&;;yg2TE!$Mh>eYCZcqQYCjRBt5H(!5yNPvN=!oOYLz$% zr3+AU1&?~_tduTLRqsMjQy)ds;8E={1Z93Ps(QH!<}&>8$_S&Exzm`cu1lp6c=1y_ zf|f|7-$zwfpWTgi7@O6|NreVK@EN z=xOi{S#B89RKj#r4N;~OOzxn}{o?)XNvaRJ`yvZoE>13a3l|EH}pfvYKfEG2kY#o>Zi(T6e7%DPE;SU}{|6qk zxxIBKTq^ldXM3ZzLW#=^GvxanRChT-WTF}}&^kg3X}Q917D*u|OqW{9v}KpE5;d!8u$6x4Dx6Y2Q4}RuUFu_mgzXoi2o_FV))>5H zaXJlOV>np;!U5d7Iw(XAEQ}hhh3o7A>a!NvzUvUK(#T~U_VzAnz7CnX;xO)#WvHhd zFRHR08N7o0*F%rWz|qd2d+U+GQRKJ*hoJlsAtuqe4X9k6UaQJpC_a?35z1b=y%E(6 znL_-MN$WPDnt@Jj!U6F-isAV&+^C^Bn{hxqY1d|`3!qFq4$zWm3)BU)Y74F+-$5zP z62kd}5TW$-Pe|-{c)RN-9PL4n)D7QGt>O&TtiHi4C7(99s|d}ALuQAZvYXDMwygv0*l6RQ~L5Ld{C?XL%Z5S<1#P0F9h?^HVD%QIsVfT2@xFl4~hSHeo z??fla&Y^)jarzx~Nr-|=C%&E4?0xO zkAKlrDZevXw_rYVQd2T2-;i*s2^-Vs@ zM%YtHD!M>$qosT~LzQP}Oq?Zjlbgxg=YuEmViuY$IKznnzVotCFX? zR#xZ#`d3+cNKfe{z2UDMb~T89kScu#&aaMbYfDhRbHaN(px2WKdAc(nYSr911b2T0C%nmDf$R5QePAh9f7u}5T|2k9SmNM*~%l_39l&% z6lY~oA;o55Kve4vw-oGLG|Gp3x?^C(sSm6Hq6nq?-OR*3^#pIf;RmDWuAg| z8(PPQY9|Ylw;#~9(}shN3m)?NW@DQ0h=!lRPMY(OmYl(*_?<^!1FYU-9O0+b^DMUK z&LbLs)^O0KuoP#zXXKr&-kLm)BXhHq2A+fC#WQTwbJgK*TZ*#T+ykl7jW%Q(2HV*F z4o3d2Iz1i!-d?NUsqT5hkqR|l;KT@151RU~P`mABRRt0qn`o%KY=kqlykJ-_KYvLD z7qFrMFUfoXr@uij)k+)W7Ay&Gr{)+A%gC3MlLOaK&9zVNhpRq4zhp>~#+S6|GF&4y z*LitKtF`BfVWI6Z7oim#~8 zRcL#mdA+8J*P!ivMWNTwc-Pn3rt5lZW2QmZvD}`o$tll}=H3Uc)^9L=f~|Y|_vTL1 zYo}z{=QX{_!`0WRx0HDUTY2Cu72GhSIX`;Ov36!5`oQS70~lPZXIdRx8oKp6p}Px( zX8mdilsnB@XVLc(iZ}-Gun%s;soh8iMe8dLW6)R1;EuxM(+~O*B${^9km|S*`Vxt! zCoq$a!fqi2HYyZ#3+eF#FgDpr5j$Z0t*O>+_rG{#mD#kQ1n2fH-JmP%F4(@qid z?I`gsG*3IqyNkB6>?rddcK2!c%;qFzx5n!`MTW_a*^u_zE8;Hf69{uukwMG49%k=QJ%#4$s))v}6kZC=*Olg$;-2g>XzyJWayV|N>iA52D|!HOEtR=q znJW!{hDyEMkSlIf>p3d*a-%-ap}AF7M4ig&j`yMjd!vJNt4yK4!!Z|*mzAmPcLdL^ zOaU*jgpO6P+p8ei_FxGyN-%nmmq=22iH=ps=_M*Txhuloow8q|l9M~VQMFiTPu!{2 zVWXF$ySS^ZRWv@Kj&-MkSMY~=Dg@U*8Gmx^!9hE@7a5X)7= zW;8cdb#%k!c{TiRBKnCfD9awFV_Fg@(r=<8{!s*1#W`_NN9`(6-i~fmYCl`77dvKY3U~ z8|F{#tfAElP{hUn(%C?(7eIAwpuL7RxF*$#g!Vds-1NqS_D5?fLLaDzdV!R$H~PuL zHOZ{%(}NUo7WR7(W!W12Y^R`XHaEo8MK@|@XB=!FR$CE^U}?1}(GC?uYg3LLD(dSf zq6aLd4y~|9MIFj!bF@~md^uD+Usn-s^%T*f9>tVH#WQtjQ#n*zj#n3M!}Rqj!T}W* zqii;B(JJ0@K*fFy6!A0cVgu?}9u>c8K*P(Uq7Qz}(E$6gAvJJBMNgE?<~*(9PDkTX zS=5L^ov{568!4hsFqJuB`yV!<0B2*GRz@2JR%}~EtZK`^ifzllDuvd+-M;{+ikQ`bfo1H#z`6ykL&tvt>sAK_ z)|QTnaO}ju+R~AM71>DNp8o=@KYM7vI^0tcfxQ@5YWe?xHKms#9`|Bk zO~FrztH5gU6^Q*61FOYX3@oeOiWu3Ofo0X3fprF2qdp9*GrbvDi~A_zk3I~n#eEo9 zz4|KRcwYuquf7Z{uYQV%gy92G4Os5|7+3{gDUjPsO-!ibC4N^qY@31!CF|eLs{v%+e zM<_x!SP``cGqCnXFtDaZD&idMMI-}j63QO|t5p;YY;H`e(l$yF4Tb<(usJXl3F^N; zXz_VtW!yJu7mB?e4^PFRq-z1J#SfvnEdZVNL)GYy(A94!qpQuZl|YkY8C@k~7+w9wD&o{wMpwVFj4qFH zikLT!(dB`s7V22*7POb+7+tr|i zsf?~;QyEn9t~H_5&`wV7q=`bTvWwBXpS;Vo0z^!6O$&SJ^^F zSJq;jxt1s*cnPB`6Z0RTYu-{tE!@Y)LP|KOFrhT*ki4Z|yTts3$Xyq2zIc+FhP@bX)yhI|CC%3F9vT41_( z3&RTz_D);Z+2ecA;1`?k{*b$64Uj0n)c|3@?;5c%?z}i)VPH#WB3b#iLip zGrY#dGrSu8tccD(GrSu8%#N@LHU}@anNc5t%#w z1ztUNFuYt774c~z!^<_1;WY=^i^PAzYfd7=t3wiou1O594oM6z$DO#~gna-n$DItX zX^@}p{19H#b~3!$?o!0QT@0_byBJ;$$%?3+%%0$aIER@P1rX?Pque?`L@Z2`%~n!|Tue46oA%z?y?#%|V7&)&YjsyhDn( z1bcUg;WZ28kKolI1H^=7WH7wiW-z=QGjXd0HY1baWsmYl@X9@^2(M#`Xm^aqT{%Y? zUTcoydLQPP#qjzO<&WU??FmIB!LFTPc=bQQ@CrDkh|#e1rx;$Dug>rtKFjdxe3s$$T#Nr`#Fn95vx(qD0#OLkG>qqXfkMzFh4zl zo5!DQGq#tDuF}A5xW1ism14IUi|r0xRhw8K7F%wvyVI8K#>tLHASYhKL4fJ5Q>_H7 z?vbn1H31jhKG*S*ILti{?}F!1#U1eZT&Lh2@LAnZ#2c9ZFF5D@LS?GY>IQiy8c*4K z{>p26!}1)*Nt>^zJ;&*oWE|yq?iL3;#7dcl!sra!wYL?K3{&sL`sfzl zX1L3Q0@}38=%rgqf>3J7bv1tA;lzPJbk@@wk2Z+Pb@@A6;i}*XcG%*$!=qs z`$K5g?qGqiPw(=AwNsoG-y42dNaObyPsu)aDKrH;tixRzn1U^QcaLMM6k*&{L?Jm? zNod+i+MI=WyNJr|gP2idS;gwb+=5#%)xC_h>0YdeBgIs58EezMn9QlhH2oWBkq;Dl z^3)h8-$1;Az|9ZPO&(HQIs!L8pqzAQUp~Z5n}_tne&h4`#>el-T_FhebVMd+_k+y17|A5i75PsjA-xL=Jhbi0jWObm@#Qv^O)4PbQ@H=%qg~)>t17A?N(}+Zwy4^$M_b-qgFK|*WLge=^$omW;U0&ig z`b)|`gGiLg=RP8jK>YNTLO1Ut^2kdnJ&TPW_6mboPgxZ}Bwr_^ zr|t?|OCK9k9Z&qpNm+zx{r8-d&^ReqzQ-|t&q+D&y(KBnnmH*Co3*6Wzcwp)_9E%Y zWi08nS<6bB_4ugBUZIkw*kF`b6xTDTw8aR_s+ zVt=i~S3*)pKU_m~lxgz;L^jh&k)V^*{~#ip>1fk+L>5BqVnyM3h(wu2975!LD=FSs zNveGqk@L|lZy>V1wG^AJDZGLyNQW}D$iR-xhuF@BD*lQcn{Q2_zalW!Mv4*}Dubp& znVd5bSWPd*QazQuL0~mKIo(9yIcUMQR8|QsqD+NHvFwrfpzF4+r1i(J?2)!qa0`)@ z?WCA(N9%5*Nt9{#aYSZ9tZgsJkcG%hJ4!A<Us~6!y$m*ePQadrt$289ko1BBJhNvZ^zDZ>q?aJ7^eNaC|K^>;+rdPqyOfgo~ zjX^W48Figwdv(9#c_AeNtCsm{1aNVhb1R5!#TOt10VEyT5@u$ z2j^rbPbm(1a!#VmIr$3WpsJRfeC5eGxw@(pHh5T}<|N9TlP$fZNcOViWJ@p3$;S}; zdUH;q%sIKj8@s@pb8>|@=VY*t6mdSBlPGge=0j}n%Q>0v!#O#_SBg?-YEGieIT`3D z#VS8bP6qmMPF{l8tQzMe%AAwqt4UE*&61Pjt8q?xRhRfYgL4vP&dHMy8`QAm8HuYZIP222rN9>6BGdd}gL0Qr4}_8R`2OXJkuEmwaZ)NQj(~&!O7Xw`Amf zs9HugX<*67+9+rl`8|G+BNsC&C3Tq5GScC5bWD7ap;8iMEhAH*RcmO;NX&3X4rnMv zHdKw00~&HhS~ZelR3pwvlsO}JLaY*O$;h3JI3v3SOK~KaGZJOa$afH<8e1~*T`*_l zPmQH;Zo(OfGG}DRCQ_s~;f(Cqgfp@fTKE^7ktlOUuJ}T#Z)a+hT=4~GuNv5FfX}`YMO4SWN0|x_;rgI; zCn(^O|!CffS-{d79bfSU&rXwz2ca>r|?62#F zUe@Ha#ptGkM85ZX|GSFttz}A*q4?aR7P@K}-1U1%F#xuxC#|TBt{T>z(rd$))>De< zy>O<1>3dVmr|_lW1CUSQtJhl!-#$`wg-z{C5q03J*PG_nfp1%1ben!sY=m_Rr;c^u z+t!zc*EOB8pApX6_ZDweZ8Ey)wb^)nVXU5Ml;gzyQhfgnh61px0p#%+>Q2NL7oVZ- z(*a!9nO|72y`#u{A~>KurmG^Tq&_P9M37Sh?4u{p`VOY-1~^hE^O0IG z7#(7;$_Fp93p6>%1%uVYRV@7@Y4}i63QcTe`dkJ@QgS0xn!Zk?6s;rC^8?ivjDrzg zCz2=_jW37C97#PJ;{Ytj2NsQ?b^2b42z+4C1X`!>DXIyy6lgwCRP76BDfqzR3uvY& z3|*qATnIFLd=VT1?HaVOA!_&Ya{N*mqrD2SR#_*mMUi(?_?HclV*3!vZ;Cq0hLFA) z*6uB|$f2Ok6uff~B3^5i7K*CM+aXkn0Gqu-fw-ZR*c_Gi4yC;2&^(8M{ljQQC^XMu zlo<-`7iiCiQA`VHzYL>oEugiEMoLFhL`!I`qG?G>Xl7{92I|-fnmL-rw}O^t09=jK zAPicXfd+;_8*aoo%SaxrO+of*8864l#gdeZxbPj?+O*Op(1gQfB3&C)3N%sOHmFnt ztq1;cnyM9<$gM53EyJa78bP^jp=}vX=C-DTuHTK2VhgMU_E*2zt*6*vldJ6jP4m;< zp>EdRG}!*$NUYr`DU72iu|0C5U?kdDKt z(8?BJ9I#l5l*Lr54}1?7QrAB4Ra=4~$xS$zDMl{G_vb65 zsJVj5RNsJQ%5jS`@=VTJ@(56B*{kX zmyI;@8~A3gr)}TBcMRIqO&Atz#)xk-MGt`Q*hX410KQpUq!|4ZMmupB^2Slmf$+`R zLgNR5N3n4<@LL?CneaW2BacBiMl<8^3lQ)vkEgodA$L~At4UE+=d0yT_Xy<9+ITWY zz_n3xHPkiHT)vT}g)%vwk|U8OKgCl{B+@G=fm5mjrmHPwHH`&-WTS(hPkB$_{CWqC zjsi$g)<9Y%ZwJoUiBcSZ>689W&f4_8rpZm_?NG6Lk-i#gsw}%EsccPi?}@k;J5dK# zvg_|UIPIx#<;$K))MuFKprb=F`U-45%yBn)M`NvRlPNSB`>gG5Bsc6OtkoXU8L-dV z?xp|(d<*vAA{Evk1v#8TC8}@19&$3m7qC}~A7QyL-+h#8H2K-9n%P`k`COrvo57|k zCeupCv-^;AsZx9g+nq{>OlainJ}NMwkxgk*`~eG0M z*w+2@!wC2?(rhozVdJ9n7EM#Hz_5Pn4hK9>wBropU_NYV2M)fxkzO9piv17EF7Db~Qej!I!T zN)^Y#S1Xf($HMmtTEsDQ0$8KtRHph~9VPE^@MRvyHe}(d3if9f-5UpA=5f-GN779` zL8aqyPF{3^58P4hob0C8X7Au-(&pqb(KN%V_DOZ{(#7N{y-!l+MC4+{Q)-PjvJ64> z>CPmisoN=95`)HSYA(ETZ8^bvX!DLp+U9gd}kwqix8G~1*@Bj@lr0u z%t8}Imub^1?E7|CaW#KU3KQ(wHHw%GU%RU`cQ$6UpMyOU zoTo0jq0&Tq2Xxt7?A?$&3Y~|&+eveo&AlwQqeC%Imp7?v7(~(YO(U(&ovHKHe*q)e Bsh0o% delta 61279 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

^=HPA6xQvxE?MSX-1HvZZFL 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 Yu+NeWmv~P!fJQ9QzPIYRY|Ib;1Eoi|$p8QV diff --git a/nspanel_us_land_code/Program.s.txt b/nspanel_us_land_code/Program.s.txt index 0a45324..9d3a5a7 100644 --- a/nspanel_us_land_code/Program.s.txt +++ b/nspanel_us_land_code/Program.s.txt @@ -18,9 +18,9 @@ Program.s lcd_dev fffb 0002 0000 0020// Fix touch offset for EU Version } printh 92 - prints "nspanelevent",0 + prints "currentpage",0 printh 00 - prints "{\"page\": \"\", \"component\": \"\", \"value\": \"\"}",0 + prints "",0 printh 00 printh FF FF FF page 8//Power on start page boot diff --git a/nspanel_us_land_code/boot.txt b/nspanel_us_land_code/boot.txt index 7f58781..ee3f1ab 100644 --- a/nspanel_us_land_code/boot.txt +++ b/nspanel_us_land_code/boot.txt @@ -20,14 +20,7 @@ Page boot printh FF FF FF dim=0 vis bt_reboot,0 - covx display_mode,aux2.txt,0,0 - nspanelevent.txt="{\"page\": \"boot\", \"event\": \"pagechanged\", \"version\": \""+tft_version.txt+"\", \"display_mode\": \""+aux2.txt+"\"}" - printh 92 - prints "localevent",0 - printh 00 - prints nspanelevent.txt,0 - printh 00 - printh FF FF FF + covx baud,baud_rate.txt,0,0 Touch Press Event printh 91 @@ -140,7 +133,7 @@ Text tft_version Dragging : 0 Send Component ID : disabled Associated Keyboard: none - Text : 4.1dev3 + Text : 4.1dev4 Max. Text Size : 9 Text esph_version @@ -163,6 +156,16 @@ Text bluep_version Text : Max. Text Size : 9 +Text baud_rate + Attributes + ID : 18 + Scope : local + Dragging : 0 + Send Component ID : disabled + Associated Keyboard: none + Text : + Max. Text Size : 10 + Dual-state Button bt_reboot Attributes ID : 4 @@ -217,3 +220,39 @@ Timer wakeup_timer wakeup_timer.en=0 } +Timer tm_esphome + Attributes + ID : 17 + Scope : local + Period (ms): 30000 + Enabled : yes + + Events + Timer Event + if(baud==115200) + { + bauds=921600 + }else + { + bauds=115200 + } + rest + +Timer tm_pageid + Attributes + ID : 19 + Scope : local + Period (ms): 2500 + Enabled : yes + + Events + Timer Event + covx display_mode,aux2.txt,0,0 + nspanelevent.txt="{\"page\": \"boot\", \"event\": \"pagechanged\", \"version\": \""+tft_version.txt+"\", \"display_mode\": \""+aux2.txt+"\"}" + printh 92 + prints "localevent",0 + printh 00 + prints nspanelevent.txt,0 + printh 00 + printh FF FF FF +